38#include "llvm/ADT/APFloat.h"
39#include "llvm/ADT/APInt.h"
40#include "llvm/ADT/FloatingPointMode.h"
41#include "llvm/ADT/SmallPtrSet.h"
42#include "llvm/ADT/StringExtras.h"
43#include "llvm/Analysis/ValueTracking.h"
44#include "llvm/IR/DataLayout.h"
45#include "llvm/IR/InlineAsm.h"
46#include "llvm/IR/Intrinsics.h"
47#include "llvm/IR/IntrinsicsAArch64.h"
48#include "llvm/IR/IntrinsicsAMDGPU.h"
49#include "llvm/IR/IntrinsicsARM.h"
50#include "llvm/IR/IntrinsicsBPF.h"
51#include "llvm/IR/IntrinsicsDirectX.h"
52#include "llvm/IR/IntrinsicsHexagon.h"
53#include "llvm/IR/IntrinsicsNVPTX.h"
54#include "llvm/IR/IntrinsicsPowerPC.h"
55#include "llvm/IR/IntrinsicsR600.h"
56#include "llvm/IR/IntrinsicsRISCV.h"
57#include "llvm/IR/IntrinsicsS390.h"
58#include "llvm/IR/IntrinsicsWebAssembly.h"
59#include "llvm/IR/IntrinsicsX86.h"
60#include "llvm/IR/MDBuilder.h"
61#include "llvm/IR/MatrixBuilder.h"
62#include "llvm/IR/MemoryModelRelaxationAnnotations.h"
63#include "llvm/Support/AMDGPUAddrSpace.h"
64#include "llvm/Support/ConvertUTF.h"
65#include "llvm/Support/MathExtras.h"
66#include "llvm/Support/ScopedPrinter.h"
67#include "llvm/TargetParser/AArch64TargetParser.h"
68#include "llvm/TargetParser/RISCVISAInfo.h"
69#include "llvm/TargetParser/RISCVTargetParser.h"
70#include "llvm/TargetParser/X86TargetParser.h"
76using namespace CodeGen;
80 Align AlignmentInBytes) {
82 switch (CGF.
getLangOpts().getTrivialAutoVarInit()) {
83 case LangOptions::TrivialAutoVarInitKind::Uninitialized:
86 case LangOptions::TrivialAutoVarInitKind::Zero:
87 Byte = CGF.
Builder.getInt8(0x00);
89 case LangOptions::TrivialAutoVarInitKind::Pattern: {
91 Byte = llvm::dyn_cast<llvm::ConstantInt>(
99 I->addAnnotationMetadata(
"auto-init");
105 Constant *FZeroConst = ConstantFP::getZero(CGF->
FloatTy);
110 FZeroConst = ConstantVector::getSplat(
111 ElementCount::getFixed(VecTy->getNumElements()), FZeroConst);
112 auto *FCompInst = CGF->
Builder.CreateFCmpOLT(Op0, FZeroConst);
113 CMP = CGF->
Builder.CreateIntrinsic(
115 {FCompInst},
nullptr);
117 CMP = CGF->
Builder.CreateFCmpOLT(Op0, FZeroConst);
120 LastInstr = CGF->
Builder.CreateIntrinsic(
121 CGF->
VoidTy, llvm::Intrinsic::dx_discard, {CMP},
nullptr);
126 CGF->
Builder.CreateCondBr(CMP, LT0, End);
128 CGF->
Builder.SetInsertPoint(LT0);
130 CGF->
Builder.CreateIntrinsic(CGF->
VoidTy, llvm::Intrinsic::spv_discard, {},
133 LastInstr = CGF->
Builder.CreateBr(End);
135 CGF->
Builder.SetInsertPoint(End);
137 llvm_unreachable(
"Backend Codegen not supported.");
145 const auto *OutArg1 = dyn_cast<HLSLOutArgExpr>(
E->getArg(1));
146 const auto *OutArg2 = dyn_cast<HLSLOutArgExpr>(
E->getArg(2));
157 Value *LowBits =
nullptr;
158 Value *HighBits =
nullptr;
162 llvm::Type *RetElementTy = CGF->
Int32Ty;
164 RetElementTy = llvm::VectorType::get(
165 CGF->
Int32Ty, ElementCount::getFixed(Op0VecTy->getNumElements()));
166 auto *RetTy = llvm::StructType::get(RetElementTy, RetElementTy);
168 CallInst *CI = CGF->
Builder.CreateIntrinsic(
169 RetTy, Intrinsic::dx_splitdouble, {Op0},
nullptr,
"hlsl.splitdouble");
171 LowBits = CGF->
Builder.CreateExtractValue(CI, 0);
172 HighBits = CGF->
Builder.CreateExtractValue(CI, 1);
177 if (!Op0->
getType()->isVectorTy()) {
178 FixedVectorType *DestTy = FixedVectorType::get(CGF->
Int32Ty, 2);
179 Value *Bitcast = CGF->
Builder.CreateBitCast(Op0, DestTy);
181 LowBits = CGF->
Builder.CreateExtractElement(Bitcast, (uint64_t)0);
182 HighBits = CGF->
Builder.CreateExtractElement(Bitcast, 1);
185 if (
const auto *VecTy =
187 NumElements = VecTy->getNumElements();
189 FixedVectorType *Uint32VecTy =
190 FixedVectorType::get(CGF->
Int32Ty, NumElements * 2);
191 Value *Uint32Vec = CGF->
Builder.CreateBitCast(Op0, Uint32VecTy);
192 if (NumElements == 1) {
193 LowBits = CGF->
Builder.CreateExtractElement(Uint32Vec, (uint64_t)0);
194 HighBits = CGF->
Builder.CreateExtractElement(Uint32Vec, 1);
197 for (
int I = 0,
E = NumElements; I !=
E; ++I) {
198 EvenMask.push_back(I * 2);
199 OddMask.push_back(I * 2 + 1);
201 LowBits = CGF->
Builder.CreateShuffleVector(Uint32Vec, EvenMask);
202 HighBits = CGF->
Builder.CreateShuffleVector(Uint32Vec, OddMask);
216 "asdouble operands types mismatch");
220 llvm::Type *ResultType = CGF.
DoubleTy;
223 N = VTy->getNumElements();
224 ResultType = llvm::FixedVectorType::get(CGF.
DoubleTy, N);
228 return CGF.
Builder.CreateIntrinsic(
229 ResultType, Intrinsic::dx_asdouble,
233 OpLowBits = CGF.
Builder.CreateVectorSplat(1, OpLowBits);
234 OpHighBits = CGF.
Builder.CreateVectorSplat(1, OpHighBits);
238 for (
int i = 0; i < N; i++) {
240 Mask.push_back(i + N);
243 Value *BitVec = CGF.
Builder.CreateShuffleVector(OpLowBits, OpHighBits, Mask);
245 return CGF.
Builder.CreateBitCast(BitVec, ResultType);
252 llvm::Metadata *Ops[] = {llvm::MDString::get(Context,
"x18")};
253 llvm::MDNode *RegName = llvm::MDNode::get(Context, Ops);
254 llvm::Value *Metadata = llvm::MetadataAsValue::get(Context, RegName);
257 llvm::Value *X18 = CGF.
Builder.CreateCall(F, Metadata);
264 unsigned BuiltinID) {
273 static SmallDenseMap<unsigned, StringRef, 64> F128Builtins{
274 {Builtin::BI__builtin___fprintf_chk,
"__fprintf_chkieee128"},
275 {Builtin::BI__builtin___printf_chk,
"__printf_chkieee128"},
276 {Builtin::BI__builtin___snprintf_chk,
"__snprintf_chkieee128"},
277 {Builtin::BI__builtin___sprintf_chk,
"__sprintf_chkieee128"},
278 {Builtin::BI__builtin___vfprintf_chk,
"__vfprintf_chkieee128"},
279 {Builtin::BI__builtin___vprintf_chk,
"__vprintf_chkieee128"},
280 {Builtin::BI__builtin___vsnprintf_chk,
"__vsnprintf_chkieee128"},
281 {Builtin::BI__builtin___vsprintf_chk,
"__vsprintf_chkieee128"},
282 {Builtin::BI__builtin_fprintf,
"__fprintfieee128"},
283 {Builtin::BI__builtin_printf,
"__printfieee128"},
284 {Builtin::BI__builtin_snprintf,
"__snprintfieee128"},
285 {Builtin::BI__builtin_sprintf,
"__sprintfieee128"},
286 {Builtin::BI__builtin_vfprintf,
"__vfprintfieee128"},
287 {Builtin::BI__builtin_vprintf,
"__vprintfieee128"},
288 {Builtin::BI__builtin_vsnprintf,
"__vsnprintfieee128"},
289 {Builtin::BI__builtin_vsprintf,
"__vsprintfieee128"},
290 {Builtin::BI__builtin_fscanf,
"__fscanfieee128"},
291 {Builtin::BI__builtin_scanf,
"__scanfieee128"},
292 {Builtin::BI__builtin_sscanf,
"__sscanfieee128"},
293 {Builtin::BI__builtin_vfscanf,
"__vfscanfieee128"},
294 {Builtin::BI__builtin_vscanf,
"__vscanfieee128"},
295 {Builtin::BI__builtin_vsscanf,
"__vsscanfieee128"},
296 {Builtin::BI__builtin_nexttowardf128,
"__nexttowardieee128"},
302 static SmallDenseMap<unsigned, StringRef, 4> AIXLongDouble64Builtins{
303 {Builtin::BI__builtin_frexpl,
"frexp"},
304 {Builtin::BI__builtin_ldexpl,
"ldexp"},
305 {Builtin::BI__builtin_modfl,
"modf"},
311 if (FD->
hasAttr<AsmLabelAttr>())
317 &
getTarget().getLongDoubleFormat() == &llvm::APFloat::IEEEquad() &&
318 F128Builtins.contains(BuiltinID))
319 Name = F128Builtins[BuiltinID];
322 &llvm::APFloat::IEEEdouble() &&
323 AIXLongDouble64Builtins.contains(BuiltinID))
324 Name = AIXLongDouble64Builtins[BuiltinID];
329 llvm::FunctionType *Ty =
332 return GetOrCreateLLVMFunction(Name, Ty,
D,
false);
338 QualType T, llvm::IntegerType *IntType) {
341 if (
V->getType()->isPointerTy())
342 return CGF.
Builder.CreatePtrToInt(
V, IntType);
344 assert(
V->getType() == IntType);
352 if (ResultType->isPointerTy())
353 return CGF.
Builder.CreateIntToPtr(
V, ResultType);
355 assert(
V->getType() == ResultType);
366 if (Align % Bytes != 0) {
379 AtomicOrdering Ordering = AtomicOrdering::SequentiallyConsistent) {
389 llvm::IntegerType *IntType = llvm::IntegerType::get(
393 llvm::Type *ValueType = Val->getType();
421 llvm::AtomicRMWInst::BinOp Kind,
430 llvm::AtomicRMWInst::BinOp Kind,
432 Instruction::BinaryOps Op,
433 bool Invert =
false) {
442 llvm::IntegerType *IntType = llvm::IntegerType::get(
446 llvm::Type *ValueType = Val->getType();
450 Kind, DestAddr, Val, llvm::AtomicOrdering::SequentiallyConsistent);
455 llvm::ConstantInt::getAllOnesValue(IntType));
479 llvm::IntegerType *IntType = llvm::IntegerType::get(
483 llvm::Type *ValueType = Cmp->getType();
488 DestAddr, Cmp, New, llvm::AtomicOrdering::SequentiallyConsistent,
489 llvm::AtomicOrdering::SequentiallyConsistent);
492 return CGF.
Builder.CreateZExt(CGF.
Builder.CreateExtractValue(Pair, 1),
515 AtomicOrdering SuccessOrdering = AtomicOrdering::SequentiallyConsistent) {
527 auto *RTy = Exchange->getType();
531 if (RTy->isPointerTy()) {
537 auto FailureOrdering = SuccessOrdering == AtomicOrdering::Release ?
538 AtomicOrdering::Monotonic :
546 DestAddr, Comparand, Exchange, SuccessOrdering, FailureOrdering);
547 CmpXchg->setVolatile(
true);
550 if (RTy->isPointerTy()) {
571 AtomicOrdering SuccessOrdering) {
572 assert(
E->getNumArgs() == 4);
578 assert(DestPtr->getType()->isPointerTy());
579 assert(!ExchangeHigh->getType()->isPointerTy());
580 assert(!ExchangeLow->getType()->isPointerTy());
583 auto FailureOrdering = SuccessOrdering == AtomicOrdering::Release
584 ? AtomicOrdering::Monotonic
589 llvm::Type *Int128Ty = llvm::IntegerType::get(CGF.
getLLVMContext(), 128);
590 Address DestAddr(DestPtr, Int128Ty,
595 ExchangeHigh = CGF.
Builder.CreateZExt(ExchangeHigh, Int128Ty);
596 ExchangeLow = CGF.
Builder.CreateZExt(ExchangeLow, Int128Ty);
598 CGF.
Builder.CreateShl(ExchangeHigh, llvm::ConstantInt::get(Int128Ty, 64));
599 llvm::Value *Exchange = CGF.
Builder.CreateOr(ExchangeHigh, ExchangeLow);
605 SuccessOrdering, FailureOrdering);
611 CXI->setVolatile(
true);
623 AtomicOrdering Ordering = AtomicOrdering::SequentiallyConsistent) {
629 AtomicRMWInst::Add, DestAddr, ConstantInt::get(IntTy, 1), Ordering);
630 return CGF.
Builder.CreateAdd(
Result, ConstantInt::get(IntTy, 1));
635 AtomicOrdering Ordering = AtomicOrdering::SequentiallyConsistent) {
641 AtomicRMWInst::Sub, DestAddr, ConstantInt::get(IntTy, 1), Ordering);
642 return CGF.
Builder.CreateSub(
Result, ConstantInt::get(IntTy, 1));
653 Load->setVolatile(
true);
663 llvm::StoreInst *Store =
665 Store->setVolatile(
true);
674 unsigned ConstrainedIntrinsicID) {
677 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF,
E);
678 if (CGF.
Builder.getIsFPConstrained()) {
680 return CGF.
Builder.CreateConstrainedFPCall(F, { Src0 });
683 return CGF.
Builder.CreateCall(F, Src0);
691 unsigned ConstrainedIntrinsicID) {
695 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF,
E);
696 if (CGF.
Builder.getIsFPConstrained()) {
698 return CGF.
Builder.CreateConstrainedFPCall(F, { Src0, Src1 });
701 return CGF.
Builder.CreateCall(F, { Src0, Src1 });
708 llvm::Intrinsic::ID ConstrainedIntrinsicID) {
712 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF,
E);
713 if (CGF.
Builder.getIsFPConstrained()) {
715 {Src0->getType(), Src1->getType()});
716 return CGF.
Builder.CreateConstrainedFPCall(F, {Src0, Src1});
721 return CGF.
Builder.CreateCall(F, {Src0, Src1});
728 unsigned ConstrainedIntrinsicID) {
733 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF,
E);
734 if (CGF.
Builder.getIsFPConstrained()) {
736 return CGF.
Builder.CreateConstrainedFPCall(F, { Src0, Src1, Src2 });
739 return CGF.
Builder.CreateCall(F, { Src0, Src1, Src2 });
746 unsigned IntrinsicID,
747 unsigned ConstrainedIntrinsicID,
751 if (CGF.
Builder.getIsFPConstrained())
756 if (CGF.
Builder.getIsFPConstrained())
757 return CGF.
Builder.CreateConstrainedFPCall(F, Args);
759 return CGF.
Builder.CreateCall(F, Args);
768 unsigned IntrinsicID,
769 llvm::StringRef Name =
"") {
770 static_assert(N,
"expect non-empty argument");
772 for (
unsigned I = 0; I < N; ++I)
775 return CGF.
Builder.CreateCall(F, Args, Name);
781 unsigned IntrinsicID) {
786 return CGF.
Builder.CreateCall(F, {Src0, Src1});
792 unsigned IntrinsicID,
793 unsigned ConstrainedIntrinsicID) {
797 if (CGF.
Builder.getIsFPConstrained()) {
798 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF,
E);
800 {ResultType, Src0->getType()});
801 return CGF.
Builder.CreateConstrainedFPCall(F, {Src0});
805 return CGF.
Builder.CreateCall(F, Src0);
810 llvm::Intrinsic::ID IntrinsicID) {
818 llvm::Value *
Call = CGF.
Builder.CreateCall(F, Src0);
820 llvm::Value *Exp = CGF.
Builder.CreateExtractValue(
Call, 1);
828 llvm::Intrinsic::ID IntrinsicID) {
833 llvm::Function *F = CGF.
CGM.
getIntrinsic(IntrinsicID, {Val->getType()});
834 llvm::Value *
Call = CGF.
Builder.CreateCall(F, Val);
836 llvm::Value *SinResult = CGF.
Builder.CreateExtractValue(
Call, 0);
837 llvm::Value *CosResult = CGF.
Builder.CreateExtractValue(
Call, 1);
843 llvm::StoreInst *StoreSin =
845 llvm::StoreInst *StoreCos =
852 MDNode *
Domain = MDHelper.createAnonymousAliasScopeDomain();
853 MDNode *AliasScope = MDHelper.createAnonymousAliasScope(
Domain);
854 MDNode *AliasScopeList = MDNode::get(
Call->getContext(), AliasScope);
855 StoreSin->setMetadata(LLVMContext::MD_alias_scope, AliasScopeList);
856 StoreCos->setMetadata(LLVMContext::MD_noalias, AliasScopeList);
863 Call->setDoesNotAccessMemory();
872 llvm::Type *Ty =
V->getType();
873 int Width = Ty->getPrimitiveSizeInBits();
874 llvm::Type *IntTy = llvm::IntegerType::get(
C, Width);
876 if (Ty->isPPC_FP128Ty()) {
886 Value *ShiftCst = llvm::ConstantInt::get(IntTy, Width);
891 IntTy = llvm::IntegerType::get(
C, Width);
894 Value *Zero = llvm::Constant::getNullValue(IntTy);
895 return CGF.
Builder.CreateICmpSLT(
V, Zero);
904 auto IsIndirect = [&](
ABIArgInfo const &info) {
905 return info.isIndirect() || info.isIndirectAliased() || info.isInAlloca();
910 return IsIndirect(ArgInfo.info);
915 const CallExpr *
E, llvm::Constant *calleeValue) {
916 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF,
E);
918 llvm::CallBase *callOrInvoke =
nullptr;
922 nullptr, &callOrInvoke, &FnInfo);
927 bool ConstWithoutErrnoAndExceptions =
931 if (ConstWithoutErrnoAndExceptions && CGF.
CGM.
getLangOpts().MathErrno &&
932 !CGF.
Builder.getIsFPConstrained() &&
Call.isScalar() &&
953 const llvm::Intrinsic::ID IntrinsicID,
954 llvm::Value *
X, llvm::Value *Y,
955 llvm::Value *&Carry) {
957 assert(
X->getType() == Y->getType() &&
958 "Arguments must be the same type. (Did you forget to make sure both "
959 "arguments have the same integer width?)");
962 llvm::Value *Tmp = CGF.
Builder.CreateCall(Callee, {
X, Y});
963 Carry = CGF.
Builder.CreateExtractValue(Tmp, 1);
964 return CGF.
Builder.CreateExtractValue(Tmp, 0);
971 llvm::ConstantRange CR(APInt(32, low), APInt(32, high));
972 Call->addRangeRetAttr(CR);
973 Call->addRetAttr(llvm::Attribute::AttrKind::NoUndef);
978 struct WidthAndSignedness {
984static WidthAndSignedness
996static struct WidthAndSignedness
998 assert(Types.size() > 0 &&
"Empty list of types.");
1002 for (
const auto &
Type : Types) {
1011 for (
const auto &
Type : Types) {
1013 if (Width < MinWidth) {
1022 Intrinsic::ID inst = IsStart ? Intrinsic::vastart : Intrinsic::vaend;
1033 return From == To || (From == 0 && To == 1) || (From == 3 && To == 2);
1038 return ConstantInt::get(ResType, (
Type & 2) ? 0 : -1,
true);
1042CodeGenFunction::evaluateOrEmitBuiltinObjectSize(
const Expr *
E,
unsigned Type,
1043 llvm::IntegerType *ResType,
1044 llvm::Value *EmittedE,
1048 return emitBuiltinObjectSize(
E,
Type, ResType, EmittedE, IsDynamic);
1049 return ConstantInt::get(ResType, ObjectSize,
true);
1063 if ((!FAMDecl || FD == FAMDecl) &&
1065 Ctx, FD, FD->getType(), StrictFlexArraysLevel,
1093 if (FD->getType()->isCountAttributedType())
1105CodeGenFunction::emitFlexibleArrayMemberSize(
const Expr *
E,
unsigned Type,
1106 llvm::IntegerType *ResType) {
1135 const Expr *Idx =
nullptr;
1137 if (
const auto *UO = dyn_cast<UnaryOperator>(
Base);
1138 UO && UO->getOpcode() == UO_AddrOf) {
1140 if (
const auto *ASE = dyn_cast<ArraySubscriptExpr>(SubExpr)) {
1141 Base = ASE->getBase()->IgnoreParenImpCasts();
1144 if (
const auto *IL = dyn_cast<IntegerLiteral>(Idx)) {
1145 int64_t Val = IL->getValue().getSExtValue();
1162 if (
const auto *ME = dyn_cast<MemberExpr>(
Base)) {
1164 const ValueDecl *VD = ME->getMemberDecl();
1166 FAMDecl = dyn_cast<FieldDecl>(VD);
1169 }
else if (
const auto *DRE = dyn_cast<DeclRefExpr>(
Base)) {
1171 QualType Ty = DRE->getDecl()->getType();
1224 if (isa<DeclRefExpr>(
Base))
1248 CountedByInst =
Builder.CreateIntCast(CountedByInst, ResType, IsSigned);
1251 Value *IdxInst =
nullptr;
1259 IdxInst =
Builder.CreateIntCast(IdxInst, ResType, IdxSigned);
1264 Builder.CreateSub(CountedByInst, IdxInst,
"", !IsSigned, IsSigned);
1270 llvm::Constant *ElemSize =
1271 llvm::ConstantInt::get(ResType,
Size.getQuantity(), IsSigned);
1273 Builder.CreateMul(CountedByInst, ElemSize,
"", !IsSigned, IsSigned);
1274 Res =
Builder.CreateIntCast(Res, ResType, IsSigned);
1283 return Builder.CreateSelect(Cmp, Res, ConstantInt::get(ResType, 0, IsSigned));
1296CodeGenFunction::emitBuiltinObjectSize(
const Expr *
E,
unsigned Type,
1297 llvm::IntegerType *ResType,
1298 llvm::Value *EmittedE,
bool IsDynamic) {
1302 auto *Param = dyn_cast<ParmVarDecl>(
D->getDecl());
1303 auto *PS =
D->getDecl()->
getAttr<PassObjectSizeAttr>();
1304 if (Param !=
nullptr && PS !=
nullptr &&
1306 auto Iter = SizeArguments.find(Param);
1307 assert(
Iter != SizeArguments.end());
1310 auto DIter = LocalDeclMap.find(
D);
1311 assert(DIter != LocalDeclMap.end());
1321 if (
Value *
V = emitFlexibleArrayMemberSize(
E,
Type, ResType))
1332 assert(Ptr->
getType()->isPointerTy() &&
1333 "Non-pointer passed to __builtin_object_size?");
1349 enum ActionKind : uint8_t { TestOnly, Complement, Reset,
Set };
1350 enum InterlockingKind : uint8_t {
1359 InterlockingKind Interlocking;
1362 static BitTest decodeBitTestBuiltin(
unsigned BuiltinID);
1367BitTest BitTest::decodeBitTestBuiltin(
unsigned BuiltinID) {
1368 switch (BuiltinID) {
1370 case Builtin::BI_bittest:
1371 return {TestOnly, Unlocked,
false};
1372 case Builtin::BI_bittestandcomplement:
1373 return {Complement, Unlocked,
false};
1374 case Builtin::BI_bittestandreset:
1375 return {Reset, Unlocked,
false};
1376 case Builtin::BI_bittestandset:
1377 return {
Set, Unlocked,
false};
1378 case Builtin::BI_interlockedbittestandreset:
1379 return {Reset, Sequential,
false};
1380 case Builtin::BI_interlockedbittestandset:
1381 return {
Set, Sequential,
false};
1384 case Builtin::BI_bittest64:
1385 return {TestOnly, Unlocked,
true};
1386 case Builtin::BI_bittestandcomplement64:
1387 return {Complement, Unlocked,
true};
1388 case Builtin::BI_bittestandreset64:
1389 return {Reset, Unlocked,
true};
1390 case Builtin::BI_bittestandset64:
1391 return {
Set, Unlocked,
true};
1392 case Builtin::BI_interlockedbittestandreset64:
1393 return {Reset, Sequential,
true};
1394 case Builtin::BI_interlockedbittestandset64:
1395 return {
Set, Sequential,
true};
1398 case Builtin::BI_interlockedbittestandset_acq:
1399 return {
Set, Acquire,
false};
1400 case Builtin::BI_interlockedbittestandset_rel:
1401 return {
Set, Release,
false};
1402 case Builtin::BI_interlockedbittestandset_nf:
1403 return {
Set, NoFence,
false};
1404 case Builtin::BI_interlockedbittestandreset_acq:
1405 return {Reset, Acquire,
false};
1406 case Builtin::BI_interlockedbittestandreset_rel:
1407 return {Reset, Release,
false};
1408 case Builtin::BI_interlockedbittestandreset_nf:
1409 return {Reset, NoFence,
false};
1411 llvm_unreachable(
"expected only bittest intrinsics");
1416 case BitTest::TestOnly:
return '\0';
1417 case BitTest::Complement:
return 'c';
1418 case BitTest::Reset:
return 'r';
1419 case BitTest::Set:
return 's';
1421 llvm_unreachable(
"invalid action");
1429 char SizeSuffix = BT.Is64Bit ?
'q' :
'l';
1433 raw_svector_ostream AsmOS(
Asm);
1434 if (BT.Interlocking != BitTest::Unlocked)
1439 AsmOS << SizeSuffix <<
" $2, ($1)";
1442 std::string Constraints =
"={@ccc},r,r,~{cc},~{memory}";
1444 if (!MachineClobbers.empty()) {
1446 Constraints += MachineClobbers;
1448 llvm::IntegerType *IntType = llvm::IntegerType::get(
1451 llvm::FunctionType *FTy =
1452 llvm::FunctionType::get(CGF.
Int8Ty, {CGF.UnqualPtrTy, IntType},
false);
1454 llvm::InlineAsm *IA =
1455 llvm::InlineAsm::get(FTy,
Asm, Constraints,
true);
1456 return CGF.
Builder.CreateCall(IA, {BitBase, BitPos});
1459static llvm::AtomicOrdering
1462 case BitTest::Unlocked:
return llvm::AtomicOrdering::NotAtomic;
1463 case BitTest::Sequential:
return llvm::AtomicOrdering::SequentiallyConsistent;
1464 case BitTest::Acquire:
return llvm::AtomicOrdering::Acquire;
1465 case BitTest::Release:
return llvm::AtomicOrdering::Release;
1466 case BitTest::NoFence:
return llvm::AtomicOrdering::Monotonic;
1468 llvm_unreachable(
"invalid interlocking");
1481 BitTest BT = BitTest::decodeBitTestBuiltin(BuiltinID);
1493 BitPos, llvm::ConstantInt::get(BitPos->
getType(), 3),
"bittest.byteidx");
1495 "bittest.byteaddr"),
1499 llvm::ConstantInt::get(CGF.
Int8Ty, 0x7));
1502 Value *Mask =
nullptr;
1503 if (BT.Action != BitTest::TestOnly) {
1504 Mask = CGF.
Builder.CreateShl(llvm::ConstantInt::get(CGF.
Int8Ty, 1), PosLow,
1511 Value *OldByte =
nullptr;
1512 if (Ordering != llvm::AtomicOrdering::NotAtomic) {
1515 llvm::AtomicRMWInst::BinOp RMWOp = llvm::AtomicRMWInst::Or;
1516 if (BT.Action == BitTest::Reset) {
1517 Mask = CGF.
Builder.CreateNot(Mask);
1518 RMWOp = llvm::AtomicRMWInst::And;
1524 Value *NewByte =
nullptr;
1525 switch (BT.Action) {
1526 case BitTest::TestOnly:
1529 case BitTest::Complement:
1530 NewByte = CGF.
Builder.CreateXor(OldByte, Mask);
1532 case BitTest::Reset:
1533 NewByte = CGF.
Builder.CreateAnd(OldByte, CGF.
Builder.CreateNot(Mask));
1536 NewByte = CGF.
Builder.CreateOr(OldByte, Mask);
1545 Value *ShiftedByte = CGF.
Builder.CreateLShr(OldByte, PosLow,
"bittest.shr");
1547 ShiftedByte, llvm::ConstantInt::get(CGF.
Int8Ty, 1),
"bittest.res");
1556 raw_svector_ostream AsmOS(
Asm);
1557 llvm::IntegerType *RetType = CGF.
Int32Ty;
1559 switch (BuiltinID) {
1560 case clang::PPC::BI__builtin_ppc_ldarx:
1564 case clang::PPC::BI__builtin_ppc_lwarx:
1568 case clang::PPC::BI__builtin_ppc_lharx:
1572 case clang::PPC::BI__builtin_ppc_lbarx:
1577 llvm_unreachable(
"Expected only PowerPC load reserve intrinsics");
1580 AsmOS <<
"$0, ${1:y}";
1582 std::string Constraints =
"=r,*Z,~{memory}";
1584 if (!MachineClobbers.empty()) {
1586 Constraints += MachineClobbers;
1590 llvm::FunctionType *FTy = llvm::FunctionType::get(RetType, {PtrType},
false);
1592 llvm::InlineAsm *IA =
1593 llvm::InlineAsm::get(FTy,
Asm, Constraints,
true);
1594 llvm::CallInst *CI = CGF.
Builder.CreateCall(IA, {Addr});
1596 0, Attribute::get(CGF.
getLLVMContext(), Attribute::ElementType, RetType));
1601enum class MSVCSetJmpKind {
1613 llvm::Value *Arg1 =
nullptr;
1614 llvm::Type *Arg1Ty =
nullptr;
1616 bool IsVarArg =
false;
1617 if (SJKind == MSVCSetJmpKind::_setjmp3) {
1620 Arg1 = llvm::ConstantInt::get(CGF.
IntTy, 0);
1623 Name = SJKind == MSVCSetJmpKind::_setjmp ?
"_setjmp" :
"_setjmpex";
1626 Arg1 = CGF.
Builder.CreateCall(
1629 Arg1 = CGF.
Builder.CreateCall(
1631 llvm::ConstantInt::get(CGF.
Int32Ty, 0));
1635 llvm::Type *ArgTypes[2] = {CGF.
Int8PtrTy, Arg1Ty};
1636 llvm::AttributeList ReturnsTwiceAttr = llvm::AttributeList::get(
1638 llvm::Attribute::ReturnsTwice);
1640 llvm::FunctionType::get(CGF.
IntTy, ArgTypes, IsVarArg), Name,
1641 ReturnsTwiceAttr,
true);
1643 llvm::Value *Buf = CGF.
Builder.CreateBitOrPointerCast(
1645 llvm::Value *Args[] = {Buf, Arg1};
1647 CB->setAttributes(ReturnsTwiceAttr);
1696static std::optional<CodeGenFunction::MSVCIntrin>
1699 switch (BuiltinID) {
1701 return std::nullopt;
1702 case clang::ARM::BI_BitScanForward:
1703 case clang::ARM::BI_BitScanForward64:
1704 return MSVCIntrin::_BitScanForward;
1705 case clang::ARM::BI_BitScanReverse:
1706 case clang::ARM::BI_BitScanReverse64:
1707 return MSVCIntrin::_BitScanReverse;
1708 case clang::ARM::BI_InterlockedAnd64:
1709 return MSVCIntrin::_InterlockedAnd;
1710 case clang::ARM::BI_InterlockedExchange64:
1711 return MSVCIntrin::_InterlockedExchange;
1712 case clang::ARM::BI_InterlockedExchangeAdd64:
1713 return MSVCIntrin::_InterlockedExchangeAdd;
1714 case clang::ARM::BI_InterlockedExchangeSub64:
1715 return MSVCIntrin::_InterlockedExchangeSub;
1716 case clang::ARM::BI_InterlockedOr64:
1717 return MSVCIntrin::_InterlockedOr;
1718 case clang::ARM::BI_InterlockedXor64:
1719 return MSVCIntrin::_InterlockedXor;
1720 case clang::ARM::BI_InterlockedDecrement64:
1721 return MSVCIntrin::_InterlockedDecrement;
1722 case clang::ARM::BI_InterlockedIncrement64:
1723 return MSVCIntrin::_InterlockedIncrement;
1724 case clang::ARM::BI_InterlockedExchangeAdd8_acq:
1725 case clang::ARM::BI_InterlockedExchangeAdd16_acq:
1726 case clang::ARM::BI_InterlockedExchangeAdd_acq:
1727 case clang::ARM::BI_InterlockedExchangeAdd64_acq:
1728 return MSVCIntrin::_InterlockedExchangeAdd_acq;
1729 case clang::ARM::BI_InterlockedExchangeAdd8_rel:
1730 case clang::ARM::BI_InterlockedExchangeAdd16_rel:
1731 case clang::ARM::BI_InterlockedExchangeAdd_rel:
1732 case clang::ARM::BI_InterlockedExchangeAdd64_rel:
1733 return MSVCIntrin::_InterlockedExchangeAdd_rel;
1734 case clang::ARM::BI_InterlockedExchangeAdd8_nf:
1735 case clang::ARM::BI_InterlockedExchangeAdd16_nf:
1736 case clang::ARM::BI_InterlockedExchangeAdd_nf:
1737 case clang::ARM::BI_InterlockedExchangeAdd64_nf:
1738 return MSVCIntrin::_InterlockedExchangeAdd_nf;
1739 case clang::ARM::BI_InterlockedExchange8_acq:
1740 case clang::ARM::BI_InterlockedExchange16_acq:
1741 case clang::ARM::BI_InterlockedExchange_acq:
1742 case clang::ARM::BI_InterlockedExchange64_acq:
1743 case clang::ARM::BI_InterlockedExchangePointer_acq:
1744 return MSVCIntrin::_InterlockedExchange_acq;
1745 case clang::ARM::BI_InterlockedExchange8_rel:
1746 case clang::ARM::BI_InterlockedExchange16_rel:
1747 case clang::ARM::BI_InterlockedExchange_rel:
1748 case clang::ARM::BI_InterlockedExchange64_rel:
1749 case clang::ARM::BI_InterlockedExchangePointer_rel:
1750 return MSVCIntrin::_InterlockedExchange_rel;
1751 case clang::ARM::BI_InterlockedExchange8_nf:
1752 case clang::ARM::BI_InterlockedExchange16_nf:
1753 case clang::ARM::BI_InterlockedExchange_nf:
1754 case clang::ARM::BI_InterlockedExchange64_nf:
1755 case clang::ARM::BI_InterlockedExchangePointer_nf:
1756 return MSVCIntrin::_InterlockedExchange_nf;
1757 case clang::ARM::BI_InterlockedCompareExchange8_acq:
1758 case clang::ARM::BI_InterlockedCompareExchange16_acq:
1759 case clang::ARM::BI_InterlockedCompareExchange_acq:
1760 case clang::ARM::BI_InterlockedCompareExchange64_acq:
1761 case clang::ARM::BI_InterlockedCompareExchangePointer_acq:
1762 return MSVCIntrin::_InterlockedCompareExchange_acq;
1763 case clang::ARM::BI_InterlockedCompareExchange8_rel:
1764 case clang::ARM::BI_InterlockedCompareExchange16_rel:
1765 case clang::ARM::BI_InterlockedCompareExchange_rel:
1766 case clang::ARM::BI_InterlockedCompareExchange64_rel:
1767 case clang::ARM::BI_InterlockedCompareExchangePointer_rel:
1768 return MSVCIntrin::_InterlockedCompareExchange_rel;
1769 case clang::ARM::BI_InterlockedCompareExchange8_nf:
1770 case clang::ARM::BI_InterlockedCompareExchange16_nf:
1771 case clang::ARM::BI_InterlockedCompareExchange_nf:
1772 case clang::ARM::BI_InterlockedCompareExchange64_nf:
1773 return MSVCIntrin::_InterlockedCompareExchange_nf;
1774 case clang::ARM::BI_InterlockedOr8_acq:
1775 case clang::ARM::BI_InterlockedOr16_acq:
1776 case clang::ARM::BI_InterlockedOr_acq:
1777 case clang::ARM::BI_InterlockedOr64_acq:
1778 return MSVCIntrin::_InterlockedOr_acq;
1779 case clang::ARM::BI_InterlockedOr8_rel:
1780 case clang::ARM::BI_InterlockedOr16_rel:
1781 case clang::ARM::BI_InterlockedOr_rel:
1782 case clang::ARM::BI_InterlockedOr64_rel:
1783 return MSVCIntrin::_InterlockedOr_rel;
1784 case clang::ARM::BI_InterlockedOr8_nf:
1785 case clang::ARM::BI_InterlockedOr16_nf:
1786 case clang::ARM::BI_InterlockedOr_nf:
1787 case clang::ARM::BI_InterlockedOr64_nf:
1788 return MSVCIntrin::_InterlockedOr_nf;
1789 case clang::ARM::BI_InterlockedXor8_acq:
1790 case clang::ARM::BI_InterlockedXor16_acq:
1791 case clang::ARM::BI_InterlockedXor_acq:
1792 case clang::ARM::BI_InterlockedXor64_acq:
1793 return MSVCIntrin::_InterlockedXor_acq;
1794 case clang::ARM::BI_InterlockedXor8_rel:
1795 case clang::ARM::BI_InterlockedXor16_rel:
1796 case clang::ARM::BI_InterlockedXor_rel:
1797 case clang::ARM::BI_InterlockedXor64_rel:
1798 return MSVCIntrin::_InterlockedXor_rel;
1799 case clang::ARM::BI_InterlockedXor8_nf:
1800 case clang::ARM::BI_InterlockedXor16_nf:
1801 case clang::ARM::BI_InterlockedXor_nf:
1802 case clang::ARM::BI_InterlockedXor64_nf:
1803 return MSVCIntrin::_InterlockedXor_nf;
1804 case clang::ARM::BI_InterlockedAnd8_acq:
1805 case clang::ARM::BI_InterlockedAnd16_acq:
1806 case clang::ARM::BI_InterlockedAnd_acq:
1807 case clang::ARM::BI_InterlockedAnd64_acq:
1808 return MSVCIntrin::_InterlockedAnd_acq;
1809 case clang::ARM::BI_InterlockedAnd8_rel:
1810 case clang::ARM::BI_InterlockedAnd16_rel:
1811 case clang::ARM::BI_InterlockedAnd_rel:
1812 case clang::ARM::BI_InterlockedAnd64_rel:
1813 return MSVCIntrin::_InterlockedAnd_rel;
1814 case clang::ARM::BI_InterlockedAnd8_nf:
1815 case clang::ARM::BI_InterlockedAnd16_nf:
1816 case clang::ARM::BI_InterlockedAnd_nf:
1817 case clang::ARM::BI_InterlockedAnd64_nf:
1818 return MSVCIntrin::_InterlockedAnd_nf;
1819 case clang::ARM::BI_InterlockedIncrement16_acq:
1820 case clang::ARM::BI_InterlockedIncrement_acq:
1821 case clang::ARM::BI_InterlockedIncrement64_acq:
1822 return MSVCIntrin::_InterlockedIncrement_acq;
1823 case clang::ARM::BI_InterlockedIncrement16_rel:
1824 case clang::ARM::BI_InterlockedIncrement_rel:
1825 case clang::ARM::BI_InterlockedIncrement64_rel:
1826 return MSVCIntrin::_InterlockedIncrement_rel;
1827 case clang::ARM::BI_InterlockedIncrement16_nf:
1828 case clang::ARM::BI_InterlockedIncrement_nf:
1829 case clang::ARM::BI_InterlockedIncrement64_nf:
1830 return MSVCIntrin::_InterlockedIncrement_nf;
1831 case clang::ARM::BI_InterlockedDecrement16_acq:
1832 case clang::ARM::BI_InterlockedDecrement_acq:
1833 case clang::ARM::BI_InterlockedDecrement64_acq:
1834 return MSVCIntrin::_InterlockedDecrement_acq;
1835 case clang::ARM::BI_InterlockedDecrement16_rel:
1836 case clang::ARM::BI_InterlockedDecrement_rel:
1837 case clang::ARM::BI_InterlockedDecrement64_rel:
1838 return MSVCIntrin::_InterlockedDecrement_rel;
1839 case clang::ARM::BI_InterlockedDecrement16_nf:
1840 case clang::ARM::BI_InterlockedDecrement_nf:
1841 case clang::ARM::BI_InterlockedDecrement64_nf:
1842 return MSVCIntrin::_InterlockedDecrement_nf;
1844 llvm_unreachable(
"must return from switch");
1847static std::optional<CodeGenFunction::MSVCIntrin>
1850 switch (BuiltinID) {
1852 return std::nullopt;
1853 case clang::AArch64::BI_BitScanForward:
1854 case clang::AArch64::BI_BitScanForward64:
1855 return MSVCIntrin::_BitScanForward;
1856 case clang::AArch64::BI_BitScanReverse:
1857 case clang::AArch64::BI_BitScanReverse64:
1858 return MSVCIntrin::_BitScanReverse;
1859 case clang::AArch64::BI_InterlockedAnd64:
1860 return MSVCIntrin::_InterlockedAnd;
1861 case clang::AArch64::BI_InterlockedExchange64:
1862 return MSVCIntrin::_InterlockedExchange;
1863 case clang::AArch64::BI_InterlockedExchangeAdd64:
1864 return MSVCIntrin::_InterlockedExchangeAdd;
1865 case clang::AArch64::BI_InterlockedExchangeSub64:
1866 return MSVCIntrin::_InterlockedExchangeSub;
1867 case clang::AArch64::BI_InterlockedOr64:
1868 return MSVCIntrin::_InterlockedOr;
1869 case clang::AArch64::BI_InterlockedXor64:
1870 return MSVCIntrin::_InterlockedXor;
1871 case clang::AArch64::BI_InterlockedDecrement64:
1872 return MSVCIntrin::_InterlockedDecrement;
1873 case clang::AArch64::BI_InterlockedIncrement64:
1874 return MSVCIntrin::_InterlockedIncrement;
1875 case clang::AArch64::BI_InterlockedExchangeAdd8_acq:
1876 case clang::AArch64::BI_InterlockedExchangeAdd16_acq:
1877 case clang::AArch64::BI_InterlockedExchangeAdd_acq:
1878 case clang::AArch64::BI_InterlockedExchangeAdd64_acq:
1879 return MSVCIntrin::_InterlockedExchangeAdd_acq;
1880 case clang::AArch64::BI_InterlockedExchangeAdd8_rel:
1881 case clang::AArch64::BI_InterlockedExchangeAdd16_rel:
1882 case clang::AArch64::BI_InterlockedExchangeAdd_rel:
1883 case clang::AArch64::BI_InterlockedExchangeAdd64_rel:
1884 return MSVCIntrin::_InterlockedExchangeAdd_rel;
1885 case clang::AArch64::BI_InterlockedExchangeAdd8_nf:
1886 case clang::AArch64::BI_InterlockedExchangeAdd16_nf:
1887 case clang::AArch64::BI_InterlockedExchangeAdd_nf:
1888 case clang::AArch64::BI_InterlockedExchangeAdd64_nf:
1889 return MSVCIntrin::_InterlockedExchangeAdd_nf;
1890 case clang::AArch64::BI_InterlockedExchange8_acq:
1891 case clang::AArch64::BI_InterlockedExchange16_acq:
1892 case clang::AArch64::BI_InterlockedExchange_acq:
1893 case clang::AArch64::BI_InterlockedExchange64_acq:
1894 case clang::AArch64::BI_InterlockedExchangePointer_acq:
1895 return MSVCIntrin::_InterlockedExchange_acq;
1896 case clang::AArch64::BI_InterlockedExchange8_rel:
1897 case clang::AArch64::BI_InterlockedExchange16_rel:
1898 case clang::AArch64::BI_InterlockedExchange_rel:
1899 case clang::AArch64::BI_InterlockedExchange64_rel:
1900 case clang::AArch64::BI_InterlockedExchangePointer_rel:
1901 return MSVCIntrin::_InterlockedExchange_rel;
1902 case clang::AArch64::BI_InterlockedExchange8_nf:
1903 case clang::AArch64::BI_InterlockedExchange16_nf:
1904 case clang::AArch64::BI_InterlockedExchange_nf:
1905 case clang::AArch64::BI_InterlockedExchange64_nf:
1906 case clang::AArch64::BI_InterlockedExchangePointer_nf:
1907 return MSVCIntrin::_InterlockedExchange_nf;
1908 case clang::AArch64::BI_InterlockedCompareExchange8_acq:
1909 case clang::AArch64::BI_InterlockedCompareExchange16_acq:
1910 case clang::AArch64::BI_InterlockedCompareExchange_acq:
1911 case clang::AArch64::BI_InterlockedCompareExchange64_acq:
1912 case clang::AArch64::BI_InterlockedCompareExchangePointer_acq:
1913 return MSVCIntrin::_InterlockedCompareExchange_acq;
1914 case clang::AArch64::BI_InterlockedCompareExchange8_rel:
1915 case clang::AArch64::BI_InterlockedCompareExchange16_rel:
1916 case clang::AArch64::BI_InterlockedCompareExchange_rel:
1917 case clang::AArch64::BI_InterlockedCompareExchange64_rel:
1918 case clang::AArch64::BI_InterlockedCompareExchangePointer_rel:
1919 return MSVCIntrin::_InterlockedCompareExchange_rel;
1920 case clang::AArch64::BI_InterlockedCompareExchange8_nf:
1921 case clang::AArch64::BI_InterlockedCompareExchange16_nf:
1922 case clang::AArch64::BI_InterlockedCompareExchange_nf:
1923 case clang::AArch64::BI_InterlockedCompareExchange64_nf:
1924 return MSVCIntrin::_InterlockedCompareExchange_nf;
1925 case clang::AArch64::BI_InterlockedCompareExchange128:
1926 return MSVCIntrin::_InterlockedCompareExchange128;
1927 case clang::AArch64::BI_InterlockedCompareExchange128_acq:
1928 return MSVCIntrin::_InterlockedCompareExchange128_acq;
1929 case clang::AArch64::BI_InterlockedCompareExchange128_nf:
1930 return MSVCIntrin::_InterlockedCompareExchange128_nf;
1931 case clang::AArch64::BI_InterlockedCompareExchange128_rel:
1932 return MSVCIntrin::_InterlockedCompareExchange128_rel;
1933 case clang::AArch64::BI_InterlockedOr8_acq:
1934 case clang::AArch64::BI_InterlockedOr16_acq:
1935 case clang::AArch64::BI_InterlockedOr_acq:
1936 case clang::AArch64::BI_InterlockedOr64_acq:
1937 return MSVCIntrin::_InterlockedOr_acq;
1938 case clang::AArch64::BI_InterlockedOr8_rel:
1939 case clang::AArch64::BI_InterlockedOr16_rel:
1940 case clang::AArch64::BI_InterlockedOr_rel:
1941 case clang::AArch64::BI_InterlockedOr64_rel:
1942 return MSVCIntrin::_InterlockedOr_rel;
1943 case clang::AArch64::BI_InterlockedOr8_nf:
1944 case clang::AArch64::BI_InterlockedOr16_nf:
1945 case clang::AArch64::BI_InterlockedOr_nf:
1946 case clang::AArch64::BI_InterlockedOr64_nf:
1947 return MSVCIntrin::_InterlockedOr_nf;
1948 case clang::AArch64::BI_InterlockedXor8_acq:
1949 case clang::AArch64::BI_InterlockedXor16_acq:
1950 case clang::AArch64::BI_InterlockedXor_acq:
1951 case clang::AArch64::BI_InterlockedXor64_acq:
1952 return MSVCIntrin::_InterlockedXor_acq;
1953 case clang::AArch64::BI_InterlockedXor8_rel:
1954 case clang::AArch64::BI_InterlockedXor16_rel:
1955 case clang::AArch64::BI_InterlockedXor_rel:
1956 case clang::AArch64::BI_InterlockedXor64_rel:
1957 return MSVCIntrin::_InterlockedXor_rel;
1958 case clang::AArch64::BI_InterlockedXor8_nf:
1959 case clang::AArch64::BI_InterlockedXor16_nf:
1960 case clang::AArch64::BI_InterlockedXor_nf:
1961 case clang::AArch64::BI_InterlockedXor64_nf:
1962 return MSVCIntrin::_InterlockedXor_nf;
1963 case clang::AArch64::BI_InterlockedAnd8_acq:
1964 case clang::AArch64::BI_InterlockedAnd16_acq:
1965 case clang::AArch64::BI_InterlockedAnd_acq:
1966 case clang::AArch64::BI_InterlockedAnd64_acq:
1967 return MSVCIntrin::_InterlockedAnd_acq;
1968 case clang::AArch64::BI_InterlockedAnd8_rel:
1969 case clang::AArch64::BI_InterlockedAnd16_rel:
1970 case clang::AArch64::BI_InterlockedAnd_rel:
1971 case clang::AArch64::BI_InterlockedAnd64_rel:
1972 return MSVCIntrin::_InterlockedAnd_rel;
1973 case clang::AArch64::BI_InterlockedAnd8_nf:
1974 case clang::AArch64::BI_InterlockedAnd16_nf:
1975 case clang::AArch64::BI_InterlockedAnd_nf:
1976 case clang::AArch64::BI_InterlockedAnd64_nf:
1977 return MSVCIntrin::_InterlockedAnd_nf;
1978 case clang::AArch64::BI_InterlockedIncrement16_acq:
1979 case clang::AArch64::BI_InterlockedIncrement_acq:
1980 case clang::AArch64::BI_InterlockedIncrement64_acq:
1981 return MSVCIntrin::_InterlockedIncrement_acq;
1982 case clang::AArch64::BI_InterlockedIncrement16_rel:
1983 case clang::AArch64::BI_InterlockedIncrement_rel:
1984 case clang::AArch64::BI_InterlockedIncrement64_rel:
1985 return MSVCIntrin::_InterlockedIncrement_rel;
1986 case clang::AArch64::BI_InterlockedIncrement16_nf:
1987 case clang::AArch64::BI_InterlockedIncrement_nf:
1988 case clang::AArch64::BI_InterlockedIncrement64_nf:
1989 return MSVCIntrin::_InterlockedIncrement_nf;
1990 case clang::AArch64::BI_InterlockedDecrement16_acq:
1991 case clang::AArch64::BI_InterlockedDecrement_acq:
1992 case clang::AArch64::BI_InterlockedDecrement64_acq:
1993 return MSVCIntrin::_InterlockedDecrement_acq;
1994 case clang::AArch64::BI_InterlockedDecrement16_rel:
1995 case clang::AArch64::BI_InterlockedDecrement_rel:
1996 case clang::AArch64::BI_InterlockedDecrement64_rel:
1997 return MSVCIntrin::_InterlockedDecrement_rel;
1998 case clang::AArch64::BI_InterlockedDecrement16_nf:
1999 case clang::AArch64::BI_InterlockedDecrement_nf:
2000 case clang::AArch64::BI_InterlockedDecrement64_nf:
2001 return MSVCIntrin::_InterlockedDecrement_nf;
2003 llvm_unreachable(
"must return from switch");
2006static std::optional<CodeGenFunction::MSVCIntrin>
2009 switch (BuiltinID) {
2011 return std::nullopt;
2012 case clang::X86::BI_BitScanForward:
2013 case clang::X86::BI_BitScanForward64:
2014 return MSVCIntrin::_BitScanForward;
2015 case clang::X86::BI_BitScanReverse:
2016 case clang::X86::BI_BitScanReverse64:
2017 return MSVCIntrin::_BitScanReverse;
2018 case clang::X86::BI_InterlockedAnd64:
2019 return MSVCIntrin::_InterlockedAnd;
2020 case clang::X86::BI_InterlockedCompareExchange128:
2021 return MSVCIntrin::_InterlockedCompareExchange128;
2022 case clang::X86::BI_InterlockedExchange64:
2023 return MSVCIntrin::_InterlockedExchange;
2024 case clang::X86::BI_InterlockedExchangeAdd64:
2025 return MSVCIntrin::_InterlockedExchangeAdd;
2026 case clang::X86::BI_InterlockedExchangeSub64:
2027 return MSVCIntrin::_InterlockedExchangeSub;
2028 case clang::X86::BI_InterlockedOr64:
2029 return MSVCIntrin::_InterlockedOr;
2030 case clang::X86::BI_InterlockedXor64:
2031 return MSVCIntrin::_InterlockedXor;
2032 case clang::X86::BI_InterlockedDecrement64:
2033 return MSVCIntrin::_InterlockedDecrement;
2034 case clang::X86::BI_InterlockedIncrement64:
2035 return MSVCIntrin::_InterlockedIncrement;
2037 llvm_unreachable(
"must return from switch");
2043 switch (BuiltinID) {
2044 case MSVCIntrin::_BitScanForward:
2045 case MSVCIntrin::_BitScanReverse: {
2049 llvm::Type *ArgType = ArgValue->
getType();
2050 llvm::Type *IndexType = IndexAddress.getElementType();
2053 Value *ArgZero = llvm::Constant::getNullValue(ArgType);
2054 Value *ResZero = llvm::Constant::getNullValue(ResultType);
2055 Value *ResOne = llvm::ConstantInt::get(ResultType, 1);
2060 PHINode *
Result =
Builder.CreatePHI(ResultType, 2,
"bitscan_result");
2063 Value *IsZero =
Builder.CreateICmpEQ(ArgValue, ArgZero);
2065 Builder.CreateCondBr(IsZero, End, NotZero);
2068 Builder.SetInsertPoint(NotZero);
2070 if (BuiltinID == MSVCIntrin::_BitScanForward) {
2073 ZeroCount =
Builder.CreateIntCast(ZeroCount, IndexType,
false);
2076 unsigned ArgWidth = cast<llvm::IntegerType>(ArgType)->getBitWidth();
2077 Value *ArgTypeLastIndex = llvm::ConstantInt::get(IndexType, ArgWidth - 1);
2081 ZeroCount =
Builder.CreateIntCast(ZeroCount, IndexType,
false);
2082 Value *Index =
Builder.CreateNSWSub(ArgTypeLastIndex, ZeroCount);
2086 Result->addIncoming(ResOne, NotZero);
2091 case MSVCIntrin::_InterlockedAnd:
2093 case MSVCIntrin::_InterlockedExchange:
2095 case MSVCIntrin::_InterlockedExchangeAdd:
2097 case MSVCIntrin::_InterlockedExchangeSub:
2099 case MSVCIntrin::_InterlockedOr:
2101 case MSVCIntrin::_InterlockedXor:
2103 case MSVCIntrin::_InterlockedExchangeAdd_acq:
2105 AtomicOrdering::Acquire);
2106 case MSVCIntrin::_InterlockedExchangeAdd_rel:
2108 AtomicOrdering::Release);
2109 case MSVCIntrin::_InterlockedExchangeAdd_nf:
2111 AtomicOrdering::Monotonic);
2112 case MSVCIntrin::_InterlockedExchange_acq:
2114 AtomicOrdering::Acquire);
2115 case MSVCIntrin::_InterlockedExchange_rel:
2117 AtomicOrdering::Release);
2118 case MSVCIntrin::_InterlockedExchange_nf:
2120 AtomicOrdering::Monotonic);
2121 case MSVCIntrin::_InterlockedCompareExchange:
2123 case MSVCIntrin::_InterlockedCompareExchange_acq:
2125 case MSVCIntrin::_InterlockedCompareExchange_rel:
2127 case MSVCIntrin::_InterlockedCompareExchange_nf:
2129 case MSVCIntrin::_InterlockedCompareExchange128:
2131 *
this,
E, AtomicOrdering::SequentiallyConsistent);
2132 case MSVCIntrin::_InterlockedCompareExchange128_acq:
2134 case MSVCIntrin::_InterlockedCompareExchange128_rel:
2136 case MSVCIntrin::_InterlockedCompareExchange128_nf:
2138 case MSVCIntrin::_InterlockedOr_acq:
2140 AtomicOrdering::Acquire);
2141 case MSVCIntrin::_InterlockedOr_rel:
2143 AtomicOrdering::Release);
2144 case MSVCIntrin::_InterlockedOr_nf:
2146 AtomicOrdering::Monotonic);
2147 case MSVCIntrin::_InterlockedXor_acq:
2149 AtomicOrdering::Acquire);
2150 case MSVCIntrin::_InterlockedXor_rel:
2152 AtomicOrdering::Release);
2153 case MSVCIntrin::_InterlockedXor_nf:
2155 AtomicOrdering::Monotonic);
2156 case MSVCIntrin::_InterlockedAnd_acq:
2158 AtomicOrdering::Acquire);
2159 case MSVCIntrin::_InterlockedAnd_rel:
2161 AtomicOrdering::Release);
2162 case MSVCIntrin::_InterlockedAnd_nf:
2164 AtomicOrdering::Monotonic);
2165 case MSVCIntrin::_InterlockedIncrement_acq:
2167 case MSVCIntrin::_InterlockedIncrement_rel:
2169 case MSVCIntrin::_InterlockedIncrement_nf:
2171 case MSVCIntrin::_InterlockedDecrement_acq:
2173 case MSVCIntrin::_InterlockedDecrement_rel:
2175 case MSVCIntrin::_InterlockedDecrement_nf:
2178 case MSVCIntrin::_InterlockedDecrement:
2180 case MSVCIntrin::_InterlockedIncrement:
2183 case MSVCIntrin::__fastfail: {
2188 StringRef
Asm, Constraints;
2193 case llvm::Triple::x86:
2194 case llvm::Triple::x86_64:
2196 Constraints =
"{cx}";
2198 case llvm::Triple::thumb:
2200 Constraints =
"{r0}";
2202 case llvm::Triple::aarch64:
2203 Asm =
"brk #0xF003";
2204 Constraints =
"{w0}";
2206 llvm::FunctionType *FTy = llvm::FunctionType::get(
VoidTy, {
Int32Ty},
false);
2207 llvm::InlineAsm *IA =
2208 llvm::InlineAsm::get(FTy,
Asm, Constraints,
true);
2209 llvm::AttributeList NoReturnAttr = llvm::AttributeList::get(
2211 llvm::Attribute::NoReturn);
2213 CI->setAttributes(NoReturnAttr);
2217 llvm_unreachable(
"Incorrect MSVC intrinsic!");
2223 CallObjCArcUse(llvm::Value *
object) : object(object) {}
2224 llvm::Value *object;
2233 BuiltinCheckKind Kind) {
2235 "Unsupported builtin check kind");
2241 SanitizerScope SanScope(
this);
2243 ArgValue, llvm::Constant::getNullValue(ArgValue->
getType()));
2244 EmitCheck(std::make_pair(Cond, SanitizerKind::SO_Builtin),
2245 SanitizerHandler::InvalidBuiltin,
2247 llvm::ConstantInt::get(
Builder.getInt8Ty(), Kind)},
2257 SanitizerScope SanScope(
this);
2259 std::make_pair(ArgValue, SanitizerKind::SO_Builtin),
2260 SanitizerHandler::InvalidBuiltin,
2268 return CGF.
Builder.CreateBinaryIntrinsic(
2269 Intrinsic::abs, ArgValue,
2270 ConstantInt::get(CGF.
Builder.getInt1Ty(), HasNSW));
2274 bool SanitizeOverflow) {
2278 if (
const auto *VCI = dyn_cast<llvm::ConstantInt>(ArgValue)) {
2279 if (!VCI->isMinSignedValue())
2280 return EmitAbs(CGF, ArgValue,
true);
2283 CodeGenFunction::SanitizerScope SanScope(&CGF);
2285 Constant *Zero = Constant::getNullValue(ArgValue->
getType());
2286 Value *ResultAndOverflow = CGF.
Builder.CreateBinaryIntrinsic(
2287 Intrinsic::ssub_with_overflow, Zero, ArgValue);
2290 CGF.
Builder.CreateExtractValue(ResultAndOverflow, 1));
2293 if (SanitizeOverflow) {
2294 CGF.
EmitCheck({{NotOverflow, SanitizerKind::SO_SignedIntegerOverflow}},
2295 SanitizerHandler::NegateOverflow,
2300 CGF.
EmitTrapCheck(NotOverflow, SanitizerHandler::SubOverflow);
2302 Value *CmpResult = CGF.
Builder.CreateICmpSLT(ArgValue, Zero,
"abscond");
2303 return CGF.
Builder.CreateSelect(CmpResult,
Result, ArgValue,
"abs");
2308 QualType UnsignedTy =
C.getIntTypeForBitwidth(Size * 8,
false);
2309 return C.getCanonicalType(UnsignedTy);
2319 raw_svector_ostream OS(Name);
2320 OS <<
"__os_log_helper";
2324 for (
const auto &Item : Layout.
Items)
2325 OS <<
"_" <<
int(Item.getSizeByte()) <<
"_"
2326 <<
int(Item.getDescriptorByte());
2329 if (llvm::Function *F =
CGM.
getModule().getFunction(Name))
2339 for (
unsigned int I = 0,
E = Layout.
Items.size(); I <
E; ++I) {
2340 char Size = Layout.
Items[I].getSizeByte();
2347 &Ctx.
Idents.
get(std::string(
"arg") + llvm::to_string(I)), ArgTy,
2349 ArgTys.emplace_back(ArgTy);
2360 llvm::Function *
Fn = llvm::Function::Create(
2361 FuncTy, llvm::GlobalValue::LinkOnceODRLinkage, Name, &
CGM.
getModule());
2362 Fn->setVisibility(llvm::GlobalValue::HiddenVisibility);
2365 Fn->setDoesNotThrow();
2369 Fn->addFnAttr(llvm::Attribute::NoInline);
2387 for (
const auto &Item : Layout.
Items) {
2389 Builder.getInt8(Item.getDescriptorByte()),
2392 Builder.getInt8(Item.getSizeByte()),
2396 if (!
Size.getQuantity())
2413 assert(
E.getNumArgs() >= 2 &&
2414 "__builtin_os_log_format takes at least 2 arguments");
2425 for (
const auto &Item : Layout.
Items) {
2426 int Size = Item.getSizeByte();
2430 llvm::Value *ArgVal;
2434 for (
unsigned I = 0,
E = Item.getMaskType().size(); I <
E; ++I)
2435 Val |= ((
uint64_t)Item.getMaskType()[I]) << I * 8;
2436 ArgVal = llvm::Constant::getIntegerValue(
Int64Ty, llvm::APInt(64, Val));
2437 }
else if (
const Expr *TheExpr = Item.getExpr()) {
2443 auto LifetimeExtendObject = [&](
const Expr *
E) {
2451 if (isa<CallExpr>(
E) || isa<ObjCMessageExpr>(
E))
2456 if (TheExpr->getType()->isObjCRetainableType() &&
2457 getLangOpts().ObjCAutoRefCount && LifetimeExtendObject(TheExpr)) {
2459 "Only scalar can be a ObjC retainable type");
2460 if (!isa<Constant>(ArgVal)) {
2474 pushCleanupAfterFullExpr<CallObjCArcUse>(Cleanup, ArgVal);
2478 ArgVal =
Builder.getInt32(Item.getConstValue().getQuantity());
2481 unsigned ArgValSize =
2485 ArgVal =
Builder.CreateBitOrPointerCast(ArgVal,
IntTy);
2501 unsigned BuiltinID, WidthAndSignedness Op1Info, WidthAndSignedness Op2Info,
2502 WidthAndSignedness ResultInfo) {
2503 return BuiltinID == Builtin::BI__builtin_mul_overflow &&
2504 Op1Info.Width == Op2Info.Width && Op2Info.Width == ResultInfo.Width &&
2505 !Op1Info.Signed && !Op2Info.Signed && ResultInfo.Signed;
2510 const clang::Expr *Op2, WidthAndSignedness Op2Info,
2512 WidthAndSignedness ResultInfo) {
2514 Builtin::BI__builtin_mul_overflow, Op1Info, Op2Info, ResultInfo) &&
2515 "Cannot specialize this multiply");
2520 llvm::Value *HasOverflow;
2522 CGF, llvm::Intrinsic::umul_with_overflow, V1, V2, HasOverflow);
2527 auto IntMax = llvm::APInt::getSignedMaxValue(ResultInfo.Width);
2528 llvm::Value *IntMaxValue = llvm::ConstantInt::get(
Result->getType(), IntMax);
2530 llvm::Value *IntMaxOverflow = CGF.
Builder.CreateICmpUGT(
Result, IntMaxValue);
2531 HasOverflow = CGF.
Builder.CreateOr(HasOverflow, IntMaxOverflow);
2543 WidthAndSignedness Op1Info,
2544 WidthAndSignedness Op2Info,
2545 WidthAndSignedness ResultInfo) {
2546 return BuiltinID == Builtin::BI__builtin_mul_overflow &&
2547 std::max(Op1Info.Width, Op2Info.Width) >= ResultInfo.Width &&
2548 Op1Info.Signed != Op2Info.Signed;
2555 WidthAndSignedness Op1Info,
const clang::Expr *Op2,
2556 WidthAndSignedness Op2Info,
2558 WidthAndSignedness ResultInfo) {
2560 Op2Info, ResultInfo) &&
2561 "Not a mixed-sign multipliction we can specialize");
2564 const clang::Expr *SignedOp = Op1Info.Signed ? Op1 : Op2;
2565 const clang::Expr *UnsignedOp = Op1Info.Signed ? Op2 : Op1;
2568 unsigned SignedOpWidth = Op1Info.Signed ? Op1Info.Width : Op2Info.Width;
2569 unsigned UnsignedOpWidth = Op1Info.Signed ? Op2Info.Width : Op1Info.Width;
2572 if (SignedOpWidth < UnsignedOpWidth)
2574 if (UnsignedOpWidth < SignedOpWidth)
2577 llvm::Type *OpTy =
Signed->getType();
2578 llvm::Value *Zero = llvm::Constant::getNullValue(OpTy);
2581 unsigned OpWidth = std::max(Op1Info.Width, Op2Info.Width);
2584 llvm::Value *IsNegative = CGF.
Builder.CreateICmpSLT(
Signed, Zero);
2585 llvm::Value *AbsOfNegative = CGF.
Builder.CreateSub(Zero,
Signed);
2586 llvm::Value *AbsSigned =
2587 CGF.
Builder.CreateSelect(IsNegative, AbsOfNegative,
Signed);
2590 llvm::Value *UnsignedOverflow;
2591 llvm::Value *UnsignedResult =
2595 llvm::Value *Overflow, *
Result;
2596 if (ResultInfo.Signed) {
2600 llvm::APInt::getSignedMaxValue(ResultInfo.Width).zext(OpWidth);
2601 llvm::Value *MaxResult =
2602 CGF.
Builder.CreateAdd(llvm::ConstantInt::get(OpTy, IntMax),
2603 CGF.
Builder.CreateZExt(IsNegative, OpTy));
2604 llvm::Value *SignedOverflow =
2605 CGF.
Builder.CreateICmpUGT(UnsignedResult, MaxResult);
2606 Overflow = CGF.
Builder.CreateOr(UnsignedOverflow, SignedOverflow);
2609 llvm::Value *NegativeResult = CGF.
Builder.CreateNeg(UnsignedResult);
2610 llvm::Value *SignedResult =
2611 CGF.
Builder.CreateSelect(IsNegative, NegativeResult, UnsignedResult);
2615 llvm::Value *Underflow = CGF.
Builder.CreateAnd(
2616 IsNegative, CGF.
Builder.CreateIsNotNull(UnsignedResult));
2617 Overflow = CGF.
Builder.CreateOr(UnsignedOverflow, Underflow);
2618 if (ResultInfo.Width < OpWidth) {
2620 llvm::APInt::getMaxValue(ResultInfo.Width).zext(OpWidth);
2621 llvm::Value *TruncOverflow = CGF.
Builder.CreateICmpUGT(
2622 UnsignedResult, llvm::ConstantInt::get(OpTy, IntMax));
2623 Overflow = CGF.
Builder.CreateOr(Overflow, TruncOverflow);
2628 IsNegative, CGF.
Builder.CreateNeg(UnsignedResult), UnsignedResult);
2632 assert(Overflow &&
Result &&
"Missing overflow or result");
2643 llvm::SmallPtrSetImpl<const Decl *> &Seen) {
2652 if (!Seen.insert(
Record).second)
2655 assert(
Record->hasDefinition() &&
2656 "Incomplete types should already be diagnosed");
2658 if (
Record->isDynamicClass())
2683 llvm::Type *Ty = Src->getType();
2684 ShiftAmt =
Builder.CreateIntCast(ShiftAmt, Ty,
false);
2687 unsigned IID = IsRotateRight ? Intrinsic::fshr : Intrinsic::fshl;
2694 switch (BuiltinID) {
2695#define MUTATE_LDBL(func) \
2696 case Builtin::BI__builtin_##func##l: \
2697 return Builtin::BI__builtin_##func##f128;
2766 if (CGF.
Builder.getIsFPConstrained() &&
2767 CGF.
Builder.getDefaultConstrainedExcept() != fp::ebIgnore) {
2779 auto UBF = CGF->
CGM.
getModule().getOrInsertFunction(Name, FnTy);
2782 for (
auto &&FormalTy : FnTy->params())
2783 Args.push_back(llvm::PoisonValue::get(FormalTy));
2792 "Should not codegen for consteval builtins");
2799 !
Result.hasSideEffects()) {
2803 if (
Result.Val.isFloat())
2812 if (
getTarget().getTriple().isPPC64() &&
2813 &
getTarget().getLongDoubleFormat() == &llvm::APFloat::IEEEquad())
2820 const unsigned BuiltinIDIfNoAsmLabel =
2821 FD->
hasAttr<AsmLabelAttr>() ? 0 : BuiltinID;
2823 std::optional<bool> ErrnoOverriden;
2827 if (
E->hasStoredFPFeatures()) {
2829 if (OP.hasMathErrnoOverride())
2830 ErrnoOverriden = OP.getMathErrnoOverride();
2839 bool ErrnoOverridenToFalseWithOpt =
2840 ErrnoOverriden.has_value() && !ErrnoOverriden.value() && !OptNone &&
2858 switch (BuiltinID) {
2859 case Builtin::BI__builtin_fma:
2860 case Builtin::BI__builtin_fmaf:
2861 case Builtin::BI__builtin_fmal:
2862 case Builtin::BI__builtin_fmaf16:
2863 case Builtin::BIfma:
2864 case Builtin::BIfmaf:
2865 case Builtin::BIfmal: {
2867 if (Trip.isGNUEnvironment() || Trip.isOSMSVCRT())
2875 bool ConstWithoutErrnoAndExceptions =
2877 bool ConstWithoutExceptions =
2895 bool ConstWithoutErrnoOrExceptions =
2896 ConstWithoutErrnoAndExceptions || ConstWithoutExceptions;
2897 bool GenerateIntrinsics =
2898 (ConstAlways && !OptNone) ||
2900 !(ErrnoOverriden.has_value() && ErrnoOverriden.value()) && !OptNone);
2901 if (!GenerateIntrinsics) {
2902 GenerateIntrinsics =
2903 ConstWithoutErrnoOrExceptions && !ConstWithoutErrnoAndExceptions;
2904 if (!GenerateIntrinsics)
2905 GenerateIntrinsics =
2906 ConstWithoutErrnoOrExceptions &&
2908 !(ErrnoOverriden.has_value() && ErrnoOverriden.value()) && !OptNone);
2909 if (!GenerateIntrinsics)
2910 GenerateIntrinsics =
2911 ConstWithoutErrnoOrExceptions && ErrnoOverridenToFalseWithOpt;
2913 if (GenerateIntrinsics) {
2914 switch (BuiltinIDIfNoAsmLabel) {
2915 case Builtin::BIacos:
2916 case Builtin::BIacosf:
2917 case Builtin::BIacosl:
2918 case Builtin::BI__builtin_acos:
2919 case Builtin::BI__builtin_acosf:
2920 case Builtin::BI__builtin_acosf16:
2921 case Builtin::BI__builtin_acosl:
2922 case Builtin::BI__builtin_acosf128:
2924 *
this,
E, Intrinsic::acos, Intrinsic::experimental_constrained_acos));
2926 case Builtin::BIasin:
2927 case Builtin::BIasinf:
2928 case Builtin::BIasinl:
2929 case Builtin::BI__builtin_asin:
2930 case Builtin::BI__builtin_asinf:
2931 case Builtin::BI__builtin_asinf16:
2932 case Builtin::BI__builtin_asinl:
2933 case Builtin::BI__builtin_asinf128:
2935 *
this,
E, Intrinsic::asin, Intrinsic::experimental_constrained_asin));
2937 case Builtin::BIatan:
2938 case Builtin::BIatanf:
2939 case Builtin::BIatanl:
2940 case Builtin::BI__builtin_atan:
2941 case Builtin::BI__builtin_atanf:
2942 case Builtin::BI__builtin_atanf16:
2943 case Builtin::BI__builtin_atanl:
2944 case Builtin::BI__builtin_atanf128:
2946 *
this,
E, Intrinsic::atan, Intrinsic::experimental_constrained_atan));
2948 case Builtin::BIatan2:
2949 case Builtin::BIatan2f:
2950 case Builtin::BIatan2l:
2951 case Builtin::BI__builtin_atan2:
2952 case Builtin::BI__builtin_atan2f:
2953 case Builtin::BI__builtin_atan2f16:
2954 case Builtin::BI__builtin_atan2l:
2955 case Builtin::BI__builtin_atan2f128:
2957 *
this,
E, Intrinsic::atan2,
2958 Intrinsic::experimental_constrained_atan2));
2960 case Builtin::BIceil:
2961 case Builtin::BIceilf:
2962 case Builtin::BIceill:
2963 case Builtin::BI__builtin_ceil:
2964 case Builtin::BI__builtin_ceilf:
2965 case Builtin::BI__builtin_ceilf16:
2966 case Builtin::BI__builtin_ceill:
2967 case Builtin::BI__builtin_ceilf128:
2970 Intrinsic::experimental_constrained_ceil));
2972 case Builtin::BIcopysign:
2973 case Builtin::BIcopysignf:
2974 case Builtin::BIcopysignl:
2975 case Builtin::BI__builtin_copysign:
2976 case Builtin::BI__builtin_copysignf:
2977 case Builtin::BI__builtin_copysignf16:
2978 case Builtin::BI__builtin_copysignl:
2979 case Builtin::BI__builtin_copysignf128:
2981 emitBuiltinWithOneOverloadedType<2>(*
this,
E, Intrinsic::copysign));
2983 case Builtin::BIcos:
2984 case Builtin::BIcosf:
2985 case Builtin::BIcosl:
2986 case Builtin::BI__builtin_cos:
2987 case Builtin::BI__builtin_cosf:
2988 case Builtin::BI__builtin_cosf16:
2989 case Builtin::BI__builtin_cosl:
2990 case Builtin::BI__builtin_cosf128:
2993 Intrinsic::experimental_constrained_cos));
2995 case Builtin::BIcosh:
2996 case Builtin::BIcoshf:
2997 case Builtin::BIcoshl:
2998 case Builtin::BI__builtin_cosh:
2999 case Builtin::BI__builtin_coshf:
3000 case Builtin::BI__builtin_coshf16:
3001 case Builtin::BI__builtin_coshl:
3002 case Builtin::BI__builtin_coshf128:
3004 *
this,
E, Intrinsic::cosh, Intrinsic::experimental_constrained_cosh));
3006 case Builtin::BIexp:
3007 case Builtin::BIexpf:
3008 case Builtin::BIexpl:
3009 case Builtin::BI__builtin_exp:
3010 case Builtin::BI__builtin_expf:
3011 case Builtin::BI__builtin_expf16:
3012 case Builtin::BI__builtin_expl:
3013 case Builtin::BI__builtin_expf128:
3016 Intrinsic::experimental_constrained_exp));
3018 case Builtin::BIexp2:
3019 case Builtin::BIexp2f:
3020 case Builtin::BIexp2l:
3021 case Builtin::BI__builtin_exp2:
3022 case Builtin::BI__builtin_exp2f:
3023 case Builtin::BI__builtin_exp2f16:
3024 case Builtin::BI__builtin_exp2l:
3025 case Builtin::BI__builtin_exp2f128:
3028 Intrinsic::experimental_constrained_exp2));
3029 case Builtin::BI__builtin_exp10:
3030 case Builtin::BI__builtin_exp10f:
3031 case Builtin::BI__builtin_exp10f16:
3032 case Builtin::BI__builtin_exp10l:
3033 case Builtin::BI__builtin_exp10f128: {
3035 if (
Builder.getIsFPConstrained())
3038 emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::exp10));
3040 case Builtin::BIfabs:
3041 case Builtin::BIfabsf:
3042 case Builtin::BIfabsl:
3043 case Builtin::BI__builtin_fabs:
3044 case Builtin::BI__builtin_fabsf:
3045 case Builtin::BI__builtin_fabsf16:
3046 case Builtin::BI__builtin_fabsl:
3047 case Builtin::BI__builtin_fabsf128:
3049 emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::fabs));
3051 case Builtin::BIfloor:
3052 case Builtin::BIfloorf:
3053 case Builtin::BIfloorl:
3054 case Builtin::BI__builtin_floor:
3055 case Builtin::BI__builtin_floorf:
3056 case Builtin::BI__builtin_floorf16:
3057 case Builtin::BI__builtin_floorl:
3058 case Builtin::BI__builtin_floorf128:
3061 Intrinsic::experimental_constrained_floor));
3063 case Builtin::BIfma:
3064 case Builtin::BIfmaf:
3065 case Builtin::BIfmal:
3066 case Builtin::BI__builtin_fma:
3067 case Builtin::BI__builtin_fmaf:
3068 case Builtin::BI__builtin_fmaf16:
3069 case Builtin::BI__builtin_fmal:
3070 case Builtin::BI__builtin_fmaf128:
3073 Intrinsic::experimental_constrained_fma));
3075 case Builtin::BIfmax:
3076 case Builtin::BIfmaxf:
3077 case Builtin::BIfmaxl:
3078 case Builtin::BI__builtin_fmax:
3079 case Builtin::BI__builtin_fmaxf:
3080 case Builtin::BI__builtin_fmaxf16:
3081 case Builtin::BI__builtin_fmaxl:
3082 case Builtin::BI__builtin_fmaxf128:
3085 Intrinsic::experimental_constrained_maxnum));
3087 case Builtin::BIfmin:
3088 case Builtin::BIfminf:
3089 case Builtin::BIfminl:
3090 case Builtin::BI__builtin_fmin:
3091 case Builtin::BI__builtin_fminf:
3092 case Builtin::BI__builtin_fminf16:
3093 case Builtin::BI__builtin_fminl:
3094 case Builtin::BI__builtin_fminf128:
3097 Intrinsic::experimental_constrained_minnum));
3099 case Builtin::BIfmaximum_num:
3100 case Builtin::BIfmaximum_numf:
3101 case Builtin::BIfmaximum_numl:
3102 case Builtin::BI__builtin_fmaximum_num:
3103 case Builtin::BI__builtin_fmaximum_numf:
3104 case Builtin::BI__builtin_fmaximum_numf16:
3105 case Builtin::BI__builtin_fmaximum_numl:
3106 case Builtin::BI__builtin_fmaximum_numf128:
3108 emitBuiltinWithOneOverloadedType<2>(*
this,
E, Intrinsic::maximumnum));
3110 case Builtin::BIfminimum_num:
3111 case Builtin::BIfminimum_numf:
3112 case Builtin::BIfminimum_numl:
3113 case Builtin::BI__builtin_fminimum_num:
3114 case Builtin::BI__builtin_fminimum_numf:
3115 case Builtin::BI__builtin_fminimum_numf16:
3116 case Builtin::BI__builtin_fminimum_numl:
3117 case Builtin::BI__builtin_fminimum_numf128:
3119 emitBuiltinWithOneOverloadedType<2>(*
this,
E, Intrinsic::minimumnum));
3123 case Builtin::BIfmod:
3124 case Builtin::BIfmodf:
3125 case Builtin::BIfmodl:
3126 case Builtin::BI__builtin_fmod:
3127 case Builtin::BI__builtin_fmodf:
3128 case Builtin::BI__builtin_fmodf16:
3129 case Builtin::BI__builtin_fmodl:
3130 case Builtin::BI__builtin_fmodf128:
3131 case Builtin::BI__builtin_elementwise_fmod: {
3132 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
3138 case Builtin::BIlog:
3139 case Builtin::BIlogf:
3140 case Builtin::BIlogl:
3141 case Builtin::BI__builtin_log:
3142 case Builtin::BI__builtin_logf:
3143 case Builtin::BI__builtin_logf16:
3144 case Builtin::BI__builtin_logl:
3145 case Builtin::BI__builtin_logf128:
3148 Intrinsic::experimental_constrained_log));
3150 case Builtin::BIlog10:
3151 case Builtin::BIlog10f:
3152 case Builtin::BIlog10l:
3153 case Builtin::BI__builtin_log10:
3154 case Builtin::BI__builtin_log10f:
3155 case Builtin::BI__builtin_log10f16:
3156 case Builtin::BI__builtin_log10l:
3157 case Builtin::BI__builtin_log10f128:
3160 Intrinsic::experimental_constrained_log10));
3162 case Builtin::BIlog2:
3163 case Builtin::BIlog2f:
3164 case Builtin::BIlog2l:
3165 case Builtin::BI__builtin_log2:
3166 case Builtin::BI__builtin_log2f:
3167 case Builtin::BI__builtin_log2f16:
3168 case Builtin::BI__builtin_log2l:
3169 case Builtin::BI__builtin_log2f128:
3172 Intrinsic::experimental_constrained_log2));
3174 case Builtin::BInearbyint:
3175 case Builtin::BInearbyintf:
3176 case Builtin::BInearbyintl:
3177 case Builtin::BI__builtin_nearbyint:
3178 case Builtin::BI__builtin_nearbyintf:
3179 case Builtin::BI__builtin_nearbyintl:
3180 case Builtin::BI__builtin_nearbyintf128:
3182 Intrinsic::nearbyint,
3183 Intrinsic::experimental_constrained_nearbyint));
3185 case Builtin::BIpow:
3186 case Builtin::BIpowf:
3187 case Builtin::BIpowl:
3188 case Builtin::BI__builtin_pow:
3189 case Builtin::BI__builtin_powf:
3190 case Builtin::BI__builtin_powf16:
3191 case Builtin::BI__builtin_powl:
3192 case Builtin::BI__builtin_powf128:
3195 Intrinsic::experimental_constrained_pow));
3197 case Builtin::BIrint:
3198 case Builtin::BIrintf:
3199 case Builtin::BIrintl:
3200 case Builtin::BI__builtin_rint:
3201 case Builtin::BI__builtin_rintf:
3202 case Builtin::BI__builtin_rintf16:
3203 case Builtin::BI__builtin_rintl:
3204 case Builtin::BI__builtin_rintf128:
3207 Intrinsic::experimental_constrained_rint));
3209 case Builtin::BIround:
3210 case Builtin::BIroundf:
3211 case Builtin::BIroundl:
3212 case Builtin::BI__builtin_round:
3213 case Builtin::BI__builtin_roundf:
3214 case Builtin::BI__builtin_roundf16:
3215 case Builtin::BI__builtin_roundl:
3216 case Builtin::BI__builtin_roundf128:
3219 Intrinsic::experimental_constrained_round));
3221 case Builtin::BIroundeven:
3222 case Builtin::BIroundevenf:
3223 case Builtin::BIroundevenl:
3224 case Builtin::BI__builtin_roundeven:
3225 case Builtin::BI__builtin_roundevenf:
3226 case Builtin::BI__builtin_roundevenf16:
3227 case Builtin::BI__builtin_roundevenl:
3228 case Builtin::BI__builtin_roundevenf128:
3230 Intrinsic::roundeven,
3231 Intrinsic::experimental_constrained_roundeven));
3233 case Builtin::BIsin:
3234 case Builtin::BIsinf:
3235 case Builtin::BIsinl:
3236 case Builtin::BI__builtin_sin:
3237 case Builtin::BI__builtin_sinf:
3238 case Builtin::BI__builtin_sinf16:
3239 case Builtin::BI__builtin_sinl:
3240 case Builtin::BI__builtin_sinf128:
3243 Intrinsic::experimental_constrained_sin));
3245 case Builtin::BIsinh:
3246 case Builtin::BIsinhf:
3247 case Builtin::BIsinhl:
3248 case Builtin::BI__builtin_sinh:
3249 case Builtin::BI__builtin_sinhf:
3250 case Builtin::BI__builtin_sinhf16:
3251 case Builtin::BI__builtin_sinhl:
3252 case Builtin::BI__builtin_sinhf128:
3254 *
this,
E, Intrinsic::sinh, Intrinsic::experimental_constrained_sinh));
3256 case Builtin::BI__builtin_sincos:
3257 case Builtin::BI__builtin_sincosf:
3258 case Builtin::BI__builtin_sincosf16:
3259 case Builtin::BI__builtin_sincosl:
3260 case Builtin::BI__builtin_sincosf128:
3264 case Builtin::BIsqrt:
3265 case Builtin::BIsqrtf:
3266 case Builtin::BIsqrtl:
3267 case Builtin::BI__builtin_sqrt:
3268 case Builtin::BI__builtin_sqrtf:
3269 case Builtin::BI__builtin_sqrtf16:
3270 case Builtin::BI__builtin_sqrtl:
3271 case Builtin::BI__builtin_sqrtf128:
3272 case Builtin::BI__builtin_elementwise_sqrt: {
3274 *
this,
E, Intrinsic::sqrt, Intrinsic::experimental_constrained_sqrt);
3279 case Builtin::BItan:
3280 case Builtin::BItanf:
3281 case Builtin::BItanl:
3282 case Builtin::BI__builtin_tan:
3283 case Builtin::BI__builtin_tanf:
3284 case Builtin::BI__builtin_tanf16:
3285 case Builtin::BI__builtin_tanl:
3286 case Builtin::BI__builtin_tanf128:
3288 *
this,
E, Intrinsic::tan, Intrinsic::experimental_constrained_tan));
3290 case Builtin::BItanh:
3291 case Builtin::BItanhf:
3292 case Builtin::BItanhl:
3293 case Builtin::BI__builtin_tanh:
3294 case Builtin::BI__builtin_tanhf:
3295 case Builtin::BI__builtin_tanhf16:
3296 case Builtin::BI__builtin_tanhl:
3297 case Builtin::BI__builtin_tanhf128:
3299 *
this,
E, Intrinsic::tanh, Intrinsic::experimental_constrained_tanh));
3301 case Builtin::BItrunc:
3302 case Builtin::BItruncf:
3303 case Builtin::BItruncl:
3304 case Builtin::BI__builtin_trunc:
3305 case Builtin::BI__builtin_truncf:
3306 case Builtin::BI__builtin_truncf16:
3307 case Builtin::BI__builtin_truncl:
3308 case Builtin::BI__builtin_truncf128:
3311 Intrinsic::experimental_constrained_trunc));
3313 case Builtin::BIlround:
3314 case Builtin::BIlroundf:
3315 case Builtin::BIlroundl:
3316 case Builtin::BI__builtin_lround:
3317 case Builtin::BI__builtin_lroundf:
3318 case Builtin::BI__builtin_lroundl:
3319 case Builtin::BI__builtin_lroundf128:
3321 *
this,
E, Intrinsic::lround,
3322 Intrinsic::experimental_constrained_lround));
3324 case Builtin::BIllround:
3325 case Builtin::BIllroundf:
3326 case Builtin::BIllroundl:
3327 case Builtin::BI__builtin_llround:
3328 case Builtin::BI__builtin_llroundf:
3329 case Builtin::BI__builtin_llroundl:
3330 case Builtin::BI__builtin_llroundf128:
3332 *
this,
E, Intrinsic::llround,
3333 Intrinsic::experimental_constrained_llround));
3335 case Builtin::BIlrint:
3336 case Builtin::BIlrintf:
3337 case Builtin::BIlrintl:
3338 case Builtin::BI__builtin_lrint:
3339 case Builtin::BI__builtin_lrintf:
3340 case Builtin::BI__builtin_lrintl:
3341 case Builtin::BI__builtin_lrintf128:
3343 *
this,
E, Intrinsic::lrint,
3344 Intrinsic::experimental_constrained_lrint));
3346 case Builtin::BIllrint:
3347 case Builtin::BIllrintf:
3348 case Builtin::BIllrintl:
3349 case Builtin::BI__builtin_llrint:
3350 case Builtin::BI__builtin_llrintf:
3351 case Builtin::BI__builtin_llrintl:
3352 case Builtin::BI__builtin_llrintf128:
3354 *
this,
E, Intrinsic::llrint,
3355 Intrinsic::experimental_constrained_llrint));
3356 case Builtin::BI__builtin_ldexp:
3357 case Builtin::BI__builtin_ldexpf:
3358 case Builtin::BI__builtin_ldexpl:
3359 case Builtin::BI__builtin_ldexpf16:
3360 case Builtin::BI__builtin_ldexpf128: {
3362 *
this,
E, Intrinsic::ldexp,
3363 Intrinsic::experimental_constrained_ldexp));
3373 Value *Val = A.emitRawPointer(*
this);
3379 SkippedChecks.
set(SanitizerKind::All);
3380 SkippedChecks.
clear(SanitizerKind::Alignment);
3383 if (
auto *CE = dyn_cast<ImplicitCastExpr>(Arg))
3384 if (CE->getCastKind() == CK_BitCast)
3385 Arg = CE->getSubExpr();
3391 switch (BuiltinIDIfNoAsmLabel) {
3393 case Builtin::BI__builtin___CFStringMakeConstantString:
3394 case Builtin::BI__builtin___NSStringMakeConstantString:
3396 case Builtin::BI__builtin_stdarg_start:
3397 case Builtin::BI__builtin_va_start:
3398 case Builtin::BI__va_start:
3399 case Builtin::BI__builtin_va_end:
3403 BuiltinID != Builtin::BI__builtin_va_end);
3405 case Builtin::BI__builtin_va_copy: {
3412 case Builtin::BIabs:
3413 case Builtin::BIlabs:
3414 case Builtin::BIllabs:
3415 case Builtin::BI__builtin_abs:
3416 case Builtin::BI__builtin_labs:
3417 case Builtin::BI__builtin_llabs: {
3418 bool SanitizeOverflow =
SanOpts.
has(SanitizerKind::SignedIntegerOverflow);
3421 switch (
getLangOpts().getSignedOverflowBehavior()) {
3426 if (!SanitizeOverflow) {
3438 case Builtin::BI__builtin_complex: {
3443 case Builtin::BI__builtin_conj:
3444 case Builtin::BI__builtin_conjf:
3445 case Builtin::BI__builtin_conjl:
3446 case Builtin::BIconj:
3447 case Builtin::BIconjf:
3448 case Builtin::BIconjl: {
3450 Value *Real = ComplexVal.first;
3451 Value *Imag = ComplexVal.second;
3452 Imag =
Builder.CreateFNeg(Imag,
"neg");
3455 case Builtin::BI__builtin_creal:
3456 case Builtin::BI__builtin_crealf:
3457 case Builtin::BI__builtin_creall:
3458 case Builtin::BIcreal:
3459 case Builtin::BIcrealf:
3460 case Builtin::BIcreall: {
3465 case Builtin::BI__builtin_preserve_access_index: {
3486 case Builtin::BI__builtin_cimag:
3487 case Builtin::BI__builtin_cimagf:
3488 case Builtin::BI__builtin_cimagl:
3489 case Builtin::BIcimag:
3490 case Builtin::BIcimagf:
3491 case Builtin::BIcimagl: {
3496 case Builtin::BI__builtin_clrsb:
3497 case Builtin::BI__builtin_clrsbl:
3498 case Builtin::BI__builtin_clrsbll: {
3502 llvm::Type *ArgType = ArgValue->
getType();
3506 Value *
Zero = llvm::Constant::getNullValue(ArgType);
3507 Value *IsNeg =
Builder.CreateICmpSLT(ArgValue, Zero,
"isneg");
3509 Value *Tmp =
Builder.CreateSelect(IsNeg, Inverse, ArgValue);
3516 case Builtin::BI__builtin_ctzs:
3517 case Builtin::BI__builtin_ctz:
3518 case Builtin::BI__builtin_ctzl:
3519 case Builtin::BI__builtin_ctzll:
3520 case Builtin::BI__builtin_ctzg: {
3521 bool HasFallback = BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_ctzg &&
3522 E->getNumArgs() > 1;
3528 llvm::Type *ArgType = ArgValue->
getType();
3535 if (
Result->getType() != ResultType)
3541 Value *
Zero = Constant::getNullValue(ArgType);
3542 Value *IsZero =
Builder.CreateICmpEQ(ArgValue, Zero,
"iszero");
3544 Value *ResultOrFallback =
3545 Builder.CreateSelect(IsZero, FallbackValue,
Result,
"ctzg");
3548 case Builtin::BI__builtin_clzs:
3549 case Builtin::BI__builtin_clz:
3550 case Builtin::BI__builtin_clzl:
3551 case Builtin::BI__builtin_clzll:
3552 case Builtin::BI__builtin_clzg: {
3553 bool HasFallback = BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_clzg &&
3554 E->getNumArgs() > 1;
3560 llvm::Type *ArgType = ArgValue->
getType();
3567 if (
Result->getType() != ResultType)
3573 Value *
Zero = Constant::getNullValue(ArgType);
3574 Value *IsZero =
Builder.CreateICmpEQ(ArgValue, Zero,
"iszero");
3576 Value *ResultOrFallback =
3577 Builder.CreateSelect(IsZero, FallbackValue,
Result,
"clzg");
3580 case Builtin::BI__builtin_ffs:
3581 case Builtin::BI__builtin_ffsl:
3582 case Builtin::BI__builtin_ffsll: {
3586 llvm::Type *ArgType = ArgValue->
getType();
3591 Builder.CreateAdd(
Builder.CreateCall(F, {ArgValue, Builder.getTrue()}),
3592 llvm::ConstantInt::get(ArgType, 1));
3593 Value *
Zero = llvm::Constant::getNullValue(ArgType);
3594 Value *IsZero =
Builder.CreateICmpEQ(ArgValue, Zero,
"iszero");
3596 if (
Result->getType() != ResultType)
3601 case Builtin::BI__builtin_parity:
3602 case Builtin::BI__builtin_parityl:
3603 case Builtin::BI__builtin_parityll: {
3607 llvm::Type *ArgType = ArgValue->
getType();
3613 if (
Result->getType() != ResultType)
3618 case Builtin::BI__lzcnt16:
3619 case Builtin::BI__lzcnt:
3620 case Builtin::BI__lzcnt64: {
3623 llvm::Type *ArgType = ArgValue->
getType();
3628 if (
Result->getType() != ResultType)
3633 case Builtin::BI__popcnt16:
3634 case Builtin::BI__popcnt:
3635 case Builtin::BI__popcnt64:
3636 case Builtin::BI__builtin_popcount:
3637 case Builtin::BI__builtin_popcountl:
3638 case Builtin::BI__builtin_popcountll:
3639 case Builtin::BI__builtin_popcountg: {
3642 llvm::Type *ArgType = ArgValue->
getType();
3647 if (
Result->getType() != ResultType)
3652 case Builtin::BI__builtin_unpredictable: {
3658 case Builtin::BI__builtin_expect: {
3660 llvm::Type *ArgType = ArgValue->
getType();
3671 Builder.CreateCall(FnExpect, {ArgValue, ExpectedValue},
"expval");
3674 case Builtin::BI__builtin_expect_with_probability: {
3676 llvm::Type *ArgType = ArgValue->
getType();
3679 llvm::APFloat Probability(0.0);
3680 const Expr *ProbArg =
E->getArg(2);
3682 assert(EvalSucceed &&
"probability should be able to evaluate as float");
3684 bool LoseInfo =
false;
3685 Probability.convert(llvm::APFloat::IEEEdouble(),
3686 llvm::RoundingMode::Dynamic, &LoseInfo);
3688 Constant *Confidence = ConstantFP::get(Ty, Probability);
3698 FnExpect, {ArgValue, ExpectedValue, Confidence},
"expval");
3701 case Builtin::BI__builtin_assume_aligned: {
3702 const Expr *Ptr =
E->getArg(0);
3704 Value *OffsetValue =
3708 ConstantInt *AlignmentCI = cast<ConstantInt>(AlignmentValue);
3709 if (AlignmentCI->getValue().ugt(llvm::Value::MaximumAlignment))
3710 AlignmentCI = ConstantInt::get(AlignmentCI->getIntegerType(),
3711 llvm::Value::MaximumAlignment);
3715 AlignmentCI, OffsetValue);
3718 case Builtin::BI__assume:
3719 case Builtin::BI__builtin_assume: {
3725 Builder.CreateCall(FnAssume, ArgValue);
3728 case Builtin::BI__builtin_assume_separate_storage: {
3729 const Expr *Arg0 =
E->getArg(0);
3730 const Expr *Arg1 =
E->getArg(1);
3735 Value *Values[] = {Value0, Value1};
3736 OperandBundleDefT<Value *> OBD(
"separate_storage", Values);
3740 case Builtin::BI__builtin_allow_runtime_check: {
3744 llvm::Value *Allow =
Builder.CreateCall(
3746 llvm::MetadataAsValue::get(Ctx, llvm::MDString::get(Ctx, Kind)));
3749 case Builtin::BI__arithmetic_fence: {
3752 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
3753 llvm::FastMathFlags FMF =
Builder.getFastMathFlags();
3754 bool isArithmeticFenceEnabled =
3755 FMF.allowReassoc() &&
3759 if (isArithmeticFenceEnabled) {
3762 Value *Real =
Builder.CreateArithmeticFence(ComplexVal.first,
3764 Value *Imag =
Builder.CreateArithmeticFence(ComplexVal.second,
3769 Value *Real = ComplexVal.first;
3770 Value *Imag = ComplexVal.second;
3774 if (isArithmeticFenceEnabled)
3779 case Builtin::BI__builtin_bswap16:
3780 case Builtin::BI__builtin_bswap32:
3781 case Builtin::BI__builtin_bswap64:
3782 case Builtin::BI_byteswap_ushort:
3783 case Builtin::BI_byteswap_ulong:
3784 case Builtin::BI_byteswap_uint64: {
3786 emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::bswap));
3788 case Builtin::BI__builtin_bitreverse8:
3789 case Builtin::BI__builtin_bitreverse16:
3790 case Builtin::BI__builtin_bitreverse32:
3791 case Builtin::BI__builtin_bitreverse64: {
3793 emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::bitreverse));
3795 case Builtin::BI__builtin_rotateleft8:
3796 case Builtin::BI__builtin_rotateleft16:
3797 case Builtin::BI__builtin_rotateleft32:
3798 case Builtin::BI__builtin_rotateleft64:
3799 case Builtin::BI_rotl8:
3800 case Builtin::BI_rotl16:
3801 case Builtin::BI_rotl:
3802 case Builtin::BI_lrotl:
3803 case Builtin::BI_rotl64:
3806 case Builtin::BI__builtin_rotateright8:
3807 case Builtin::BI__builtin_rotateright16:
3808 case Builtin::BI__builtin_rotateright32:
3809 case Builtin::BI__builtin_rotateright64:
3810 case Builtin::BI_rotr8:
3811 case Builtin::BI_rotr16:
3812 case Builtin::BI_rotr:
3813 case Builtin::BI_lrotr:
3814 case Builtin::BI_rotr64:
3817 case Builtin::BI__builtin_constant_p: {
3820 const Expr *Arg =
E->getArg(0);
3828 return RValue::get(ConstantInt::get(ResultType, 0));
3833 return RValue::get(ConstantInt::get(ResultType, 0));
3845 if (
Result->getType() != ResultType)
3849 case Builtin::BI__builtin_dynamic_object_size:
3850 case Builtin::BI__builtin_object_size: {
3857 bool IsDynamic = BuiltinID == Builtin::BI__builtin_dynamic_object_size;
3859 nullptr, IsDynamic));
3861 case Builtin::BI__builtin_counted_by_ref: {
3863 llvm::Value *
Result = llvm::ConstantPointerNull::get(
3868 if (
auto *UO = dyn_cast<UnaryOperator>(Arg);
3869 UO && UO->getOpcode() == UO_AddrOf) {
3872 if (
auto *ASE = dyn_cast<ArraySubscriptExpr>(Arg))
3876 if (
const MemberExpr *ME = dyn_cast_if_present<MemberExpr>(Arg)) {
3880 const auto *FAMDecl = cast<FieldDecl>(ME->getMemberDecl());
3884 llvm::report_fatal_error(
"Cannot find the counted_by 'count' field");
3890 case Builtin::BI__builtin_prefetch: {
3894 llvm::ConstantInt::get(
Int32Ty, 0);
3896 llvm::ConstantInt::get(
Int32Ty, 3);
3902 case Builtin::BI__builtin_readcyclecounter: {
3906 case Builtin::BI__builtin_readsteadycounter: {
3910 case Builtin::BI__builtin___clear_cache: {
3916 case Builtin::BI__builtin_trap:
3919 case Builtin::BI__builtin_verbose_trap: {
3920 llvm::DILocation *TrapLocation =
Builder.getCurrentDebugLocation();
3931 case Builtin::BI__debugbreak:
3934 case Builtin::BI__builtin_unreachable: {
3943 case Builtin::BI__builtin_powi:
3944 case Builtin::BI__builtin_powif:
3945 case Builtin::BI__builtin_powil: {
3949 if (
Builder.getIsFPConstrained()) {
3952 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
3959 { Src0->getType(), Src1->getType() });
3962 case Builtin::BI__builtin_frexpl: {
3966 if (&
getTarget().getLongDoubleFormat() == &llvm::APFloat::PPCDoubleDouble())
3970 case Builtin::BI__builtin_frexp:
3971 case Builtin::BI__builtin_frexpf:
3972 case Builtin::BI__builtin_frexpf128:
3973 case Builtin::BI__builtin_frexpf16:
3975 case Builtin::BI__builtin_isgreater:
3976 case Builtin::BI__builtin_isgreaterequal:
3977 case Builtin::BI__builtin_isless:
3978 case Builtin::BI__builtin_islessequal:
3979 case Builtin::BI__builtin_islessgreater:
3980 case Builtin::BI__builtin_isunordered: {
3983 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
3987 switch (BuiltinID) {
3988 default: llvm_unreachable(
"Unknown ordered comparison");
3989 case Builtin::BI__builtin_isgreater:
3990 LHS =
Builder.CreateFCmpOGT(LHS, RHS,
"cmp");
3992 case Builtin::BI__builtin_isgreaterequal:
3993 LHS =
Builder.CreateFCmpOGE(LHS, RHS,
"cmp");
3995 case Builtin::BI__builtin_isless:
3996 LHS =
Builder.CreateFCmpOLT(LHS, RHS,
"cmp");
3998 case Builtin::BI__builtin_islessequal:
3999 LHS =
Builder.CreateFCmpOLE(LHS, RHS,
"cmp");
4001 case Builtin::BI__builtin_islessgreater:
4002 LHS =
Builder.CreateFCmpONE(LHS, RHS,
"cmp");
4004 case Builtin::BI__builtin_isunordered:
4005 LHS =
Builder.CreateFCmpUNO(LHS, RHS,
"cmp");
4012 case Builtin::BI__builtin_isnan: {
4013 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4022 case Builtin::BI__builtin_issignaling: {
4023 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4030 case Builtin::BI__builtin_isinf: {
4031 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4040 case Builtin::BIfinite:
4041 case Builtin::BI__finite:
4042 case Builtin::BIfinitef:
4043 case Builtin::BI__finitef:
4044 case Builtin::BIfinitel:
4045 case Builtin::BI__finitel:
4046 case Builtin::BI__builtin_isfinite: {
4047 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4056 case Builtin::BI__builtin_isnormal: {
4057 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4064 case Builtin::BI__builtin_issubnormal: {
4065 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4068 Builder.CreateZExt(
Builder.createIsFPClass(
V, FPClassTest::fcSubnormal),
4072 case Builtin::BI__builtin_iszero: {
4073 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4080 case Builtin::BI__builtin_isfpclass: {
4085 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4091 case Builtin::BI__builtin_nondeterministic_value: {
4100 case Builtin::BI__builtin_elementwise_abs: {
4105 QT = VecTy->getElementType();
4109 Builder.getFalse(),
nullptr,
"elt.abs");
4111 Result = emitBuiltinWithOneOverloadedType<1>(
4112 *
this,
E, llvm::Intrinsic::fabs,
"elt.abs");
4116 case Builtin::BI__builtin_elementwise_acos:
4117 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4118 *
this,
E, llvm::Intrinsic::acos,
"elt.acos"));
4119 case Builtin::BI__builtin_elementwise_asin:
4120 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4121 *
this,
E, llvm::Intrinsic::asin,
"elt.asin"));
4122 case Builtin::BI__builtin_elementwise_atan:
4123 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4124 *
this,
E, llvm::Intrinsic::atan,
"elt.atan"));
4125 case Builtin::BI__builtin_elementwise_atan2:
4126 return RValue::get(emitBuiltinWithOneOverloadedType<2>(
4127 *
this,
E, llvm::Intrinsic::atan2,
"elt.atan2"));
4128 case Builtin::BI__builtin_elementwise_ceil:
4129 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4130 *
this,
E, llvm::Intrinsic::ceil,
"elt.ceil"));
4131 case Builtin::BI__builtin_elementwise_exp:
4132 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4133 *
this,
E, llvm::Intrinsic::exp,
"elt.exp"));
4134 case Builtin::BI__builtin_elementwise_exp2:
4135 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4136 *
this,
E, llvm::Intrinsic::exp2,
"elt.exp2"));
4137 case Builtin::BI__builtin_elementwise_log:
4138 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4139 *
this,
E, llvm::Intrinsic::log,
"elt.log"));
4140 case Builtin::BI__builtin_elementwise_log2:
4141 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4142 *
this,
E, llvm::Intrinsic::log2,
"elt.log2"));
4143 case Builtin::BI__builtin_elementwise_log10:
4144 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4145 *
this,
E, llvm::Intrinsic::log10,
"elt.log10"));
4146 case Builtin::BI__builtin_elementwise_pow: {
4148 emitBuiltinWithOneOverloadedType<2>(*
this,
E, llvm::Intrinsic::pow));
4150 case Builtin::BI__builtin_elementwise_bitreverse:
4151 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4152 *
this,
E, llvm::Intrinsic::bitreverse,
"elt.bitreverse"));
4153 case Builtin::BI__builtin_elementwise_cos:
4154 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4155 *
this,
E, llvm::Intrinsic::cos,
"elt.cos"));
4156 case Builtin::BI__builtin_elementwise_cosh:
4157 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4158 *
this,
E, llvm::Intrinsic::cosh,
"elt.cosh"));
4159 case Builtin::BI__builtin_elementwise_floor:
4160 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4161 *
this,
E, llvm::Intrinsic::floor,
"elt.floor"));
4162 case Builtin::BI__builtin_elementwise_popcount:
4163 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4164 *
this,
E, llvm::Intrinsic::ctpop,
"elt.ctpop"));
4165 case Builtin::BI__builtin_elementwise_roundeven:
4166 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4167 *
this,
E, llvm::Intrinsic::roundeven,
"elt.roundeven"));
4168 case Builtin::BI__builtin_elementwise_round:
4169 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4170 *
this,
E, llvm::Intrinsic::round,
"elt.round"));
4171 case Builtin::BI__builtin_elementwise_rint:
4172 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4173 *
this,
E, llvm::Intrinsic::rint,
"elt.rint"));
4174 case Builtin::BI__builtin_elementwise_nearbyint:
4175 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4176 *
this,
E, llvm::Intrinsic::nearbyint,
"elt.nearbyint"));
4177 case Builtin::BI__builtin_elementwise_sin:
4178 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4179 *
this,
E, llvm::Intrinsic::sin,
"elt.sin"));
4180 case Builtin::BI__builtin_elementwise_sinh:
4181 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4182 *
this,
E, llvm::Intrinsic::sinh,
"elt.sinh"));
4183 case Builtin::BI__builtin_elementwise_tan:
4184 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4185 *
this,
E, llvm::Intrinsic::tan,
"elt.tan"));
4186 case Builtin::BI__builtin_elementwise_tanh:
4187 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4188 *
this,
E, llvm::Intrinsic::tanh,
"elt.tanh"));
4189 case Builtin::BI__builtin_elementwise_trunc:
4190 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4191 *
this,
E, llvm::Intrinsic::trunc,
"elt.trunc"));
4192 case Builtin::BI__builtin_elementwise_canonicalize:
4193 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4194 *
this,
E, llvm::Intrinsic::canonicalize,
"elt.canonicalize"));
4195 case Builtin::BI__builtin_elementwise_copysign:
4196 return RValue::get(emitBuiltinWithOneOverloadedType<2>(
4197 *
this,
E, llvm::Intrinsic::copysign));
4198 case Builtin::BI__builtin_elementwise_fma:
4200 emitBuiltinWithOneOverloadedType<3>(*
this,
E, llvm::Intrinsic::fma));
4201 case Builtin::BI__builtin_elementwise_add_sat:
4202 case Builtin::BI__builtin_elementwise_sub_sat: {
4206 assert(Op0->
getType()->isIntOrIntVectorTy() &&
"integer type expected");
4209 Ty = VecTy->getElementType();
4212 if (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_add_sat)
4213 Opc = IsSigned ? llvm::Intrinsic::sadd_sat : llvm::Intrinsic::uadd_sat;
4215 Opc = IsSigned ? llvm::Intrinsic::ssub_sat : llvm::Intrinsic::usub_sat;
4216 Result =
Builder.CreateBinaryIntrinsic(Opc, Op0, Op1,
nullptr,
"elt.sat");
4220 case Builtin::BI__builtin_elementwise_max: {
4224 if (Op0->
getType()->isIntOrIntVectorTy()) {
4227 Ty = VecTy->getElementType();
4229 ? llvm::Intrinsic::smax
4230 : llvm::Intrinsic::umax,
4231 Op0, Op1,
nullptr,
"elt.max");
4236 case Builtin::BI__builtin_elementwise_min: {
4240 if (Op0->
getType()->isIntOrIntVectorTy()) {
4243 Ty = VecTy->getElementType();
4245 ? llvm::Intrinsic::smin
4246 : llvm::Intrinsic::umin,
4247 Op0, Op1,
nullptr,
"elt.min");
4253 case Builtin::BI__builtin_elementwise_maximum: {
4257 Op1,
nullptr,
"elt.maximum");
4261 case Builtin::BI__builtin_elementwise_minimum: {
4265 Op1,
nullptr,
"elt.minimum");
4269 case Builtin::BI__builtin_reduce_max: {
4270 auto GetIntrinsicID = [
this](
QualType QT) {
4272 QT = VecTy->getElementType();
4277 return llvm::Intrinsic::vector_reduce_smax;
4279 return llvm::Intrinsic::vector_reduce_umax;
4281 return llvm::Intrinsic::vector_reduce_fmax;
4283 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4284 *
this,
E, GetIntrinsicID(
E->getArg(0)->
getType()),
"rdx.min"));
4287 case Builtin::BI__builtin_reduce_min: {
4288 auto GetIntrinsicID = [
this](
QualType QT) {
4290 QT = VecTy->getElementType();
4295 return llvm::Intrinsic::vector_reduce_smin;
4297 return llvm::Intrinsic::vector_reduce_umin;
4299 return llvm::Intrinsic::vector_reduce_fmin;
4302 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4303 *
this,
E, GetIntrinsicID(
E->getArg(0)->
getType()),
"rdx.min"));
4306 case Builtin::BI__builtin_reduce_add:
4307 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4308 *
this,
E, llvm::Intrinsic::vector_reduce_add,
"rdx.add"));
4309 case Builtin::BI__builtin_reduce_mul:
4310 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4311 *
this,
E, llvm::Intrinsic::vector_reduce_mul,
"rdx.mul"));
4312 case Builtin::BI__builtin_reduce_xor:
4313 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4314 *
this,
E, llvm::Intrinsic::vector_reduce_xor,
"rdx.xor"));
4315 case Builtin::BI__builtin_reduce_or:
4316 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4317 *
this,
E, llvm::Intrinsic::vector_reduce_or,
"rdx.or"));
4318 case Builtin::BI__builtin_reduce_and:
4319 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4320 *
this,
E, llvm::Intrinsic::vector_reduce_and,
"rdx.and"));
4321 case Builtin::BI__builtin_reduce_maximum:
4322 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4323 *
this,
E, llvm::Intrinsic::vector_reduce_fmaximum,
"rdx.maximum"));
4324 case Builtin::BI__builtin_reduce_minimum:
4325 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4326 *
this,
E, llvm::Intrinsic::vector_reduce_fminimum,
"rdx.minimum"));
4328 case Builtin::BI__builtin_matrix_transpose: {
4332 Value *
Result = MB.CreateMatrixTranspose(MatValue, MatrixTy->getNumRows(),
4333 MatrixTy->getNumColumns());
4337 case Builtin::BI__builtin_matrix_column_major_load: {
4343 assert(PtrTy &&
"arg0 must be of pointer type");
4353 ResultTy->getNumRows(), ResultTy->getNumColumns(),
"matrix");
4357 case Builtin::BI__builtin_matrix_column_major_store: {
4365 assert(PtrTy &&
"arg1 must be of pointer type");
4374 MatrixTy->getNumRows(), MatrixTy->getNumColumns());
4378 case Builtin::BI__builtin_isinf_sign: {
4380 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4385 AbsArg, ConstantFP::getInfinity(Arg->
getType()),
"isinf");
4391 Value *NegativeOne = ConstantInt::get(
IntTy, -1);
4392 Value *SignResult =
Builder.CreateSelect(IsNeg, NegativeOne, One);
4397 case Builtin::BI__builtin_flt_rounds: {
4402 if (
Result->getType() != ResultType)
4408 case Builtin::BI__builtin_set_flt_rounds: {
4416 case Builtin::BI__builtin_fpclassify: {
4417 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4428 "fpclassify_result");
4432 Value *IsZero =
Builder.CreateFCmpOEQ(
V, Constant::getNullValue(Ty),
4436 Builder.CreateCondBr(IsZero, End, NotZero);
4440 Builder.SetInsertPoint(NotZero);
4444 Builder.CreateCondBr(IsNan, End, NotNan);
4445 Result->addIncoming(NanLiteral, NotZero);
4448 Builder.SetInsertPoint(NotNan);
4451 Builder.CreateFCmpOEQ(VAbs, ConstantFP::getInfinity(
V->getType()),
4455 Builder.CreateCondBr(IsInf, End, NotInf);
4456 Result->addIncoming(InfLiteral, NotNan);
4459 Builder.SetInsertPoint(NotInf);
4460 APFloat Smallest = APFloat::getSmallestNormalized(
4463 Builder.CreateFCmpUGE(VAbs, ConstantFP::get(
V->getContext(), Smallest),
4465 Value *NormalResult =
4469 Result->addIncoming(NormalResult, NotInf);
4482 case Builtin::BIalloca:
4483 case Builtin::BI_alloca:
4484 case Builtin::BI__builtin_alloca_uninitialized:
4485 case Builtin::BI__builtin_alloca: {
4489 const Align SuitableAlignmentInBytes =
4493 AllocaInst *AI =
Builder.CreateAlloca(
Builder.getInt8Ty(), Size);
4494 AI->setAlignment(SuitableAlignmentInBytes);
4495 if (BuiltinID != Builtin::BI__builtin_alloca_uninitialized)
4507 case Builtin::BI__builtin_alloca_with_align_uninitialized:
4508 case Builtin::BI__builtin_alloca_with_align: {
4511 auto *AlignmentInBitsCI = cast<ConstantInt>(AlignmentInBitsValue);
4512 unsigned AlignmentInBits = AlignmentInBitsCI->getZExtValue();
4513 const Align AlignmentInBytes =
4515 AllocaInst *AI =
Builder.CreateAlloca(
Builder.getInt8Ty(), Size);
4516 AI->setAlignment(AlignmentInBytes);
4517 if (BuiltinID != Builtin::BI__builtin_alloca_with_align_uninitialized)
4529 case Builtin::BIbzero:
4530 case Builtin::BI__builtin_bzero: {
4539 case Builtin::BIbcopy:
4540 case Builtin::BI__builtin_bcopy: {
4554 case Builtin::BImemcpy:
4555 case Builtin::BI__builtin_memcpy:
4556 case Builtin::BImempcpy:
4557 case Builtin::BI__builtin_mempcpy: {
4561 EmitArgCheck(
TCK_Store, Dest,
E->getArg(0), 0);
4562 EmitArgCheck(
TCK_Load, Src,
E->getArg(1), 1);
4564 if (BuiltinID == Builtin::BImempcpy ||
4565 BuiltinID == Builtin::BI__builtin_mempcpy)
4572 case Builtin::BI__builtin_memcpy_inline: {
4577 EmitArgCheck(
TCK_Store, Dest,
E->getArg(0), 0);
4578 EmitArgCheck(
TCK_Load, Src,
E->getArg(1), 1);
4583 case Builtin::BI__builtin_char_memchr:
4584 BuiltinID = Builtin::BI__builtin_memchr;
4587 case Builtin::BI__builtin___memcpy_chk: {
4594 llvm::APSInt DstSize = DstSizeResult.
Val.
getInt();
4595 if (
Size.ugt(DstSize))
4599 Value *SizeVal = llvm::ConstantInt::get(
Builder.getContext(), Size);
4604 case Builtin::BI__builtin_objc_memmove_collectable: {
4609 DestAddr, SrcAddr, SizeVal);
4613 case Builtin::BI__builtin___memmove_chk: {
4620 llvm::APSInt DstSize = DstSizeResult.
Val.
getInt();
4621 if (
Size.ugt(DstSize))
4625 Value *SizeVal = llvm::ConstantInt::get(
Builder.getContext(), Size);
4630 case Builtin::BImemmove:
4631 case Builtin::BI__builtin_memmove: {
4635 EmitArgCheck(
TCK_Store, Dest,
E->getArg(0), 0);
4636 EmitArgCheck(
TCK_Load, Src,
E->getArg(1), 1);
4640 case Builtin::BImemset:
4641 case Builtin::BI__builtin_memset: {
4651 case Builtin::BI__builtin_memset_inline: {
4663 case Builtin::BI__builtin___memset_chk: {
4670 llvm::APSInt DstSize = DstSizeResult.
Val.
getInt();
4671 if (
Size.ugt(DstSize))
4676 Value *SizeVal = llvm::ConstantInt::get(
Builder.getContext(), Size);
4680 case Builtin::BI__builtin_wmemchr: {
4683 if (!
getTarget().getTriple().isOSMSVCRT())
4691 BasicBlock *Entry =
Builder.GetInsertBlock();
4696 Builder.CreateCondBr(SizeEq0, Exit, CmpEq);
4700 StrPhi->addIncoming(Str, Entry);
4702 SizePhi->addIncoming(Size, Entry);
4706 Value *FoundChr =
Builder.CreateConstInBoundsGEP1_32(WCharTy, StrPhi, 0);
4708 Builder.CreateCondBr(StrEqChr, Exit, Next);
4711 Value *NextStr =
Builder.CreateConstInBoundsGEP1_32(WCharTy, StrPhi, 1);
4713 Value *NextSizeEq0 =
4714 Builder.CreateICmpEQ(NextSize, ConstantInt::get(
SizeTy, 0));
4715 Builder.CreateCondBr(NextSizeEq0, Exit, CmpEq);
4716 StrPhi->addIncoming(NextStr, Next);
4717 SizePhi->addIncoming(NextSize, Next);
4721 Ret->addIncoming(llvm::Constant::getNullValue(Str->
getType()), Entry);
4722 Ret->addIncoming(llvm::Constant::getNullValue(Str->
getType()), Next);
4723 Ret->addIncoming(FoundChr, CmpEq);
4726 case Builtin::BI__builtin_wmemcmp: {
4729 if (!
getTarget().getTriple().isOSMSVCRT())
4738 BasicBlock *Entry =
Builder.GetInsertBlock();
4744 Builder.CreateCondBr(SizeEq0, Exit, CmpGT);
4748 DstPhi->addIncoming(Dst, Entry);
4750 SrcPhi->addIncoming(Src, Entry);
4752 SizePhi->addIncoming(Size, Entry);
4758 Builder.CreateCondBr(DstGtSrc, Exit, CmpLT);
4762 Builder.CreateCondBr(DstLtSrc, Exit, Next);
4765 Value *NextDst =
Builder.CreateConstInBoundsGEP1_32(WCharTy, DstPhi, 1);
4766 Value *NextSrc =
Builder.CreateConstInBoundsGEP1_32(WCharTy, SrcPhi, 1);
4768 Value *NextSizeEq0 =
4769 Builder.CreateICmpEQ(NextSize, ConstantInt::get(
SizeTy, 0));
4770 Builder.CreateCondBr(NextSizeEq0, Exit, CmpGT);
4771 DstPhi->addIncoming(NextDst, Next);
4772 SrcPhi->addIncoming(NextSrc, Next);
4773 SizePhi->addIncoming(NextSize, Next);
4777 Ret->addIncoming(ConstantInt::get(
IntTy, 0), Entry);
4778 Ret->addIncoming(ConstantInt::get(
IntTy, 1), CmpGT);
4779 Ret->addIncoming(ConstantInt::get(
IntTy, -1), CmpLT);
4780 Ret->addIncoming(ConstantInt::get(
IntTy, 0), Next);
4783 case Builtin::BI__builtin_dwarf_cfa: {
4796 llvm::ConstantInt::get(
Int32Ty, Offset)));
4798 case Builtin::BI__builtin_return_address: {
4804 case Builtin::BI_ReturnAddress: {
4808 case Builtin::BI__builtin_frame_address: {
4814 case Builtin::BI__builtin_extract_return_addr: {
4819 case Builtin::BI__builtin_frob_return_addr: {
4824 case Builtin::BI__builtin_dwarf_sp_column: {
4825 llvm::IntegerType *Ty
4834 case Builtin::BI__builtin_init_dwarf_reg_size_table: {
4840 case Builtin::BI__builtin_eh_return: {
4844 llvm::IntegerType *
IntTy = cast<llvm::IntegerType>(
Int->getType());
4845 assert((
IntTy->getBitWidth() == 32 ||
IntTy->getBitWidth() == 64) &&
4846 "LLVM's __builtin_eh_return only supports 32- and 64-bit variants");
4849 : Intrinsic::eh_return_i64);
4858 case Builtin::BI__builtin_unwind_init: {
4863 case Builtin::BI__builtin_extend_pointer: {
4888 case Builtin::BI__builtin_setjmp: {
4892 if (
getTarget().getTriple().getArch() == llvm::Triple::systemz) {
4903 ConstantInt::get(
Int32Ty, 0));
4917 case Builtin::BI__builtin_longjmp: {
4931 case Builtin::BI__builtin_launder: {
4932 const Expr *Arg =
E->getArg(0);
4940 case Builtin::BI__sync_fetch_and_add:
4941 case Builtin::BI__sync_fetch_and_sub:
4942 case Builtin::BI__sync_fetch_and_or:
4943 case Builtin::BI__sync_fetch_and_and:
4944 case Builtin::BI__sync_fetch_and_xor:
4945 case Builtin::BI__sync_fetch_and_nand:
4946 case Builtin::BI__sync_add_and_fetch:
4947 case Builtin::BI__sync_sub_and_fetch:
4948 case Builtin::BI__sync_and_and_fetch:
4949 case Builtin::BI__sync_or_and_fetch:
4950 case Builtin::BI__sync_xor_and_fetch:
4951 case Builtin::BI__sync_nand_and_fetch:
4952 case Builtin::BI__sync_val_compare_and_swap:
4953 case Builtin::BI__sync_bool_compare_and_swap:
4954 case Builtin::BI__sync_lock_test_and_set:
4955 case Builtin::BI__sync_lock_release:
4956 case Builtin::BI__sync_swap:
4957 llvm_unreachable(
"Shouldn't make it through sema");
4958 case Builtin::BI__sync_fetch_and_add_1:
4959 case Builtin::BI__sync_fetch_and_add_2:
4960 case Builtin::BI__sync_fetch_and_add_4:
4961 case Builtin::BI__sync_fetch_and_add_8:
4962 case Builtin::BI__sync_fetch_and_add_16:
4964 case Builtin::BI__sync_fetch_and_sub_1:
4965 case Builtin::BI__sync_fetch_and_sub_2:
4966 case Builtin::BI__sync_fetch_and_sub_4:
4967 case Builtin::BI__sync_fetch_and_sub_8:
4968 case Builtin::BI__sync_fetch_and_sub_16:
4970 case Builtin::BI__sync_fetch_and_or_1:
4971 case Builtin::BI__sync_fetch_and_or_2:
4972 case Builtin::BI__sync_fetch_and_or_4:
4973 case Builtin::BI__sync_fetch_and_or_8:
4974 case Builtin::BI__sync_fetch_and_or_16:
4976 case Builtin::BI__sync_fetch_and_and_1:
4977 case Builtin::BI__sync_fetch_and_and_2:
4978 case Builtin::BI__sync_fetch_and_and_4:
4979 case Builtin::BI__sync_fetch_and_and_8:
4980 case Builtin::BI__sync_fetch_and_and_16:
4982 case Builtin::BI__sync_fetch_and_xor_1:
4983 case Builtin::BI__sync_fetch_and_xor_2:
4984 case Builtin::BI__sync_fetch_and_xor_4:
4985 case Builtin::BI__sync_fetch_and_xor_8:
4986 case Builtin::BI__sync_fetch_and_xor_16:
4988 case Builtin::BI__sync_fetch_and_nand_1:
4989 case Builtin::BI__sync_fetch_and_nand_2:
4990 case Builtin::BI__sync_fetch_and_nand_4:
4991 case Builtin::BI__sync_fetch_and_nand_8:
4992 case Builtin::BI__sync_fetch_and_nand_16:
4996 case Builtin::BI__sync_fetch_and_min:
4998 case Builtin::BI__sync_fetch_and_max:
5000 case Builtin::BI__sync_fetch_and_umin:
5002 case Builtin::BI__sync_fetch_and_umax:
5005 case Builtin::BI__sync_add_and_fetch_1:
5006 case Builtin::BI__sync_add_and_fetch_2:
5007 case Builtin::BI__sync_add_and_fetch_4:
5008 case Builtin::BI__sync_add_and_fetch_8:
5009 case Builtin::BI__sync_add_and_fetch_16:
5011 llvm::Instruction::Add);
5012 case Builtin::BI__sync_sub_and_fetch_1:
5013 case Builtin::BI__sync_sub_and_fetch_2:
5014 case Builtin::BI__sync_sub_and_fetch_4:
5015 case Builtin::BI__sync_sub_and_fetch_8:
5016 case Builtin::BI__sync_sub_and_fetch_16:
5018 llvm::Instruction::Sub);
5019 case Builtin::BI__sync_and_and_fetch_1:
5020 case Builtin::BI__sync_and_and_fetch_2:
5021 case Builtin::BI__sync_and_and_fetch_4:
5022 case Builtin::BI__sync_and_and_fetch_8:
5023 case Builtin::BI__sync_and_and_fetch_16:
5025 llvm::Instruction::And);
5026 case Builtin::BI__sync_or_and_fetch_1:
5027 case Builtin::BI__sync_or_and_fetch_2:
5028 case Builtin::BI__sync_or_and_fetch_4:
5029 case Builtin::BI__sync_or_and_fetch_8:
5030 case Builtin::BI__sync_or_and_fetch_16:
5032 llvm::Instruction::Or);
5033 case Builtin::BI__sync_xor_and_fetch_1:
5034 case Builtin::BI__sync_xor_and_fetch_2:
5035 case Builtin::BI__sync_xor_and_fetch_4:
5036 case Builtin::BI__sync_xor_and_fetch_8:
5037 case Builtin::BI__sync_xor_and_fetch_16:
5039 llvm::Instruction::Xor);
5040 case Builtin::BI__sync_nand_and_fetch_1:
5041 case Builtin::BI__sync_nand_and_fetch_2:
5042 case Builtin::BI__sync_nand_and_fetch_4:
5043 case Builtin::BI__sync_nand_and_fetch_8:
5044 case Builtin::BI__sync_nand_and_fetch_16:
5046 llvm::Instruction::And,
true);
5048 case Builtin::BI__sync_val_compare_and_swap_1:
5049 case Builtin::BI__sync_val_compare_and_swap_2:
5050 case Builtin::BI__sync_val_compare_and_swap_4:
5051 case Builtin::BI__sync_val_compare_and_swap_8:
5052 case Builtin::BI__sync_val_compare_and_swap_16:
5055 case Builtin::BI__sync_bool_compare_and_swap_1:
5056 case Builtin::BI__sync_bool_compare_and_swap_2:
5057 case Builtin::BI__sync_bool_compare_and_swap_4:
5058 case Builtin::BI__sync_bool_compare_and_swap_8:
5059 case Builtin::BI__sync_bool_compare_and_swap_16:
5062 case Builtin::BI__sync_swap_1:
5063 case Builtin::BI__sync_swap_2:
5064 case Builtin::BI__sync_swap_4:
5065 case Builtin::BI__sync_swap_8:
5066 case Builtin::BI__sync_swap_16:
5069 case Builtin::BI__sync_lock_test_and_set_1:
5070 case Builtin::BI__sync_lock_test_and_set_2:
5071 case Builtin::BI__sync_lock_test_and_set_4:
5072 case Builtin::BI__sync_lock_test_and_set_8:
5073 case Builtin::BI__sync_lock_test_and_set_16:
5076 case Builtin::BI__sync_lock_release_1:
5077 case Builtin::BI__sync_lock_release_2:
5078 case Builtin::BI__sync_lock_release_4:
5079 case Builtin::BI__sync_lock_release_8:
5080 case Builtin::BI__sync_lock_release_16: {
5086 llvm::StoreInst *
Store =
5088 Store->setAtomic(llvm::AtomicOrdering::Release);
5092 case Builtin::BI__sync_synchronize: {
5100 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent);
5104 case Builtin::BI__builtin_nontemporal_load:
5106 case Builtin::BI__builtin_nontemporal_store:
5108 case Builtin::BI__c11_atomic_is_lock_free:
5109 case Builtin::BI__atomic_is_lock_free: {
5113 const char *LibCallName =
"__atomic_is_lock_free";
5117 if (BuiltinID == Builtin::BI__atomic_is_lock_free)
5131 case Builtin::BI__atomic_test_and_set: {
5143 if (isa<llvm::ConstantInt>(Order)) {
5144 int ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
5145 AtomicRMWInst *
Result =
nullptr;
5150 llvm::AtomicOrdering::Monotonic);
5155 llvm::AtomicOrdering::Acquire);
5159 llvm::AtomicOrdering::Release);
5164 llvm::AtomicOrdering::AcquireRelease);
5168 llvm::AtomicRMWInst::Xchg, Ptr, NewVal,
5169 llvm::AtomicOrdering::SequentiallyConsistent);
5172 Result->setVolatile(Volatile);
5178 llvm::BasicBlock *BBs[5] = {
5185 llvm::AtomicOrdering Orders[5] = {
5186 llvm::AtomicOrdering::Monotonic, llvm::AtomicOrdering::Acquire,
5187 llvm::AtomicOrdering::Release, llvm::AtomicOrdering::AcquireRelease,
5188 llvm::AtomicOrdering::SequentiallyConsistent};
5190 Order =
Builder.CreateIntCast(Order,
Builder.getInt32Ty(),
false);
5191 llvm::SwitchInst *SI =
Builder.CreateSwitch(Order, BBs[0]);
5193 Builder.SetInsertPoint(ContBB);
5196 for (
unsigned i = 0; i < 5; ++i) {
5197 Builder.SetInsertPoint(BBs[i]);
5199 Ptr, NewVal, Orders[i]);
5200 RMW->setVolatile(Volatile);
5201 Result->addIncoming(RMW, BBs[i]);
5205 SI->addCase(
Builder.getInt32(0), BBs[0]);
5206 SI->addCase(
Builder.getInt32(1), BBs[1]);
5207 SI->addCase(
Builder.getInt32(2), BBs[1]);
5208 SI->addCase(
Builder.getInt32(3), BBs[2]);
5209 SI->addCase(
Builder.getInt32(4), BBs[3]);
5210 SI->addCase(
Builder.getInt32(5), BBs[4]);
5212 Builder.SetInsertPoint(ContBB);
5216 case Builtin::BI__atomic_clear: {
5225 if (isa<llvm::ConstantInt>(Order)) {
5226 int ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
5231 Store->setOrdering(llvm::AtomicOrdering::Monotonic);
5234 Store->setOrdering(llvm::AtomicOrdering::Release);
5237 Store->setOrdering(llvm::AtomicOrdering::SequentiallyConsistent);
5245 llvm::BasicBlock *BBs[3] = {
5250 llvm::AtomicOrdering Orders[3] = {
5251 llvm::AtomicOrdering::Monotonic, llvm::AtomicOrdering::Release,
5252 llvm::AtomicOrdering::SequentiallyConsistent};
5254 Order =
Builder.CreateIntCast(Order,
Builder.getInt32Ty(),
false);
5255 llvm::SwitchInst *SI =
Builder.CreateSwitch(Order, BBs[0]);
5257 for (
unsigned i = 0; i < 3; ++i) {
5258 Builder.SetInsertPoint(BBs[i]);
5260 Store->setOrdering(Orders[i]);
5264 SI->addCase(
Builder.getInt32(0), BBs[0]);
5265 SI->addCase(
Builder.getInt32(3), BBs[1]);
5266 SI->addCase(
Builder.getInt32(5), BBs[2]);
5268 Builder.SetInsertPoint(ContBB);
5272 case Builtin::BI__atomic_thread_fence:
5273 case Builtin::BI__atomic_signal_fence:
5274 case Builtin::BI__c11_atomic_thread_fence:
5275 case Builtin::BI__c11_atomic_signal_fence: {
5276 llvm::SyncScope::ID SSID;
5277 if (BuiltinID == Builtin::BI__atomic_signal_fence ||
5278 BuiltinID == Builtin::BI__c11_atomic_signal_fence)
5279 SSID = llvm::SyncScope::SingleThread;
5281 SSID = llvm::SyncScope::System;
5283 if (isa<llvm::ConstantInt>(Order)) {
5284 int ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
5291 Builder.CreateFence(llvm::AtomicOrdering::Acquire, SSID);
5294 Builder.CreateFence(llvm::AtomicOrdering::Release, SSID);
5297 Builder.CreateFence(llvm::AtomicOrdering::AcquireRelease, SSID);
5300 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent, SSID);
5306 llvm::BasicBlock *AcquireBB, *ReleaseBB, *AcqRelBB, *SeqCstBB;
5313 Order =
Builder.CreateIntCast(Order,
Builder.getInt32Ty(),
false);
5314 llvm::SwitchInst *SI =
Builder.CreateSwitch(Order, ContBB);
5316 Builder.SetInsertPoint(AcquireBB);
5317 Builder.CreateFence(llvm::AtomicOrdering::Acquire, SSID);
5319 SI->addCase(
Builder.getInt32(1), AcquireBB);
5320 SI->addCase(
Builder.getInt32(2), AcquireBB);
5322 Builder.SetInsertPoint(ReleaseBB);
5323 Builder.CreateFence(llvm::AtomicOrdering::Release, SSID);
5325 SI->addCase(
Builder.getInt32(3), ReleaseBB);
5327 Builder.SetInsertPoint(AcqRelBB);
5328 Builder.CreateFence(llvm::AtomicOrdering::AcquireRelease, SSID);
5330 SI->addCase(
Builder.getInt32(4), AcqRelBB);
5332 Builder.SetInsertPoint(SeqCstBB);
5333 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent, SSID);
5335 SI->addCase(
Builder.getInt32(5), SeqCstBB);
5337 Builder.SetInsertPoint(ContBB);
5340 case Builtin::BI__scoped_atomic_thread_fence: {
5345 auto Ord = dyn_cast<llvm::ConstantInt>(Order);
5346 auto Scp = dyn_cast<llvm::ConstantInt>(
Scope);
5348 SyncScope SS = ScopeModel->isValid(Scp->getZExtValue())
5349 ? ScopeModel->map(Scp->getZExtValue())
5350 : ScopeModel->map(ScopeModel->getFallBackValue());
5351 switch (Ord->getZExtValue()) {
5358 llvm::AtomicOrdering::Acquire,
5360 llvm::AtomicOrdering::Acquire,
5365 llvm::AtomicOrdering::Release,
5367 llvm::AtomicOrdering::Release,
5371 Builder.CreateFence(llvm::AtomicOrdering::AcquireRelease,
5374 llvm::AtomicOrdering::AcquireRelease,
5378 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent,
5381 llvm::AtomicOrdering::SequentiallyConsistent,
5393 switch (Ord->getZExtValue()) {
5396 ContBB->eraseFromParent();
5400 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5401 llvm::AtomicOrdering::Acquire);
5404 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5405 llvm::AtomicOrdering::Release);
5408 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5409 llvm::AtomicOrdering::AcquireRelease);
5412 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5413 llvm::AtomicOrdering::SequentiallyConsistent);
5422 Order =
Builder.CreateIntCast(Order,
Builder.getInt32Ty(),
false);
5423 llvm::SwitchInst *SI =
Builder.CreateSwitch(Order, ContBB);
5424 SI->addCase(
Builder.getInt32(1), AcquireBB);
5425 SI->addCase(
Builder.getInt32(2), AcquireBB);
5426 SI->addCase(
Builder.getInt32(3), ReleaseBB);
5427 SI->addCase(
Builder.getInt32(4), AcqRelBB);
5428 SI->addCase(
Builder.getInt32(5), SeqCstBB);
5430 OrderBBs.emplace_back(AcquireBB, llvm::AtomicOrdering::Acquire);
5431 OrderBBs.emplace_back(ReleaseBB, llvm::AtomicOrdering::Release);
5432 OrderBBs.emplace_back(AcqRelBB, llvm::AtomicOrdering::AcquireRelease);
5433 OrderBBs.emplace_back(SeqCstBB,
5434 llvm::AtomicOrdering::SequentiallyConsistent);
5437 for (
auto &[OrderBB, Ordering] : OrderBBs) {
5438 Builder.SetInsertPoint(OrderBB);
5440 SyncScope SS = ScopeModel->isValid(Scp->getZExtValue())
5441 ? ScopeModel->map(Scp->getZExtValue())
5442 : ScopeModel->map(ScopeModel->getFallBackValue());
5448 llvm::DenseMap<unsigned, llvm::BasicBlock *> BBs;
5449 for (
unsigned Scp : ScopeModel->getRuntimeValues())
5453 llvm::SwitchInst *SI =
Builder.CreateSwitch(SC, ContBB);
5454 for (
unsigned Scp : ScopeModel->getRuntimeValues()) {
5456 SI->addCase(
Builder.getInt32(Scp), B);
5467 Builder.SetInsertPoint(ContBB);
5471 case Builtin::BI__builtin_signbit:
5472 case Builtin::BI__builtin_signbitf:
5473 case Builtin::BI__builtin_signbitl: {
5478 case Builtin::BI__warn_memset_zero_len:
5480 case Builtin::BI__annotation: {
5483 for (
const Expr *Arg :
E->arguments()) {
5485 assert(Str->getCharByteWidth() == 2);
5486 StringRef WideBytes = Str->getBytes();
5487 std::string StrUtf8;
5488 if (!convertUTF16ToUTF8String(
5489 ArrayRef(WideBytes.data(), WideBytes.size()), StrUtf8)) {
5493 Strings.push_back(llvm::MDString::get(
getLLVMContext(), StrUtf8));
5503 case Builtin::BI__builtin_annotation: {
5512 StringRef Str = cast<StringLiteral>(AnnotationStrExpr)->getString();
5516 case Builtin::BI__builtin_addcb:
5517 case Builtin::BI__builtin_addcs:
5518 case Builtin::BI__builtin_addc:
5519 case Builtin::BI__builtin_addcl:
5520 case Builtin::BI__builtin_addcll:
5521 case Builtin::BI__builtin_subcb:
5522 case Builtin::BI__builtin_subcs:
5523 case Builtin::BI__builtin_subc:
5524 case Builtin::BI__builtin_subcl:
5525 case Builtin::BI__builtin_subcll: {
5551 llvm::Intrinsic::ID IntrinsicId;
5552 switch (BuiltinID) {
5553 default: llvm_unreachable(
"Unknown multiprecision builtin id.");
5554 case Builtin::BI__builtin_addcb:
5555 case Builtin::BI__builtin_addcs:
5556 case Builtin::BI__builtin_addc:
5557 case Builtin::BI__builtin_addcl:
5558 case Builtin::BI__builtin_addcll:
5559 IntrinsicId = llvm::Intrinsic::uadd_with_overflow;
5561 case Builtin::BI__builtin_subcb:
5562 case Builtin::BI__builtin_subcs:
5563 case Builtin::BI__builtin_subc:
5564 case Builtin::BI__builtin_subcl:
5565 case Builtin::BI__builtin_subcll:
5566 IntrinsicId = llvm::Intrinsic::usub_with_overflow;
5571 llvm::Value *Carry1;
5574 llvm::Value *Carry2;
5576 Sum1, Carryin, Carry2);
5577 llvm::Value *CarryOut =
Builder.CreateZExt(
Builder.CreateOr(Carry1, Carry2),
5583 case Builtin::BI__builtin_add_overflow:
5584 case Builtin::BI__builtin_sub_overflow:
5585 case Builtin::BI__builtin_mul_overflow: {
5593 WidthAndSignedness LeftInfo =
5595 WidthAndSignedness RightInfo =
5597 WidthAndSignedness ResultInfo =
5604 RightInfo, ResultArg, ResultQTy,
5610 *
this, LeftArg, LeftInfo, RightArg, RightInfo, ResultArg, ResultQTy,
5613 WidthAndSignedness EncompassingInfo =
5616 llvm::Type *EncompassingLLVMTy =
5621 llvm::Intrinsic::ID IntrinsicId;
5622 switch (BuiltinID) {
5624 llvm_unreachable(
"Unknown overflow builtin id.");
5625 case Builtin::BI__builtin_add_overflow:
5626 IntrinsicId = EncompassingInfo.Signed
5627 ? llvm::Intrinsic::sadd_with_overflow
5628 : llvm::Intrinsic::uadd_with_overflow;
5630 case Builtin::BI__builtin_sub_overflow:
5631 IntrinsicId = EncompassingInfo.Signed
5632 ? llvm::Intrinsic::ssub_with_overflow
5633 : llvm::Intrinsic::usub_with_overflow;
5635 case Builtin::BI__builtin_mul_overflow:
5636 IntrinsicId = EncompassingInfo.Signed
5637 ? llvm::Intrinsic::smul_with_overflow
5638 : llvm::Intrinsic::umul_with_overflow;
5647 Left =
Builder.CreateIntCast(Left, EncompassingLLVMTy, LeftInfo.Signed);
5648 Right =
Builder.CreateIntCast(Right, EncompassingLLVMTy, RightInfo.Signed);
5651 llvm::Value *Overflow, *
Result;
5654 if (EncompassingInfo.Width > ResultInfo.Width) {
5657 llvm::Value *ResultTrunc =
Builder.CreateTrunc(
Result, ResultLLVMTy);
5661 llvm::Value *ResultTruncExt =
Builder.CreateIntCast(
5662 ResultTrunc, EncompassingLLVMTy, ResultInfo.Signed);
5663 llvm::Value *TruncationOverflow =
5666 Overflow =
Builder.CreateOr(Overflow, TruncationOverflow);
5678 case Builtin::BI__builtin_uadd_overflow:
5679 case Builtin::BI__builtin_uaddl_overflow:
5680 case Builtin::BI__builtin_uaddll_overflow:
5681 case Builtin::BI__builtin_usub_overflow:
5682 case Builtin::BI__builtin_usubl_overflow:
5683 case Builtin::BI__builtin_usubll_overflow:
5684 case Builtin::BI__builtin_umul_overflow:
5685 case Builtin::BI__builtin_umull_overflow:
5686 case Builtin::BI__builtin_umulll_overflow:
5687 case Builtin::BI__builtin_sadd_overflow:
5688 case Builtin::BI__builtin_saddl_overflow:
5689 case Builtin::BI__builtin_saddll_overflow:
5690 case Builtin::BI__builtin_ssub_overflow:
5691 case Builtin::BI__builtin_ssubl_overflow:
5692 case Builtin::BI__builtin_ssubll_overflow:
5693 case Builtin::BI__builtin_smul_overflow:
5694 case Builtin::BI__builtin_smull_overflow:
5695 case Builtin::BI__builtin_smulll_overflow: {
5705 llvm::Intrinsic::ID IntrinsicId;
5706 switch (BuiltinID) {
5707 default: llvm_unreachable(
"Unknown overflow builtin id.");
5708 case Builtin::BI__builtin_uadd_overflow:
5709 case Builtin::BI__builtin_uaddl_overflow:
5710 case Builtin::BI__builtin_uaddll_overflow:
5711 IntrinsicId = llvm::Intrinsic::uadd_with_overflow;
5713 case Builtin::BI__builtin_usub_overflow:
5714 case Builtin::BI__builtin_usubl_overflow:
5715 case Builtin::BI__builtin_usubll_overflow:
5716 IntrinsicId = llvm::Intrinsic::usub_with_overflow;
5718 case Builtin::BI__builtin_umul_overflow:
5719 case Builtin::BI__builtin_umull_overflow:
5720 case Builtin::BI__builtin_umulll_overflow:
5721 IntrinsicId = llvm::Intrinsic::umul_with_overflow;
5723 case Builtin::BI__builtin_sadd_overflow:
5724 case Builtin::BI__builtin_saddl_overflow:
5725 case Builtin::BI__builtin_saddll_overflow:
5726 IntrinsicId = llvm::Intrinsic::sadd_with_overflow;
5728 case Builtin::BI__builtin_ssub_overflow:
5729 case Builtin::BI__builtin_ssubl_overflow:
5730 case Builtin::BI__builtin_ssubll_overflow:
5731 IntrinsicId = llvm::Intrinsic::ssub_with_overflow;
5733 case Builtin::BI__builtin_smul_overflow:
5734 case Builtin::BI__builtin_smull_overflow:
5735 case Builtin::BI__builtin_smulll_overflow:
5736 IntrinsicId = llvm::Intrinsic::smul_with_overflow;
5747 case Builtin::BIaddressof:
5748 case Builtin::BI__addressof:
5749 case Builtin::BI__builtin_addressof:
5751 case Builtin::BI__builtin_function_start:
5754 case Builtin::BI__builtin_operator_new:
5757 case Builtin::BI__builtin_operator_delete:
5762 case Builtin::BI__builtin_is_aligned:
5764 case Builtin::BI__builtin_align_up:
5766 case Builtin::BI__builtin_align_down:
5769 case Builtin::BI__noop:
5772 case Builtin::BI__builtin_call_with_static_chain: {
5774 const Expr *Chain =
E->getArg(1);
5779 case Builtin::BI_InterlockedExchange8:
5780 case Builtin::BI_InterlockedExchange16:
5781 case Builtin::BI_InterlockedExchange:
5782 case Builtin::BI_InterlockedExchangePointer:
5785 case Builtin::BI_InterlockedCompareExchangePointer:
5788 case Builtin::BI_InterlockedCompareExchangePointer_nf:
5791 case Builtin::BI_InterlockedCompareExchange8:
5792 case Builtin::BI_InterlockedCompareExchange16:
5793 case Builtin::BI_InterlockedCompareExchange:
5794 case Builtin::BI_InterlockedCompareExchange64:
5796 case Builtin::BI_InterlockedIncrement16:
5797 case Builtin::BI_InterlockedIncrement:
5800 case Builtin::BI_InterlockedDecrement16:
5801 case Builtin::BI_InterlockedDecrement:
5804 case Builtin::BI_InterlockedAnd8:
5805 case Builtin::BI_InterlockedAnd16:
5806 case Builtin::BI_InterlockedAnd:
5808 case Builtin::BI_InterlockedExchangeAdd8:
5809 case Builtin::BI_InterlockedExchangeAdd16:
5810 case Builtin::BI_InterlockedExchangeAdd:
5813 case Builtin::BI_InterlockedExchangeSub8:
5814 case Builtin::BI_InterlockedExchangeSub16:
5815 case Builtin::BI_InterlockedExchangeSub:
5818 case Builtin::BI_InterlockedOr8:
5819 case Builtin::BI_InterlockedOr16:
5820 case Builtin::BI_InterlockedOr:
5822 case Builtin::BI_InterlockedXor8:
5823 case Builtin::BI_InterlockedXor16:
5824 case Builtin::BI_InterlockedXor:
5827 case Builtin::BI_bittest64:
5828 case Builtin::BI_bittest:
5829 case Builtin::BI_bittestandcomplement64:
5830 case Builtin::BI_bittestandcomplement:
5831 case Builtin::BI_bittestandreset64:
5832 case Builtin::BI_bittestandreset:
5833 case Builtin::BI_bittestandset64:
5834 case Builtin::BI_bittestandset:
5835 case Builtin::BI_interlockedbittestandreset:
5836 case Builtin::BI_interlockedbittestandreset64:
5837 case Builtin::BI_interlockedbittestandset64:
5838 case Builtin::BI_interlockedbittestandset:
5839 case Builtin::BI_interlockedbittestandset_acq:
5840 case Builtin::BI_interlockedbittestandset_rel:
5841 case Builtin::BI_interlockedbittestandset_nf:
5842 case Builtin::BI_interlockedbittestandreset_acq:
5843 case Builtin::BI_interlockedbittestandreset_rel:
5844 case Builtin::BI_interlockedbittestandreset_nf:
5849 case Builtin::BI__iso_volatile_load8:
5850 case Builtin::BI__iso_volatile_load16:
5851 case Builtin::BI__iso_volatile_load32:
5852 case Builtin::BI__iso_volatile_load64:
5854 case Builtin::BI__iso_volatile_store8:
5855 case Builtin::BI__iso_volatile_store16:
5856 case Builtin::BI__iso_volatile_store32:
5857 case Builtin::BI__iso_volatile_store64:
5860 case Builtin::BI__builtin_ptrauth_sign_constant:
5863 case Builtin::BI__builtin_ptrauth_auth:
5864 case Builtin::BI__builtin_ptrauth_auth_and_resign:
5865 case Builtin::BI__builtin_ptrauth_blend_discriminator:
5866 case Builtin::BI__builtin_ptrauth_sign_generic_data:
5867 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
5868 case Builtin::BI__builtin_ptrauth_strip: {
5871 for (
auto argExpr :
E->arguments())
5875 llvm::Type *OrigValueType = Args[0]->getType();
5876 if (OrigValueType->isPointerTy())
5879 switch (BuiltinID) {
5880 case Builtin::BI__builtin_ptrauth_auth_and_resign:
5881 if (Args[4]->getType()->isPointerTy())
5885 case Builtin::BI__builtin_ptrauth_auth:
5886 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
5887 if (Args[2]->getType()->isPointerTy())
5891 case Builtin::BI__builtin_ptrauth_sign_generic_data:
5892 if (Args[1]->getType()->isPointerTy())
5896 case Builtin::BI__builtin_ptrauth_blend_discriminator:
5897 case Builtin::BI__builtin_ptrauth_strip:
5902 auto IntrinsicID = [&]() ->
unsigned {
5903 switch (BuiltinID) {
5904 case Builtin::BI__builtin_ptrauth_auth:
5905 return llvm::Intrinsic::ptrauth_auth;
5906 case Builtin::BI__builtin_ptrauth_auth_and_resign:
5907 return llvm::Intrinsic::ptrauth_resign;
5908 case Builtin::BI__builtin_ptrauth_blend_discriminator:
5909 return llvm::Intrinsic::ptrauth_blend;
5910 case Builtin::BI__builtin_ptrauth_sign_generic_data:
5911 return llvm::Intrinsic::ptrauth_sign_generic;
5912 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
5913 return llvm::Intrinsic::ptrauth_sign;
5914 case Builtin::BI__builtin_ptrauth_strip:
5915 return llvm::Intrinsic::ptrauth_strip;
5917 llvm_unreachable(
"bad ptrauth intrinsic");
5922 if (BuiltinID != Builtin::BI__builtin_ptrauth_sign_generic_data &&
5923 BuiltinID != Builtin::BI__builtin_ptrauth_blend_discriminator &&
5924 OrigValueType->isPointerTy()) {
5930 case Builtin::BI__exception_code:
5931 case Builtin::BI_exception_code:
5933 case Builtin::BI__exception_info:
5934 case Builtin::BI_exception_info:
5936 case Builtin::BI__abnormal_termination:
5937 case Builtin::BI_abnormal_termination:
5939 case Builtin::BI_setjmpex:
5940 if (
getTarget().getTriple().isOSMSVCRT() &&
E->getNumArgs() == 1 &&
5944 case Builtin::BI_setjmp:
5945 if (
getTarget().getTriple().isOSMSVCRT() &&
E->getNumArgs() == 1 &&
5947 if (
getTarget().getTriple().getArch() == llvm::Triple::x86)
5949 else if (
getTarget().getTriple().getArch() == llvm::Triple::aarch64)
5956 case Builtin::BImove:
5957 case Builtin::BImove_if_noexcept:
5958 case Builtin::BIforward:
5959 case Builtin::BIforward_like:
5960 case Builtin::BIas_const:
5962 case Builtin::BI__GetExceptionInfo: {
5963 if (llvm::GlobalVariable *GV =
5969 case Builtin::BI__fastfail:
5972 case Builtin::BI__builtin_coro_id:
5974 case Builtin::BI__builtin_coro_promise:
5976 case Builtin::BI__builtin_coro_resume:
5979 case Builtin::BI__builtin_coro_frame:
5981 case Builtin::BI__builtin_coro_noop:
5983 case Builtin::BI__builtin_coro_free:
5985 case Builtin::BI__builtin_coro_destroy:
5988 case Builtin::BI__builtin_coro_done:
5990 case Builtin::BI__builtin_coro_alloc:
5992 case Builtin::BI__builtin_coro_begin:
5994 case Builtin::BI__builtin_coro_end:
5996 case Builtin::BI__builtin_coro_suspend:
5998 case Builtin::BI__builtin_coro_size:
6000 case Builtin::BI__builtin_coro_align:
6004 case Builtin::BIread_pipe:
6005 case Builtin::BIwrite_pipe: {
6009 Value *PacketSize = OpenCLRT.getPipeElemSize(
E->getArg(0));
6010 Value *PacketAlign = OpenCLRT.getPipeElemAlign(
E->getArg(0));
6013 unsigned GenericAS =
6015 llvm::Type *I8PTy = llvm::PointerType::get(
getLLVMContext(), GenericAS);
6018 if (2U ==
E->getNumArgs()) {
6019 const char *Name = (BuiltinID == Builtin::BIread_pipe) ?
"__read_pipe_2"
6024 llvm::FunctionType *FTy = llvm::FunctionType::get(
6029 {Arg0, ACast, PacketSize, PacketAlign}));
6031 assert(4 ==
E->getNumArgs() &&
6032 "Illegal number of parameters to pipe function");
6033 const char *Name = (BuiltinID == Builtin::BIread_pipe) ?
"__read_pipe_4"
6040 llvm::FunctionType *FTy = llvm::FunctionType::get(
6049 {Arg0, Arg1, Arg2, ACast, PacketSize, PacketAlign}));
6054 case Builtin::BIreserve_read_pipe:
6055 case Builtin::BIreserve_write_pipe:
6056 case Builtin::BIwork_group_reserve_read_pipe:
6057 case Builtin::BIwork_group_reserve_write_pipe:
6058 case Builtin::BIsub_group_reserve_read_pipe:
6059 case Builtin::BIsub_group_reserve_write_pipe: {
6062 if (BuiltinID == Builtin::BIreserve_read_pipe)
6063 Name =
"__reserve_read_pipe";
6064 else if (BuiltinID == Builtin::BIreserve_write_pipe)
6065 Name =
"__reserve_write_pipe";
6066 else if (BuiltinID == Builtin::BIwork_group_reserve_read_pipe)
6067 Name =
"__work_group_reserve_read_pipe";
6068 else if (BuiltinID == Builtin::BIwork_group_reserve_write_pipe)
6069 Name =
"__work_group_reserve_write_pipe";
6070 else if (BuiltinID == Builtin::BIsub_group_reserve_read_pipe)
6071 Name =
"__sub_group_reserve_read_pipe";
6073 Name =
"__sub_group_reserve_write_pipe";
6079 Value *PacketSize = OpenCLRT.getPipeElemSize(
E->getArg(0));
6080 Value *PacketAlign = OpenCLRT.getPipeElemAlign(
E->getArg(0));
6084 llvm::FunctionType *FTy = llvm::FunctionType::get(
6091 {Arg0, Arg1, PacketSize, PacketAlign}));
6095 case Builtin::BIcommit_read_pipe:
6096 case Builtin::BIcommit_write_pipe:
6097 case Builtin::BIwork_group_commit_read_pipe:
6098 case Builtin::BIwork_group_commit_write_pipe:
6099 case Builtin::BIsub_group_commit_read_pipe:
6100 case Builtin::BIsub_group_commit_write_pipe: {
6102 if (BuiltinID == Builtin::BIcommit_read_pipe)
6103 Name =
"__commit_read_pipe";
6104 else if (BuiltinID == Builtin::BIcommit_write_pipe)
6105 Name =
"__commit_write_pipe";
6106 else if (BuiltinID == Builtin::BIwork_group_commit_read_pipe)
6107 Name =
"__work_group_commit_read_pipe";
6108 else if (BuiltinID == Builtin::BIwork_group_commit_write_pipe)
6109 Name =
"__work_group_commit_write_pipe";
6110 else if (BuiltinID == Builtin::BIsub_group_commit_read_pipe)
6111 Name =
"__sub_group_commit_read_pipe";
6113 Name =
"__sub_group_commit_write_pipe";
6118 Value *PacketSize = OpenCLRT.getPipeElemSize(
E->getArg(0));
6119 Value *PacketAlign = OpenCLRT.getPipeElemAlign(
E->getArg(0));
6123 llvm::FunctionType *FTy =
6128 {Arg0, Arg1, PacketSize, PacketAlign}));
6131 case Builtin::BIget_pipe_num_packets:
6132 case Builtin::BIget_pipe_max_packets: {
6133 const char *BaseName;
6135 if (BuiltinID == Builtin::BIget_pipe_num_packets)
6136 BaseName =
"__get_pipe_num_packets";
6138 BaseName =
"__get_pipe_max_packets";
6139 std::string Name = std::string(BaseName) +
6140 std::string(PipeTy->isReadOnly() ?
"_ro" :
"_wo");
6145 Value *PacketSize = OpenCLRT.getPipeElemSize(
E->getArg(0));
6146 Value *PacketAlign = OpenCLRT.getPipeElemAlign(
E->getArg(0));
6148 llvm::FunctionType *FTy = llvm::FunctionType::get(
6152 {Arg0, PacketSize, PacketAlign}));
6156 case Builtin::BIto_global:
6157 case Builtin::BIto_local:
6158 case Builtin::BIto_private: {
6160 auto NewArgT = llvm::PointerType::get(
6163 auto NewRetT = llvm::PointerType::get(
6167 auto FTy = llvm::FunctionType::get(NewRetT, {NewArgT},
false);
6168 llvm::Value *NewArg;
6169 if (Arg0->
getType()->getPointerAddressSpace() !=
6170 NewArgT->getPointerAddressSpace())
6173 NewArg =
Builder.CreateBitOrPointerCast(Arg0, NewArgT);
6174 auto NewName = std::string(
"__") +
E->getDirectCallee()->getName().str();
6189 case Builtin::BIenqueue_kernel: {
6191 unsigned NumArgs =
E->getNumArgs();
6194 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6206 Name =
"__enqueue_kernel_basic";
6207 llvm::Type *ArgTys[] = {QueueTy,
Int32Ty, RangeTy, GenericVoidPtrTy,
6209 llvm::FunctionType *FTy = llvm::FunctionType::get(
6215 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6216 llvm::Value *
Block =
6217 Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6220 {Queue, Flags, Range, Kernel, Block});
6223 assert(NumArgs >= 5 &&
"Invalid enqueue_kernel signature");
6227 auto CreateArrayForSizeVar = [=](
unsigned First)
6228 -> std::tuple<llvm::Value *, llvm::Value *, llvm::Value *> {
6229 llvm::APInt ArraySize(32, NumArgs -
First);
6231 getContext().getSizeType(), ArraySize,
nullptr,
6235 llvm::Value *TmpPtr = Tmp.getPointer();
6240 llvm::Value *Alloca = TmpPtr->stripPointerCasts();
6243 llvm::Value *ElemPtr;
6246 auto *
Zero = llvm::ConstantInt::get(
IntTy, 0);
6247 for (
unsigned I =
First; I < NumArgs; ++I) {
6248 auto *Index = llvm::ConstantInt::get(
IntTy, I -
First);
6260 return std::tie(ElemPtr, TmpSize, Alloca);
6266 Name =
"__enqueue_kernel_varargs";
6270 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6271 auto *
Block =
Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6272 llvm::Value *ElemPtr, *TmpSize, *TmpPtr;
6273 std::tie(ElemPtr, TmpSize, TmpPtr) = CreateArrayForSizeVar(4);
6277 llvm::Value *
const Args[] = {Queue, Flags,
6281 llvm::Type *
const ArgTys[] = {
6282 QueueTy,
IntTy, RangeTy, GenericVoidPtrTy,
6283 GenericVoidPtrTy,
IntTy, ElemPtr->getType()};
6285 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6294 llvm::PointerType *PtrTy = llvm::PointerType::get(
6298 llvm::Value *NumEvents =
6304 llvm::Value *EventWaitList =
nullptr;
6307 EventWaitList = llvm::ConstantPointerNull::get(PtrTy);
6314 EventWaitList =
Builder.CreatePointerCast(EventWaitList, PtrTy);
6316 llvm::Value *EventRet =
nullptr;
6319 EventRet = llvm::ConstantPointerNull::get(PtrTy);
6328 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6329 llvm::Value *
Block =
6330 Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6332 std::vector<llvm::Type *> ArgTys = {
6334 PtrTy, PtrTy, GenericVoidPtrTy, GenericVoidPtrTy};
6336 std::vector<llvm::Value *> Args = {Queue, Flags,
Range,
6337 NumEvents, EventWaitList, EventRet,
6342 Name =
"__enqueue_kernel_basic_events";
6343 llvm::FunctionType *FTy = llvm::FunctionType::get(
6351 Args.push_back(ConstantInt::get(
Int32Ty, NumArgs - 7));
6353 Name =
"__enqueue_kernel_events_varargs";
6355 llvm::Value *ElemPtr, *TmpSize, *TmpPtr;
6356 std::tie(ElemPtr, TmpSize, TmpPtr) = CreateArrayForSizeVar(7);
6357 Args.push_back(ElemPtr);
6358 ArgTys.push_back(ElemPtr->getType());
6360 llvm::FunctionType *FTy = llvm::FunctionType::get(
6369 llvm_unreachable(
"Unexpected enqueue_kernel signature");
6373 case Builtin::BIget_kernel_work_group_size: {
6374 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6379 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6380 Value *Arg =
Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6383 llvm::FunctionType::get(
IntTy, {GenericVoidPtrTy, GenericVoidPtrTy},
6385 "__get_kernel_work_group_size_impl"),
6388 case Builtin::BIget_kernel_preferred_work_group_size_multiple: {
6389 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6394 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6395 Value *Arg =
Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6398 llvm::FunctionType::get(
IntTy, {GenericVoidPtrTy, GenericVoidPtrTy},
6400 "__get_kernel_preferred_work_group_size_multiple_impl"),
6403 case Builtin::BIget_kernel_max_sub_group_size_for_ndrange:
6404 case Builtin::BIget_kernel_sub_group_count_for_ndrange: {
6405 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6412 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6415 BuiltinID == Builtin::BIget_kernel_max_sub_group_size_for_ndrange
6416 ?
"__get_kernel_max_sub_group_size_for_ndrange_impl"
6417 :
"__get_kernel_sub_group_count_for_ndrange_impl";
6420 llvm::FunctionType::get(
6421 IntTy, {NDRange->getType(), GenericVoidPtrTy, GenericVoidPtrTy},
6424 {NDRange, Kernel, Block}));
6426 case Builtin::BI__builtin_store_half:
6427 case Builtin::BI__builtin_store_halff: {
6434 case Builtin::BI__builtin_load_half: {
6439 case Builtin::BI__builtin_load_halff: {
6444 case Builtin::BI__builtin_printf:
6445 case Builtin::BIprintf:
6446 if (
getTarget().getTriple().isNVPTX() ||
6449 getTarget().getTriple().getVendor() == Triple::VendorType::AMD)) {
6452 if ((
getTarget().getTriple().isAMDGCN() ||
6459 case Builtin::BI__builtin_canonicalize:
6460 case Builtin::BI__builtin_canonicalizef:
6461 case Builtin::BI__builtin_canonicalizef16:
6462 case Builtin::BI__builtin_canonicalizel:
6464 emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::canonicalize));
6466 case Builtin::BI__builtin_thread_pointer: {
6467 if (!
getContext().getTargetInfo().isTLSSupported())
6472 case Builtin::BI__builtin_os_log_format:
6475 case Builtin::BI__xray_customevent: {
6488 auto FTy = F->getFunctionType();
6489 auto Arg0 =
E->getArg(0);
6491 auto Arg0Ty = Arg0->
getType();
6492 auto PTy0 = FTy->getParamType(0);
6493 if (PTy0 != Arg0Val->getType()) {
6494 if (Arg0Ty->isArrayType())
6497 Arg0Val =
Builder.CreatePointerCast(Arg0Val, PTy0);
6500 auto PTy1 = FTy->getParamType(1);
6502 Arg1 =
Builder.CreateTruncOrBitCast(Arg1, PTy1);
6506 case Builtin::BI__xray_typedevent: {
6522 auto FTy = F->getFunctionType();
6524 auto PTy0 = FTy->getParamType(0);
6526 Arg0 =
Builder.CreateTruncOrBitCast(Arg0, PTy0);
6527 auto Arg1 =
E->getArg(1);
6529 auto Arg1Ty = Arg1->
getType();
6530 auto PTy1 = FTy->getParamType(1);
6531 if (PTy1 != Arg1Val->getType()) {
6532 if (Arg1Ty->isArrayType())
6535 Arg1Val =
Builder.CreatePointerCast(Arg1Val, PTy1);
6538 auto PTy2 = FTy->getParamType(2);
6540 Arg2 =
Builder.CreateTruncOrBitCast(Arg2, PTy2);
6544 case Builtin::BI__builtin_ms_va_start:
6545 case Builtin::BI__builtin_ms_va_end:
6548 BuiltinID == Builtin::BI__builtin_ms_va_start));
6550 case Builtin::BI__builtin_ms_va_copy: {
6567 case Builtin::BI__builtin_get_device_side_mangled_name: {
6595 LargestVectorWidth = std::max(LargestVectorWidth, VectorWidth);
6599 Intrinsic::ID IntrinsicID = Intrinsic::not_intrinsic;
6601 llvm::Triple::getArchTypePrefix(
getTarget().getTriple().getArch());
6602 if (!Prefix.empty()) {
6603 IntrinsicID = Intrinsic::getIntrinsicForClangBuiltin(Prefix.data(), Name);
6604 if (IntrinsicID == Intrinsic::not_intrinsic && Prefix ==
"spv" &&
6605 getTarget().getTriple().getOS() == llvm::Triple::OSType::AMDHSA)
6606 IntrinsicID = Intrinsic::getIntrinsicForClangBuiltin(
"amdgcn", Name);
6610 if (IntrinsicID == Intrinsic::not_intrinsic)
6611 IntrinsicID = Intrinsic::getIntrinsicForMSBuiltin(Prefix.data(), Name);
6614 if (IntrinsicID != Intrinsic::not_intrinsic) {
6619 unsigned ICEArguments = 0;
6625 llvm::FunctionType *FTy = F->getFunctionType();
6627 for (
unsigned i = 0, e =
E->getNumArgs(); i != e; ++i) {
6631 llvm::Type *PTy = FTy->getParamType(i);
6632 if (PTy != ArgValue->
getType()) {
6634 if (
auto *PtrTy = dyn_cast<llvm::PointerType>(PTy)) {
6635 if (PtrTy->getAddressSpace() !=
6636 ArgValue->
getType()->getPointerAddressSpace()) {
6639 PtrTy->getAddressSpace()));
6645 if (PTy->isX86_AMXTy())
6646 ArgValue =
Builder.CreateIntrinsic(Intrinsic::x86_cast_vector_to_tile,
6647 {ArgValue->
getType()}, {ArgValue});
6649 ArgValue =
Builder.CreateBitCast(ArgValue, PTy);
6652 Args.push_back(ArgValue);
6658 llvm::Type *RetTy =
VoidTy;
6662 if (RetTy !=
V->getType()) {
6664 if (
auto *PtrTy = dyn_cast<llvm::PointerType>(RetTy)) {
6665 if (PtrTy->getAddressSpace() !=
V->getType()->getPointerAddressSpace()) {
6668 PtrTy->getAddressSpace()));
6674 if (
V->getType()->isX86_AMXTy())
6675 V =
Builder.CreateIntrinsic(Intrinsic::x86_cast_tile_to_vector, {RetTy},
6681 if (RetTy->isVoidTy())
6701 if (
V->getType()->isVoidTy())
6708 llvm_unreachable(
"No current target builtin returns complex");
6710 llvm_unreachable(
"Bad evaluation kind in EmitBuiltinExpr");
6717 if (
V->getType()->isVoidTy())
6724 llvm_unreachable(
"No current hlsl builtin returns complex");
6726 llvm_unreachable(
"Bad evaluation kind in EmitBuiltinExpr");
6741 llvm::Triple::ArchType Arch) {
6753 case llvm::Triple::arm:
6754 case llvm::Triple::armeb:
6755 case llvm::Triple::thumb:
6756 case llvm::Triple::thumbeb:
6758 case llvm::Triple::aarch64:
6759 case llvm::Triple::aarch64_32:
6760 case llvm::Triple::aarch64_be:
6762 case llvm::Triple::bpfeb:
6763 case llvm::Triple::bpfel:
6765 case llvm::Triple::x86:
6766 case llvm::Triple::x86_64:
6768 case llvm::Triple::ppc:
6769 case llvm::Triple::ppcle:
6770 case llvm::Triple::ppc64:
6771 case llvm::Triple::ppc64le:
6773 case llvm::Triple::r600:
6774 case llvm::Triple::amdgcn:
6776 case llvm::Triple::systemz:
6778 case llvm::Triple::nvptx:
6779 case llvm::Triple::nvptx64:
6781 case llvm::Triple::wasm32:
6782 case llvm::Triple::wasm64:
6784 case llvm::Triple::hexagon:
6786 case llvm::Triple::riscv32:
6787 case llvm::Triple::riscv64:
6789 case llvm::Triple::spirv:
6791 case llvm::Triple::spirv64:
6804 assert(
getContext().getAuxTargetInfo() &&
"Missing aux target info");
6816 bool HasLegalHalfType =
true,
6818 bool AllowBFloatArgsAndRet =
true) {
6819 int IsQuad = TypeFlags.
isQuad();
6823 return llvm::FixedVectorType::get(CGF->
Int8Ty, V1Ty ? 1 : (8 << IsQuad));
6826 return llvm::FixedVectorType::get(CGF->
Int16Ty, V1Ty ? 1 : (4 << IsQuad));
6828 if (AllowBFloatArgsAndRet)
6829 return llvm::FixedVectorType::get(CGF->
BFloatTy, V1Ty ? 1 : (4 << IsQuad));
6831 return llvm::FixedVectorType::get(CGF->
Int16Ty, V1Ty ? 1 : (4 << IsQuad));
6833 if (HasLegalHalfType)
6834 return llvm::FixedVectorType::get(CGF->
HalfTy, V1Ty ? 1 : (4 << IsQuad));
6836 return llvm::FixedVectorType::get(CGF->
Int16Ty, V1Ty ? 1 : (4 << IsQuad));
6838 return llvm::FixedVectorType::get(CGF->
Int32Ty, V1Ty ? 1 : (2 << IsQuad));
6841 return llvm::FixedVectorType::get(CGF->
Int64Ty, V1Ty ? 1 : (1 << IsQuad));
6846 return llvm::FixedVectorType::get(CGF->
Int8Ty, 16);
6848 return llvm::FixedVectorType::get(CGF->
FloatTy, V1Ty ? 1 : (2 << IsQuad));
6850 return llvm::FixedVectorType::get(CGF->
DoubleTy, V1Ty ? 1 : (1 << IsQuad));
6852 llvm_unreachable(
"Unknown vector element type!");
6857 int IsQuad = IntTypeFlags.
isQuad();
6860 return llvm::FixedVectorType::get(CGF->
HalfTy, (4 << IsQuad));
6862 return llvm::FixedVectorType::get(CGF->
FloatTy, (2 << IsQuad));
6864 return llvm::FixedVectorType::get(CGF->
DoubleTy, (1 << IsQuad));
6866 llvm_unreachable(
"Type can't be converted to floating-point!");
6871 const ElementCount &Count) {
6872 Value *SV = llvm::ConstantVector::getSplat(Count,
C);
6873 return Builder.CreateShuffleVector(
V,
V, SV,
"lane");
6877 ElementCount EC = cast<llvm::VectorType>(
V->getType())->getElementCount();
6883 unsigned shift,
bool rightshift) {
6885 for (Function::const_arg_iterator ai = F->arg_begin(), ae = F->arg_end();
6886 ai != ae; ++ai, ++j) {
6887 if (F->isConstrainedFPIntrinsic())
6888 if (ai->getType()->isMetadataTy())
6890 if (shift > 0 && shift == j)
6893 Ops[j] =
Builder.CreateBitCast(Ops[j], ai->getType(), name);
6896 if (F->isConstrainedFPIntrinsic())
6897 return Builder.CreateConstrainedFPCall(F, Ops, name);
6899 return Builder.CreateCall(F, Ops, name);
6904 int SV = cast<ConstantInt>(
V)->getSExtValue();
6905 return ConstantInt::get(Ty, neg ? -SV : SV);
6910 llvm::Type *Ty,
bool usgn,
6912 llvm::VectorType *VTy = cast<llvm::VectorType>(Ty);
6914 int ShiftAmt = cast<ConstantInt>(Shift)->getSExtValue();
6915 int EltSize = VTy->getScalarSizeInBits();
6917 Vec =
Builder.CreateBitCast(Vec, Ty);
6921 if (ShiftAmt == EltSize) {
6924 return llvm::ConstantAggregateZero::get(VTy);
6929 Shift = ConstantInt::get(VTy->getElementType(), ShiftAmt);
6935 return Builder.CreateLShr(Vec, Shift, name);
6937 return Builder.CreateAShr(Vec, Shift, name);
6963struct ARMVectorIntrinsicInfo {
6964 const char *NameHint;
6966 unsigned LLVMIntrinsic;
6967 unsigned AltLLVMIntrinsic;
6970 bool operator<(
unsigned RHSBuiltinID)
const {
6971 return BuiltinID < RHSBuiltinID;
6973 bool operator<(
const ARMVectorIntrinsicInfo &TE)
const {
6974 return BuiltinID < TE.BuiltinID;
6979#define NEONMAP0(NameBase) \
6980 { #NameBase, NEON::BI__builtin_neon_ ## NameBase, 0, 0, 0 }
6982#define NEONMAP1(NameBase, LLVMIntrinsic, TypeModifier) \
6983 { #NameBase, NEON:: BI__builtin_neon_ ## NameBase, \
6984 Intrinsic::LLVMIntrinsic, 0, TypeModifier }
6986#define NEONMAP2(NameBase, LLVMIntrinsic, AltLLVMIntrinsic, TypeModifier) \
6987 { #NameBase, NEON:: BI__builtin_neon_ ## NameBase, \
6988 Intrinsic::LLVMIntrinsic, Intrinsic::AltLLVMIntrinsic, \
6992 NEONMAP1(__a32_vcvt_bf16_f32, arm_neon_vcvtfp2bf, 0),
6999 NEONMAP1(vabs_v, arm_neon_vabs, 0),
7000 NEONMAP1(vabsq_v, arm_neon_vabs, 0),
7004 NEONMAP1(vaesdq_u8, arm_neon_aesd, 0),
7005 NEONMAP1(vaeseq_u8, arm_neon_aese, 0),
7006 NEONMAP1(vaesimcq_u8, arm_neon_aesimc, 0),
7007 NEONMAP1(vaesmcq_u8, arm_neon_aesmc, 0),
7008 NEONMAP1(vbfdot_f32, arm_neon_bfdot, 0),
7009 NEONMAP1(vbfdotq_f32, arm_neon_bfdot, 0),
7010 NEONMAP1(vbfmlalbq_f32, arm_neon_bfmlalb, 0),
7011 NEONMAP1(vbfmlaltq_f32, arm_neon_bfmlalt, 0),
7012 NEONMAP1(vbfmmlaq_f32, arm_neon_bfmmla, 0),
7025 NEONMAP1(vcage_v, arm_neon_vacge, 0),
7026 NEONMAP1(vcageq_v, arm_neon_vacge, 0),
7027 NEONMAP1(vcagt_v, arm_neon_vacgt, 0),
7028 NEONMAP1(vcagtq_v, arm_neon_vacgt, 0),
7029 NEONMAP1(vcale_v, arm_neon_vacge, 0),
7030 NEONMAP1(vcaleq_v, arm_neon_vacge, 0),
7031 NEONMAP1(vcalt_v, arm_neon_vacgt, 0),
7032 NEONMAP1(vcaltq_v, arm_neon_vacgt, 0),
7049 NEONMAP1(vcvt_f16_f32, arm_neon_vcvtfp2hf, 0),
7052 NEONMAP1(vcvt_f32_f16, arm_neon_vcvthf2fp, 0),
7054 NEONMAP1(vcvt_n_f16_s16, arm_neon_vcvtfxs2fp, 0),
7055 NEONMAP1(vcvt_n_f16_u16, arm_neon_vcvtfxu2fp, 0),
7056 NEONMAP2(vcvt_n_f32_v, arm_neon_vcvtfxu2fp, arm_neon_vcvtfxs2fp, 0),
7057 NEONMAP1(vcvt_n_s16_f16, arm_neon_vcvtfp2fxs, 0),
7058 NEONMAP1(vcvt_n_s32_v, arm_neon_vcvtfp2fxs, 0),
7059 NEONMAP1(vcvt_n_s64_v, arm_neon_vcvtfp2fxs, 0),
7060 NEONMAP1(vcvt_n_u16_f16, arm_neon_vcvtfp2fxu, 0),
7061 NEONMAP1(vcvt_n_u32_v, arm_neon_vcvtfp2fxu, 0),
7062 NEONMAP1(vcvt_n_u64_v, arm_neon_vcvtfp2fxu, 0),
7069 NEONMAP1(vcvta_s16_f16, arm_neon_vcvtas, 0),
7070 NEONMAP1(vcvta_s32_v, arm_neon_vcvtas, 0),
7071 NEONMAP1(vcvta_s64_v, arm_neon_vcvtas, 0),
7072 NEONMAP1(vcvta_u16_f16, arm_neon_vcvtau, 0),
7073 NEONMAP1(vcvta_u32_v, arm_neon_vcvtau, 0),
7074 NEONMAP1(vcvta_u64_v, arm_neon_vcvtau, 0),
7075 NEONMAP1(vcvtaq_s16_f16, arm_neon_vcvtas, 0),
7076 NEONMAP1(vcvtaq_s32_v, arm_neon_vcvtas, 0),
7077 NEONMAP1(vcvtaq_s64_v, arm_neon_vcvtas, 0),
7078 NEONMAP1(vcvtaq_u16_f16, arm_neon_vcvtau, 0),
7079 NEONMAP1(vcvtaq_u32_v, arm_neon_vcvtau, 0),
7080 NEONMAP1(vcvtaq_u64_v, arm_neon_vcvtau, 0),
7081 NEONMAP1(vcvth_bf16_f32, arm_neon_vcvtbfp2bf, 0),
7082 NEONMAP1(vcvtm_s16_f16, arm_neon_vcvtms, 0),
7083 NEONMAP1(vcvtm_s32_v, arm_neon_vcvtms, 0),
7084 NEONMAP1(vcvtm_s64_v, arm_neon_vcvtms, 0),
7085 NEONMAP1(vcvtm_u16_f16, arm_neon_vcvtmu, 0),
7086 NEONMAP1(vcvtm_u32_v, arm_neon_vcvtmu, 0),
7087 NEONMAP1(vcvtm_u64_v, arm_neon_vcvtmu, 0),
7088 NEONMAP1(vcvtmq_s16_f16, arm_neon_vcvtms, 0),
7089 NEONMAP1(vcvtmq_s32_v, arm_neon_vcvtms, 0),
7090 NEONMAP1(vcvtmq_s64_v, arm_neon_vcvtms, 0),
7091 NEONMAP1(vcvtmq_u16_f16, arm_neon_vcvtmu, 0),
7092 NEONMAP1(vcvtmq_u32_v, arm_neon_vcvtmu, 0),
7093 NEONMAP1(vcvtmq_u64_v, arm_neon_vcvtmu, 0),
7094 NEONMAP1(vcvtn_s16_f16, arm_neon_vcvtns, 0),
7095 NEONMAP1(vcvtn_s32_v, arm_neon_vcvtns, 0),
7096 NEONMAP1(vcvtn_s64_v, arm_neon_vcvtns, 0),
7097 NEONMAP1(vcvtn_u16_f16, arm_neon_vcvtnu, 0),
7098 NEONMAP1(vcvtn_u32_v, arm_neon_vcvtnu, 0),
7099 NEONMAP1(vcvtn_u64_v, arm_neon_vcvtnu, 0),
7100 NEONMAP1(vcvtnq_s16_f16, arm_neon_vcvtns, 0),
7101 NEONMAP1(vcvtnq_s32_v, arm_neon_vcvtns, 0),
7102 NEONMAP1(vcvtnq_s64_v, arm_neon_vcvtns, 0),
7103 NEONMAP1(vcvtnq_u16_f16, arm_neon_vcvtnu, 0),
7104 NEONMAP1(vcvtnq_u32_v, arm_neon_vcvtnu, 0),
7105 NEONMAP1(vcvtnq_u64_v, arm_neon_vcvtnu, 0),
7106 NEONMAP1(vcvtp_s16_f16, arm_neon_vcvtps, 0),
7107 NEONMAP1(vcvtp_s32_v, arm_neon_vcvtps, 0),
7108 NEONMAP1(vcvtp_s64_v, arm_neon_vcvtps, 0),
7109 NEONMAP1(vcvtp_u16_f16, arm_neon_vcvtpu, 0),
7110 NEONMAP1(vcvtp_u32_v, arm_neon_vcvtpu, 0),
7111 NEONMAP1(vcvtp_u64_v, arm_neon_vcvtpu, 0),
7112 NEONMAP1(vcvtpq_s16_f16, arm_neon_vcvtps, 0),
7113 NEONMAP1(vcvtpq_s32_v, arm_neon_vcvtps, 0),
7114 NEONMAP1(vcvtpq_s64_v, arm_neon_vcvtps, 0),
7115 NEONMAP1(vcvtpq_u16_f16, arm_neon_vcvtpu, 0),
7116 NEONMAP1(vcvtpq_u32_v, arm_neon_vcvtpu, 0),
7117 NEONMAP1(vcvtpq_u64_v, arm_neon_vcvtpu, 0),
7121 NEONMAP1(vcvtq_n_f16_s16, arm_neon_vcvtfxs2fp, 0),
7122 NEONMAP1(vcvtq_n_f16_u16, arm_neon_vcvtfxu2fp, 0),
7123 NEONMAP2(vcvtq_n_f32_v, arm_neon_vcvtfxu2fp, arm_neon_vcvtfxs2fp, 0),
7124 NEONMAP1(vcvtq_n_s16_f16, arm_neon_vcvtfp2fxs, 0),
7125 NEONMAP1(vcvtq_n_s32_v, arm_neon_vcvtfp2fxs, 0),
7126 NEONMAP1(vcvtq_n_s64_v, arm_neon_vcvtfp2fxs, 0),
7127 NEONMAP1(vcvtq_n_u16_f16, arm_neon_vcvtfp2fxu, 0),
7128 NEONMAP1(vcvtq_n_u32_v, arm_neon_vcvtfp2fxu, 0),
7129 NEONMAP1(vcvtq_n_u64_v, arm_neon_vcvtfp2fxu, 0),
7136 NEONMAP1(vdot_s32, arm_neon_sdot, 0),
7137 NEONMAP1(vdot_u32, arm_neon_udot, 0),
7138 NEONMAP1(vdotq_s32, arm_neon_sdot, 0),
7139 NEONMAP1(vdotq_u32, arm_neon_udot, 0),
7149 NEONMAP1(vld1_v, arm_neon_vld1, 0),
7150 NEONMAP1(vld1_x2_v, arm_neon_vld1x2, 0),
7151 NEONMAP1(vld1_x3_v, arm_neon_vld1x3, 0),
7152 NEONMAP1(vld1_x4_v, arm_neon_vld1x4, 0),
7154 NEONMAP1(vld1q_v, arm_neon_vld1, 0),
7155 NEONMAP1(vld1q_x2_v, arm_neon_vld1x2, 0),
7156 NEONMAP1(vld1q_x3_v, arm_neon_vld1x3, 0),
7157 NEONMAP1(vld1q_x4_v, arm_neon_vld1x4, 0),
7158 NEONMAP1(vld2_dup_v, arm_neon_vld2dup, 0),
7159 NEONMAP1(vld2_lane_v, arm_neon_vld2lane, 0),
7160 NEONMAP1(vld2_v, arm_neon_vld2, 0),
7161 NEONMAP1(vld2q_dup_v, arm_neon_vld2dup, 0),
7162 NEONMAP1(vld2q_lane_v, arm_neon_vld2lane, 0),
7163 NEONMAP1(vld2q_v, arm_neon_vld2, 0),
7164 NEONMAP1(vld3_dup_v, arm_neon_vld3dup, 0),
7165 NEONMAP1(vld3_lane_v, arm_neon_vld3lane, 0),
7166 NEONMAP1(vld3_v, arm_neon_vld3, 0),
7167 NEONMAP1(vld3q_dup_v, arm_neon_vld3dup, 0),
7168 NEONMAP1(vld3q_lane_v, arm_neon_vld3lane, 0),
7169 NEONMAP1(vld3q_v, arm_neon_vld3, 0),
7170 NEONMAP1(vld4_dup_v, arm_neon_vld4dup, 0),
7171 NEONMAP1(vld4_lane_v, arm_neon_vld4lane, 0),
7172 NEONMAP1(vld4_v, arm_neon_vld4, 0),
7173 NEONMAP1(vld4q_dup_v, arm_neon_vld4dup, 0),
7174 NEONMAP1(vld4q_lane_v, arm_neon_vld4lane, 0),
7175 NEONMAP1(vld4q_v, arm_neon_vld4, 0),
7184 NEONMAP1(vmmlaq_s32, arm_neon_smmla, 0),
7185 NEONMAP1(vmmlaq_u32, arm_neon_ummla, 0),
7203 NEONMAP2(vqdmlal_v, arm_neon_vqdmull, sadd_sat, 0),
7204 NEONMAP2(vqdmlsl_v, arm_neon_vqdmull, ssub_sat, 0),
7228 NEONMAP1(vqshlu_n_v, arm_neon_vqshiftsu, 0),
7229 NEONMAP1(vqshluq_n_v, arm_neon_vqshiftsu, 0),
7233 NEONMAP2(vrecpe_v, arm_neon_vrecpe, arm_neon_vrecpe, 0),
7234 NEONMAP2(vrecpeq_v, arm_neon_vrecpe, arm_neon_vrecpe, 0),
7257 NEONMAP2(vrsqrte_v, arm_neon_vrsqrte, arm_neon_vrsqrte, 0),
7258 NEONMAP2(vrsqrteq_v, arm_neon_vrsqrte, arm_neon_vrsqrte, 0),
7262 NEONMAP1(vsha1su0q_u32, arm_neon_sha1su0, 0),
7263 NEONMAP1(vsha1su1q_u32, arm_neon_sha1su1, 0),
7264 NEONMAP1(vsha256h2q_u32, arm_neon_sha256h2, 0),
7265 NEONMAP1(vsha256hq_u32, arm_neon_sha256h, 0),
7266 NEONMAP1(vsha256su0q_u32, arm_neon_sha256su0, 0),
7267 NEONMAP1(vsha256su1q_u32, arm_neon_sha256su1, 0),
7276 NEONMAP1(vst1_v, arm_neon_vst1, 0),
7277 NEONMAP1(vst1_x2_v, arm_neon_vst1x2, 0),
7278 NEONMAP1(vst1_x3_v, arm_neon_vst1x3, 0),
7279 NEONMAP1(vst1_x4_v, arm_neon_vst1x4, 0),
7280 NEONMAP1(vst1q_v, arm_neon_vst1, 0),
7281 NEONMAP1(vst1q_x2_v, arm_neon_vst1x2, 0),
7282 NEONMAP1(vst1q_x3_v, arm_neon_vst1x3, 0),
7283 NEONMAP1(vst1q_x4_v, arm_neon_vst1x4, 0),
7284 NEONMAP1(vst2_lane_v, arm_neon_vst2lane, 0),
7285 NEONMAP1(vst2_v, arm_neon_vst2, 0),
7286 NEONMAP1(vst2q_lane_v, arm_neon_vst2lane, 0),
7287 NEONMAP1(vst2q_v, arm_neon_vst2, 0),
7288 NEONMAP1(vst3_lane_v, arm_neon_vst3lane, 0),
7289 NEONMAP1(vst3_v, arm_neon_vst3, 0),
7290 NEONMAP1(vst3q_lane_v, arm_neon_vst3lane, 0),
7291 NEONMAP1(vst3q_v, arm_neon_vst3, 0),
7292 NEONMAP1(vst4_lane_v, arm_neon_vst4lane, 0),
7293 NEONMAP1(vst4_v, arm_neon_vst4, 0),
7294 NEONMAP1(vst4q_lane_v, arm_neon_vst4lane, 0),
7295 NEONMAP1(vst4q_v, arm_neon_vst4, 0),
7301 NEONMAP1(vusdot_s32, arm_neon_usdot, 0),
7302 NEONMAP1(vusdotq_s32, arm_neon_usdot, 0),
7303 NEONMAP1(vusmmlaq_s32, arm_neon_usmmla, 0),
7315 NEONMAP1(vabs_v, aarch64_neon_abs, 0),
7316 NEONMAP1(vabsq_v, aarch64_neon_abs, 0),
7321 NEONMAP1(vaesdq_u8, aarch64_crypto_aesd, 0),
7322 NEONMAP1(vaeseq_u8, aarch64_crypto_aese, 0),
7323 NEONMAP1(vaesimcq_u8, aarch64_crypto_aesimc, 0),
7324 NEONMAP1(vaesmcq_u8, aarch64_crypto_aesmc, 0),
7333 NEONMAP1(vbfdot_f32, aarch64_neon_bfdot, 0),
7334 NEONMAP1(vbfdotq_f32, aarch64_neon_bfdot, 0),
7335 NEONMAP1(vbfmlalbq_f32, aarch64_neon_bfmlalb, 0),
7336 NEONMAP1(vbfmlaltq_f32, aarch64_neon_bfmlalt, 0),
7337 NEONMAP1(vbfmmlaq_f32, aarch64_neon_bfmmla, 0),
7348 NEONMAP1(vcage_v, aarch64_neon_facge, 0),
7349 NEONMAP1(vcageq_v, aarch64_neon_facge, 0),
7350 NEONMAP1(vcagt_v, aarch64_neon_facgt, 0),
7351 NEONMAP1(vcagtq_v, aarch64_neon_facgt, 0),
7352 NEONMAP1(vcale_v, aarch64_neon_facge, 0),
7353 NEONMAP1(vcaleq_v, aarch64_neon_facge, 0),
7354 NEONMAP1(vcalt_v, aarch64_neon_facgt, 0),
7355 NEONMAP1(vcaltq_v, aarch64_neon_facgt, 0),
7392 NEONMAP1(vcvt_f16_f32, aarch64_neon_vcvtfp2hf, 0),
7395 NEONMAP1(vcvt_f32_f16, aarch64_neon_vcvthf2fp, 0),
7397 NEONMAP1(vcvt_n_f16_s16, aarch64_neon_vcvtfxs2fp, 0),
7398 NEONMAP1(vcvt_n_f16_u16, aarch64_neon_vcvtfxu2fp, 0),
7399 NEONMAP2(vcvt_n_f32_v, aarch64_neon_vcvtfxu2fp, aarch64_neon_vcvtfxs2fp, 0),
7400 NEONMAP2(vcvt_n_f64_v, aarch64_neon_vcvtfxu2fp, aarch64_neon_vcvtfxs2fp, 0),
7401 NEONMAP1(vcvt_n_s16_f16, aarch64_neon_vcvtfp2fxs, 0),
7402 NEONMAP1(vcvt_n_s32_v, aarch64_neon_vcvtfp2fxs, 0),
7403 NEONMAP1(vcvt_n_s64_v, aarch64_neon_vcvtfp2fxs, 0),
7404 NEONMAP1(vcvt_n_u16_f16, aarch64_neon_vcvtfp2fxu, 0),
7405 NEONMAP1(vcvt_n_u32_v, aarch64_neon_vcvtfp2fxu, 0),
7406 NEONMAP1(vcvt_n_u64_v, aarch64_neon_vcvtfp2fxu, 0),
7412 NEONMAP1(vcvtq_n_f16_s16, aarch64_neon_vcvtfxs2fp, 0),
7413 NEONMAP1(vcvtq_n_f16_u16, aarch64_neon_vcvtfxu2fp, 0),
7414 NEONMAP2(vcvtq_n_f32_v, aarch64_neon_vcvtfxu2fp, aarch64_neon_vcvtfxs2fp, 0),
7415 NEONMAP2(vcvtq_n_f64_v, aarch64_neon_vcvtfxu2fp, aarch64_neon_vcvtfxs2fp, 0),
7416 NEONMAP1(vcvtq_n_s16_f16, aarch64_neon_vcvtfp2fxs, 0),
7417 NEONMAP1(vcvtq_n_s32_v, aarch64_neon_vcvtfp2fxs, 0),
7418 NEONMAP1(vcvtq_n_s64_v, aarch64_neon_vcvtfp2fxs, 0),
7419 NEONMAP1(vcvtq_n_u16_f16, aarch64_neon_vcvtfp2fxu, 0),
7420 NEONMAP1(vcvtq_n_u32_v, aarch64_neon_vcvtfp2fxu, 0),
7421 NEONMAP1(vcvtq_n_u64_v, aarch64_neon_vcvtfp2fxu, 0),
7423 NEONMAP1(vdot_s32, aarch64_neon_sdot, 0),
7424 NEONMAP1(vdot_u32, aarch64_neon_udot, 0),
7425 NEONMAP1(vdotq_s32, aarch64_neon_sdot, 0),
7426 NEONMAP1(vdotq_u32, aarch64_neon_udot, 0),
7439 NEONMAP1(vfmlal_high_f16, aarch64_neon_fmlal2, 0),
7440 NEONMAP1(vfmlal_low_f16, aarch64_neon_fmlal, 0),
7441 NEONMAP1(vfmlalq_high_f16, aarch64_neon_fmlal2, 0),
7442 NEONMAP1(vfmlalq_low_f16, aarch64_neon_fmlal, 0),
7443 NEONMAP1(vfmlsl_high_f16, aarch64_neon_fmlsl2, 0),
7444 NEONMAP1(vfmlsl_low_f16, aarch64_neon_fmlsl, 0),
7445 NEONMAP1(vfmlslq_high_f16, aarch64_neon_fmlsl2, 0),
7446 NEONMAP1(vfmlslq_low_f16, aarch64_neon_fmlsl, 0),
7451 NEONMAP1(vld1_x2_v, aarch64_neon_ld1x2, 0),
7452 NEONMAP1(vld1_x3_v, aarch64_neon_ld1x3, 0),
7453 NEONMAP1(vld1_x4_v, aarch64_neon_ld1x4, 0),
7454 NEONMAP1(vld1q_x2_v, aarch64_neon_ld1x2, 0),
7455 NEONMAP1(vld1q_x3_v, aarch64_neon_ld1x3, 0),
7456 NEONMAP1(vld1q_x4_v, aarch64_neon_ld1x4, 0),
7457 NEONMAP1(vmmlaq_s32, aarch64_neon_smmla, 0),
7458 NEONMAP1(vmmlaq_u32, aarch64_neon_ummla, 0),
7471 NEONMAP2(vqdmlal_v, aarch64_neon_sqdmull, aarch64_neon_sqadd, 0),
7472 NEONMAP2(vqdmlsl_v, aarch64_neon_sqdmull, aarch64_neon_sqsub, 0),
7473 NEONMAP1(vqdmulh_lane_v, aarch64_neon_sqdmulh_lane, 0),
7474 NEONMAP1(vqdmulh_laneq_v, aarch64_neon_sqdmulh_laneq, 0),
7476 NEONMAP1(vqdmulhq_lane_v, aarch64_neon_sqdmulh_lane, 0),
7477 NEONMAP1(vqdmulhq_laneq_v, aarch64_neon_sqdmulh_laneq, 0),
7492 NEONMAP1(vqrdmulh_lane_v, aarch64_neon_sqrdmulh_lane, 0),
7493 NEONMAP1(vqrdmulh_laneq_v, aarch64_neon_sqrdmulh_laneq, 0),
7495 NEONMAP1(vqrdmulhq_lane_v, aarch64_neon_sqrdmulh_lane, 0),
7496 NEONMAP1(vqrdmulhq_laneq_v, aarch64_neon_sqrdmulh_laneq, 0),
7504 NEONMAP1(vqshlu_n_v, aarch64_neon_sqshlu, 0),
7505 NEONMAP1(vqshluq_n_v, aarch64_neon_sqshlu, 0),
7509 NEONMAP1(vrax1q_u64, aarch64_crypto_rax1, 0),
7510 NEONMAP2(vrecpe_v, aarch64_neon_frecpe, aarch64_neon_urecpe, 0),
7511 NEONMAP2(vrecpeq_v, aarch64_neon_frecpe, aarch64_neon_urecpe, 0),
7538 NEONMAP2(vrsqrte_v, aarch64_neon_frsqrte, aarch64_neon_ursqrte, 0),
7539 NEONMAP2(vrsqrteq_v, aarch64_neon_frsqrte, aarch64_neon_ursqrte, 0),
7543 NEONMAP1(vsha1su0q_u32, aarch64_crypto_sha1su0, 0),
7544 NEONMAP1(vsha1su1q_u32, aarch64_crypto_sha1su1, 0),
7545 NEONMAP1(vsha256h2q_u32, aarch64_crypto_sha256h2, 0),
7546 NEONMAP1(vsha256hq_u32, aarch64_crypto_sha256h, 0),
7547 NEONMAP1(vsha256su0q_u32, aarch64_crypto_sha256su0, 0),
7548 NEONMAP1(vsha256su1q_u32, aarch64_crypto_sha256su1, 0),
7549 NEONMAP1(vsha512h2q_u64, aarch64_crypto_sha512h2, 0),
7550 NEONMAP1(vsha512hq_u64, aarch64_crypto_sha512h, 0),
7551 NEONMAP1(vsha512su0q_u64, aarch64_crypto_sha512su0, 0),
7552 NEONMAP1(vsha512su1q_u64, aarch64_crypto_sha512su1, 0),
7561 NEONMAP1(vsm3partw1q_u32, aarch64_crypto_sm3partw1, 0),
7562 NEONMAP1(vsm3partw2q_u32, aarch64_crypto_sm3partw2, 0),
7563 NEONMAP1(vsm3ss1q_u32, aarch64_crypto_sm3ss1, 0),
7564 NEONMAP1(vsm3tt1aq_u32, aarch64_crypto_sm3tt1a, 0),
7565 NEONMAP1(vsm3tt1bq_u32, aarch64_crypto_sm3tt1b, 0),
7566 NEONMAP1(vsm3tt2aq_u32, aarch64_crypto_sm3tt2a, 0),
7567 NEONMAP1(vsm3tt2bq_u32, aarch64_crypto_sm3tt2b, 0),
7568 NEONMAP1(vsm4ekeyq_u32, aarch64_crypto_sm4ekey, 0),
7569 NEONMAP1(vsm4eq_u32, aarch64_crypto_sm4e, 0),
7570 NEONMAP1(vst1_x2_v, aarch64_neon_st1x2, 0),
7571 NEONMAP1(vst1_x3_v, aarch64_neon_st1x3, 0),
7572 NEONMAP1(vst1_x4_v, aarch64_neon_st1x4, 0),
7573 NEONMAP1(vst1q_x2_v, aarch64_neon_st1x2, 0),
7574 NEONMAP1(vst1q_x3_v, aarch64_neon_st1x3, 0),
7575 NEONMAP1(vst1q_x4_v, aarch64_neon_st1x4, 0),
7579 NEONMAP1(vusdot_s32, aarch64_neon_usdot, 0),
7580 NEONMAP1(vusdotq_s32, aarch64_neon_usdot, 0),
7581 NEONMAP1(vusmmlaq_s32, aarch64_neon_usmmla, 0),
7582 NEONMAP1(vxarq_u64, aarch64_crypto_xar, 0),
7639 NEONMAP1(vcvtxd_f32_f64, aarch64_sisd_fcvtxn, 0),
7660 NEONMAP1(vmull_p64, aarch64_neon_pmull64, 0),
7688 NEONMAP1(vqdmulls_s32, aarch64_neon_sqdmulls_scalar, 0),
7769 NEONMAP1(vsha1cq_u32, aarch64_crypto_sha1c, 0),
7770 NEONMAP1(vsha1h_u32, aarch64_crypto_sha1h, 0),
7771 NEONMAP1(vsha1mq_u32, aarch64_crypto_sha1m, 0),
7772 NEONMAP1(vsha1pq_u32, aarch64_crypto_sha1p, 0),
7826 { NEON::BI__builtin_neon_splat_lane_bf16, NEON::BI__builtin_neon_splat_lane_v, },
7827 { NEON::BI__builtin_neon_splat_laneq_bf16, NEON::BI__builtin_neon_splat_laneq_v, },
7828 { NEON::BI__builtin_neon_splatq_lane_bf16, NEON::BI__builtin_neon_splatq_lane_v, },
7829 { NEON::BI__builtin_neon_splatq_laneq_bf16, NEON::BI__builtin_neon_splatq_laneq_v, },
7830 { NEON::BI__builtin_neon_vabd_f16, NEON::BI__builtin_neon_vabd_v, },
7831 { NEON::BI__builtin_neon_vabdq_f16, NEON::BI__builtin_neon_vabdq_v, },
7832 { NEON::BI__builtin_neon_vabs_f16, NEON::BI__builtin_neon_vabs_v, },
7833 { NEON::BI__builtin_neon_vabsq_f16, NEON::BI__builtin_neon_vabsq_v, },
7834 { NEON::BI__builtin_neon_vcage_f16, NEON::BI__builtin_neon_vcage_v, },
7835 { NEON::BI__builtin_neon_vcageq_f16, NEON::BI__builtin_neon_vcageq_v, },
7836 { NEON::BI__builtin_neon_vcagt_f16, NEON::BI__builtin_neon_vcagt_v, },
7837 { NEON::BI__builtin_neon_vcagtq_f16, NEON::BI__builtin_neon_vcagtq_v, },
7838 { NEON::BI__builtin_neon_vcale_f16, NEON::BI__builtin_neon_vcale_v, },
7839 { NEON::BI__builtin_neon_vcaleq_f16, NEON::BI__builtin_neon_vcaleq_v, },
7840 { NEON::BI__builtin_neon_vcalt_f16, NEON::BI__builtin_neon_vcalt_v, },
7841 { NEON::BI__builtin_neon_vcaltq_f16, NEON::BI__builtin_neon_vcaltq_v, },
7842 { NEON::BI__builtin_neon_vceqz_f16, NEON::BI__builtin_neon_vceqz_v, },
7843 { NEON::BI__builtin_neon_vceqzq_f16, NEON::BI__builtin_neon_vceqzq_v, },
7844 { NEON::BI__builtin_neon_vcgez_f16, NEON::BI__builtin_neon_vcgez_v, },
7845 { NEON::BI__builtin_neon_vcgezq_f16, NEON::BI__builtin_neon_vcgezq_v, },
7846 { NEON::BI__builtin_neon_vcgtz_f16, NEON::BI__builtin_neon_vcgtz_v, },
7847 { NEON::BI__builtin_neon_vcgtzq_f16, NEON::BI__builtin_neon_vcgtzq_v, },
7848 { NEON::BI__builtin_neon_vclez_f16, NEON::BI__builtin_neon_vclez_v, },
7849 { NEON::BI__builtin_neon_vclezq_f16, NEON::BI__builtin_neon_vclezq_v, },
7850 { NEON::BI__builtin_neon_vcltz_f16, NEON::BI__builtin_neon_vcltz_v, },
7851 { NEON::BI__builtin_neon_vcltzq_f16, NEON::BI__builtin_neon_vcltzq_v, },
7852 { NEON::BI__builtin_neon_vfma_f16, NEON::BI__builtin_neon_vfma_v, },
7853 { NEON::BI__builtin_neon_vfma_lane_f16, NEON::BI__builtin_neon_vfma_lane_v, },
7854 { NEON::BI__builtin_neon_vfma_laneq_f16, NEON::BI__builtin_neon_vfma_laneq_v, },
7855 { NEON::BI__builtin_neon_vfmaq_f16, NEON::BI__builtin_neon_vfmaq_v, },
7856 { NEON::BI__builtin_neon_vfmaq_lane_f16, NEON::BI__builtin_neon_vfmaq_lane_v, },
7857 { NEON::BI__builtin_neon_vfmaq_laneq_f16, NEON::BI__builtin_neon_vfmaq_laneq_v, },
7858 { NEON::BI__builtin_neon_vld1_bf16_x2, NEON::BI__builtin_neon_vld1_x2_v },
7859 { NEON::BI__builtin_neon_vld1_bf16_x3, NEON::BI__builtin_neon_vld1_x3_v },
7860 { NEON::BI__builtin_neon_vld1_bf16_x4, NEON::BI__builtin_neon_vld1_x4_v },
7861 { NEON::BI__builtin_neon_vld1_bf16, NEON::BI__builtin_neon_vld1_v },
7862 { NEON::BI__builtin_neon_vld1_dup_bf16, NEON::BI__builtin_neon_vld1_dup_v },
7863 { NEON::BI__builtin_neon_vld1_lane_bf16, NEON::BI__builtin_neon_vld1_lane_v },
7864 { NEON::BI__builtin_neon_vld1q_bf16_x2, NEON::BI__builtin_neon_vld1q_x2_v },
7865 { NEON::BI__builtin_neon_vld1q_bf16_x3, NEON::BI__builtin_neon_vld1q_x3_v },
7866 { NEON::BI__builtin_neon_vld1q_bf16_x4, NEON::BI__builtin_neon_vld1q_x4_v },
7867 { NEON::BI__builtin_neon_vld1q_bf16, NEON::BI__builtin_neon_vld1q_v },
7868 { NEON::BI__builtin_neon_vld1q_dup_bf16, NEON::BI__builtin_neon_vld1q_dup_v },
7869 { NEON::BI__builtin_neon_vld1q_lane_bf16, NEON::BI__builtin_neon_vld1q_lane_v },
7870 { NEON::BI__builtin_neon_vld2_bf16, NEON::BI__builtin_neon_vld2_v },
7871 { NEON::BI__builtin_neon_vld2_dup_bf16, NEON::BI__builtin_neon_vld2_dup_v },
7872 { NEON::BI__builtin_neon_vld2_lane_bf16, NEON::BI__builtin_neon_vld2_lane_v },
7873 { NEON::BI__builtin_neon_vld2q_bf16, NEON::BI__builtin_neon_vld2q_v },
7874 { NEON::BI__builtin_neon_vld2q_dup_bf16, NEON::BI__builtin_neon_vld2q_dup_v },
7875 { NEON::BI__builtin_neon_vld2q_lane_bf16, NEON::BI__builtin_neon_vld2q_lane_v },
7876 { NEON::BI__builtin_neon_vld3_bf16, NEON::BI__builtin_neon_vld3_v },
7877 { NEON::BI__builtin_neon_vld3_dup_bf16, NEON::BI__builtin_neon_vld3_dup_v },
7878 { NEON::BI__builtin_neon_vld3_lane_bf16, NEON::BI__builtin_neon_vld3_lane_v },
7879 { NEON::BI__builtin_neon_vld3q_bf16, NEON::BI__builtin_neon_vld3q_v },
7880 { NEON::BI__builtin_neon_vld3q_dup_bf16, NEON::BI__builtin_neon_vld3q_dup_v },
7881 { NEON::BI__builtin_neon_vld3q_lane_bf16, NEON::BI__builtin_neon_vld3q_lane_v },
7882 { NEON::BI__builtin_neon_vld4_bf16, NEON::BI__builtin_neon_vld4_v },
7883 { NEON::BI__builtin_neon_vld4_dup_bf16, NEON::BI__builtin_neon_vld4_dup_v },
7884 { NEON::BI__builtin_neon_vld4_lane_bf16, NEON::BI__builtin_neon_vld4_lane_v },
7885 { NEON::BI__builtin_neon_vld4q_bf16, NEON::BI__builtin_neon_vld4q_v },
7886 { NEON::BI__builtin_neon_vld4q_dup_bf16, NEON::BI__builtin_neon_vld4q_dup_v },
7887 { NEON::BI__builtin_neon_vld4q_lane_bf16, NEON::BI__builtin_neon_vld4q_lane_v },
7888 { NEON::BI__builtin_neon_vmax_f16, NEON::BI__builtin_neon_vmax_v, },
7889 { NEON::BI__builtin_neon_vmaxnm_f16, NEON::BI__builtin_neon_vmaxnm_v, },
7890 { NEON::BI__builtin_neon_vmaxnmq_f16, NEON::BI__builtin_neon_vmaxnmq_v, },
7891 { NEON::BI__builtin_neon_vmaxq_f16, NEON::BI__builtin_neon_vmaxq_v, },
7892 { NEON::BI__builtin_neon_vmin_f16, NEON::BI__builtin_neon_vmin_v, },
7893 { NEON::BI__builtin_neon_vminnm_f16, NEON::BI__builtin_neon_vminnm_v, },
7894 { NEON::BI__builtin_neon_vminnmq_f16, NEON::BI__builtin_neon_vminnmq_v, },
7895 { NEON::BI__builtin_neon_vminq_f16, NEON::BI__builtin_neon_vminq_v, },
7896 { NEON::BI__builtin_neon_vmulx_f16, NEON::BI__builtin_neon_vmulx_v, },
7897 { NEON::BI__builtin_neon_vmulxq_f16, NEON::BI__builtin_neon_vmulxq_v, },
7898 { NEON::BI__builtin_neon_vpadd_f16, NEON::BI__builtin_neon_vpadd_v, },
7899 { NEON::BI__builtin_neon_vpaddq_f16, NEON::BI__builtin_neon_vpaddq_v, },
7900 { NEON::BI__builtin_neon_vpmax_f16, NEON::BI__builtin_neon_vpmax_v, },
7901 { NEON::BI__builtin_neon_vpmaxnm_f16, NEON::BI__builtin_neon_vpmaxnm_v, },
7902 { NEON::BI__builtin_neon_vpmaxnmq_f16, NEON::BI__builtin_neon_vpmaxnmq_v, },
7903 { NEON::BI__builtin_neon_vpmaxq_f16, NEON::BI__builtin_neon_vpmaxq_v, },
7904 { NEON::BI__builtin_neon_vpmin_f16, NEON::BI__builtin_neon_vpmin_v, },
7905 { NEON::BI__builtin_neon_vpminnm_f16, NEON::BI__builtin_neon_vpminnm_v, },
7906 { NEON::BI__builtin_neon_vpminnmq_f16, NEON::BI__builtin_neon_vpminnmq_v, },
7907 { NEON::BI__builtin_neon_vpminq_f16, NEON::BI__builtin_neon_vpminq_v, },
7908 { NEON::BI__builtin_neon_vrecpe_f16, NEON::BI__builtin_neon_vrecpe_v, },
7909 { NEON::BI__builtin_neon_vrecpeq_f16, NEON::BI__builtin_neon_vrecpeq_v, },
7910 { NEON::BI__builtin_neon_vrecps_f16, NEON::BI__builtin_neon_vrecps_v, },
7911 { NEON::BI__builtin_neon_vrecpsq_f16, NEON::BI__builtin_neon_vrecpsq_v, },
7912 { NEON::BI__builtin_neon_vrnd_f16, NEON::BI__builtin_neon_vrnd_v, },
7913 { NEON::BI__builtin_neon_vrnda_f16, NEON::BI__builtin_neon_vrnda_v, },
7914 { NEON::BI__builtin_neon_vrndaq_f16, NEON::BI__builtin_neon_vrndaq_v, },
7915 { NEON::BI__builtin_neon_vrndi_f16, NEON::BI__builtin_neon_vrndi_v, },
7916 { NEON::BI__builtin_neon_vrndiq_f16, NEON::BI__builtin_neon_vrndiq_v, },
7917 { NEON::BI__builtin_neon_vrndm_f16, NEON::BI__builtin_neon_vrndm_v, },
7918 { NEON::BI__builtin_neon_vrndmq_f16, NEON::BI__builtin_neon_vrndmq_v, },
7919 { NEON::BI__builtin_neon_vrndn_f16, NEON::BI__builtin_neon_vrndn_v, },
7920 { NEON::BI__builtin_neon_vrndnq_f16, NEON::BI__builtin_neon_vrndnq_v, },
7921 { NEON::BI__builtin_neon_vrndp_f16, NEON::BI__builtin_neon_vrndp_v, },
7922 { NEON::BI__builtin_neon_vrndpq_f16, NEON::BI__builtin_neon_vrndpq_v, },
7923 { NEON::BI__builtin_neon_vrndq_f16, NEON::BI__builtin_neon_vrndq_v, },
7924 { NEON::BI__builtin_neon_vrndx_f16, NEON::BI__builtin_neon_vrndx_v, },
7925 { NEON::BI__builtin_neon_vrndxq_f16, NEON::BI__builtin_neon_vrndxq_v, },
7926 { NEON::BI__builtin_neon_vrsqrte_f16, NEON::BI__builtin_neon_vrsqrte_v, },
7927 { NEON::BI__builtin_neon_vrsqrteq_f16, NEON::BI__builtin_neon_vrsqrteq_v, },
7928 { NEON::BI__builtin_neon_vrsqrts_f16, NEON::BI__builtin_neon_vrsqrts_v, },
7929 { NEON::BI__builtin_neon_vrsqrtsq_f16, NEON::BI__builtin_neon_vrsqrtsq_v, },
7930 { NEON::BI__builtin_neon_vsqrt_f16, NEON::BI__builtin_neon_vsqrt_v, },
7931 { NEON::BI__builtin_neon_vsqrtq_f16, NEON::BI__builtin_neon_vsqrtq_v, },
7932 { NEON::BI__builtin_neon_vst1_bf16_x2, NEON::BI__builtin_neon_vst1_x2_v },
7933 { NEON::BI__builtin_neon_vst1_bf16_x3, NEON::BI__builtin_neon_vst1_x3_v },
7934 { NEON::BI__builtin_neon_vst1_bf16_x4, NEON::BI__builtin_neon_vst1_x4_v },
7935 { NEON::BI__builtin_neon_vst1_bf16, NEON::BI__builtin_neon_vst1_v },
7936 { NEON::BI__builtin_neon_vst1_lane_bf16, NEON::BI__builtin_neon_vst1_lane_v },
7937 { NEON::BI__builtin_neon_vst1q_bf16_x2, NEON::BI__builtin_neon_vst1q_x2_v },
7938 { NEON::BI__builtin_neon_vst1q_bf16_x3, NEON::BI__builtin_neon_vst1q_x3_v },
7939 { NEON::BI__builtin_neon_vst1q_bf16_x4, NEON::BI__builtin_neon_vst1q_x4_v },
7940 { NEON::BI__builtin_neon_vst1q_bf16, NEON::BI__builtin_neon_vst1q_v },
7941 { NEON::BI__builtin_neon_vst1q_lane_bf16, NEON::BI__builtin_neon_vst1q_lane_v },
7942 { NEON::BI__builtin_neon_vst2_bf16, NEON::BI__builtin_neon_vst2_v },
7943 { NEON::BI__builtin_neon_vst2_lane_bf16, NEON::BI__builtin_neon_vst2_lane_v },
7944 { NEON::BI__builtin_neon_vst2q_bf16, NEON::BI__builtin_neon_vst2q_v },
7945 { NEON::BI__builtin_neon_vst2q_lane_bf16, NEON::BI__builtin_neon_vst2q_lane_v },
7946 { NEON::BI__builtin_neon_vst3_bf16, NEON::BI__builtin_neon_vst3_v },
7947 { NEON::BI__builtin_neon_vst3_lane_bf16, NEON::BI__builtin_neon_vst3_lane_v },
7948 { NEON::BI__builtin_neon_vst3q_bf16, NEON::BI__builtin_neon_vst3q_v },
7949 { NEON::BI__builtin_neon_vst3q_lane_bf16, NEON::BI__builtin_neon_vst3q_lane_v },
7950 { NEON::BI__builtin_neon_vst4_bf16, NEON::BI__builtin_neon_vst4_v },
7951 { NEON::BI__builtin_neon_vst4_lane_bf16, NEON::BI__builtin_neon_vst4_lane_v },
7952 { NEON::BI__builtin_neon_vst4q_bf16, NEON::BI__builtin_neon_vst4q_v },
7953 { NEON::BI__builtin_neon_vst4q_lane_bf16, NEON::BI__builtin_neon_vst4q_lane_v },
7957 { NEON::BI__builtin_neon_vldap1_lane_u64, NEON::BI__builtin_neon_vldap1_lane_s64 },
7958 { NEON::BI__builtin_neon_vldap1_lane_f64, NEON::BI__builtin_neon_vldap1_lane_s64 },
7959 { NEON::BI__builtin_neon_vldap1_lane_p64, NEON::BI__builtin_neon_vldap1_lane_s64 },
7960 { NEON::BI__builtin_neon_vldap1q_lane_u64, NEON::BI__builtin_neon_vldap1q_lane_s64 },
7961 { NEON::BI__builtin_neon_vldap1q_lane_f64, NEON::BI__builtin_neon_vldap1q_lane_s64 },
7962 { NEON::BI__builtin_neon_vldap1q_lane_p64, NEON::BI__builtin_neon_vldap1q_lane_s64 },
7963 { NEON::BI__builtin_neon_vstl1_lane_u64, NEON::BI__builtin_neon_vstl1_lane_s64 },
7964 { NEON::BI__builtin_neon_vstl1_lane_f64, NEON::BI__builtin_neon_vstl1_lane_s64 },
7965 { NEON::BI__builtin_neon_vstl1_lane_p64, NEON::BI__builtin_neon_vstl1_lane_s64 },
7966 { NEON::BI__builtin_neon_vstl1q_lane_u64, NEON::BI__builtin_neon_vstl1q_lane_s64 },
7967 { NEON::BI__builtin_neon_vstl1q_lane_f64, NEON::BI__builtin_neon_vstl1q_lane_s64 },
7968 { NEON::BI__builtin_neon_vstl1q_lane_p64, NEON::BI__builtin_neon_vstl1q_lane_s64 },
7975#define SVEMAP1(NameBase, LLVMIntrinsic, TypeModifier) \
7977 #NameBase, SVE::BI__builtin_sve_##NameBase, Intrinsic::LLVMIntrinsic, 0, \
7981#define SVEMAP2(NameBase, TypeModifier) \
7982 { #NameBase, SVE::BI__builtin_sve_##NameBase, 0, 0, TypeModifier }
7984#define GET_SVE_LLVM_INTRINSIC_MAP
7985#include "clang/Basic/arm_sve_builtin_cg.inc"
7986#include "clang/Basic/BuiltinsAArch64NeonSVEBridge_cg.def"
7987#undef GET_SVE_LLVM_INTRINSIC_MAP
7993#define SMEMAP1(NameBase, LLVMIntrinsic, TypeModifier) \
7995 #NameBase, SME::BI__builtin_sme_##NameBase, Intrinsic::LLVMIntrinsic, 0, \
7999#define SMEMAP2(NameBase, TypeModifier) \
8000 { #NameBase, SME::BI__builtin_sme_##NameBase, 0, 0, TypeModifier }
8002#define GET_SME_LLVM_INTRINSIC_MAP
8003#include "clang/Basic/arm_sme_builtin_cg.inc"
8004#undef GET_SME_LLVM_INTRINSIC_MAP
8017static const ARMVectorIntrinsicInfo *
8019 unsigned BuiltinID,
bool &MapProvenSorted) {
8022 if (!MapProvenSorted) {
8023 assert(llvm::is_sorted(IntrinsicMap));
8024 MapProvenSorted =
true;
8028 const ARMVectorIntrinsicInfo *Builtin =
8029 llvm::lower_bound(IntrinsicMap, BuiltinID);
8031 if (Builtin != IntrinsicMap.end() && Builtin->BuiltinID == BuiltinID)
8039 llvm::Type *ArgType,
8052 Ty = llvm::FixedVectorType::get(
8053 Ty, VectorSize ? VectorSize / Ty->getPrimitiveSizeInBits() : 1);
8060 int Elts = VectorSize ? VectorSize / ArgType->getPrimitiveSizeInBits() : 1;
8061 ArgType = llvm::FixedVectorType::get(ArgType, Elts);
8065 Tys.push_back(ArgType);
8068 Tys.push_back(ArgType);
8079 unsigned BuiltinID = SISDInfo.BuiltinID;
8080 unsigned int Int = SISDInfo.LLVMIntrinsic;
8081 unsigned Modifier = SISDInfo.TypeModifier;
8082 const char *
s = SISDInfo.NameHint;
8084 switch (BuiltinID) {
8085 case NEON::BI__builtin_neon_vcled_s64:
8086 case NEON::BI__builtin_neon_vcled_u64:
8087 case NEON::BI__builtin_neon_vcles_f32:
8088 case NEON::BI__builtin_neon_vcled_f64:
8089 case NEON::BI__builtin_neon_vcltd_s64:
8090 case NEON::BI__builtin_neon_vcltd_u64:
8091 case NEON::BI__builtin_neon_vclts_f32:
8092 case NEON::BI__builtin_neon_vcltd_f64:
8093 case NEON::BI__builtin_neon_vcales_f32:
8094 case NEON::BI__builtin_neon_vcaled_f64:
8095 case NEON::BI__builtin_neon_vcalts_f32:
8096 case NEON::BI__builtin_neon_vcaltd_f64:
8100 std::swap(Ops[0], Ops[1]);
8104 assert(Int &&
"Generic code assumes a valid intrinsic");
8107 const Expr *Arg =
E->getArg(0);
8112 ConstantInt *C0 = ConstantInt::get(CGF.
SizeTy, 0);
8113 for (Function::const_arg_iterator ai = F->arg_begin(), ae = F->arg_end();
8114 ai != ae; ++ai, ++j) {
8115 llvm::Type *ArgTy = ai->getType();
8116 if (Ops[j]->getType()->getPrimitiveSizeInBits() ==
8117 ArgTy->getPrimitiveSizeInBits())
8120 assert(ArgTy->isVectorTy() && !Ops[j]->getType()->isVectorTy());
8123 Ops[j] = CGF.
Builder.CreateTruncOrBitCast(
8124 Ops[j], cast<llvm::VectorType>(ArgTy)->getElementType());
8126 CGF.
Builder.CreateInsertElement(PoisonValue::get(ArgTy), Ops[j], C0);
8131 if (ResultType->getPrimitiveSizeInBits().getFixedValue() <
8132 Result->getType()->getPrimitiveSizeInBits().getFixedValue())
8139 unsigned BuiltinID,
unsigned LLVMIntrinsic,
unsigned AltLLVMIntrinsic,
8140 const char *NameHint,
unsigned Modifier,
const CallExpr *
E,
8142 llvm::Triple::ArchType Arch) {
8144 const Expr *Arg =
E->getArg(
E->getNumArgs() - 1);
8145 std::optional<llvm::APSInt> NeonTypeConst =
8152 bool Usgn =
Type.isUnsigned();
8153 bool Quad =
Type.isQuad();
8155 const bool AllowBFloatArgsAndRet =
8158 llvm::FixedVectorType *VTy =
8159 GetNeonType(
this,
Type, HasLegalHalfType,
false, AllowBFloatArgsAndRet);
8160 llvm::Type *Ty = VTy;
8164 auto getAlignmentValue32 = [&](
Address addr) ->
Value* {
8165 return Builder.getInt32(addr.getAlignment().getQuantity());
8168 unsigned Int = LLVMIntrinsic;
8170 Int = AltLLVMIntrinsic;
8172 switch (BuiltinID) {
8174 case NEON::BI__builtin_neon_splat_lane_v:
8175 case NEON::BI__builtin_neon_splat_laneq_v:
8176 case NEON::BI__builtin_neon_splatq_lane_v:
8177 case NEON::BI__builtin_neon_splatq_laneq_v: {
8178 auto NumElements = VTy->getElementCount();
8179 if (BuiltinID == NEON::BI__builtin_neon_splatq_lane_v)
8180 NumElements = NumElements * 2;
8181 if (BuiltinID == NEON::BI__builtin_neon_splat_laneq_v)
8182 NumElements = NumElements.divideCoefficientBy(2);
8184 Ops[0] =
Builder.CreateBitCast(Ops[0], VTy);
8185 return EmitNeonSplat(Ops[0], cast<ConstantInt>(Ops[1]), NumElements);
8187 case NEON::BI__builtin_neon_vpadd_v:
8188 case NEON::BI__builtin_neon_vpaddq_v:
8190 if (VTy->getElementType()->isFloatingPointTy() &&
8191 Int == Intrinsic::aarch64_neon_addp)
8192 Int = Intrinsic::aarch64_neon_faddp;
8194 case NEON::BI__builtin_neon_vabs_v:
8195 case NEON::BI__builtin_neon_vabsq_v:
8196 if (VTy->getElementType()->isFloatingPointTy())
8199 case NEON::BI__builtin_neon_vadd_v:
8200 case NEON::BI__builtin_neon_vaddq_v: {
8201 llvm::Type *VTy = llvm::FixedVectorType::get(
Int8Ty, Quad ? 16 : 8);
8202 Ops[0] =
Builder.CreateBitCast(Ops[0], VTy);
8203 Ops[1] =
Builder.CreateBitCast(Ops[1], VTy);
8204 Ops[0] =
Builder.CreateXor(Ops[0], Ops[1]);
8205 return Builder.CreateBitCast(Ops[0], Ty);
8207 case NEON::BI__builtin_neon_vaddhn_v: {
8208 llvm::FixedVectorType *SrcTy =
8209 llvm::FixedVectorType::getExtendedElementVectorType(VTy);
8212 Ops[0] =
Builder.CreateBitCast(Ops[0], SrcTy);
8213 Ops[1] =
Builder.CreateBitCast(Ops[1], SrcTy);
8214 Ops[0] =
Builder.CreateAdd(Ops[0], Ops[1],
"vaddhn");
8217 Constant *ShiftAmt =
8218 ConstantInt::get(SrcTy, SrcTy->getScalarSizeInBits() / 2);
8219 Ops[0] =
Builder.CreateLShr(Ops[0], ShiftAmt,
"vaddhn");
8222 return Builder.CreateTrunc(Ops[0], VTy,
"vaddhn");
8224 case NEON::BI__builtin_neon_vcale_v:
8225 case NEON::BI__builtin_neon_vcaleq_v:
8226 case NEON::BI__builtin_neon_vcalt_v:
8227 case NEON::BI__builtin_neon_vcaltq_v:
8228 std::swap(Ops[0], Ops[1]);
8230 case NEON::BI__builtin_neon_vcage_v:
8231 case NEON::BI__builtin_neon_vcageq_v:
8232 case NEON::BI__builtin_neon_vcagt_v:
8233 case NEON::BI__builtin_neon_vcagtq_v: {
8235 switch (VTy->getScalarSizeInBits()) {
8236 default: llvm_unreachable(
"unexpected type");
8247 auto *VecFlt = llvm::FixedVectorType::get(Ty, VTy->getNumElements());
8248 llvm::Type *Tys[] = { VTy, VecFlt };
8252 case NEON::BI__builtin_neon_vceqz_v:
8253 case NEON::BI__builtin_neon_vceqzq_v:
8255 ICmpInst::ICMP_EQ,
"vceqz");
8256 case NEON::BI__builtin_neon_vcgez_v:
8257 case NEON::BI__builtin_neon_vcgezq_v:
8259 ICmpInst::ICMP_SGE,
"vcgez");
8260 case NEON::BI__builtin_neon_vclez_v:
8261 case NEON::BI__builtin_neon_vclezq_v:
8263 ICmpInst::ICMP_SLE,
"vclez");
8264 case NEON::BI__builtin_neon_vcgtz_v:
8265 case NEON::BI__builtin_neon_vcgtzq_v:
8267 ICmpInst::ICMP_SGT,
"vcgtz");
8268 case NEON::BI__builtin_neon_vcltz_v:
8269 case NEON::BI__builtin_neon_vcltzq_v:
8271 ICmpInst::ICMP_SLT,
"vcltz");
8272 case NEON::BI__builtin_neon_vclz_v:
8273 case NEON::BI__builtin_neon_vclzq_v:
8278 case NEON::BI__builtin_neon_vcvt_f32_v:
8279 case NEON::BI__builtin_neon_vcvtq_f32_v:
8280 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
8283 return Usgn ?
Builder.CreateUIToFP(Ops[0], Ty,
"vcvt")
8284 :
Builder.CreateSIToFP(Ops[0], Ty,
"vcvt");
8285 case NEON::BI__builtin_neon_vcvt_f16_s16:
8286 case NEON::BI__builtin_neon_vcvt_f16_u16:
8287 case NEON::BI__builtin_neon_vcvtq_f16_s16:
8288 case NEON::BI__builtin_neon_vcvtq_f16_u16:
8289 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
8292 return Usgn ?
Builder.CreateUIToFP(Ops[0], Ty,
"vcvt")
8293 :
Builder.CreateSIToFP(Ops[0], Ty,
"vcvt");
8294 case NEON::BI__builtin_neon_vcvt_n_f16_s16:
8295 case NEON::BI__builtin_neon_vcvt_n_f16_u16:
8296 case NEON::BI__builtin_neon_vcvtq_n_f16_s16:
8297 case NEON::BI__builtin_neon_vcvtq_n_f16_u16: {
8302 case NEON::BI__builtin_neon_vcvt_n_f32_v:
8303 case NEON::BI__builtin_neon_vcvt_n_f64_v:
8304 case NEON::BI__builtin_neon_vcvtq_n_f32_v:
8305 case NEON::BI__builtin_neon_vcvtq_n_f64_v: {
8307 Int = Usgn ? LLVMIntrinsic : AltLLVMIntrinsic;
8311 case NEON::BI__builtin_neon_vcvt_n_s16_f16:
8312 case NEON::BI__builtin_neon_vcvt_n_s32_v:
8313 case NEON::BI__builtin_neon_vcvt_n_u16_f16:
8314 case NEON::BI__builtin_neon_vcvt_n_u32_v:
8315 case NEON::BI__builtin_neon_vcvt_n_s64_v:
8316 case NEON::BI__builtin_neon_vcvt_n_u64_v:
8317 case NEON::BI__builtin_neon_vcvtq_n_s16_f16:
8318 case NEON::BI__builtin_neon_vcvtq_n_s32_v:
8319 case NEON::BI__builtin_neon_vcvtq_n_u16_f16:
8320 case NEON::BI__builtin_neon_vcvtq_n_u32_v:
8321 case NEON::BI__builtin_neon_vcvtq_n_s64_v:
8322 case NEON::BI__builtin_neon_vcvtq_n_u64_v: {
8327 case NEON::BI__builtin_neon_vcvt_s32_v:
8328 case NEON::BI__builtin_neon_vcvt_u32_v:
8329 case NEON::BI__builtin_neon_vcvt_s64_v:
8330 case NEON::BI__builtin_neon_vcvt_u64_v:
8331 case NEON::BI__builtin_neon_vcvt_s16_f16:
8332 case NEON::BI__builtin_neon_vcvt_u16_f16:
8333 case NEON::BI__builtin_neon_vcvtq_s32_v:
8334 case NEON::BI__builtin_neon_vcvtq_u32_v:
8335 case NEON::BI__builtin_neon_vcvtq_s64_v:
8336 case NEON::BI__builtin_neon_vcvtq_u64_v:
8337 case NEON::BI__builtin_neon_vcvtq_s16_f16:
8338 case NEON::BI__builtin_neon_vcvtq_u16_f16: {
8340 return Usgn ?
Builder.CreateFPToUI(Ops[0], Ty,
"vcvt")
8341 :
Builder.CreateFPToSI(Ops[0], Ty,
"vcvt");
8343 case NEON::BI__builtin_neon_vcvta_s16_f16:
8344 case NEON::BI__builtin_neon_vcvta_s32_v:
8345 case NEON::BI__builtin_neon_vcvta_s64_v:
8346 case NEON::BI__builtin_neon_vcvta_u16_f16:
8347 case NEON::BI__builtin_neon_vcvta_u32_v:
8348 case NEON::BI__builtin_neon_vcvta_u64_v:
8349 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
8350 case NEON::BI__builtin_neon_vcvtaq_s32_v:
8351 case NEON::BI__builtin_neon_vcvtaq_s64_v:
8352 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
8353 case NEON::BI__builtin_neon_vcvtaq_u32_v:
8354 case NEON::BI__builtin_neon_vcvtaq_u64_v:
8355 case NEON::BI__builtin_neon_vcvtn_s16_f16:
8356 case NEON::BI__builtin_neon_vcvtn_s32_v:
8357 case NEON::BI__builtin_neon_vcvtn_s64_v:
8358 case NEON::BI__builtin_neon_vcvtn_u16_f16:
8359 case NEON::BI__builtin_neon_vcvtn_u32_v:
8360 case NEON::BI__builtin_neon_vcvtn_u64_v:
8361 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
8362 case NEON::BI__builtin_neon_vcvtnq_s32_v:
8363 case NEON::BI__builtin_neon_vcvtnq_s64_v:
8364 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
8365 case NEON::BI__builtin_neon_vcvtnq_u32_v:
8366 case NEON::BI__builtin_neon_vcvtnq_u64_v:
8367 case NEON::BI__builtin_neon_vcvtp_s16_f16:
8368 case NEON::BI__builtin_neon_vcvtp_s32_v:
8369 case NEON::BI__builtin_neon_vcvtp_s64_v:
8370 case NEON::BI__builtin_neon_vcvtp_u16_f16:
8371 case NEON::BI__builtin_neon_vcvtp_u32_v:
8372 case NEON::BI__builtin_neon_vcvtp_u64_v:
8373 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
8374 case NEON::BI__builtin_neon_vcvtpq_s32_v:
8375 case NEON::BI__builtin_neon_vcvtpq_s64_v:
8376 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
8377 case NEON::BI__builtin_neon_vcvtpq_u32_v:
8378 case NEON::BI__builtin_neon_vcvtpq_u64_v:
8379 case NEON::BI__builtin_neon_vcvtm_s16_f16:
8380 case NEON::BI__builtin_neon_vcvtm_s32_v:
8381 case NEON::BI__builtin_neon_vcvtm_s64_v:
8382 case NEON::BI__builtin_neon_vcvtm_u16_f16:
8383 case NEON::BI__builtin_neon_vcvtm_u32_v:
8384 case NEON::BI__builtin_neon_vcvtm_u64_v:
8385 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
8386 case NEON::BI__builtin_neon_vcvtmq_s32_v:
8387 case NEON::BI__builtin_neon_vcvtmq_s64_v:
8388 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
8389 case NEON::BI__builtin_neon_vcvtmq_u32_v:
8390 case NEON::BI__builtin_neon_vcvtmq_u64_v: {
8394 case NEON::BI__builtin_neon_vcvtx_f32_v: {
8395 llvm::Type *Tys[2] = { VTy->getTruncatedElementVectorType(VTy), Ty};
8399 case NEON::BI__builtin_neon_vext_v:
8400 case NEON::BI__builtin_neon_vextq_v: {
8401 int CV = cast<ConstantInt>(Ops[2])->getSExtValue();
8403 for (
unsigned i = 0, e = VTy->getNumElements(); i != e; ++i)
8404 Indices.push_back(i+CV);
8406 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
8407 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
8408 return Builder.CreateShuffleVector(Ops[0], Ops[1], Indices,
"vext");
8410 case NEON::BI__builtin_neon_vfma_v:
8411 case NEON::BI__builtin_neon_vfmaq_v: {
8412 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
8413 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
8414 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
8418 *
this, Intrinsic::fma, Intrinsic::experimental_constrained_fma, Ty,
8419 {Ops[1], Ops[2], Ops[0]});
8421 case NEON::BI__builtin_neon_vld1_v:
8422 case NEON::BI__builtin_neon_vld1q_v: {
8424 Ops.push_back(getAlignmentValue32(PtrOp0));
8427 case NEON::BI__builtin_neon_vld1_x2_v:
8428 case NEON::BI__builtin_neon_vld1q_x2_v:
8429 case NEON::BI__builtin_neon_vld1_x3_v:
8430 case NEON::BI__builtin_neon_vld1q_x3_v:
8431 case NEON::BI__builtin_neon_vld1_x4_v:
8432 case NEON::BI__builtin_neon_vld1q_x4_v: {
8435 Ops[1] =
Builder.CreateCall(F, Ops[1],
"vld1xN");
8438 case NEON::BI__builtin_neon_vld2_v:
8439 case NEON::BI__builtin_neon_vld2q_v:
8440 case NEON::BI__builtin_neon_vld3_v:
8441 case NEON::BI__builtin_neon_vld3q_v:
8442 case NEON::BI__builtin_neon_vld4_v:
8443 case NEON::BI__builtin_neon_vld4q_v:
8444 case NEON::BI__builtin_neon_vld2_dup_v:
8445 case NEON::BI__builtin_neon_vld2q_dup_v:
8446 case NEON::BI__builtin_neon_vld3_dup_v:
8447 case NEON::BI__builtin_neon_vld3q_dup_v:
8448 case NEON::BI__builtin_neon_vld4_dup_v:
8449 case NEON::BI__builtin_neon_vld4q_dup_v: {
8452 Value *Align = getAlignmentValue32(PtrOp1);
8453 Ops[1] =
Builder.CreateCall(F, {Ops[1], Align}, NameHint);
8456 case NEON::BI__builtin_neon_vld1_dup_v:
8457 case NEON::BI__builtin_neon_vld1q_dup_v: {
8458 Value *
V = PoisonValue::get(Ty);
8461 llvm::Constant *CI = ConstantInt::get(
SizeTy, 0);
8462 Ops[0] =
Builder.CreateInsertElement(
V, Ld, CI);
8465 case NEON::BI__builtin_neon_vld2_lane_v:
8466 case NEON::BI__builtin_neon_vld2q_lane_v:
8467 case NEON::BI__builtin_neon_vld3_lane_v:
8468 case NEON::BI__builtin_neon_vld3q_lane_v:
8469 case NEON::BI__builtin_neon_vld4_lane_v:
8470 case NEON::BI__builtin_neon_vld4q_lane_v: {
8473 for (
unsigned I = 2; I < Ops.size() - 1; ++I)
8474 Ops[I] =
Builder.CreateBitCast(Ops[I], Ty);
8475 Ops.push_back(getAlignmentValue32(PtrOp1));
8479 case NEON::BI__builtin_neon_vmovl_v: {
8480 llvm::FixedVectorType *DTy =
8481 llvm::FixedVectorType::getTruncatedElementVectorType(VTy);
8482 Ops[0] =
Builder.CreateBitCast(Ops[0], DTy);
8484 return Builder.CreateZExt(Ops[0], Ty,
"vmovl");
8485 return Builder.CreateSExt(Ops[0], Ty,
"vmovl");
8487 case NEON::BI__builtin_neon_vmovn_v: {
8488 llvm::FixedVectorType *QTy =
8489 llvm::FixedVectorType::getExtendedElementVectorType(VTy);
8490 Ops[0] =
Builder.CreateBitCast(Ops[0], QTy);
8491 return Builder.CreateTrunc(Ops[0], Ty,
"vmovn");
8493 case NEON::BI__builtin_neon_vmull_v:
8499 Int = Usgn ? Intrinsic::arm_neon_vmullu : Intrinsic::arm_neon_vmulls;
8502 case NEON::BI__builtin_neon_vpadal_v:
8503 case NEON::BI__builtin_neon_vpadalq_v: {
8505 unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits();
8509 llvm::FixedVectorType::get(EltTy, VTy->getNumElements() * 2);
8510 llvm::Type *Tys[2] = { Ty, NarrowTy };
8513 case NEON::BI__builtin_neon_vpaddl_v:
8514 case NEON::BI__builtin_neon_vpaddlq_v: {
8516 unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits();
8517 llvm::Type *EltTy = llvm::IntegerType::get(
getLLVMContext(), EltBits / 2);
8519 llvm::FixedVectorType::get(EltTy, VTy->getNumElements() * 2);
8520 llvm::Type *Tys[2] = { Ty, NarrowTy };
8523 case NEON::BI__builtin_neon_vqdmlal_v:
8524 case NEON::BI__builtin_neon_vqdmlsl_v: {
8531 case NEON::BI__builtin_neon_vqdmulhq_lane_v:
8532 case NEON::BI__builtin_neon_vqdmulh_lane_v:
8533 case NEON::BI__builtin_neon_vqrdmulhq_lane_v:
8534 case NEON::BI__builtin_neon_vqrdmulh_lane_v: {
8535 auto *RTy = cast<llvm::FixedVectorType>(Ty);
8536 if (BuiltinID == NEON::BI__builtin_neon_vqdmulhq_lane_v ||
8537 BuiltinID == NEON::BI__builtin_neon_vqrdmulhq_lane_v)
8538 RTy = llvm::FixedVectorType::get(RTy->getElementType(),
8539 RTy->getNumElements() * 2);
8540 llvm::Type *Tys[2] = {
8545 case NEON::BI__builtin_neon_vqdmulhq_laneq_v:
8546 case NEON::BI__builtin_neon_vqdmulh_laneq_v:
8547 case NEON::BI__builtin_neon_vqrdmulhq_laneq_v:
8548 case NEON::BI__builtin_neon_vqrdmulh_laneq_v: {
8549 llvm::Type *Tys[2] = {
8554 case NEON::BI__builtin_neon_vqshl_n_v:
8555 case NEON::BI__builtin_neon_vqshlq_n_v:
8558 case NEON::BI__builtin_neon_vqshlu_n_v:
8559 case NEON::BI__builtin_neon_vqshluq_n_v:
8562 case NEON::BI__builtin_neon_vrecpe_v:
8563 case NEON::BI__builtin_neon_vrecpeq_v:
8564 case NEON::BI__builtin_neon_vrsqrte_v:
8565 case NEON::BI__builtin_neon_vrsqrteq_v:
8566 Int = Ty->isFPOrFPVectorTy() ? LLVMIntrinsic : AltLLVMIntrinsic;
8568 case NEON::BI__builtin_neon_vrndi_v:
8569 case NEON::BI__builtin_neon_vrndiq_v:
8571 ? Intrinsic::experimental_constrained_nearbyint
8572 : Intrinsic::nearbyint;
8574 case NEON::BI__builtin_neon_vrshr_n_v:
8575 case NEON::BI__builtin_neon_vrshrq_n_v:
8578 case NEON::BI__builtin_neon_vsha512hq_u64:
8579 case NEON::BI__builtin_neon_vsha512h2q_u64:
8580 case NEON::BI__builtin_neon_vsha512su0q_u64:
8581 case NEON::BI__builtin_neon_vsha512su1q_u64: {
8585 case NEON::BI__builtin_neon_vshl_n_v:
8586 case NEON::BI__builtin_neon_vshlq_n_v:
8588 return Builder.CreateShl(
Builder.CreateBitCast(Ops[0],Ty), Ops[1],
8590 case NEON::BI__builtin_neon_vshll_n_v: {
8591 llvm::FixedVectorType *SrcTy =
8592 llvm::FixedVectorType::getTruncatedElementVectorType(VTy);
8593 Ops[0] =
Builder.CreateBitCast(Ops[0], SrcTy);
8595 Ops[0] =
Builder.CreateZExt(Ops[0], VTy);
8597 Ops[0] =
Builder.CreateSExt(Ops[0], VTy);
8599 return Builder.CreateShl(Ops[0], Ops[1],
"vshll_n");
8601 case NEON::BI__builtin_neon_vshrn_n_v: {
8602 llvm::FixedVectorType *SrcTy =
8603 llvm::FixedVectorType::getExtendedElementVectorType(VTy);
8604 Ops[0] =
Builder.CreateBitCast(Ops[0], SrcTy);
8607 Ops[0] =
Builder.CreateLShr(Ops[0], Ops[1]);
8609 Ops[0] =
Builder.CreateAShr(Ops[0], Ops[1]);
8610 return Builder.CreateTrunc(Ops[0], Ty,
"vshrn_n");
8612 case NEON::BI__builtin_neon_vshr_n_v:
8613 case NEON::BI__builtin_neon_vshrq_n_v:
8615 case NEON::BI__builtin_neon_vst1_v:
8616 case NEON::BI__builtin_neon_vst1q_v:
8617 case NEON::BI__builtin_neon_vst2_v:
8618 case NEON::BI__builtin_neon_vst2q_v:
8619 case NEON::BI__builtin_neon_vst3_v:
8620 case NEON::BI__builtin_neon_vst3q_v:
8621 case NEON::BI__builtin_neon_vst4_v:
8622 case NEON::BI__builtin_neon_vst4q_v:
8623 case NEON::BI__builtin_neon_vst2_lane_v:
8624 case NEON::BI__builtin_neon_vst2q_lane_v:
8625 case NEON::BI__builtin_neon_vst3_lane_v:
8626 case NEON::BI__builtin_neon_vst3q_lane_v:
8627 case NEON::BI__builtin_neon_vst4_lane_v:
8628 case NEON::BI__builtin_neon_vst4q_lane_v: {
8630 Ops.push_back(getAlignmentValue32(PtrOp0));
8633 case NEON::BI__builtin_neon_vsm3partw1q_u32:
8634 case NEON::BI__builtin_neon_vsm3partw2q_u32:
8635 case NEON::BI__builtin_neon_vsm3ss1q_u32:
8636 case NEON::BI__builtin_neon_vsm4ekeyq_u32:
8637 case NEON::BI__builtin_neon_vsm4eq_u32: {
8641 case NEON::BI__builtin_neon_vsm3tt1aq_u32:
8642 case NEON::BI__builtin_neon_vsm3tt1bq_u32:
8643 case NEON::BI__builtin_neon_vsm3tt2aq_u32:
8644 case NEON::BI__builtin_neon_vsm3tt2bq_u32: {
8649 case NEON::BI__builtin_neon_vst1_x2_v:
8650 case NEON::BI__builtin_neon_vst1q_x2_v:
8651 case NEON::BI__builtin_neon_vst1_x3_v:
8652 case NEON::BI__builtin_neon_vst1q_x3_v:
8653 case NEON::BI__builtin_neon_vst1_x4_v:
8654 case NEON::BI__builtin_neon_vst1q_x4_v: {
8657 if (Arch == llvm::Triple::aarch64 || Arch == llvm::Triple::aarch64_be ||
8658 Arch == llvm::Triple::aarch64_32) {
8660 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end());
8666 case NEON::BI__builtin_neon_vsubhn_v: {
8667 llvm::FixedVectorType *SrcTy =
8668 llvm::FixedVectorType::getExtendedElementVectorType(VTy);
8671 Ops[0] =
Builder.CreateBitCast(Ops[0], SrcTy);
8672 Ops[1] =
Builder.CreateBitCast(Ops[1], SrcTy);
8673 Ops[0] =
Builder.CreateSub(Ops[0], Ops[1],
"vsubhn");
8676 Constant *ShiftAmt =
8677 ConstantInt::get(SrcTy, SrcTy->getScalarSizeInBits() / 2);
8678 Ops[0] =
Builder.CreateLShr(Ops[0], ShiftAmt,
"vsubhn");
8681 return Builder.CreateTrunc(Ops[0], VTy,
"vsubhn");
8683 case NEON::BI__builtin_neon_vtrn_v:
8684 case NEON::BI__builtin_neon_vtrnq_v: {
8685 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
8686 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
8687 Value *SV =
nullptr;
8689 for (
unsigned vi = 0; vi != 2; ++vi) {
8691 for (
unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) {
8692 Indices.push_back(i+vi);
8693 Indices.push_back(i+e+vi);
8695 Value *Addr =
Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi);
8696 SV =
Builder.CreateShuffleVector(Ops[1], Ops[2], Indices,
"vtrn");
8701 case NEON::BI__builtin_neon_vtst_v:
8702 case NEON::BI__builtin_neon_vtstq_v: {
8703 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
8704 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
8705 Ops[0] =
Builder.CreateAnd(Ops[0], Ops[1]);
8706 Ops[0] =
Builder.CreateICmp(ICmpInst::ICMP_NE, Ops[0],
8707 ConstantAggregateZero::get(Ty));
8708 return Builder.CreateSExt(Ops[0], Ty,
"vtst");
8710 case NEON::BI__builtin_neon_vuzp_v:
8711 case NEON::BI__builtin_neon_vuzpq_v: {
8712 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
8713 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
8714 Value *SV =
nullptr;
8716 for (
unsigned vi = 0; vi != 2; ++vi) {
8718 for (
unsigned i = 0, e = VTy->getNumElements(); i != e; ++i)
8719 Indices.push_back(2*i+vi);
8721 Value *Addr =
Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi);
8722 SV =
Builder.CreateShuffleVector(Ops[1], Ops[2], Indices,
"vuzp");
8727 case NEON::BI__builtin_neon_vxarq_u64: {
8732 case NEON::BI__builtin_neon_vzip_v:
8733 case NEON::BI__builtin_neon_vzipq_v: {
8734 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
8735 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
8736 Value *SV =
nullptr;
8738 for (
unsigned vi = 0; vi != 2; ++vi) {
8740 for (
unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) {
8741 Indices.push_back((i + vi*e) >> 1);
8742 Indices.push_back(((i + vi*e) >> 1)+e);
8744 Value *Addr =
Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi);
8745 SV =
Builder.CreateShuffleVector(Ops[1], Ops[2], Indices,
"vzip");
8750 case NEON::BI__builtin_neon_vdot_s32:
8751 case NEON::BI__builtin_neon_vdot_u32:
8752 case NEON::BI__builtin_neon_vdotq_s32:
8753 case NEON::BI__builtin_neon_vdotq_u32: {
8755 llvm::FixedVectorType::get(
Int8Ty, Ty->getPrimitiveSizeInBits() / 8);
8756 llvm::Type *Tys[2] = { Ty, InputTy };
8759 case NEON::BI__builtin_neon_vfmlal_low_f16:
8760 case NEON::BI__builtin_neon_vfmlalq_low_f16: {
8762 llvm::FixedVectorType::get(
HalfTy, Ty->getPrimitiveSizeInBits() / 16);
8763 llvm::Type *Tys[2] = { Ty, InputTy };
8766 case NEON::BI__builtin_neon_vfmlsl_low_f16:
8767 case NEON::BI__builtin_neon_vfmlslq_low_f16: {
8769 llvm::FixedVectorType::get(
HalfTy, Ty->getPrimitiveSizeInBits() / 16);
8770 llvm::Type *Tys[2] = { Ty, InputTy };
8773 case NEON::BI__builtin_neon_vfmlal_high_f16:
8774 case NEON::BI__builtin_neon_vfmlalq_high_f16: {
8776 llvm::FixedVectorType::get(
HalfTy, Ty->getPrimitiveSizeInBits() / 16);
8777 llvm::Type *Tys[2] = { Ty, InputTy };
8780 case NEON::BI__builtin_neon_vfmlsl_high_f16:
8781 case NEON::BI__builtin_neon_vfmlslq_high_f16: {
8783 llvm::FixedVectorType::get(
HalfTy, Ty->getPrimitiveSizeInBits() / 16);
8784 llvm::Type *Tys[2] = { Ty, InputTy };
8787 case NEON::BI__builtin_neon_vmmlaq_s32:
8788 case NEON::BI__builtin_neon_vmmlaq_u32: {
8790 llvm::FixedVectorType::get(
Int8Ty, Ty->getPrimitiveSizeInBits() / 8);
8791 llvm::Type *Tys[2] = { Ty, InputTy };
8794 case NEON::BI__builtin_neon_vusmmlaq_s32: {
8796 llvm::FixedVectorType::get(
Int8Ty, Ty->getPrimitiveSizeInBits() / 8);
8797 llvm::Type *Tys[2] = { Ty, InputTy };
8800 case NEON::BI__builtin_neon_vusdot_s32:
8801 case NEON::BI__builtin_neon_vusdotq_s32: {
8803 llvm::FixedVectorType::get(
Int8Ty, Ty->getPrimitiveSizeInBits() / 8);
8804 llvm::Type *Tys[2] = { Ty, InputTy };
8807 case NEON::BI__builtin_neon_vbfdot_f32:
8808 case NEON::BI__builtin_neon_vbfdotq_f32: {
8809 llvm::Type *InputTy =
8810 llvm::FixedVectorType::get(
BFloatTy, Ty->getPrimitiveSizeInBits() / 16);
8811 llvm::Type *Tys[2] = { Ty, InputTy };
8814 case NEON::BI__builtin_neon___a32_vcvt_bf16_f32: {
8815 llvm::Type *Tys[1] = { Ty };
8822 assert(Int &&
"Expected valid intrinsic number");
8835 Value *Op, llvm::Type *Ty,
const CmpInst::Predicate Fp,
8836 const CmpInst::Predicate Ip,
const Twine &Name) {
8837 llvm::Type *OTy = Op->
getType();
8843 if (BitCastInst *BI = dyn_cast<BitCastInst>(Op))
8844 OTy = BI->getOperand(0)->getType();
8846 Op =
Builder.CreateBitCast(Op, OTy);
8847 if (OTy->getScalarType()->isFloatingPointTy()) {
8848 if (Fp == CmpInst::FCMP_OEQ)
8849 Op =
Builder.CreateFCmp(Fp, Op, Constant::getNullValue(OTy));
8851 Op =
Builder.CreateFCmpS(Fp, Op, Constant::getNullValue(OTy));
8853 Op =
Builder.CreateICmp(Ip, Op, Constant::getNullValue(OTy));
8855 return Builder.CreateSExt(Op, Ty, Name);
8860 llvm::Type *ResTy,
unsigned IntID,
8864 TblOps.push_back(ExtOp);
8868 auto *TblTy = cast<llvm::FixedVectorType>(Ops[0]->getType());
8869 for (
unsigned i = 0, e = TblTy->getNumElements(); i != e; ++i) {
8870 Indices.push_back(2*i);
8871 Indices.push_back(2*i+1);
8874 int PairPos = 0, End = Ops.size() - 1;
8875 while (PairPos < End) {
8876 TblOps.push_back(CGF.
Builder.CreateShuffleVector(Ops[PairPos],
8877 Ops[PairPos+1], Indices,
8884 if (PairPos == End) {
8885 Value *ZeroTbl = ConstantAggregateZero::get(TblTy);
8886 TblOps.push_back(CGF.
Builder.CreateShuffleVector(Ops[PairPos],
8887 ZeroTbl, Indices, Name));
8891 TblOps.push_back(IndexOp);
8897Value *CodeGenFunction::GetValueForARMHint(
unsigned BuiltinID) {
8899 switch (BuiltinID) {
8902 case clang::ARM::BI__builtin_arm_nop:
8905 case clang::ARM::BI__builtin_arm_yield:
8906 case clang::ARM::BI__yield:
8909 case clang::ARM::BI__builtin_arm_wfe:
8910 case clang::ARM::BI__wfe:
8913 case clang::ARM::BI__builtin_arm_wfi:
8914 case clang::ARM::BI__wfi:
8917 case clang::ARM::BI__builtin_arm_sev:
8918 case clang::ARM::BI__sev:
8921 case clang::ARM::BI__builtin_arm_sevl:
8922 case clang::ARM::BI__sevl:
8941 llvm::Type *ValueType,
bool isExecHi) {
8946 llvm::Value *
Call = Builder.CreateCall(F, {Builder.getInt1(
true)});
8949 Value *Rt2 = Builder.CreateLShr(
Call, 32);
8950 Rt2 = Builder.CreateTrunc(Rt2, CGF.
Int32Ty);
8963 llvm::Type *ValueType,
8965 StringRef SysReg =
"") {
8969 "Unsupported size for register.");
8975 if (SysReg.empty()) {
8977 SysReg = cast<clang::StringLiteral>(SysRegStrExpr)->getString();
8980 llvm::Metadata *Ops[] = { llvm::MDString::get(Context, SysReg) };
8981 llvm::MDNode *RegName = llvm::MDNode::get(Context, Ops);
8982 llvm::Value *Metadata = llvm::MetadataAsValue::get(Context, RegName);
8986 bool MixedTypes =
RegisterType->isIntegerTy(64) && ValueType->isIntegerTy(32);
8987 assert(!(
RegisterType->isIntegerTy(32) && ValueType->isIntegerTy(64))
8988 &&
"Can't fit 64-bit value in 32-bit register");
8990 if (AccessKind !=
Write) {
8993 AccessKind ==
VolatileRead ? llvm::Intrinsic::read_volatile_register
8994 : llvm::Intrinsic::read_register,
8996 llvm::Value *
Call = Builder.CreateCall(F, Metadata);
9000 return Builder.CreateTrunc(
Call, ValueType);
9002 if (ValueType->isPointerTy())
9004 return Builder.CreateIntToPtr(
Call, ValueType);
9009 llvm::Function *F = CGM.
getIntrinsic(llvm::Intrinsic::write_register, Types);
9014 return Builder.CreateCall(F, { Metadata, ArgValue });
9017 if (ValueType->isPointerTy()) {
9019 ArgValue = Builder.CreatePtrToInt(ArgValue,
RegisterType);
9020 return Builder.CreateCall(F, { Metadata, ArgValue });
9023 return Builder.CreateCall(F, { Metadata, ArgValue });
9029 switch (BuiltinID) {
9031 case NEON::BI__builtin_neon_vget_lane_i8:
9032 case NEON::BI__builtin_neon_vget_lane_i16:
9033 case NEON::BI__builtin_neon_vget_lane_bf16:
9034 case NEON::BI__builtin_neon_vget_lane_i32:
9035 case NEON::BI__builtin_neon_vget_lane_i64:
9036 case NEON::BI__builtin_neon_vget_lane_f32:
9037 case NEON::BI__builtin_neon_vgetq_lane_i8:
9038 case NEON::BI__builtin_neon_vgetq_lane_i16:
9039 case NEON::BI__builtin_neon_vgetq_lane_bf16:
9040 case NEON::BI__builtin_neon_vgetq_lane_i32:
9041 case NEON::BI__builtin_neon_vgetq_lane_i64:
9042 case NEON::BI__builtin_neon_vgetq_lane_f32:
9043 case NEON::BI__builtin_neon_vduph_lane_bf16:
9044 case NEON::BI__builtin_neon_vduph_laneq_bf16:
9045 case NEON::BI__builtin_neon_vset_lane_i8:
9046 case NEON::BI__builtin_neon_vset_lane_i16:
9047 case NEON::BI__builtin_neon_vset_lane_bf16:
9048 case NEON::BI__builtin_neon_vset_lane_i32:
9049 case NEON::BI__builtin_neon_vset_lane_i64:
9050 case NEON::BI__builtin_neon_vset_lane_f32:
9051 case NEON::BI__builtin_neon_vsetq_lane_i8:
9052 case NEON::BI__builtin_neon_vsetq_lane_i16:
9053 case NEON::BI__builtin_neon_vsetq_lane_bf16:
9054 case NEON::BI__builtin_neon_vsetq_lane_i32:
9055 case NEON::BI__builtin_neon_vsetq_lane_i64:
9056 case NEON::BI__builtin_neon_vsetq_lane_f32:
9057 case NEON::BI__builtin_neon_vsha1h_u32:
9058 case NEON::BI__builtin_neon_vsha1cq_u32:
9059 case NEON::BI__builtin_neon_vsha1pq_u32:
9060 case NEON::BI__builtin_neon_vsha1mq_u32:
9061 case NEON::BI__builtin_neon_vcvth_bf16_f32:
9062 case clang::ARM::BI_MoveToCoprocessor:
9063 case clang::ARM::BI_MoveToCoprocessor2:
9072 llvm::Triple::ArchType Arch) {
9073 if (
auto Hint = GetValueForARMHint(BuiltinID))
9076 if (BuiltinID == clang::ARM::BI__emit) {
9078 llvm::FunctionType *FTy =
9079 llvm::FunctionType::get(
VoidTy,
false);
9083 llvm_unreachable(
"Sema will ensure that the parameter is constant");
9086 uint64_t ZExtValue =
Value.zextOrTrunc(IsThumb ? 16 : 32).getZExtValue();
9088 llvm::InlineAsm *Emit =
9089 IsThumb ? InlineAsm::get(FTy,
".inst.n 0x" + utohexstr(ZExtValue),
"",
9091 : InlineAsm::get(FTy,
".inst 0x" + utohexstr(ZExtValue),
"",
9094 return Builder.CreateCall(Emit);
9097 if (BuiltinID == clang::ARM::BI__builtin_arm_dbg) {
9102 if (BuiltinID == clang::ARM::BI__builtin_arm_prefetch) {
9114 if (BuiltinID == clang::ARM::BI__builtin_arm_rbit) {
9117 CGM.
getIntrinsic(Intrinsic::bitreverse, Arg->getType()), Arg,
"rbit");
9120 if (BuiltinID == clang::ARM::BI__builtin_arm_clz ||
9121 BuiltinID == clang::ARM::BI__builtin_arm_clz64) {
9125 if (BuiltinID == clang::ARM::BI__builtin_arm_clz64)
9131 if (BuiltinID == clang::ARM::BI__builtin_arm_cls) {
9135 if (BuiltinID == clang::ARM::BI__builtin_arm_cls64) {
9141 if (BuiltinID == clang::ARM::BI__clear_cache) {
9142 assert(
E->getNumArgs() == 2 &&
"__clear_cache takes 2 arguments");
9145 for (
unsigned i = 0; i < 2; i++)
9148 llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty);
9149 StringRef Name = FD->
getName();
9153 if (BuiltinID == clang::ARM::BI__builtin_arm_mcrr ||
9154 BuiltinID == clang::ARM::BI__builtin_arm_mcrr2) {
9157 switch (BuiltinID) {
9158 default: llvm_unreachable(
"unexpected builtin");
9159 case clang::ARM::BI__builtin_arm_mcrr:
9162 case clang::ARM::BI__builtin_arm_mcrr2:
9184 return Builder.CreateCall(F, {Coproc, Opc1, Rt, Rt2, CRm});
9187 if (BuiltinID == clang::ARM::BI__builtin_arm_mrrc ||
9188 BuiltinID == clang::ARM::BI__builtin_arm_mrrc2) {
9191 switch (BuiltinID) {
9192 default: llvm_unreachable(
"unexpected builtin");
9193 case clang::ARM::BI__builtin_arm_mrrc:
9196 case clang::ARM::BI__builtin_arm_mrrc2:
9204 Value *RtAndRt2 =
Builder.CreateCall(F, {Coproc, Opc1, CRm});
9214 Value *ShiftCast = llvm::ConstantInt::get(
Int64Ty, 32);
9215 RtAndRt2 =
Builder.CreateShl(Rt, ShiftCast,
"shl",
true);
9216 RtAndRt2 =
Builder.CreateOr(RtAndRt2, Rt1);
9221 if (BuiltinID == clang::ARM::BI__builtin_arm_ldrexd ||
9222 ((BuiltinID == clang::ARM::BI__builtin_arm_ldrex ||
9223 BuiltinID == clang::ARM::BI__builtin_arm_ldaex) &&
9225 BuiltinID == clang::ARM::BI__ldrexd) {
9228 switch (BuiltinID) {
9229 default: llvm_unreachable(
"unexpected builtin");
9230 case clang::ARM::BI__builtin_arm_ldaex:
9233 case clang::ARM::BI__builtin_arm_ldrexd:
9234 case clang::ARM::BI__builtin_arm_ldrex:
9235 case clang::ARM::BI__ldrexd:
9249 Val =
Builder.CreateShl(Val0, ShiftCst,
"shl",
true );
9250 Val =
Builder.CreateOr(Val, Val1);
9254 if (BuiltinID == clang::ARM::BI__builtin_arm_ldrex ||
9255 BuiltinID == clang::ARM::BI__builtin_arm_ldaex) {
9264 BuiltinID == clang::ARM::BI__builtin_arm_ldaex ? Intrinsic::arm_ldaex
9265 : Intrinsic::arm_ldrex,
9267 CallInst *Val =
Builder.CreateCall(F, LoadAddr,
"ldrex");
9271 if (RealResTy->isPointerTy())
9272 return Builder.CreateIntToPtr(Val, RealResTy);
9274 llvm::Type *IntResTy = llvm::IntegerType::get(
9276 return Builder.CreateBitCast(
Builder.CreateTruncOrBitCast(Val, IntResTy),
9281 if (BuiltinID == clang::ARM::BI__builtin_arm_strexd ||
9282 ((BuiltinID == clang::ARM::BI__builtin_arm_stlex ||
9283 BuiltinID == clang::ARM::BI__builtin_arm_strex) &&
9286 BuiltinID == clang::ARM::BI__builtin_arm_stlex ? Intrinsic::arm_stlexd
9287 : Intrinsic::arm_strexd);
9300 return Builder.CreateCall(F, {Arg0, Arg1, StPtr},
"strexd");
9303 if (BuiltinID == clang::ARM::BI__builtin_arm_strex ||
9304 BuiltinID == clang::ARM::BI__builtin_arm_stlex) {
9309 llvm::Type *StoreTy =
9312 if (StoreVal->
getType()->isPointerTy())
9315 llvm::Type *
IntTy = llvm::IntegerType::get(
9323 BuiltinID == clang::ARM::BI__builtin_arm_stlex ? Intrinsic::arm_stlex
9324 : Intrinsic::arm_strex,
9327 CallInst *CI =
Builder.CreateCall(F, {StoreVal, StoreAddr},
"strex");
9329 1, Attribute::get(
getLLVMContext(), Attribute::ElementType, StoreTy));
9333 if (BuiltinID == clang::ARM::BI__builtin_arm_clrex) {
9339 Intrinsic::ID CRCIntrinsicID = Intrinsic::not_intrinsic;
9340 switch (BuiltinID) {
9341 case clang::ARM::BI__builtin_arm_crc32b:
9342 CRCIntrinsicID = Intrinsic::arm_crc32b;
break;
9343 case clang::ARM::BI__builtin_arm_crc32cb:
9344 CRCIntrinsicID = Intrinsic::arm_crc32cb;
break;
9345 case clang::ARM::BI__builtin_arm_crc32h:
9346 CRCIntrinsicID = Intrinsic::arm_crc32h;
break;
9347 case clang::ARM::BI__builtin_arm_crc32ch:
9348 CRCIntrinsicID = Intrinsic::arm_crc32ch;
break;
9349 case clang::ARM::BI__builtin_arm_crc32w:
9350 case clang::ARM::BI__builtin_arm_crc32d:
9351 CRCIntrinsicID = Intrinsic::arm_crc32w;
break;
9352 case clang::ARM::BI__builtin_arm_crc32cw:
9353 case clang::ARM::BI__builtin_arm_crc32cd:
9354 CRCIntrinsicID = Intrinsic::arm_crc32cw;
break;
9357 if (CRCIntrinsicID != Intrinsic::not_intrinsic) {
9363 if (BuiltinID == clang::ARM::BI__builtin_arm_crc32d ||
9364 BuiltinID == clang::ARM::BI__builtin_arm_crc32cd) {
9372 return Builder.CreateCall(F, {Res, Arg1b});
9377 return Builder.CreateCall(F, {Arg0, Arg1});
9381 if (BuiltinID == clang::ARM::BI__builtin_arm_rsr ||
9382 BuiltinID == clang::ARM::BI__builtin_arm_rsr64 ||
9383 BuiltinID == clang::ARM::BI__builtin_arm_rsrp ||
9384 BuiltinID == clang::ARM::BI__builtin_arm_wsr ||
9385 BuiltinID == clang::ARM::BI__builtin_arm_wsr64 ||
9386 BuiltinID == clang::ARM::BI__builtin_arm_wsrp) {
9389 if (BuiltinID == clang::ARM::BI__builtin_arm_rsr ||
9390 BuiltinID == clang::ARM::BI__builtin_arm_rsr64 ||
9391 BuiltinID == clang::ARM::BI__builtin_arm_rsrp)
9394 bool IsPointerBuiltin = BuiltinID == clang::ARM::BI__builtin_arm_rsrp ||
9395 BuiltinID == clang::ARM::BI__builtin_arm_wsrp;
9397 bool Is64Bit = BuiltinID == clang::ARM::BI__builtin_arm_rsr64 ||
9398 BuiltinID == clang::ARM::BI__builtin_arm_wsr64;
9400 llvm::Type *ValueType;
9402 if (IsPointerBuiltin) {
9405 }
else if (Is64Bit) {
9415 if (BuiltinID == ARM::BI__builtin_sponentry) {
9434 return P.first == BuiltinID;
9437 BuiltinID = It->second;
9441 unsigned ICEArguments = 0;
9446 auto getAlignmentValue32 = [&](
Address addr) ->
Value* {
9447 return Builder.getInt32(addr.getAlignment().getQuantity());
9454 unsigned NumArgs =
E->getNumArgs() - (HasExtraArg ? 1 : 0);
9455 for (
unsigned i = 0, e = NumArgs; i != e; i++) {
9457 switch (BuiltinID) {
9458 case NEON::BI__builtin_neon_vld1_v:
9459 case NEON::BI__builtin_neon_vld1q_v:
9460 case NEON::BI__builtin_neon_vld1q_lane_v:
9461 case NEON::BI__builtin_neon_vld1_lane_v:
9462 case NEON::BI__builtin_neon_vld1_dup_v:
9463 case NEON::BI__builtin_neon_vld1q_dup_v:
9464 case NEON::BI__builtin_neon_vst1_v:
9465 case NEON::BI__builtin_neon_vst1q_v:
9466 case NEON::BI__builtin_neon_vst1q_lane_v:
9467 case NEON::BI__builtin_neon_vst1_lane_v:
9468 case NEON::BI__builtin_neon_vst2_v:
9469 case NEON::BI__builtin_neon_vst2q_v:
9470 case NEON::BI__builtin_neon_vst2_lane_v:
9471 case NEON::BI__builtin_neon_vst2q_lane_v:
9472 case NEON::BI__builtin_neon_vst3_v:
9473 case NEON::BI__builtin_neon_vst3q_v:
9474 case NEON::BI__builtin_neon_vst3_lane_v:
9475 case NEON::BI__builtin_neon_vst3q_lane_v:
9476 case NEON::BI__builtin_neon_vst4_v:
9477 case NEON::BI__builtin_neon_vst4q_v:
9478 case NEON::BI__builtin_neon_vst4_lane_v:
9479 case NEON::BI__builtin_neon_vst4q_lane_v:
9488 switch (BuiltinID) {
9489 case NEON::BI__builtin_neon_vld2_v:
9490 case NEON::BI__builtin_neon_vld2q_v:
9491 case NEON::BI__builtin_neon_vld3_v:
9492 case NEON::BI__builtin_neon_vld3q_v:
9493 case NEON::BI__builtin_neon_vld4_v:
9494 case NEON::BI__builtin_neon_vld4q_v:
9495 case NEON::BI__builtin_neon_vld2_lane_v:
9496 case NEON::BI__builtin_neon_vld2q_lane_v:
9497 case NEON::BI__builtin_neon_vld3_lane_v:
9498 case NEON::BI__builtin_neon_vld3q_lane_v:
9499 case NEON::BI__builtin_neon_vld4_lane_v:
9500 case NEON::BI__builtin_neon_vld4q_lane_v:
9501 case NEON::BI__builtin_neon_vld2_dup_v:
9502 case NEON::BI__builtin_neon_vld2q_dup_v:
9503 case NEON::BI__builtin_neon_vld3_dup_v:
9504 case NEON::BI__builtin_neon_vld3q_dup_v:
9505 case NEON::BI__builtin_neon_vld4_dup_v:
9506 case NEON::BI__builtin_neon_vld4q_dup_v:
9518 switch (BuiltinID) {
9521 case NEON::BI__builtin_neon_vget_lane_i8:
9522 case NEON::BI__builtin_neon_vget_lane_i16:
9523 case NEON::BI__builtin_neon_vget_lane_i32:
9524 case NEON::BI__builtin_neon_vget_lane_i64:
9525 case NEON::BI__builtin_neon_vget_lane_bf16:
9526 case NEON::BI__builtin_neon_vget_lane_f32:
9527 case NEON::BI__builtin_neon_vgetq_lane_i8:
9528 case NEON::BI__builtin_neon_vgetq_lane_i16:
9529 case NEON::BI__builtin_neon_vgetq_lane_i32:
9530 case NEON::BI__builtin_neon_vgetq_lane_i64:
9531 case NEON::BI__builtin_neon_vgetq_lane_bf16:
9532 case NEON::BI__builtin_neon_vgetq_lane_f32:
9533 case NEON::BI__builtin_neon_vduph_lane_bf16:
9534 case NEON::BI__builtin_neon_vduph_laneq_bf16:
9535 return Builder.CreateExtractElement(Ops[0], Ops[1],
"vget_lane");
9537 case NEON::BI__builtin_neon_vrndns_f32: {
9539 llvm::Type *Tys[] = {Arg->
getType()};
9541 return Builder.CreateCall(F, {Arg},
"vrndn"); }
9543 case NEON::BI__builtin_neon_vset_lane_i8:
9544 case NEON::BI__builtin_neon_vset_lane_i16:
9545 case NEON::BI__builtin_neon_vset_lane_i32:
9546 case NEON::BI__builtin_neon_vset_lane_i64:
9547 case NEON::BI__builtin_neon_vset_lane_bf16:
9548 case NEON::BI__builtin_neon_vset_lane_f32:
9549 case NEON::BI__builtin_neon_vsetq_lane_i8:
9550 case NEON::BI__builtin_neon_vsetq_lane_i16:
9551 case NEON::BI__builtin_neon_vsetq_lane_i32:
9552 case NEON::BI__builtin_neon_vsetq_lane_i64:
9553 case NEON::BI__builtin_neon_vsetq_lane_bf16:
9554 case NEON::BI__builtin_neon_vsetq_lane_f32:
9555 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2],
"vset_lane");
9557 case NEON::BI__builtin_neon_vsha1h_u32:
9560 case NEON::BI__builtin_neon_vsha1cq_u32:
9563 case NEON::BI__builtin_neon_vsha1pq_u32:
9566 case NEON::BI__builtin_neon_vsha1mq_u32:
9570 case NEON::BI__builtin_neon_vcvth_bf16_f32: {
9577 case clang::ARM::BI_MoveToCoprocessor:
9578 case clang::ARM::BI_MoveToCoprocessor2: {
9580 ? Intrinsic::arm_mcr
9581 : Intrinsic::arm_mcr2);
9582 return Builder.CreateCall(F, {Ops[1], Ops[2], Ops[0],
9583 Ops[3], Ops[4], Ops[5]});
9588 assert(HasExtraArg);
9589 const Expr *Arg =
E->getArg(
E->getNumArgs()-1);
9590 std::optional<llvm::APSInt>
Result =
9595 if (BuiltinID == clang::ARM::BI__builtin_arm_vcvtr_f ||
9596 BuiltinID == clang::ARM::BI__builtin_arm_vcvtr_d) {
9599 if (BuiltinID == clang::ARM::BI__builtin_arm_vcvtr_f)
9605 bool usgn =
Result->getZExtValue() == 1;
9606 unsigned Int = usgn ? Intrinsic::arm_vcvtru : Intrinsic::arm_vcvtr;
9610 return Builder.CreateCall(F, Ops,
"vcvtr");
9615 bool usgn =
Type.isUnsigned();
9616 bool rightShift =
false;
9618 llvm::FixedVectorType *VTy =
9621 llvm::Type *Ty = VTy;
9632 Builtin->BuiltinID, Builtin->LLVMIntrinsic, Builtin->AltLLVMIntrinsic,
9633 Builtin->NameHint, Builtin->TypeModifier,
E, Ops, PtrOp0, PtrOp1, Arch);
9636 switch (BuiltinID) {
9637 default:
return nullptr;
9638 case NEON::BI__builtin_neon_vld1q_lane_v:
9641 if (VTy->getElementType()->isIntegerTy(64)) {
9643 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
9644 int Lane = cast<ConstantInt>(Ops[2])->getZExtValue();
9645 Value *SV = llvm::ConstantVector::get(ConstantInt::get(
Int32Ty, 1-Lane));
9646 Ops[1] =
Builder.CreateShuffleVector(Ops[1], Ops[1], SV);
9648 Ty = llvm::FixedVectorType::get(VTy->getElementType(), 1);
9651 Value *Align = getAlignmentValue32(PtrOp0);
9654 int Indices[] = {1 - Lane, Lane};
9655 return Builder.CreateShuffleVector(Ops[1], Ld, Indices,
"vld1q_lane");
9658 case NEON::BI__builtin_neon_vld1_lane_v: {
9659 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
9662 return Builder.CreateInsertElement(Ops[1], Ld, Ops[2],
"vld1_lane");
9664 case NEON::BI__builtin_neon_vqrshrn_n_v:
9666 usgn ? Intrinsic::arm_neon_vqrshiftnu : Intrinsic::arm_neon_vqrshiftns;
9669 case NEON::BI__builtin_neon_vqrshrun_n_v:
9671 Ops,
"vqrshrun_n", 1,
true);
9672 case NEON::BI__builtin_neon_vqshrn_n_v:
9673 Int = usgn ? Intrinsic::arm_neon_vqshiftnu : Intrinsic::arm_neon_vqshiftns;
9676 case NEON::BI__builtin_neon_vqshrun_n_v:
9678 Ops,
"vqshrun_n", 1,
true);
9679 case NEON::BI__builtin_neon_vrecpe_v:
9680 case NEON::BI__builtin_neon_vrecpeq_v:
9683 case NEON::BI__builtin_neon_vrshrn_n_v:
9685 Ops,
"vrshrn_n", 1,
true);
9686 case NEON::BI__builtin_neon_vrsra_n_v:
9687 case NEON::BI__builtin_neon_vrsraq_n_v:
9688 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
9689 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
9691 Int = usgn ? Intrinsic::arm_neon_vrshiftu : Intrinsic::arm_neon_vrshifts;
9693 return Builder.CreateAdd(Ops[0], Ops[1],
"vrsra_n");
9694 case NEON::BI__builtin_neon_vsri_n_v:
9695 case NEON::BI__builtin_neon_vsriq_n_v:
9698 case NEON::BI__builtin_neon_vsli_n_v:
9699 case NEON::BI__builtin_neon_vsliq_n_v:
9703 case NEON::BI__builtin_neon_vsra_n_v:
9704 case NEON::BI__builtin_neon_vsraq_n_v:
9705 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
9707 return Builder.CreateAdd(Ops[0], Ops[1]);
9708 case NEON::BI__builtin_neon_vst1q_lane_v:
9711 if (VTy->getElementType()->isIntegerTy(64)) {
9712 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
9713 Value *SV = llvm::ConstantVector::get(cast<llvm::Constant>(Ops[2]));
9714 Ops[1] =
Builder.CreateShuffleVector(Ops[1], Ops[1], SV);
9715 Ops[2] = getAlignmentValue32(PtrOp0);
9716 llvm::Type *Tys[] = {
Int8PtrTy, Ops[1]->getType()};
9721 case NEON::BI__builtin_neon_vst1_lane_v: {
9722 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
9723 Ops[1] =
Builder.CreateExtractElement(Ops[1], Ops[2]);
9727 case NEON::BI__builtin_neon_vtbl1_v:
9730 case NEON::BI__builtin_neon_vtbl2_v:
9733 case NEON::BI__builtin_neon_vtbl3_v:
9736 case NEON::BI__builtin_neon_vtbl4_v:
9739 case NEON::BI__builtin_neon_vtbx1_v:
9742 case NEON::BI__builtin_neon_vtbx2_v:
9745 case NEON::BI__builtin_neon_vtbx3_v:
9748 case NEON::BI__builtin_neon_vtbx4_v:
9754template<
typename Integer>
9763 return Unsigned ? Builder.CreateZExt(
V,
T) : Builder.CreateSExt(
V,
T);
9773 unsigned LaneBits = cast<llvm::VectorType>(
V->getType())
9775 ->getPrimitiveSizeInBits();
9776 if (Shift == LaneBits) {
9781 return llvm::Constant::getNullValue(
V->getType());
9785 return Unsigned ? Builder.CreateLShr(
V, Shift) : Builder.CreateAShr(
V, Shift);
9792 unsigned Elements = 128 /
V->getType()->getPrimitiveSizeInBits();
9793 return Builder.CreateVectorSplat(Elements,
V);
9799 llvm::Type *DestType) {
9812 V->getType()->getScalarSizeInBits() != DestType->getScalarSizeInBits()) {
9813 return Builder.CreateCall(
9815 {DestType, V->getType()}),
9818 return Builder.CreateBitCast(
V, DestType);
9826 unsigned InputElements =
9827 cast<llvm::FixedVectorType>(
V->getType())->getNumElements();
9828 for (
unsigned i = 0; i < InputElements; i += 2)
9829 Indices.push_back(i + Odd);
9830 return Builder.CreateShuffleVector(
V, Indices);
9836 assert(V0->getType() == V1->getType() &&
"Can't zip different vector types");
9838 unsigned InputElements =
9839 cast<llvm::FixedVectorType>(V0->getType())->getNumElements();
9840 for (
unsigned i = 0; i < InputElements; i++) {
9841 Indices.push_back(i);
9842 Indices.push_back(i + InputElements);
9844 return Builder.CreateShuffleVector(V0, V1, Indices);
9847template<
unsigned HighBit,
unsigned OtherBits>
9851 llvm::Type *
T = cast<llvm::VectorType>(VT)->getElementType();
9852 unsigned LaneBits =
T->getPrimitiveSizeInBits();
9853 uint32_t
Value = HighBit << (LaneBits - 1);
9855 Value |= (1UL << (LaneBits - 1)) - 1;
9856 llvm::Value *Lane = llvm::ConstantInt::get(
T,
Value);
9862 unsigned ReverseWidth) {
9866 unsigned LaneSize =
V->getType()->getScalarSizeInBits();
9867 unsigned Elements = 128 / LaneSize;
9868 unsigned Mask = ReverseWidth / LaneSize - 1;
9869 for (
unsigned i = 0; i < Elements; i++)
9870 Indices.push_back(i ^ Mask);
9871 return Builder.CreateShuffleVector(
V, Indices);
9877 llvm::Triple::ArchType Arch) {
9878 enum class CustomCodeGen { VLD24, VST24 } CustomCodeGenType;
9879 Intrinsic::ID IRIntr;
9880 unsigned NumVectors;
9883 switch (BuiltinID) {
9884 #include "clang/Basic/arm_mve_builtin_cg.inc"
9895 switch (CustomCodeGenType) {
9897 case CustomCodeGen::VLD24: {
9903 assert(MvecLType->isStructTy() &&
9904 "Return type for vld[24]q should be a struct");
9905 assert(MvecLType->getStructNumElements() == 1 &&
9906 "Return-type struct for vld[24]q should have one element");
9907 auto MvecLTypeInner = MvecLType->getStructElementType(0);
9908 assert(MvecLTypeInner->isArrayTy() &&
9909 "Return-type struct for vld[24]q should contain an array");
9910 assert(MvecLTypeInner->getArrayNumElements() == NumVectors &&
9911 "Array member of return-type struct vld[24]q has wrong length");
9912 auto VecLType = MvecLTypeInner->getArrayElementType();
9914 Tys.push_back(VecLType);
9916 auto Addr =
E->getArg(0);
9922 Value *MvecOut = PoisonValue::get(MvecLType);
9923 for (
unsigned i = 0; i < NumVectors; ++i) {
9924 Value *Vec =
Builder.CreateExtractValue(LoadResult, i);
9925 MvecOut =
Builder.CreateInsertValue(MvecOut, Vec, {0, i});
9934 case CustomCodeGen::VST24: {
9938 auto Addr =
E->getArg(0);
9942 auto MvecCType =
E->getArg(1)->
getType();
9944 assert(MvecLType->isStructTy() &&
"Data type for vst2q should be a struct");
9945 assert(MvecLType->getStructNumElements() == 1 &&
9946 "Data-type struct for vst2q should have one element");
9947 auto MvecLTypeInner = MvecLType->getStructElementType(0);
9948 assert(MvecLTypeInner->isArrayTy() &&
9949 "Data-type struct for vst2q should contain an array");
9950 assert(MvecLTypeInner->getArrayNumElements() == NumVectors &&
9951 "Array member of return-type struct vld[24]q has wrong length");
9952 auto VecLType = MvecLTypeInner->getArrayElementType();
9954 Tys.push_back(VecLType);
9959 for (
unsigned i = 0; i < NumVectors; i++)
9960 Ops.push_back(
Builder.CreateExtractValue(Mvec, {0, i}));
9963 Value *ToReturn =
nullptr;
9964 for (
unsigned i = 0; i < NumVectors; i++) {
9965 Ops.push_back(llvm::ConstantInt::get(
Int32Ty, i));
9966 ToReturn =
Builder.CreateCall(F, Ops);
9972 llvm_unreachable(
"unknown custom codegen type.");
9978 llvm::Triple::ArchType Arch) {
9979 switch (BuiltinID) {
9982#include "clang/Basic/arm_cde_builtin_cg.inc"
9989 llvm::Triple::ArchType Arch) {
9990 unsigned int Int = 0;
9991 const char *
s =
nullptr;
9993 switch (BuiltinID) {
9996 case NEON::BI__builtin_neon_vtbl1_v:
9997 case NEON::BI__builtin_neon_vqtbl1_v:
9998 case NEON::BI__builtin_neon_vqtbl1q_v:
9999 case NEON::BI__builtin_neon_vtbl2_v:
10000 case NEON::BI__builtin_neon_vqtbl2_v:
10001 case NEON::BI__builtin_neon_vqtbl2q_v:
10002 case NEON::BI__builtin_neon_vtbl3_v:
10003 case NEON::BI__builtin_neon_vqtbl3_v:
10004 case NEON::BI__builtin_neon_vqtbl3q_v:
10005 case NEON::BI__builtin_neon_vtbl4_v:
10006 case NEON::BI__builtin_neon_vqtbl4_v:
10007 case NEON::BI__builtin_neon_vqtbl4q_v:
10009 case NEON::BI__builtin_neon_vtbx1_v:
10010 case NEON::BI__builtin_neon_vqtbx1_v:
10011 case NEON::BI__builtin_neon_vqtbx1q_v:
10012 case NEON::BI__builtin_neon_vtbx2_v:
10013 case NEON::BI__builtin_neon_vqtbx2_v:
10014 case NEON::BI__builtin_neon_vqtbx2q_v:
10015 case NEON::BI__builtin_neon_vtbx3_v:
10016 case NEON::BI__builtin_neon_vqtbx3_v:
10017 case NEON::BI__builtin_neon_vqtbx3q_v:
10018 case NEON::BI__builtin_neon_vtbx4_v:
10019 case NEON::BI__builtin_neon_vqtbx4_v:
10020 case NEON::BI__builtin_neon_vqtbx4q_v:
10024 assert(
E->getNumArgs() >= 3);
10027 const Expr *Arg =
E->getArg(
E->getNumArgs() - 1);
10028 std::optional<llvm::APSInt>
Result =
10043 switch (BuiltinID) {
10044 case NEON::BI__builtin_neon_vtbl1_v: {
10046 Ty, Intrinsic::aarch64_neon_tbl1,
"vtbl1");
10048 case NEON::BI__builtin_neon_vtbl2_v: {
10050 Ty, Intrinsic::aarch64_neon_tbl1,
"vtbl1");
10052 case NEON::BI__builtin_neon_vtbl3_v: {
10054 Ty, Intrinsic::aarch64_neon_tbl2,
"vtbl2");
10056 case NEON::BI__builtin_neon_vtbl4_v: {
10058 Ty, Intrinsic::aarch64_neon_tbl2,
"vtbl2");
10060 case NEON::BI__builtin_neon_vtbx1_v: {
10063 Intrinsic::aarch64_neon_tbl1,
"vtbl1");
10065 llvm::Constant *EightV = ConstantInt::get(Ty, 8);
10066 Value *CmpRes = Builder.CreateICmp(ICmpInst::ICMP_UGE, Ops[2], EightV);
10067 CmpRes = Builder.CreateSExt(CmpRes, Ty);
10069 Value *EltsFromInput = Builder.CreateAnd(CmpRes, Ops[0]);
10070 Value *EltsFromTbl = Builder.CreateAnd(Builder.CreateNot(CmpRes), TblRes);
10071 return Builder.CreateOr(EltsFromInput, EltsFromTbl,
"vtbx");
10073 case NEON::BI__builtin_neon_vtbx2_v: {
10075 Ty, Intrinsic::aarch64_neon_tbx1,
"vtbx1");
10077 case NEON::BI__builtin_neon_vtbx3_v: {
10080 Intrinsic::aarch64_neon_tbl2,
"vtbl2");
10082 llvm::Constant *TwentyFourV = ConstantInt::get(Ty, 24);
10083 Value *CmpRes = Builder.CreateICmp(ICmpInst::ICMP_UGE, Ops[4],
10085 CmpRes = Builder.CreateSExt(CmpRes, Ty);
10087 Value *EltsFromInput = Builder.CreateAnd(CmpRes, Ops[0]);
10088 Value *EltsFromTbl = Builder.CreateAnd(Builder.CreateNot(CmpRes), TblRes);
10089 return Builder.CreateOr(EltsFromInput, EltsFromTbl,
"vtbx");
10091 case NEON::BI__builtin_neon_vtbx4_v: {
10093 Ty, Intrinsic::aarch64_neon_tbx2,
"vtbx2");
10095 case NEON::BI__builtin_neon_vqtbl1_v:
10096 case NEON::BI__builtin_neon_vqtbl1q_v:
10097 Int = Intrinsic::aarch64_neon_tbl1;
s =
"vtbl1";
break;
10098 case NEON::BI__builtin_neon_vqtbl2_v:
10099 case NEON::BI__builtin_neon_vqtbl2q_v: {
10100 Int = Intrinsic::aarch64_neon_tbl2;
s =
"vtbl2";
break;
10101 case NEON::BI__builtin_neon_vqtbl3_v:
10102 case NEON::BI__builtin_neon_vqtbl3q_v:
10103 Int = Intrinsic::aarch64_neon_tbl3;
s =
"vtbl3";
break;
10104 case NEON::BI__builtin_neon_vqtbl4_v:
10105 case NEON::BI__builtin_neon_vqtbl4q_v:
10106 Int = Intrinsic::aarch64_neon_tbl4;
s =
"vtbl4";
break;
10107 case NEON::BI__builtin_neon_vqtbx1_v:
10108 case NEON::BI__builtin_neon_vqtbx1q_v:
10109 Int = Intrinsic::aarch64_neon_tbx1;
s =
"vtbx1";
break;
10110 case NEON::BI__builtin_neon_vqtbx2_v:
10111 case NEON::BI__builtin_neon_vqtbx2q_v:
10112 Int = Intrinsic::aarch64_neon_tbx2;
s =
"vtbx2";
break;
10113 case NEON::BI__builtin_neon_vqtbx3_v:
10114 case NEON::BI__builtin_neon_vqtbx3q_v:
10115 Int = Intrinsic::aarch64_neon_tbx3;
s =
"vtbx3";
break;
10116 case NEON::BI__builtin_neon_vqtbx4_v:
10117 case NEON::BI__builtin_neon_vqtbx4q_v:
10118 Int = Intrinsic::aarch64_neon_tbx4;
s =
"vtbx4";
break;
10130 auto *VTy = llvm::FixedVectorType::get(
Int16Ty, 4);
10132 Value *
V = PoisonValue::get(VTy);
10133 llvm::Constant *CI = ConstantInt::get(
SizeTy, 0);
10134 Op =
Builder.CreateInsertElement(
V, Op, CI);
10143 case SVETypeFlags::MemEltTyDefault:
10145 case SVETypeFlags::MemEltTyInt8:
10147 case SVETypeFlags::MemEltTyInt16:
10149 case SVETypeFlags::MemEltTyInt32:
10151 case SVETypeFlags::MemEltTyInt64:
10154 llvm_unreachable(
"Unknown MemEltType");
10160 llvm_unreachable(
"Invalid SVETypeFlag!");
10162 case SVETypeFlags::EltTyInt8:
10164 case SVETypeFlags::EltTyInt16:
10166 case SVETypeFlags::EltTyInt32:
10168 case SVETypeFlags::EltTyInt64:
10170 case SVETypeFlags::EltTyInt128:
10171 return Builder.getInt128Ty();
10173 case SVETypeFlags::EltTyFloat16:
10175 case SVETypeFlags::EltTyFloat32:
10177 case SVETypeFlags::EltTyFloat64:
10178 return Builder.getDoubleTy();
10180 case SVETypeFlags::EltTyBFloat16:
10181 return Builder.getBFloatTy();
10183 case SVETypeFlags::EltTyBool8:
10184 case SVETypeFlags::EltTyBool16:
10185 case SVETypeFlags::EltTyBool32:
10186 case SVETypeFlags::EltTyBool64:
10193llvm::ScalableVectorType *
10196 default: llvm_unreachable(
"Unhandled SVETypeFlag!");
10198 case SVETypeFlags::EltTyInt8:
10199 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 16);
10200 case SVETypeFlags::EltTyInt16:
10201 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 8);
10202 case SVETypeFlags::EltTyInt32:
10203 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 4);
10204 case SVETypeFlags::EltTyInt64:
10205 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 2);
10207 case SVETypeFlags::EltTyBFloat16:
10208 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 8);
10209 case SVETypeFlags::EltTyFloat16:
10210 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 8);
10211 case SVETypeFlags::EltTyFloat32:
10212 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 4);
10213 case SVETypeFlags::EltTyFloat64:
10214 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 2);
10216 case SVETypeFlags::EltTyBool8:
10217 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 16);
10218 case SVETypeFlags::EltTyBool16:
10219 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 8);
10220 case SVETypeFlags::EltTyBool32:
10221 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 4);
10222 case SVETypeFlags::EltTyBool64:
10223 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 2);
10228llvm::ScalableVectorType *
10232 llvm_unreachable(
"Invalid SVETypeFlag!");
10234 case SVETypeFlags::EltTyInt8:
10235 return llvm::ScalableVectorType::get(
Builder.getInt8Ty(), 16);
10236 case SVETypeFlags::EltTyInt16:
10237 return llvm::ScalableVectorType::get(
Builder.getInt16Ty(), 8);
10238 case SVETypeFlags::EltTyInt32:
10239 return llvm::ScalableVectorType::get(
Builder.getInt32Ty(), 4);
10240 case SVETypeFlags::EltTyInt64:
10241 return llvm::ScalableVectorType::get(
Builder.getInt64Ty(), 2);
10243 case SVETypeFlags::EltTyMFloat8:
10244 return llvm::ScalableVectorType::get(
Builder.getInt8Ty(), 16);
10245 case SVETypeFlags::EltTyFloat16:
10246 return llvm::ScalableVectorType::get(
Builder.getHalfTy(), 8);
10247 case SVETypeFlags::EltTyBFloat16:
10248 return llvm::ScalableVectorType::get(
Builder.getBFloatTy(), 8);
10249 case SVETypeFlags::EltTyFloat32:
10250 return llvm::ScalableVectorType::get(
Builder.getFloatTy(), 4);
10251 case SVETypeFlags::EltTyFloat64:
10252 return llvm::ScalableVectorType::get(
Builder.getDoubleTy(), 2);
10254 case SVETypeFlags::EltTyBool8:
10255 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 16);
10256 case SVETypeFlags::EltTyBool16:
10257 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 8);
10258 case SVETypeFlags::EltTyBool32:
10259 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 4);
10260 case SVETypeFlags::EltTyBool64:
10261 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 2);
10276 return llvm::ScalableVectorType::get(EltTy, NumElts);
10282 llvm::ScalableVectorType *VTy) {
10284 if (isa<TargetExtType>(Pred->
getType()) &&
10285 cast<TargetExtType>(Pred->
getType())->getName() ==
"aarch64.svcount")
10288 auto *RTy = llvm::VectorType::get(IntegerType::get(
getLLVMContext(), 1), VTy);
10293 llvm::Type *IntrinsicTy;
10294 switch (VTy->getMinNumElements()) {
10296 llvm_unreachable(
"unsupported element count!");
10301 IntID = Intrinsic::aarch64_sve_convert_from_svbool;
10305 IntID = Intrinsic::aarch64_sve_convert_to_svbool;
10306 IntrinsicTy = Pred->
getType();
10312 assert(
C->getType() == RTy &&
"Unexpected return type!");
10317 llvm::StructType *Ty) {
10318 if (PredTuple->
getType() == Ty)
10321 Value *
Ret = llvm::PoisonValue::get(Ty);
10322 for (
unsigned I = 0; I < Ty->getNumElements(); ++I) {
10323 Value *Pred =
Builder.CreateExtractValue(PredTuple, I);
10325 Pred, cast<llvm::ScalableVectorType>(Ty->getTypeAtIndex(I)));
10326 Ret =
Builder.CreateInsertValue(Ret, Pred, I);
10336 auto *OverloadedTy =
10340 if (Ops[1]->getType()->isVectorTy())
10360 Ops[0], cast<llvm::ScalableVectorType>(F->getArg(0)->getType()));
10365 if (Ops.size() == 2) {
10366 assert(Ops[1]->getType()->isVectorTy() &&
"Scalar base requires an offset");
10367 Ops.push_back(ConstantInt::get(
Int64Ty, 0));
10372 if (!TypeFlags.
isByteIndexed() && Ops[1]->getType()->isVectorTy()) {
10373 unsigned BytesPerElt =
10374 OverloadedTy->getElementType()->getScalarSizeInBits() / 8;
10375 Ops[2] =
Builder.CreateShl(Ops[2], Log2_32(BytesPerElt));
10390 auto *OverloadedTy =
10395 Ops.insert(Ops.begin(), Ops.pop_back_val());
10398 if (Ops[2]->getType()->isVectorTy())
10413 if (Ops.size() == 3) {
10414 assert(Ops[1]->getType()->isVectorTy() &&
"Scalar base requires an offset");
10415 Ops.push_back(ConstantInt::get(
Int64Ty, 0));
10420 Ops[0] =
Builder.CreateTrunc(Ops[0], OverloadedTy);
10430 Ops[1], cast<llvm::ScalableVectorType>(F->getArg(1)->getType()));
10434 if (!TypeFlags.
isByteIndexed() && Ops[2]->getType()->isVectorTy()) {
10435 unsigned BytesPerElt =
10436 OverloadedTy->getElementType()->getScalarSizeInBits() / 8;
10437 Ops[3] =
Builder.CreateShl(Ops[3], Log2_32(BytesPerElt));
10440 return Builder.CreateCall(F, Ops);
10448 auto *OverloadedTy = dyn_cast<llvm::ScalableVectorType>(Ops[1]->getType());
10450 OverloadedTy = cast<llvm::ScalableVectorType>(Ops[2]->getType());
10456 if (Ops[1]->getType()->isVectorTy()) {
10457 if (Ops.size() == 3) {
10459 Ops.push_back(ConstantInt::get(
Int64Ty, 0));
10462 std::swap(Ops[2], Ops[3]);
10466 unsigned BytesPerElt = MemEltTy->getPrimitiveSizeInBits() / 8;
10467 if (BytesPerElt > 1)
10468 Ops[2] =
Builder.CreateShl(Ops[2], Log2_32(BytesPerElt));
10473 return Builder.CreateCall(F, Ops);
10479 llvm::ScalableVectorType *VTy =
getSVEType(TypeFlags);
10481 Value *BasePtr = Ops[1];
10484 if (Ops.size() > 2)
10488 return Builder.CreateCall(F, {Predicate, BasePtr});
10494 llvm::ScalableVectorType *VTy =
getSVEType(TypeFlags);
10498 case Intrinsic::aarch64_sve_st2:
10499 case Intrinsic::aarch64_sve_st1_pn_x2:
10500 case Intrinsic::aarch64_sve_stnt1_pn_x2:
10501 case Intrinsic::aarch64_sve_st2q:
10504 case Intrinsic::aarch64_sve_st3:
10505 case Intrinsic::aarch64_sve_st3q:
10508 case Intrinsic::aarch64_sve_st4:
10509 case Intrinsic::aarch64_sve_st1_pn_x4:
10510 case Intrinsic::aarch64_sve_stnt1_pn_x4:
10511 case Intrinsic::aarch64_sve_st4q:
10515 llvm_unreachable(
"unknown intrinsic!");
10519 Value *BasePtr = Ops[1];
10522 if (Ops.size() > (2 + N))
10528 for (
unsigned I = Ops.size() - N; I < Ops.size(); ++I)
10529 Operands.push_back(Ops[I]);
10530 Operands.append({Predicate, BasePtr});
10533 return Builder.CreateCall(F, Operands);
10541 unsigned BuiltinID) {
10553 llvm::ScalableVectorType *Ty =
getSVEType(TypeFlags);
10559 llvm::Type *OverloadedTy =
getSVEType(TypeFlags);
10566 unsigned BuiltinID) {
10569 auto *MemoryTy = llvm::ScalableVectorType::get(MemEltTy, VectorTy);
10572 Value *BasePtr = Ops[1];
10575 if (Ops.size() > 3)
10578 Value *PrfOp = Ops.back();
10581 return Builder.CreateCall(F, {Predicate, BasePtr, PrfOp});
10585 llvm::Type *ReturnTy,
10587 unsigned IntrinsicID,
10588 bool IsZExtReturn) {
10595 auto VectorTy = cast<llvm::ScalableVectorType>(ReturnTy);
10596 llvm::ScalableVectorType *MemoryTy =
nullptr;
10597 llvm::ScalableVectorType *PredTy =
nullptr;
10598 bool IsQuadLoad =
false;
10599 switch (IntrinsicID) {
10600 case Intrinsic::aarch64_sve_ld1uwq:
10601 case Intrinsic::aarch64_sve_ld1udq:
10602 MemoryTy = llvm::ScalableVectorType::get(MemEltTy, 1);
10603 PredTy = llvm::ScalableVectorType::get(
10608 MemoryTy = llvm::ScalableVectorType::get(MemEltTy, VectorTy);
10614 Value *BasePtr = Ops[1];
10617 if (Ops.size() > 2)
10622 cast<llvm::Instruction>(
Builder.CreateCall(F, {Predicate, BasePtr}));
10629 return IsZExtReturn ?
Builder.CreateZExt(Load, VectorTy)
10630 :
Builder.CreateSExt(Load, VectorTy);
10635 unsigned IntrinsicID) {
10642 auto VectorTy = cast<llvm::ScalableVectorType>(Ops.back()->getType());
10643 auto MemoryTy = llvm::ScalableVectorType::get(MemEltTy, VectorTy);
10645 auto PredTy = MemoryTy;
10646 auto AddrMemoryTy = MemoryTy;
10647 bool IsQuadStore =
false;
10649 switch (IntrinsicID) {
10650 case Intrinsic::aarch64_sve_st1wq:
10651 case Intrinsic::aarch64_sve_st1dq:
10652 AddrMemoryTy = llvm::ScalableVectorType::get(MemEltTy, 1);
10654 llvm::ScalableVectorType::get(IntegerType::get(
getLLVMContext(), 1), 1);
10655 IsQuadStore =
true;
10661 Value *BasePtr = Ops[1];
10664 if (Ops.size() == 4)
10669 IsQuadStore ? Ops.back() :
Builder.CreateTrunc(Ops.back(), MemoryTy);
10674 cast<llvm::Instruction>(
Builder.CreateCall(F, {Val, Predicate, BasePtr}));
10687 NewOps.push_back(Ops[2]);
10689 llvm::Value *BasePtr = Ops[3];
10690 llvm::Value *RealSlice = Ops[1];
10693 if (Ops.size() == 5) {
10696 llvm::Value *StreamingVectorLengthCall =
10697 Builder.CreateCall(StreamingVectorLength);
10698 llvm::Value *Mulvl =
10699 Builder.CreateMul(StreamingVectorLengthCall, Ops[4],
"mulvl");
10703 RealSlice =
Builder.CreateAdd(RealSlice, Ops[4]);
10706 NewOps.push_back(BasePtr);
10707 NewOps.push_back(Ops[0]);
10708 NewOps.push_back(RealSlice);
10710 return Builder.CreateCall(F, NewOps);
10722 return Builder.CreateCall(F, Ops);
10729 if (Ops.size() == 0)
10730 Ops.push_back(llvm::ConstantInt::get(
Int32Ty, 255));
10732 return Builder.CreateCall(F, Ops);
10738 if (Ops.size() == 2)
10739 Ops.push_back(
Builder.getInt32(0));
10743 return Builder.CreateCall(F, Ops);
10749 return Builder.CreateVectorSplat(
10750 cast<llvm::VectorType>(Ty)->getElementCount(), Scalar);
10754 if (
auto *Ty =
Scalar->getType(); Ty->isVectorTy()) {
10756 auto *VecTy = cast<llvm::VectorType>(Ty);
10757 ElementCount EC = VecTy->getElementCount();
10758 assert(EC.isScalar() && VecTy->getElementType() ==
Int8Ty &&
10759 "Only <1 x i8> expected");
10774 if (
auto *StructTy = dyn_cast<StructType>(Ty)) {
10775 Value *Tuple = llvm::PoisonValue::get(Ty);
10777 for (
unsigned I = 0; I < StructTy->getNumElements(); ++I) {
10779 Value *Out =
Builder.CreateBitCast(In, StructTy->getTypeAtIndex(I));
10780 Tuple =
Builder.CreateInsertValue(Tuple, Out, I);
10786 return Builder.CreateBitCast(Val, Ty);
10791 auto *SplatZero = Constant::getNullValue(Ty);
10792 Ops.insert(Ops.begin(), SplatZero);
10797 auto *SplatUndef = UndefValue::get(Ty);
10798 Ops.insert(Ops.begin(), SplatUndef);
10803 llvm::Type *ResultType,
10808 llvm::Type *DefaultType =
getSVEType(TypeFlags);
10811 return {DefaultType, Ops[1]->getType()};
10817 return {Ops[0]->getType(), Ops.back()->getType()};
10819 if (TypeFlags.
isReductionQV() && !ResultType->isScalableTy() &&
10820 ResultType->isVectorTy())
10821 return {ResultType, Ops[1]->getType()};
10824 return {DefaultType};
10830 "Expects TypleFlags.isTupleSet() or TypeFlags.isTupleGet()");
10831 unsigned Idx = cast<ConstantInt>(Ops[1])->getZExtValue();
10834 return Builder.CreateInsertValue(Ops[0], Ops[2], Idx);
10835 return Builder.CreateExtractValue(Ops[0], Idx);
10841 assert(TypeFlags.
isTupleCreate() &&
"Expects TypleFlag isTupleCreate");
10843 Value *Tuple = llvm::PoisonValue::get(Ty);
10844 for (
unsigned Idx = 0; Idx < Ops.size(); Idx++)
10845 Tuple =
Builder.CreateInsertValue(Tuple, Ops[Idx], Idx);
10854 unsigned ICEArguments = 0;
10863 for (
unsigned i = 0, e =
E->getNumArgs(); i != e; i++) {
10864 bool IsICE = ICEArguments & (1 << i);
10870 std::optional<llvm::APSInt>
Result =
10872 assert(
Result &&
"Expected argument to be a constant");
10882 if (isa<StructType>(Arg->getType()) && !IsTupleGetOrSet) {
10883 for (
unsigned I = 0; I < Arg->getType()->getStructNumElements(); ++I)
10884 Ops.push_back(
Builder.CreateExtractValue(Arg, I));
10889 Ops.push_back(Arg);
10896 if (BuiltinID >= SVE::BI__builtin_sve_reinterpret_s8_s8 &&
10897 BuiltinID <= SVE::BI__builtin_sve_reinterpret_f64_f64_x4) {
10912 else if (TypeFlags.
isStore())
10930 else if (TypeFlags.
isUndef())
10931 return UndefValue::get(Ty);
10932 else if (Builtin->LLVMIntrinsic != 0) {
10936 Ops.pop_back_val());
10937 if (TypeFlags.
getMergeType() == SVETypeFlags::MergeZeroExp)
10940 if (TypeFlags.
getMergeType() == SVETypeFlags::MergeAnyExp)
10946 Ops.push_back(
Builder.getInt32( 31));
10948 Ops.insert(&Ops[1],
Builder.getInt32( 31));
10951 for (
unsigned i = 0, e = Ops.size(); i != e; ++i)
10952 if (
auto PredTy = dyn_cast<llvm::VectorType>(Ops[i]->getType()))
10953 if (PredTy->getElementType()->isIntegerTy(1))
10963 std::swap(Ops[1], Ops[2]);
10965 std::swap(Ops[1], Ops[2]);
10968 std::swap(Ops[1], Ops[2]);
10971 std::swap(Ops[1], Ops[3]);
10974 if (TypeFlags.
getMergeType() == SVETypeFlags::MergeZero) {
10975 llvm::Type *OpndTy = Ops[1]->getType();
10976 auto *SplatZero = Constant::getNullValue(OpndTy);
10977 Ops[1] =
Builder.CreateSelect(Ops[0], Ops[1], SplatZero);
10984 if (
Call->getType() == Ty)
10988 if (
auto PredTy = dyn_cast<llvm::ScalableVectorType>(Ty))
10990 if (
auto PredTupleTy = dyn_cast<llvm::StructType>(Ty))
10993 llvm_unreachable(
"unsupported element count!");
10996 switch (BuiltinID) {
11000 case SVE::BI__builtin_sve_svreinterpret_b: {
11004 CGM.
getIntrinsic(Intrinsic::aarch64_sve_convert_to_svbool, SVCountTy);
11005 return Builder.CreateCall(CastFromSVCountF, Ops[0]);
11007 case SVE::BI__builtin_sve_svreinterpret_c: {
11011 CGM.
getIntrinsic(Intrinsic::aarch64_sve_convert_from_svbool, SVCountTy);
11012 return Builder.CreateCall(CastToSVCountF, Ops[0]);
11015 case SVE::BI__builtin_sve_svpsel_lane_b8:
11016 case SVE::BI__builtin_sve_svpsel_lane_b16:
11017 case SVE::BI__builtin_sve_svpsel_lane_b32:
11018 case SVE::BI__builtin_sve_svpsel_lane_b64:
11019 case SVE::BI__builtin_sve_svpsel_lane_c8:
11020 case SVE::BI__builtin_sve_svpsel_lane_c16:
11021 case SVE::BI__builtin_sve_svpsel_lane_c32:
11022 case SVE::BI__builtin_sve_svpsel_lane_c64: {
11023 bool IsSVCount = isa<TargetExtType>(Ops[0]->getType());
11024 assert(((!IsSVCount || cast<TargetExtType>(Ops[0]->getType())->
getName() ==
11025 "aarch64.svcount")) &&
11026 "Unexpected TargetExtType");
11030 CGM.
getIntrinsic(Intrinsic::aarch64_sve_convert_to_svbool, SVCountTy);
11032 CGM.
getIntrinsic(Intrinsic::aarch64_sve_convert_from_svbool, SVCountTy);
11036 llvm::Value *Ops0 =
11037 IsSVCount ?
Builder.CreateCall(CastFromSVCountF, Ops[0]) : Ops[0];
11039 llvm::Value *PSel =
Builder.CreateCall(F, {Ops0, Ops1, Ops[2]});
11040 return IsSVCount ?
Builder.CreateCall(CastToSVCountF, PSel) : PSel;
11042 case SVE::BI__builtin_sve_svmov_b_z: {
11045 llvm::Type* OverloadedTy =
getSVEType(TypeFlags);
11047 return Builder.CreateCall(F, {Ops[0], Ops[1], Ops[1]});
11050 case SVE::BI__builtin_sve_svnot_b_z: {
11053 llvm::Type* OverloadedTy =
getSVEType(TypeFlags);
11055 return Builder.CreateCall(F, {Ops[0], Ops[1], Ops[0]});
11058 case SVE::BI__builtin_sve_svmovlb_u16:
11059 case SVE::BI__builtin_sve_svmovlb_u32:
11060 case SVE::BI__builtin_sve_svmovlb_u64:
11061 return EmitSVEMovl(TypeFlags, Ops, Intrinsic::aarch64_sve_ushllb);
11063 case SVE::BI__builtin_sve_svmovlb_s16:
11064 case SVE::BI__builtin_sve_svmovlb_s32:
11065 case SVE::BI__builtin_sve_svmovlb_s64:
11066 return EmitSVEMovl(TypeFlags, Ops, Intrinsic::aarch64_sve_sshllb);
11068 case SVE::BI__builtin_sve_svmovlt_u16:
11069 case SVE::BI__builtin_sve_svmovlt_u32:
11070 case SVE::BI__builtin_sve_svmovlt_u64:
11071 return EmitSVEMovl(TypeFlags, Ops, Intrinsic::aarch64_sve_ushllt);
11073 case SVE::BI__builtin_sve_svmovlt_s16:
11074 case SVE::BI__builtin_sve_svmovlt_s32:
11075 case SVE::BI__builtin_sve_svmovlt_s64:
11076 return EmitSVEMovl(TypeFlags, Ops, Intrinsic::aarch64_sve_sshllt);
11078 case SVE::BI__builtin_sve_svpmullt_u16:
11079 case SVE::BI__builtin_sve_svpmullt_u64:
11080 case SVE::BI__builtin_sve_svpmullt_n_u16:
11081 case SVE::BI__builtin_sve_svpmullt_n_u64:
11082 return EmitSVEPMull(TypeFlags, Ops, Intrinsic::aarch64_sve_pmullt_pair);
11084 case SVE::BI__builtin_sve_svpmullb_u16:
11085 case SVE::BI__builtin_sve_svpmullb_u64:
11086 case SVE::BI__builtin_sve_svpmullb_n_u16:
11087 case SVE::BI__builtin_sve_svpmullb_n_u64:
11088 return EmitSVEPMull(TypeFlags, Ops, Intrinsic::aarch64_sve_pmullb_pair);
11090 case SVE::BI__builtin_sve_svdup_n_b8:
11091 case SVE::BI__builtin_sve_svdup_n_b16:
11092 case SVE::BI__builtin_sve_svdup_n_b32:
11093 case SVE::BI__builtin_sve_svdup_n_b64: {
11095 Builder.CreateICmpNE(Ops[0], Constant::getNullValue(Ops[0]->getType()));
11096 llvm::ScalableVectorType *OverloadedTy =
getSVEType(TypeFlags);
11101 case SVE::BI__builtin_sve_svdupq_n_b8:
11102 case SVE::BI__builtin_sve_svdupq_n_b16:
11103 case SVE::BI__builtin_sve_svdupq_n_b32:
11104 case SVE::BI__builtin_sve_svdupq_n_b64:
11105 case SVE::BI__builtin_sve_svdupq_n_u8:
11106 case SVE::BI__builtin_sve_svdupq_n_s8:
11107 case SVE::BI__builtin_sve_svdupq_n_u64:
11108 case SVE::BI__builtin_sve_svdupq_n_f64:
11109 case SVE::BI__builtin_sve_svdupq_n_s64:
11110 case SVE::BI__builtin_sve_svdupq_n_u16:
11111 case SVE::BI__builtin_sve_svdupq_n_f16:
11112 case SVE::BI__builtin_sve_svdupq_n_bf16:
11113 case SVE::BI__builtin_sve_svdupq_n_s16:
11114 case SVE::BI__builtin_sve_svdupq_n_u32:
11115 case SVE::BI__builtin_sve_svdupq_n_f32:
11116 case SVE::BI__builtin_sve_svdupq_n_s32: {
11119 unsigned NumOpnds = Ops.size();
11122 cast<llvm::VectorType>(Ty)->getElementType()->isIntegerTy(1);
11127 llvm::Type *EltTy = Ops[0]->getType();
11132 for (
unsigned I = 0; I < NumOpnds; ++I)
11133 VecOps.push_back(
Builder.CreateZExt(Ops[I], EltTy));
11138 OverloadedTy, PoisonValue::get(OverloadedTy), Vec,
Builder.getInt64(0));
11153 : Intrinsic::aarch64_sve_cmpne_wide,
11160 case SVE::BI__builtin_sve_svpfalse_b:
11161 return ConstantInt::getFalse(Ty);
11163 case SVE::BI__builtin_sve_svpfalse_c: {
11164 auto SVBoolTy = ScalableVectorType::get(
Builder.getInt1Ty(), 16);
11167 return Builder.CreateCall(CastToSVCountF, ConstantInt::getFalse(SVBoolTy));
11170 case SVE::BI__builtin_sve_svlen_bf16:
11171 case SVE::BI__builtin_sve_svlen_f16:
11172 case SVE::BI__builtin_sve_svlen_f32:
11173 case SVE::BI__builtin_sve_svlen_f64:
11174 case SVE::BI__builtin_sve_svlen_s8:
11175 case SVE::BI__builtin_sve_svlen_s16:
11176 case SVE::BI__builtin_sve_svlen_s32:
11177 case SVE::BI__builtin_sve_svlen_s64:
11178 case SVE::BI__builtin_sve_svlen_u8:
11179 case SVE::BI__builtin_sve_svlen_u16:
11180 case SVE::BI__builtin_sve_svlen_u32:
11181 case SVE::BI__builtin_sve_svlen_u64: {
11183 auto VTy = cast<llvm::VectorType>(
getSVEType(TF));
11185 llvm::ConstantInt::get(Ty, VTy->getElementCount().getKnownMinValue());
11191 case SVE::BI__builtin_sve_svtbl2_u8:
11192 case SVE::BI__builtin_sve_svtbl2_s8:
11193 case SVE::BI__builtin_sve_svtbl2_u16:
11194 case SVE::BI__builtin_sve_svtbl2_s16:
11195 case SVE::BI__builtin_sve_svtbl2_u32:
11196 case SVE::BI__builtin_sve_svtbl2_s32:
11197 case SVE::BI__builtin_sve_svtbl2_u64:
11198 case SVE::BI__builtin_sve_svtbl2_s64:
11199 case SVE::BI__builtin_sve_svtbl2_f16:
11200 case SVE::BI__builtin_sve_svtbl2_bf16:
11201 case SVE::BI__builtin_sve_svtbl2_f32:
11202 case SVE::BI__builtin_sve_svtbl2_f64: {
11204 auto VTy = cast<llvm::ScalableVectorType>(
getSVEType(TF));
11206 return Builder.CreateCall(F, Ops);
11209 case SVE::BI__builtin_sve_svset_neonq_s8:
11210 case SVE::BI__builtin_sve_svset_neonq_s16:
11211 case SVE::BI__builtin_sve_svset_neonq_s32:
11212 case SVE::BI__builtin_sve_svset_neonq_s64:
11213 case SVE::BI__builtin_sve_svset_neonq_u8:
11214 case SVE::BI__builtin_sve_svset_neonq_u16:
11215 case SVE::BI__builtin_sve_svset_neonq_u32:
11216 case SVE::BI__builtin_sve_svset_neonq_u64:
11217 case SVE::BI__builtin_sve_svset_neonq_f16:
11218 case SVE::BI__builtin_sve_svset_neonq_f32:
11219 case SVE::BI__builtin_sve_svset_neonq_f64:
11220 case SVE::BI__builtin_sve_svset_neonq_bf16: {
11221 return Builder.CreateInsertVector(Ty, Ops[0], Ops[1],
Builder.getInt64(0));
11224 case SVE::BI__builtin_sve_svget_neonq_s8:
11225 case SVE::BI__builtin_sve_svget_neonq_s16:
11226 case SVE::BI__builtin_sve_svget_neonq_s32:
11227 case SVE::BI__builtin_sve_svget_neonq_s64:
11228 case SVE::BI__builtin_sve_svget_neonq_u8:
11229 case SVE::BI__builtin_sve_svget_neonq_u16:
11230 case SVE::BI__builtin_sve_svget_neonq_u32:
11231 case SVE::BI__builtin_sve_svget_neonq_u64:
11232 case SVE::BI__builtin_sve_svget_neonq_f16:
11233 case SVE::BI__builtin_sve_svget_neonq_f32:
11234 case SVE::BI__builtin_sve_svget_neonq_f64:
11235 case SVE::BI__builtin_sve_svget_neonq_bf16: {
11236 return Builder.CreateExtractVector(Ty, Ops[0],
Builder.getInt64(0));
11239 case SVE::BI__builtin_sve_svdup_neonq_s8:
11240 case SVE::BI__builtin_sve_svdup_neonq_s16:
11241 case SVE::BI__builtin_sve_svdup_neonq_s32:
11242 case SVE::BI__builtin_sve_svdup_neonq_s64:
11243 case SVE::BI__builtin_sve_svdup_neonq_u8:
11244 case SVE::BI__builtin_sve_svdup_neonq_u16:
11245 case SVE::BI__builtin_sve_svdup_neonq_u32:
11246 case SVE::BI__builtin_sve_svdup_neonq_u64:
11247 case SVE::BI__builtin_sve_svdup_neonq_f16:
11248 case SVE::BI__builtin_sve_svdup_neonq_f32:
11249 case SVE::BI__builtin_sve_svdup_neonq_f64:
11250 case SVE::BI__builtin_sve_svdup_neonq_bf16: {
11253 return Builder.CreateIntrinsic(Intrinsic::aarch64_sve_dupq_lane, {Ty},
11265 switch (BuiltinID) {
11268 case SME::BI__builtin_sme_svsumla_za32_s8_vg4x1:
11271 case SME::BI__builtin_sme_svsumla_za32_s8_vg4x2:
11272 case SME::BI__builtin_sme_svsudot_za32_s8_vg1x2:
11275 case SME::BI__builtin_sme_svsudot_za32_s8_vg1x4:
11276 case SME::BI__builtin_sme_svsumla_za32_s8_vg4x4:
11282 for (
unsigned I = 0; I < MultiVec; ++I)
11283 std::swap(Ops[I + 1], Ops[I + 1 + MultiVec]);
11296 return EmitSMELd1St1(TypeFlags, Ops, Builtin->LLVMIntrinsic);
11299 else if (BuiltinID == SME::BI__builtin_sme_svzero_mask_za ||
11300 BuiltinID == SME::BI__builtin_sme_svzero_za)
11301 return EmitSMEZero(TypeFlags, Ops, Builtin->LLVMIntrinsic);
11302 else if (BuiltinID == SME::BI__builtin_sme_svldr_vnum_za ||
11303 BuiltinID == SME::BI__builtin_sme_svstr_vnum_za ||
11304 BuiltinID == SME::BI__builtin_sme_svldr_za ||
11305 BuiltinID == SME::BI__builtin_sme_svstr_za)
11306 return EmitSMELdrStr(TypeFlags, Ops, Builtin->LLVMIntrinsic);
11311 Ops.pop_back_val());
11316 if (Builtin->LLVMIntrinsic == 0)
11319 if (BuiltinID == SME::BI__builtin_sme___arm_in_streaming_mode) {
11322 const auto *FD = cast<FunctionDecl>(
CurFuncDecl);
11324 unsigned SMEAttrs = FPT->getAArch64SMEAttributes();
11327 return ConstantInt::getBool(
Builder.getContext(), IsStreaming);
11333 for (
unsigned i = 0, e = Ops.size(); i != e; ++i)
11334 if (
auto PredTy = dyn_cast<llvm::VectorType>(Ops[i]->getType()))
11335 if (PredTy->getElementType()->isIntegerTy(1))
11343 return Builder.CreateCall(F, Ops);
11348 llvm::Triple::ArchType Arch) {
11357 if (BuiltinID == Builtin::BI__builtin_cpu_supports)
11358 return EmitAArch64CpuSupports(
E);
11360 unsigned HintID =
static_cast<unsigned>(-1);
11361 switch (BuiltinID) {
11363 case clang::AArch64::BI__builtin_arm_nop:
11366 case clang::AArch64::BI__builtin_arm_yield:
11367 case clang::AArch64::BI__yield:
11370 case clang::AArch64::BI__builtin_arm_wfe:
11371 case clang::AArch64::BI__wfe:
11374 case clang::AArch64::BI__builtin_arm_wfi:
11375 case clang::AArch64::BI__wfi:
11378 case clang::AArch64::BI__builtin_arm_sev:
11379 case clang::AArch64::BI__sev:
11382 case clang::AArch64::BI__builtin_arm_sevl:
11383 case clang::AArch64::BI__sevl:
11388 if (HintID !=
static_cast<unsigned>(-1)) {
11390 return Builder.CreateCall(F, llvm::ConstantInt::get(
Int32Ty, HintID));
11393 if (BuiltinID == clang::AArch64::BI__builtin_arm_trap) {
11399 if (BuiltinID == clang::AArch64::BI__builtin_arm_get_sme_state) {
11404 "__arm_sme_state"));
11406 "aarch64_pstate_sm_compatible");
11407 CI->setAttributes(Attrs);
11408 CI->setCallingConv(
11409 llvm::CallingConv::
11410 AArch64_SME_ABI_Support_Routines_PreserveMost_From_X2);
11417 if (BuiltinID == clang::AArch64::BI__builtin_arm_rbit) {
11419 "rbit of unusual size!");
11422 CGM.
getIntrinsic(Intrinsic::bitreverse, Arg->getType()), Arg,
"rbit");
11424 if (BuiltinID == clang::AArch64::BI__builtin_arm_rbit64) {
11426 "rbit of unusual size!");
11429 CGM.
getIntrinsic(Intrinsic::bitreverse, Arg->getType()), Arg,
"rbit");
11432 if (BuiltinID == clang::AArch64::BI__builtin_arm_clz ||
11433 BuiltinID == clang::AArch64::BI__builtin_arm_clz64) {
11437 if (BuiltinID == clang::AArch64::BI__builtin_arm_clz64)
11442 if (BuiltinID == clang::AArch64::BI__builtin_arm_cls) {
11447 if (BuiltinID == clang::AArch64::BI__builtin_arm_cls64) {
11453 if (BuiltinID == clang::AArch64::BI__builtin_arm_rint32zf ||
11454 BuiltinID == clang::AArch64::BI__builtin_arm_rint32z) {
11456 llvm::Type *Ty = Arg->getType();
11461 if (BuiltinID == clang::AArch64::BI__builtin_arm_rint64zf ||
11462 BuiltinID == clang::AArch64::BI__builtin_arm_rint64z) {
11464 llvm::Type *Ty = Arg->getType();
11469 if (BuiltinID == clang::AArch64::BI__builtin_arm_rint32xf ||
11470 BuiltinID == clang::AArch64::BI__builtin_arm_rint32x) {
11472 llvm::Type *Ty = Arg->getType();
11477 if (BuiltinID == clang::AArch64::BI__builtin_arm_rint64xf ||
11478 BuiltinID == clang::AArch64::BI__builtin_arm_rint64x) {
11480 llvm::Type *Ty = Arg->getType();
11485 if (BuiltinID == clang::AArch64::BI__builtin_arm_jcvt) {
11487 "__jcvt of unusual size!");
11493 if (BuiltinID == clang::AArch64::BI__builtin_arm_ld64b ||
11494 BuiltinID == clang::AArch64::BI__builtin_arm_st64b ||
11495 BuiltinID == clang::AArch64::BI__builtin_arm_st64bv ||
11496 BuiltinID == clang::AArch64::BI__builtin_arm_st64bv0) {
11500 if (BuiltinID == clang::AArch64::BI__builtin_arm_ld64b) {
11504 llvm::Value *Val =
Builder.CreateCall(F, MemAddr);
11505 llvm::Value *ToRet;
11506 for (
size_t i = 0; i < 8; i++) {
11507 llvm::Value *ValOffsetPtr =
11518 Args.push_back(MemAddr);
11519 for (
size_t i = 0; i < 8; i++) {
11520 llvm::Value *ValOffsetPtr =
11527 auto Intr = (BuiltinID == clang::AArch64::BI__builtin_arm_st64b
11528 ? Intrinsic::aarch64_st64b
11529 : BuiltinID == clang::AArch64::BI__builtin_arm_st64bv
11530 ? Intrinsic::aarch64_st64bv
11531 : Intrinsic::aarch64_st64bv0);
11533 return Builder.CreateCall(F, Args);
11537 if (BuiltinID == clang::AArch64::BI__builtin_arm_rndr ||
11538 BuiltinID == clang::AArch64::BI__builtin_arm_rndrrs) {
11540 auto Intr = (BuiltinID == clang::AArch64::BI__builtin_arm_rndr
11541 ? Intrinsic::aarch64_rndr
11542 : Intrinsic::aarch64_rndrrs);
11544 llvm::Value *Val =
Builder.CreateCall(F);
11545 Value *RandomValue =
Builder.CreateExtractValue(Val, 0);
11554 if (BuiltinID == clang::AArch64::BI__clear_cache) {
11555 assert(
E->getNumArgs() == 2 &&
"__clear_cache takes 2 arguments");
11558 for (
unsigned i = 0; i < 2; i++)
11561 llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty);
11562 StringRef Name = FD->
getName();
11566 if ((BuiltinID == clang::AArch64::BI__builtin_arm_ldrex ||
11567 BuiltinID == clang::AArch64::BI__builtin_arm_ldaex) &&
11571 ? Intrinsic::aarch64_ldaxp
11572 : Intrinsic::aarch64_ldxp);
11579 llvm::Type *Int128Ty = llvm::IntegerType::get(
getLLVMContext(), 128);
11580 Val0 =
Builder.CreateZExt(Val0, Int128Ty);
11581 Val1 =
Builder.CreateZExt(Val1, Int128Ty);
11583 Value *ShiftCst = llvm::ConstantInt::get(Int128Ty, 64);
11584 Val =
Builder.CreateShl(Val0, ShiftCst,
"shl",
true );
11585 Val =
Builder.CreateOr(Val, Val1);
11587 }
else if (BuiltinID == clang::AArch64::BI__builtin_arm_ldrex ||
11588 BuiltinID == clang::AArch64::BI__builtin_arm_ldaex) {
11593 llvm::Type *
IntTy =
11598 ? Intrinsic::aarch64_ldaxr
11599 : Intrinsic::aarch64_ldxr,
11601 CallInst *Val =
Builder.CreateCall(F, LoadAddr,
"ldxr");
11605 if (RealResTy->isPointerTy())
11606 return Builder.CreateIntToPtr(Val, RealResTy);
11608 llvm::Type *IntResTy = llvm::IntegerType::get(
11610 return Builder.CreateBitCast(
Builder.CreateTruncOrBitCast(Val, IntResTy),
11614 if ((BuiltinID == clang::AArch64::BI__builtin_arm_strex ||
11615 BuiltinID == clang::AArch64::BI__builtin_arm_stlex) &&
11619 ? Intrinsic::aarch64_stlxp
11620 : Intrinsic::aarch64_stxp);
11632 return Builder.CreateCall(F, {Arg0, Arg1, StPtr},
"stxp");
11635 if (BuiltinID == clang::AArch64::BI__builtin_arm_strex ||
11636 BuiltinID == clang::AArch64::BI__builtin_arm_stlex) {
11641 llvm::Type *StoreTy =
11644 if (StoreVal->
getType()->isPointerTy())
11647 llvm::Type *
IntTy = llvm::IntegerType::get(
11656 ? Intrinsic::aarch64_stlxr
11657 : Intrinsic::aarch64_stxr,
11659 CallInst *CI =
Builder.CreateCall(F, {StoreVal, StoreAddr},
"stxr");
11661 1, Attribute::get(
getLLVMContext(), Attribute::ElementType, StoreTy));
11665 if (BuiltinID == clang::AArch64::BI__getReg) {
11668 llvm_unreachable(
"Sema will ensure that the parameter is constant");
11674 llvm::Metadata *Ops[] = {llvm::MDString::get(Context, Reg)};
11675 llvm::MDNode *RegName = llvm::MDNode::get(Context, Ops);
11676 llvm::Value *Metadata = llvm::MetadataAsValue::get(Context, RegName);
11678 llvm::Function *F =
11680 return Builder.CreateCall(F, Metadata);
11683 if (BuiltinID == clang::AArch64::BI__break) {
11686 llvm_unreachable(
"Sema will ensure that the parameter is constant");
11688 llvm::Function *F =
CGM.
getIntrinsic(llvm::Intrinsic::aarch64_break);
11692 if (BuiltinID == clang::AArch64::BI__builtin_arm_clrex) {
11694 return Builder.CreateCall(F);
11697 if (BuiltinID == clang::AArch64::BI_ReadWriteBarrier)
11698 return Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent,
11699 llvm::SyncScope::SingleThread);
11702 Intrinsic::ID CRCIntrinsicID = Intrinsic::not_intrinsic;
11703 switch (BuiltinID) {
11704 case clang::AArch64::BI__builtin_arm_crc32b:
11705 CRCIntrinsicID = Intrinsic::aarch64_crc32b;
break;
11706 case clang::AArch64::BI__builtin_arm_crc32cb:
11707 CRCIntrinsicID = Intrinsic::aarch64_crc32cb;
break;
11708 case clang::AArch64::BI__builtin_arm_crc32h:
11709 CRCIntrinsicID = Intrinsic::aarch64_crc32h;
break;
11710 case clang::AArch64::BI__builtin_arm_crc32ch:
11711 CRCIntrinsicID = Intrinsic::aarch64_crc32ch;
break;
11712 case clang::AArch64::BI__builtin_arm_crc32w:
11713 CRCIntrinsicID = Intrinsic::aarch64_crc32w;
break;
11714 case clang::AArch64::BI__builtin_arm_crc32cw:
11715 CRCIntrinsicID = Intrinsic::aarch64_crc32cw;
break;
11716 case clang::AArch64::BI__builtin_arm_crc32d:
11717 CRCIntrinsicID = Intrinsic::aarch64_crc32x;
break;
11718 case clang::AArch64::BI__builtin_arm_crc32cd:
11719 CRCIntrinsicID = Intrinsic::aarch64_crc32cx;
break;
11722 if (CRCIntrinsicID != Intrinsic::not_intrinsic) {
11727 llvm::Type *DataTy = F->getFunctionType()->getParamType(1);
11728 Arg1 =
Builder.CreateZExtOrBitCast(Arg1, DataTy);
11730 return Builder.CreateCall(F, {Arg0, Arg1});
11734 if (BuiltinID == AArch64::BI__builtin_arm_mops_memset_tag) {
11741 CGM.
getIntrinsic(Intrinsic::aarch64_mops_memset_tag), {Dst, Val, Size});
11745 Intrinsic::ID MTEIntrinsicID = Intrinsic::not_intrinsic;
11746 switch (BuiltinID) {
11747 case clang::AArch64::BI__builtin_arm_irg:
11748 MTEIntrinsicID = Intrinsic::aarch64_irg;
break;
11749 case clang::AArch64::BI__builtin_arm_addg:
11750 MTEIntrinsicID = Intrinsic::aarch64_addg;
break;
11751 case clang::AArch64::BI__builtin_arm_gmi:
11752 MTEIntrinsicID = Intrinsic::aarch64_gmi;
break;
11753 case clang::AArch64::BI__builtin_arm_ldg:
11754 MTEIntrinsicID = Intrinsic::aarch64_ldg;
break;
11755 case clang::AArch64::BI__builtin_arm_stg:
11756 MTEIntrinsicID = Intrinsic::aarch64_stg;
break;
11757 case clang::AArch64::BI__builtin_arm_subp:
11758 MTEIntrinsicID = Intrinsic::aarch64_subp;
break;
11761 if (MTEIntrinsicID != Intrinsic::not_intrinsic) {
11762 if (MTEIntrinsicID == Intrinsic::aarch64_irg) {
11770 if (MTEIntrinsicID == Intrinsic::aarch64_addg) {
11776 {Pointer, TagOffset});
11778 if (MTEIntrinsicID == Intrinsic::aarch64_gmi) {
11789 if (MTEIntrinsicID == Intrinsic::aarch64_ldg) {
11792 {TagAddress, TagAddress});
11797 if (MTEIntrinsicID == Intrinsic::aarch64_stg) {
11800 {TagAddress, TagAddress});
11802 if (MTEIntrinsicID == Intrinsic::aarch64_subp) {
11810 if (BuiltinID == clang::AArch64::BI__builtin_arm_rsr ||
11811 BuiltinID == clang::AArch64::BI__builtin_arm_rsr64 ||
11812 BuiltinID == clang::AArch64::BI__builtin_arm_rsr128 ||
11813 BuiltinID == clang::AArch64::BI__builtin_arm_rsrp ||
11814 BuiltinID == clang::AArch64::BI__builtin_arm_wsr ||
11815 BuiltinID == clang::AArch64::BI__builtin_arm_wsr64 ||
11816 BuiltinID == clang::AArch64::BI__builtin_arm_wsr128 ||
11817 BuiltinID == clang::AArch64::BI__builtin_arm_wsrp) {
11820 if (BuiltinID == clang::AArch64::BI__builtin_arm_rsr ||
11821 BuiltinID == clang::AArch64::BI__builtin_arm_rsr64 ||
11822 BuiltinID == clang::AArch64::BI__builtin_arm_rsr128 ||
11823 BuiltinID == clang::AArch64::BI__builtin_arm_rsrp)
11826 bool IsPointerBuiltin = BuiltinID == clang::AArch64::BI__builtin_arm_rsrp ||
11827 BuiltinID == clang::AArch64::BI__builtin_arm_wsrp;
11829 bool Is32Bit = BuiltinID == clang::AArch64::BI__builtin_arm_rsr ||
11830 BuiltinID == clang::AArch64::BI__builtin_arm_wsr;
11832 bool Is128Bit = BuiltinID == clang::AArch64::BI__builtin_arm_rsr128 ||
11833 BuiltinID == clang::AArch64::BI__builtin_arm_wsr128;
11835 llvm::Type *ValueType;
11839 }
else if (Is128Bit) {
11840 llvm::Type *Int128Ty =
11842 ValueType = Int128Ty;
11844 }
else if (IsPointerBuiltin) {
11854 if (BuiltinID == clang::AArch64::BI_ReadStatusReg ||
11855 BuiltinID == clang::AArch64::BI_WriteStatusReg) {
11861 std::string SysRegStr;
11862 llvm::raw_string_ostream(SysRegStr) <<
11863 ((1 << 1) | ((SysReg >> 14) & 1)) <<
":" <<
11864 ((SysReg >> 11) & 7) <<
":" <<
11865 ((SysReg >> 7) & 15) <<
":" <<
11866 ((SysReg >> 3) & 15) <<
":" <<
11869 llvm::Metadata *Ops[] = { llvm::MDString::get(Context, SysRegStr) };
11870 llvm::MDNode *RegName = llvm::MDNode::get(Context, Ops);
11871 llvm::Value *Metadata = llvm::MetadataAsValue::get(Context, RegName);
11876 if (BuiltinID == clang::AArch64::BI_ReadStatusReg) {
11877 llvm::Function *F =
CGM.
getIntrinsic(llvm::Intrinsic::read_register, Types);
11879 return Builder.CreateCall(F, Metadata);
11882 llvm::Function *F =
CGM.
getIntrinsic(llvm::Intrinsic::write_register, Types);
11885 return Builder.CreateCall(F, { Metadata, ArgValue });
11888 if (BuiltinID == clang::AArch64::BI_AddressOfReturnAddress) {
11889 llvm::Function *F =
11891 return Builder.CreateCall(F);
11894 if (BuiltinID == clang::AArch64::BI__builtin_sponentry) {
11896 return Builder.CreateCall(F);
11899 if (BuiltinID == clang::AArch64::BI__mulh ||
11900 BuiltinID == clang::AArch64::BI__umulh) {
11902 llvm::Type *Int128Ty = llvm::IntegerType::get(
getLLVMContext(), 128);
11904 bool IsSigned = BuiltinID == clang::AArch64::BI__mulh;
11910 Value *MulResult, *HigherBits;
11912 MulResult =
Builder.CreateNSWMul(LHS, RHS);
11913 HigherBits =
Builder.CreateAShr(MulResult, 64);
11915 MulResult =
Builder.CreateNUWMul(LHS, RHS);
11916 HigherBits =
Builder.CreateLShr(MulResult, 64);
11918 HigherBits =
Builder.CreateIntCast(HigherBits, ResType, IsSigned);
11923 if (BuiltinID == AArch64::BI__writex18byte ||
11924 BuiltinID == AArch64::BI__writex18word ||
11925 BuiltinID == AArch64::BI__writex18dword ||
11926 BuiltinID == AArch64::BI__writex18qword) {
11942 if (BuiltinID == AArch64::BI__readx18byte ||
11943 BuiltinID == AArch64::BI__readx18word ||
11944 BuiltinID == AArch64::BI__readx18dword ||
11945 BuiltinID == AArch64::BI__readx18qword) {
11960 if (BuiltinID == AArch64::BI__addx18byte ||
11961 BuiltinID == AArch64::BI__addx18word ||
11962 BuiltinID == AArch64::BI__addx18dword ||
11963 BuiltinID == AArch64::BI__addx18qword ||
11964 BuiltinID == AArch64::BI__incx18byte ||
11965 BuiltinID == AArch64::BI__incx18word ||
11966 BuiltinID == AArch64::BI__incx18dword ||
11967 BuiltinID == AArch64::BI__incx18qword) {
11970 switch (BuiltinID) {
11971 case AArch64::BI__incx18byte:
11973 isIncrement =
true;
11975 case AArch64::BI__incx18word:
11977 isIncrement =
true;
11979 case AArch64::BI__incx18dword:
11981 isIncrement =
true;
11983 case AArch64::BI__incx18qword:
11985 isIncrement =
true;
11989 isIncrement =
false;
12014 if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 ||
12015 BuiltinID == AArch64::BI_CopyFloatFromInt32 ||
12016 BuiltinID == AArch64::BI_CopyInt32FromFloat ||
12017 BuiltinID == AArch64::BI_CopyInt64FromDouble) {
12020 return Builder.CreateBitCast(Arg, RetTy);
12023 if (BuiltinID == AArch64::BI_CountLeadingOnes ||
12024 BuiltinID == AArch64::BI_CountLeadingOnes64 ||
12025 BuiltinID == AArch64::BI_CountLeadingZeros ||
12026 BuiltinID == AArch64::BI_CountLeadingZeros64) {
12028 llvm::Type *ArgType = Arg->
getType();
12030 if (BuiltinID == AArch64::BI_CountLeadingOnes ||
12031 BuiltinID == AArch64::BI_CountLeadingOnes64)
12032 Arg =
Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType));
12037 if (BuiltinID == AArch64::BI_CountLeadingOnes64 ||
12038 BuiltinID == AArch64::BI_CountLeadingZeros64)
12043 if (BuiltinID == AArch64::BI_CountLeadingSigns ||
12044 BuiltinID == AArch64::BI_CountLeadingSigns64) {
12047 Function *F = (BuiltinID == AArch64::BI_CountLeadingSigns)
12052 if (BuiltinID == AArch64::BI_CountLeadingSigns64)
12057 if (BuiltinID == AArch64::BI_CountOneBits ||
12058 BuiltinID == AArch64::BI_CountOneBits64) {
12060 llvm::Type *ArgType = ArgValue->
getType();
12064 if (BuiltinID == AArch64::BI_CountOneBits64)
12069 if (BuiltinID == AArch64::BI__prefetch) {
12078 if (BuiltinID == AArch64::BI__hlt) {
12084 return ConstantInt::get(
Builder.getInt32Ty(), 0);
12087 if (BuiltinID == NEON::BI__builtin_neon_vcvth_bf16_f32)
12088 return Builder.CreateFPTrunc(
12095 if (std::optional<MSVCIntrin> MsvcIntId =
12101 return P.first == BuiltinID;
12104 BuiltinID = It->second;
12108 unsigned ICEArguments = 0;
12115 for (
unsigned i = 0, e =
E->getNumArgs() - 1; i != e; i++) {
12117 switch (BuiltinID) {
12118 case NEON::BI__builtin_neon_vld1_v:
12119 case NEON::BI__builtin_neon_vld1q_v:
12120 case NEON::BI__builtin_neon_vld1_dup_v:
12121 case NEON::BI__builtin_neon_vld1q_dup_v:
12122 case NEON::BI__builtin_neon_vld1_lane_v:
12123 case NEON::BI__builtin_neon_vld1q_lane_v:
12124 case NEON::BI__builtin_neon_vst1_v:
12125 case NEON::BI__builtin_neon_vst1q_v:
12126 case NEON::BI__builtin_neon_vst1_lane_v:
12127 case NEON::BI__builtin_neon_vst1q_lane_v:
12128 case NEON::BI__builtin_neon_vldap1_lane_s64:
12129 case NEON::BI__builtin_neon_vldap1q_lane_s64:
12130 case NEON::BI__builtin_neon_vstl1_lane_s64:
12131 case NEON::BI__builtin_neon_vstl1q_lane_s64:
12149 assert(
Result &&
"SISD intrinsic should have been handled");
12153 const Expr *Arg =
E->getArg(
E->getNumArgs()-1);
12155 if (std::optional<llvm::APSInt>
Result =
12160 bool usgn =
Type.isUnsigned();
12161 bool quad =
Type.isQuad();
12164 switch (BuiltinID) {
12166 case NEON::BI__builtin_neon_vabsh_f16:
12169 case NEON::BI__builtin_neon_vaddq_p128: {
12172 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
12173 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
12174 Ops[0] =
Builder.CreateXor(Ops[0], Ops[1]);
12175 llvm::Type *Int128Ty = llvm::Type::getIntNTy(
getLLVMContext(), 128);
12176 return Builder.CreateBitCast(Ops[0], Int128Ty);
12178 case NEON::BI__builtin_neon_vldrq_p128: {
12179 llvm::Type *Int128Ty = llvm::Type::getIntNTy(
getLLVMContext(), 128);
12184 case NEON::BI__builtin_neon_vstrq_p128: {
12185 Value *Ptr = Ops[0];
12188 case NEON::BI__builtin_neon_vcvts_f32_u32:
12189 case NEON::BI__builtin_neon_vcvtd_f64_u64:
12192 case NEON::BI__builtin_neon_vcvts_f32_s32:
12193 case NEON::BI__builtin_neon_vcvtd_f64_s64: {
12195 bool Is64 = Ops[0]->getType()->getPrimitiveSizeInBits() == 64;
12198 Ops[0] =
Builder.CreateBitCast(Ops[0], InTy);
12200 return Builder.CreateUIToFP(Ops[0], FTy);
12201 return Builder.CreateSIToFP(Ops[0], FTy);
12203 case NEON::BI__builtin_neon_vcvth_f16_u16:
12204 case NEON::BI__builtin_neon_vcvth_f16_u32:
12205 case NEON::BI__builtin_neon_vcvth_f16_u64:
12208 case NEON::BI__builtin_neon_vcvth_f16_s16:
12209 case NEON::BI__builtin_neon_vcvth_f16_s32:
12210 case NEON::BI__builtin_neon_vcvth_f16_s64: {
12212 llvm::Type *FTy =
HalfTy;
12214 if (Ops[0]->getType()->getPrimitiveSizeInBits() == 64)
12216 else if (Ops[0]->getType()->getPrimitiveSizeInBits() == 32)
12220 Ops[0] =
Builder.CreateBitCast(Ops[0], InTy);
12222 return Builder.CreateUIToFP(Ops[0], FTy);
12223 return Builder.CreateSIToFP(Ops[0], FTy);
12225 case NEON::BI__builtin_neon_vcvtah_u16_f16:
12226 case NEON::BI__builtin_neon_vcvtmh_u16_f16:
12227 case NEON::BI__builtin_neon_vcvtnh_u16_f16:
12228 case NEON::BI__builtin_neon_vcvtph_u16_f16:
12229 case NEON::BI__builtin_neon_vcvth_u16_f16:
12230 case NEON::BI__builtin_neon_vcvtah_s16_f16:
12231 case NEON::BI__builtin_neon_vcvtmh_s16_f16:
12232 case NEON::BI__builtin_neon_vcvtnh_s16_f16:
12233 case NEON::BI__builtin_neon_vcvtph_s16_f16:
12234 case NEON::BI__builtin_neon_vcvth_s16_f16: {
12237 llvm::Type* FTy =
HalfTy;
12238 llvm::Type *Tys[2] = {InTy, FTy};
12240 switch (BuiltinID) {
12241 default: llvm_unreachable(
"missing builtin ID in switch!");
12242 case NEON::BI__builtin_neon_vcvtah_u16_f16:
12243 Int = Intrinsic::aarch64_neon_fcvtau;
break;
12244 case NEON::BI__builtin_neon_vcvtmh_u16_f16:
12245 Int = Intrinsic::aarch64_neon_fcvtmu;
break;
12246 case NEON::BI__builtin_neon_vcvtnh_u16_f16:
12247 Int = Intrinsic::aarch64_neon_fcvtnu;
break;
12248 case NEON::BI__builtin_neon_vcvtph_u16_f16:
12249 Int = Intrinsic::aarch64_neon_fcvtpu;
break;
12250 case NEON::BI__builtin_neon_vcvth_u16_f16:
12251 Int = Intrinsic::aarch64_neon_fcvtzu;
break;
12252 case NEON::BI__builtin_neon_vcvtah_s16_f16:
12253 Int = Intrinsic::aarch64_neon_fcvtas;
break;
12254 case NEON::BI__builtin_neon_vcvtmh_s16_f16:
12255 Int = Intrinsic::aarch64_neon_fcvtms;
break;
12256 case NEON::BI__builtin_neon_vcvtnh_s16_f16:
12257 Int = Intrinsic::aarch64_neon_fcvtns;
break;
12258 case NEON::BI__builtin_neon_vcvtph_s16_f16:
12259 Int = Intrinsic::aarch64_neon_fcvtps;
break;
12260 case NEON::BI__builtin_neon_vcvth_s16_f16:
12261 Int = Intrinsic::aarch64_neon_fcvtzs;
break;
12266 case NEON::BI__builtin_neon_vcaleh_f16:
12267 case NEON::BI__builtin_neon_vcalth_f16:
12268 case NEON::BI__builtin_neon_vcageh_f16:
12269 case NEON::BI__builtin_neon_vcagth_f16: {
12272 llvm::Type* FTy =
HalfTy;
12273 llvm::Type *Tys[2] = {InTy, FTy};
12275 switch (BuiltinID) {
12276 default: llvm_unreachable(
"missing builtin ID in switch!");
12277 case NEON::BI__builtin_neon_vcageh_f16:
12278 Int = Intrinsic::aarch64_neon_facge;
break;
12279 case NEON::BI__builtin_neon_vcagth_f16:
12280 Int = Intrinsic::aarch64_neon_facgt;
break;
12281 case NEON::BI__builtin_neon_vcaleh_f16:
12282 Int = Intrinsic::aarch64_neon_facge; std::swap(Ops[0], Ops[1]);
break;
12283 case NEON::BI__builtin_neon_vcalth_f16:
12284 Int = Intrinsic::aarch64_neon_facgt; std::swap(Ops[0], Ops[1]);
break;
12289 case NEON::BI__builtin_neon_vcvth_n_s16_f16:
12290 case NEON::BI__builtin_neon_vcvth_n_u16_f16: {
12293 llvm::Type* FTy =
HalfTy;
12294 llvm::Type *Tys[2] = {InTy, FTy};
12296 switch (BuiltinID) {
12297 default: llvm_unreachable(
"missing builtin ID in switch!");
12298 case NEON::BI__builtin_neon_vcvth_n_s16_f16:
12299 Int = Intrinsic::aarch64_neon_vcvtfp2fxs;
break;
12300 case NEON::BI__builtin_neon_vcvth_n_u16_f16:
12301 Int = Intrinsic::aarch64_neon_vcvtfp2fxu;
break;
12306 case NEON::BI__builtin_neon_vcvth_n_f16_s16:
12307 case NEON::BI__builtin_neon_vcvth_n_f16_u16: {
12309 llvm::Type* FTy =
HalfTy;
12311 llvm::Type *Tys[2] = {FTy, InTy};
12313 switch (BuiltinID) {
12314 default: llvm_unreachable(
"missing builtin ID in switch!");
12315 case NEON::BI__builtin_neon_vcvth_n_f16_s16:
12316 Int = Intrinsic::aarch64_neon_vcvtfxs2fp;
12317 Ops[0] =
Builder.CreateSExt(Ops[0], InTy,
"sext");
12319 case NEON::BI__builtin_neon_vcvth_n_f16_u16:
12320 Int = Intrinsic::aarch64_neon_vcvtfxu2fp;
12321 Ops[0] =
Builder.CreateZExt(Ops[0], InTy);
12326 case NEON::BI__builtin_neon_vpaddd_s64: {
12327 auto *Ty = llvm::FixedVectorType::get(
Int64Ty, 2);
12330 Vec =
Builder.CreateBitCast(Vec, Ty,
"v2i64");
12331 llvm::Value *Idx0 = llvm::ConstantInt::get(
SizeTy, 0);
12332 llvm::Value *Idx1 = llvm::ConstantInt::get(
SizeTy, 1);
12333 Value *Op0 =
Builder.CreateExtractElement(Vec, Idx0,
"lane0");
12334 Value *Op1 =
Builder.CreateExtractElement(Vec, Idx1,
"lane1");
12336 return Builder.CreateAdd(Op0, Op1,
"vpaddd");
12338 case NEON::BI__builtin_neon_vpaddd_f64: {
12339 auto *Ty = llvm::FixedVectorType::get(
DoubleTy, 2);
12342 Vec =
Builder.CreateBitCast(Vec, Ty,
"v2f64");
12343 llvm::Value *Idx0 = llvm::ConstantInt::get(
SizeTy, 0);
12344 llvm::Value *Idx1 = llvm::ConstantInt::get(
SizeTy, 1);
12345 Value *Op0 =
Builder.CreateExtractElement(Vec, Idx0,
"lane0");
12346 Value *Op1 =
Builder.CreateExtractElement(Vec, Idx1,
"lane1");
12348 return Builder.CreateFAdd(Op0, Op1,
"vpaddd");
12350 case NEON::BI__builtin_neon_vpadds_f32: {
12351 auto *Ty = llvm::FixedVectorType::get(
FloatTy, 2);
12354 Vec =
Builder.CreateBitCast(Vec, Ty,
"v2f32");
12355 llvm::Value *Idx0 = llvm::ConstantInt::get(
SizeTy, 0);
12356 llvm::Value *Idx1 = llvm::ConstantInt::get(
SizeTy, 1);
12357 Value *Op0 =
Builder.CreateExtractElement(Vec, Idx0,
"lane0");
12358 Value *Op1 =
Builder.CreateExtractElement(Vec, Idx1,
"lane1");
12360 return Builder.CreateFAdd(Op0, Op1,
"vpaddd");
12362 case NEON::BI__builtin_neon_vceqzd_s64:
12363 case NEON::BI__builtin_neon_vceqzd_f64:
12364 case NEON::BI__builtin_neon_vceqzs_f32:
12365 case NEON::BI__builtin_neon_vceqzh_f16:
12369 ICmpInst::FCMP_OEQ, ICmpInst::ICMP_EQ,
"vceqz");
12370 case NEON::BI__builtin_neon_vcgezd_s64:
12371 case NEON::BI__builtin_neon_vcgezd_f64:
12372 case NEON::BI__builtin_neon_vcgezs_f32:
12373 case NEON::BI__builtin_neon_vcgezh_f16:
12377 ICmpInst::FCMP_OGE, ICmpInst::ICMP_SGE,
"vcgez");
12378 case NEON::BI__builtin_neon_vclezd_s64:
12379 case NEON::BI__builtin_neon_vclezd_f64:
12380 case NEON::BI__builtin_neon_vclezs_f32:
12381 case NEON::BI__builtin_neon_vclezh_f16:
12385 ICmpInst::FCMP_OLE, ICmpInst::ICMP_SLE,
"vclez");
12386 case NEON::BI__builtin_neon_vcgtzd_s64:
12387 case NEON::BI__builtin_neon_vcgtzd_f64:
12388 case NEON::BI__builtin_neon_vcgtzs_f32:
12389 case NEON::BI__builtin_neon_vcgtzh_f16:
12393 ICmpInst::FCMP_OGT, ICmpInst::ICMP_SGT,
"vcgtz");
12394 case NEON::BI__builtin_neon_vcltzd_s64:
12395 case NEON::BI__builtin_neon_vcltzd_f64:
12396 case NEON::BI__builtin_neon_vcltzs_f32:
12397 case NEON::BI__builtin_neon_vcltzh_f16:
12401 ICmpInst::FCMP_OLT, ICmpInst::ICMP_SLT,
"vcltz");
12403 case NEON::BI__builtin_neon_vceqzd_u64: {
12407 Builder.CreateICmpEQ(Ops[0], llvm::Constant::getNullValue(
Int64Ty));
12410 case NEON::BI__builtin_neon_vceqd_f64:
12411 case NEON::BI__builtin_neon_vcled_f64:
12412 case NEON::BI__builtin_neon_vcltd_f64:
12413 case NEON::BI__builtin_neon_vcged_f64:
12414 case NEON::BI__builtin_neon_vcgtd_f64: {
12415 llvm::CmpInst::Predicate
P;
12416 switch (BuiltinID) {
12417 default: llvm_unreachable(
"missing builtin ID in switch!");
12418 case NEON::BI__builtin_neon_vceqd_f64:
P = llvm::FCmpInst::FCMP_OEQ;
break;
12419 case NEON::BI__builtin_neon_vcled_f64:
P = llvm::FCmpInst::FCMP_OLE;
break;
12420 case NEON::BI__builtin_neon_vcltd_f64:
P = llvm::FCmpInst::FCMP_OLT;
break;
12421 case NEON::BI__builtin_neon_vcged_f64:
P = llvm::FCmpInst::FCMP_OGE;
break;
12422 case NEON::BI__builtin_neon_vcgtd_f64:
P = llvm::FCmpInst::FCMP_OGT;
break;
12427 if (
P == llvm::FCmpInst::FCMP_OEQ)
12428 Ops[0] =
Builder.CreateFCmp(
P, Ops[0], Ops[1]);
12430 Ops[0] =
Builder.CreateFCmpS(
P, Ops[0], Ops[1]);
12433 case NEON::BI__builtin_neon_vceqs_f32:
12434 case NEON::BI__builtin_neon_vcles_f32:
12435 case NEON::BI__builtin_neon_vclts_f32:
12436 case NEON::BI__builtin_neon_vcges_f32:
12437 case NEON::BI__builtin_neon_vcgts_f32: {
12438 llvm::CmpInst::Predicate
P;
12439 switch (BuiltinID) {
12440 default: llvm_unreachable(
"missing builtin ID in switch!");
12441 case NEON::BI__builtin_neon_vceqs_f32:
P = llvm::FCmpInst::FCMP_OEQ;
break;
12442 case NEON::BI__builtin_neon_vcles_f32:
P = llvm::FCmpInst::FCMP_OLE;
break;
12443 case NEON::BI__builtin_neon_vclts_f32:
P = llvm::FCmpInst::FCMP_OLT;
break;
12444 case NEON::BI__builtin_neon_vcges_f32:
P = llvm::FCmpInst::FCMP_OGE;
break;
12445 case NEON::BI__builtin_neon_vcgts_f32:
P = llvm::FCmpInst::FCMP_OGT;
break;
12450 if (
P == llvm::FCmpInst::FCMP_OEQ)
12451 Ops[0] =
Builder.CreateFCmp(
P, Ops[0], Ops[1]);
12453 Ops[0] =
Builder.CreateFCmpS(
P, Ops[0], Ops[1]);
12456 case NEON::BI__builtin_neon_vceqh_f16:
12457 case NEON::BI__builtin_neon_vcleh_f16:
12458 case NEON::BI__builtin_neon_vclth_f16:
12459 case NEON::BI__builtin_neon_vcgeh_f16:
12460 case NEON::BI__builtin_neon_vcgth_f16: {
12461 llvm::CmpInst::Predicate
P;
12462 switch (BuiltinID) {
12463 default: llvm_unreachable(
"missing builtin ID in switch!");
12464 case NEON::BI__builtin_neon_vceqh_f16:
P = llvm::FCmpInst::FCMP_OEQ;
break;
12465 case NEON::BI__builtin_neon_vcleh_f16:
P = llvm::FCmpInst::FCMP_OLE;
break;
12466 case NEON::BI__builtin_neon_vclth_f16:
P = llvm::FCmpInst::FCMP_OLT;
break;
12467 case NEON::BI__builtin_neon_vcgeh_f16:
P = llvm::FCmpInst::FCMP_OGE;
break;
12468 case NEON::BI__builtin_neon_vcgth_f16:
P = llvm::FCmpInst::FCMP_OGT;
break;
12473 if (
P == llvm::FCmpInst::FCMP_OEQ)
12474 Ops[0] =
Builder.CreateFCmp(
P, Ops[0], Ops[1]);
12476 Ops[0] =
Builder.CreateFCmpS(
P, Ops[0], Ops[1]);
12479 case NEON::BI__builtin_neon_vceqd_s64:
12480 case NEON::BI__builtin_neon_vceqd_u64:
12481 case NEON::BI__builtin_neon_vcgtd_s64:
12482 case NEON::BI__builtin_neon_vcgtd_u64:
12483 case NEON::BI__builtin_neon_vcltd_s64:
12484 case NEON::BI__builtin_neon_vcltd_u64:
12485 case NEON::BI__builtin_neon_vcged_u64:
12486 case NEON::BI__builtin_neon_vcged_s64:
12487 case NEON::BI__builtin_neon_vcled_u64:
12488 case NEON::BI__builtin_neon_vcled_s64: {
12489 llvm::CmpInst::Predicate
P;
12490 switch (BuiltinID) {
12491 default: llvm_unreachable(
"missing builtin ID in switch!");
12492 case NEON::BI__builtin_neon_vceqd_s64:
12493 case NEON::BI__builtin_neon_vceqd_u64:
P = llvm::ICmpInst::ICMP_EQ;
break;
12494 case NEON::BI__builtin_neon_vcgtd_s64:
P = llvm::ICmpInst::ICMP_SGT;
break;
12495 case NEON::BI__builtin_neon_vcgtd_u64:
P = llvm::ICmpInst::ICMP_UGT;
break;
12496 case NEON::BI__builtin_neon_vcltd_s64:
P = llvm::ICmpInst::ICMP_SLT;
break;
12497 case NEON::BI__builtin_neon_vcltd_u64:
P = llvm::ICmpInst::ICMP_ULT;
break;
12498 case NEON::BI__builtin_neon_vcged_u64:
P = llvm::ICmpInst::ICMP_UGE;
break;
12499 case NEON::BI__builtin_neon_vcged_s64:
P = llvm::ICmpInst::ICMP_SGE;
break;
12500 case NEON::BI__builtin_neon_vcled_u64:
P = llvm::ICmpInst::ICMP_ULE;
break;
12501 case NEON::BI__builtin_neon_vcled_s64:
P = llvm::ICmpInst::ICMP_SLE;
break;
12506 Ops[0] =
Builder.CreateICmp(
P, Ops[0], Ops[1]);
12509 case NEON::BI__builtin_neon_vtstd_s64:
12510 case NEON::BI__builtin_neon_vtstd_u64: {
12514 Ops[0] =
Builder.CreateAnd(Ops[0], Ops[1]);
12515 Ops[0] =
Builder.CreateICmp(ICmpInst::ICMP_NE, Ops[0],
12516 llvm::Constant::getNullValue(
Int64Ty));
12519 case NEON::BI__builtin_neon_vset_lane_i8:
12520 case NEON::BI__builtin_neon_vset_lane_i16:
12521 case NEON::BI__builtin_neon_vset_lane_i32:
12522 case NEON::BI__builtin_neon_vset_lane_i64:
12523 case NEON::BI__builtin_neon_vset_lane_bf16:
12524 case NEON::BI__builtin_neon_vset_lane_f32:
12525 case NEON::BI__builtin_neon_vsetq_lane_i8:
12526 case NEON::BI__builtin_neon_vsetq_lane_i16:
12527 case NEON::BI__builtin_neon_vsetq_lane_i32:
12528 case NEON::BI__builtin_neon_vsetq_lane_i64:
12529 case NEON::BI__builtin_neon_vsetq_lane_bf16:
12530 case NEON::BI__builtin_neon_vsetq_lane_f32:
12532 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2],
"vset_lane");
12533 case NEON::BI__builtin_neon_vset_lane_f64:
12536 Builder.CreateBitCast(Ops[1], llvm::FixedVectorType::get(
DoubleTy, 1));
12538 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2],
"vset_lane");
12539 case NEON::BI__builtin_neon_vsetq_lane_f64:
12542 Builder.CreateBitCast(Ops[1], llvm::FixedVectorType::get(
DoubleTy, 2));
12544 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2],
"vset_lane");
12546 case NEON::BI__builtin_neon_vget_lane_i8:
12547 case NEON::BI__builtin_neon_vdupb_lane_i8:
12549 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
Int8Ty, 8));
12552 case NEON::BI__builtin_neon_vgetq_lane_i8:
12553 case NEON::BI__builtin_neon_vdupb_laneq_i8:
12555 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
Int8Ty, 16));
12558 case NEON::BI__builtin_neon_vget_lane_i16:
12559 case NEON::BI__builtin_neon_vduph_lane_i16:
12561 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
Int16Ty, 4));
12564 case NEON::BI__builtin_neon_vgetq_lane_i16:
12565 case NEON::BI__builtin_neon_vduph_laneq_i16:
12567 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
Int16Ty, 8));
12570 case NEON::BI__builtin_neon_vget_lane_i32:
12571 case NEON::BI__builtin_neon_vdups_lane_i32:
12573 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
Int32Ty, 2));
12576 case NEON::BI__builtin_neon_vdups_lane_f32:
12578 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
FloatTy, 2));
12581 case NEON::BI__builtin_neon_vgetq_lane_i32:
12582 case NEON::BI__builtin_neon_vdups_laneq_i32:
12584 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
Int32Ty, 4));
12587 case NEON::BI__builtin_neon_vget_lane_i64:
12588 case NEON::BI__builtin_neon_vdupd_lane_i64:
12590 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
Int64Ty, 1));
12593 case NEON::BI__builtin_neon_vdupd_lane_f64:
12595 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
DoubleTy, 1));
12598 case NEON::BI__builtin_neon_vgetq_lane_i64:
12599 case NEON::BI__builtin_neon_vdupd_laneq_i64:
12601 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
Int64Ty, 2));
12604 case NEON::BI__builtin_neon_vget_lane_f32:
12606 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
FloatTy, 2));
12609 case NEON::BI__builtin_neon_vget_lane_f64:
12611 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
DoubleTy, 1));
12614 case NEON::BI__builtin_neon_vgetq_lane_f32:
12615 case NEON::BI__builtin_neon_vdups_laneq_f32:
12617 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
FloatTy, 4));
12620 case NEON::BI__builtin_neon_vgetq_lane_f64:
12621 case NEON::BI__builtin_neon_vdupd_laneq_f64:
12623 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
DoubleTy, 2));
12626 case NEON::BI__builtin_neon_vaddh_f16:
12628 return Builder.CreateFAdd(Ops[0], Ops[1],
"vaddh");
12629 case NEON::BI__builtin_neon_vsubh_f16:
12631 return Builder.CreateFSub(Ops[0], Ops[1],
"vsubh");
12632 case NEON::BI__builtin_neon_vmulh_f16:
12634 return Builder.CreateFMul(Ops[0], Ops[1],
"vmulh");
12635 case NEON::BI__builtin_neon_vdivh_f16:
12637 return Builder.CreateFDiv(Ops[0], Ops[1],
"vdivh");
12638 case NEON::BI__builtin_neon_vfmah_f16:
12641 *
this, Intrinsic::fma, Intrinsic::experimental_constrained_fma,
HalfTy,
12643 case NEON::BI__builtin_neon_vfmsh_f16: {
12648 *
this, Intrinsic::fma, Intrinsic::experimental_constrained_fma,
HalfTy,
12651 case NEON::BI__builtin_neon_vaddd_s64:
12652 case NEON::BI__builtin_neon_vaddd_u64:
12654 case NEON::BI__builtin_neon_vsubd_s64:
12655 case NEON::BI__builtin_neon_vsubd_u64:
12657 case NEON::BI__builtin_neon_vqdmlalh_s16:
12658 case NEON::BI__builtin_neon_vqdmlslh_s16: {
12662 auto *VTy = llvm::FixedVectorType::get(
Int32Ty, 4);
12664 ProductOps,
"vqdmlXl");
12665 Constant *CI = ConstantInt::get(
SizeTy, 0);
12666 Ops[1] =
Builder.CreateExtractElement(Ops[1], CI,
"lane0");
12668 unsigned AccumInt = BuiltinID == NEON::BI__builtin_neon_vqdmlalh_s16
12669 ? Intrinsic::aarch64_neon_sqadd
12670 : Intrinsic::aarch64_neon_sqsub;
12673 case NEON::BI__builtin_neon_vqshlud_n_s64: {
12679 case NEON::BI__builtin_neon_vqshld_n_u64:
12680 case NEON::BI__builtin_neon_vqshld_n_s64: {
12681 unsigned Int = BuiltinID == NEON::BI__builtin_neon_vqshld_n_u64
12682 ? Intrinsic::aarch64_neon_uqshl
12683 : Intrinsic::aarch64_neon_sqshl;
12688 case NEON::BI__builtin_neon_vrshrd_n_u64:
12689 case NEON::BI__builtin_neon_vrshrd_n_s64: {
12690 unsigned Int = BuiltinID == NEON::BI__builtin_neon_vrshrd_n_u64
12691 ? Intrinsic::aarch64_neon_urshl
12692 : Intrinsic::aarch64_neon_srshl;
12694 int SV = cast<ConstantInt>(Ops[1])->getSExtValue();
12695 Ops[1] = ConstantInt::get(
Int64Ty, -SV);
12698 case NEON::BI__builtin_neon_vrsrad_n_u64:
12699 case NEON::BI__builtin_neon_vrsrad_n_s64: {
12700 unsigned Int = BuiltinID == NEON::BI__builtin_neon_vrsrad_n_u64
12701 ? Intrinsic::aarch64_neon_urshl
12702 : Intrinsic::aarch64_neon_srshl;
12706 {Ops[1], Builder.CreateSExt(Ops[2], Int64Ty)});
12709 case NEON::BI__builtin_neon_vshld_n_s64:
12710 case NEON::BI__builtin_neon_vshld_n_u64: {
12711 llvm::ConstantInt *Amt = cast<ConstantInt>(
EmitScalarExpr(
E->getArg(1)));
12713 Ops[0], ConstantInt::get(
Int64Ty, Amt->getZExtValue()),
"shld_n");
12715 case NEON::BI__builtin_neon_vshrd_n_s64: {
12716 llvm::ConstantInt *Amt = cast<ConstantInt>(
EmitScalarExpr(
E->getArg(1)));
12718 Ops[0], ConstantInt::get(
Int64Ty, std::min(
static_cast<uint64_t>(63),
12719 Amt->getZExtValue())),
12722 case NEON::BI__builtin_neon_vshrd_n_u64: {
12723 llvm::ConstantInt *Amt = cast<ConstantInt>(
EmitScalarExpr(
E->getArg(1)));
12724 uint64_t ShiftAmt = Amt->getZExtValue();
12726 if (ShiftAmt == 64)
12727 return ConstantInt::get(
Int64Ty, 0);
12728 return Builder.CreateLShr(Ops[0], ConstantInt::get(
Int64Ty, ShiftAmt),
12731 case NEON::BI__builtin_neon_vsrad_n_s64: {
12732 llvm::ConstantInt *Amt = cast<ConstantInt>(
EmitScalarExpr(
E->getArg(2)));
12734 Ops[1], ConstantInt::get(
Int64Ty, std::min(
static_cast<uint64_t>(63),
12735 Amt->getZExtValue())),
12737 return Builder.CreateAdd(Ops[0], Ops[1]);
12739 case NEON::BI__builtin_neon_vsrad_n_u64: {
12740 llvm::ConstantInt *Amt = cast<ConstantInt>(
EmitScalarExpr(
E->getArg(2)));
12741 uint64_t ShiftAmt = Amt->getZExtValue();
12744 if (ShiftAmt == 64)
12746 Ops[1] =
Builder.CreateLShr(Ops[1], ConstantInt::get(
Int64Ty, ShiftAmt),
12748 return Builder.CreateAdd(Ops[0], Ops[1]);
12750 case NEON::BI__builtin_neon_vqdmlalh_lane_s16:
12751 case NEON::BI__builtin_neon_vqdmlalh_laneq_s16:
12752 case NEON::BI__builtin_neon_vqdmlslh_lane_s16:
12753 case NEON::BI__builtin_neon_vqdmlslh_laneq_s16: {
12759 auto *VTy = llvm::FixedVectorType::get(
Int32Ty, 4);
12761 ProductOps,
"vqdmlXl");
12762 Constant *CI = ConstantInt::get(
SizeTy, 0);
12763 Ops[1] =
Builder.CreateExtractElement(Ops[1], CI,
"lane0");
12766 unsigned AccInt = (BuiltinID == NEON::BI__builtin_neon_vqdmlalh_lane_s16 ||
12767 BuiltinID == NEON::BI__builtin_neon_vqdmlalh_laneq_s16)
12768 ? Intrinsic::aarch64_neon_sqadd
12769 : Intrinsic::aarch64_neon_sqsub;
12772 case NEON::BI__builtin_neon_vqdmlals_s32:
12773 case NEON::BI__builtin_neon_vqdmlsls_s32: {
12775 ProductOps.push_back(Ops[1]);
12779 ProductOps,
"vqdmlXl");
12781 unsigned AccumInt = BuiltinID == NEON::BI__builtin_neon_vqdmlals_s32
12782 ? Intrinsic::aarch64_neon_sqadd
12783 : Intrinsic::aarch64_neon_sqsub;
12786 case NEON::BI__builtin_neon_vqdmlals_lane_s32:
12787 case NEON::BI__builtin_neon_vqdmlals_laneq_s32:
12788 case NEON::BI__builtin_neon_vqdmlsls_lane_s32:
12789 case NEON::BI__builtin_neon_vqdmlsls_laneq_s32: {
12793 ProductOps.push_back(Ops[1]);
12794 ProductOps.push_back(Ops[2]);
12797 ProductOps,
"vqdmlXl");
12800 unsigned AccInt = (BuiltinID == NEON::BI__builtin_neon_vqdmlals_lane_s32 ||
12801 BuiltinID == NEON::BI__builtin_neon_vqdmlals_laneq_s32)
12802 ? Intrinsic::aarch64_neon_sqadd
12803 : Intrinsic::aarch64_neon_sqsub;
12806 case NEON::BI__builtin_neon_vget_lane_bf16:
12807 case NEON::BI__builtin_neon_vduph_lane_bf16:
12808 case NEON::BI__builtin_neon_vduph_lane_f16: {
12812 case NEON::BI__builtin_neon_vgetq_lane_bf16:
12813 case NEON::BI__builtin_neon_vduph_laneq_bf16:
12814 case NEON::BI__builtin_neon_vduph_laneq_f16: {
12818 case NEON::BI__builtin_neon_vcvt_bf16_f32: {
12819 llvm::Type *V4F32 = FixedVectorType::get(
Builder.getFloatTy(), 4);
12820 llvm::Type *V4BF16 = FixedVectorType::get(
Builder.getBFloatTy(), 4);
12821 return Builder.CreateFPTrunc(
Builder.CreateBitCast(Ops[0], V4F32), V4BF16);
12823 case NEON::BI__builtin_neon_vcvtq_low_bf16_f32: {
12825 std::iota(ConcatMask.begin(), ConcatMask.end(), 0);
12826 llvm::Type *V4F32 = FixedVectorType::get(
Builder.getFloatTy(), 4);
12827 llvm::Type *V4BF16 = FixedVectorType::get(
Builder.getBFloatTy(), 4);
12828 llvm::Value *Trunc =
12829 Builder.CreateFPTrunc(
Builder.CreateBitCast(Ops[0], V4F32), V4BF16);
12830 return Builder.CreateShuffleVector(
12831 Trunc, ConstantAggregateZero::get(V4BF16), ConcatMask);
12833 case NEON::BI__builtin_neon_vcvtq_high_bf16_f32: {
12835 std::iota(ConcatMask.begin(), ConcatMask.end(), 0);
12837 std::iota(LoMask.begin(), LoMask.end(), 0);
12838 llvm::Type *V4F32 = FixedVectorType::get(
Builder.getFloatTy(), 4);
12839 llvm::Type *V4BF16 = FixedVectorType::get(
Builder.getBFloatTy(), 4);
12840 llvm::Type *V8BF16 = FixedVectorType::get(
Builder.getBFloatTy(), 8);
12841 llvm::Value *Inactive =
Builder.CreateShuffleVector(
12842 Builder.CreateBitCast(Ops[0], V8BF16), LoMask);
12843 llvm::Value *Trunc =
12844 Builder.CreateFPTrunc(
Builder.CreateBitCast(Ops[1], V4F32), V4BF16);
12845 return Builder.CreateShuffleVector(Inactive, Trunc, ConcatMask);
12848 case clang::AArch64::BI_InterlockedAdd:
12849 case clang::AArch64::BI_InterlockedAdd64: {
12852 AtomicRMWInst *RMWI =
12854 llvm::AtomicOrdering::SequentiallyConsistent);
12855 return Builder.CreateAdd(RMWI, Val);
12860 llvm::Type *Ty = VTy;
12871 Builtin->BuiltinID, Builtin->LLVMIntrinsic, Builtin->AltLLVMIntrinsic,
12872 Builtin->NameHint, Builtin->TypeModifier,
E, Ops,
12879 switch (BuiltinID) {
12880 default:
return nullptr;
12881 case NEON::BI__builtin_neon_vbsl_v:
12882 case NEON::BI__builtin_neon_vbslq_v: {
12883 llvm::Type *BitTy = llvm::VectorType::getInteger(VTy);
12884 Ops[0] =
Builder.CreateBitCast(Ops[0], BitTy,
"vbsl");
12885 Ops[1] =
Builder.CreateBitCast(Ops[1], BitTy,
"vbsl");
12886 Ops[2] =
Builder.CreateBitCast(Ops[2], BitTy,
"vbsl");
12888 Ops[1] =
Builder.CreateAnd(Ops[0], Ops[1],
"vbsl");
12889 Ops[2] =
Builder.CreateAnd(
Builder.CreateNot(Ops[0]), Ops[2],
"vbsl");
12890 Ops[0] =
Builder.CreateOr(Ops[1], Ops[2],
"vbsl");
12891 return Builder.CreateBitCast(Ops[0], Ty);
12893 case NEON::BI__builtin_neon_vfma_lane_v:
12894 case NEON::BI__builtin_neon_vfmaq_lane_v: {
12897 Value *Addend = Ops[0];
12898 Value *Multiplicand = Ops[1];
12899 Value *LaneSource = Ops[2];
12900 Ops[0] = Multiplicand;
12901 Ops[1] = LaneSource;
12905 auto *SourceTy = BuiltinID == NEON::BI__builtin_neon_vfmaq_lane_v
12906 ? llvm::FixedVectorType::get(VTy->getElementType(),
12907 VTy->getNumElements() / 2)
12909 llvm::Constant *cst = cast<Constant>(Ops[3]);
12910 Value *SV = llvm::ConstantVector::getSplat(VTy->getElementCount(), cst);
12911 Ops[1] =
Builder.CreateBitCast(Ops[1], SourceTy);
12912 Ops[1] =
Builder.CreateShuffleVector(Ops[1], Ops[1], SV,
"lane");
12915 Int =
Builder.getIsFPConstrained() ? Intrinsic::experimental_constrained_fma
12919 case NEON::BI__builtin_neon_vfma_laneq_v: {
12920 auto *VTy = cast<llvm::FixedVectorType>(Ty);
12922 if (VTy && VTy->getElementType() ==
DoubleTy) {
12925 llvm::FixedVectorType *VTy =
12927 Ops[2] =
Builder.CreateBitCast(Ops[2], VTy);
12928 Ops[2] =
Builder.CreateExtractElement(Ops[2], Ops[3],
"extract");
12931 *
this, Intrinsic::fma, Intrinsic::experimental_constrained_fma,
12932 DoubleTy, {Ops[1], Ops[2], Ops[0]});
12935 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
12936 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
12938 auto *STy = llvm::FixedVectorType::get(VTy->getElementType(),
12939 VTy->getNumElements() * 2);
12940 Ops[2] =
Builder.CreateBitCast(Ops[2], STy);
12941 Value *SV = llvm::ConstantVector::getSplat(VTy->getElementCount(),
12942 cast<ConstantInt>(Ops[3]));
12943 Ops[2] =
Builder.CreateShuffleVector(Ops[2], Ops[2], SV,
"lane");
12946 *
this, Intrinsic::fma, Intrinsic::experimental_constrained_fma, Ty,
12947 {Ops[2], Ops[1], Ops[0]});
12949 case NEON::BI__builtin_neon_vfmaq_laneq_v: {
12950 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
12951 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
12953 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
12956 *
this, Intrinsic::fma, Intrinsic::experimental_constrained_fma, Ty,
12957 {Ops[2], Ops[1], Ops[0]});
12959 case NEON::BI__builtin_neon_vfmah_lane_f16:
12960 case NEON::BI__builtin_neon_vfmas_lane_f32:
12961 case NEON::BI__builtin_neon_vfmah_laneq_f16:
12962 case NEON::BI__builtin_neon_vfmas_laneq_f32:
12963 case NEON::BI__builtin_neon_vfmad_lane_f64:
12964 case NEON::BI__builtin_neon_vfmad_laneq_f64: {
12967 Ops[2] =
Builder.CreateExtractElement(Ops[2], Ops[3],
"extract");
12969 *
this, Intrinsic::fma, Intrinsic::experimental_constrained_fma, Ty,
12970 {Ops[1], Ops[2], Ops[0]});
12972 case NEON::BI__builtin_neon_vmull_v:
12974 Int = usgn ? Intrinsic::aarch64_neon_umull : Intrinsic::aarch64_neon_smull;
12975 if (
Type.isPoly())
Int = Intrinsic::aarch64_neon_pmull;
12977 case NEON::BI__builtin_neon_vmax_v:
12978 case NEON::BI__builtin_neon_vmaxq_v:
12980 Int = usgn ? Intrinsic::aarch64_neon_umax : Intrinsic::aarch64_neon_smax;
12981 if (Ty->isFPOrFPVectorTy())
Int = Intrinsic::aarch64_neon_fmax;
12983 case NEON::BI__builtin_neon_vmaxh_f16: {
12985 Int = Intrinsic::aarch64_neon_fmax;
12988 case NEON::BI__builtin_neon_vmin_v:
12989 case NEON::BI__builtin_neon_vminq_v:
12991 Int = usgn ? Intrinsic::aarch64_neon_umin : Intrinsic::aarch64_neon_smin;
12992 if (Ty->isFPOrFPVectorTy())
Int = Intrinsic::aarch64_neon_fmin;
12994 case NEON::BI__builtin_neon_vminh_f16: {
12996 Int = Intrinsic::aarch64_neon_fmin;
12999 case NEON::BI__builtin_neon_vabd_v:
13000 case NEON::BI__builtin_neon_vabdq_v:
13002 Int = usgn ? Intrinsic::aarch64_neon_uabd : Intrinsic::aarch64_neon_sabd;
13003 if (Ty->isFPOrFPVectorTy())
Int = Intrinsic::aarch64_neon_fabd;
13005 case NEON::BI__builtin_neon_vpadal_v:
13006 case NEON::BI__builtin_neon_vpadalq_v: {
13007 unsigned ArgElts = VTy->getNumElements();
13008 llvm::IntegerType *EltTy = cast<IntegerType>(VTy->getElementType());
13009 unsigned BitWidth = EltTy->getBitWidth();
13010 auto *ArgTy = llvm::FixedVectorType::get(
13011 llvm::IntegerType::get(
getLLVMContext(), BitWidth / 2), 2 * ArgElts);
13012 llvm::Type* Tys[2] = { VTy, ArgTy };
13013 Int = usgn ? Intrinsic::aarch64_neon_uaddlp : Intrinsic::aarch64_neon_saddlp;
13015 TmpOps.push_back(Ops[1]);
13018 llvm::Value *addend =
Builder.CreateBitCast(Ops[0], tmp->getType());
13019 return Builder.CreateAdd(tmp, addend);
13021 case NEON::BI__builtin_neon_vpmin_v:
13022 case NEON::BI__builtin_neon_vpminq_v:
13024 Int = usgn ? Intrinsic::aarch64_neon_uminp : Intrinsic::aarch64_neon_sminp;
13025 if (Ty->isFPOrFPVectorTy())
Int = Intrinsic::aarch64_neon_fminp;
13027 case NEON::BI__builtin_neon_vpmax_v:
13028 case NEON::BI__builtin_neon_vpmaxq_v:
13030 Int = usgn ? Intrinsic::aarch64_neon_umaxp : Intrinsic::aarch64_neon_smaxp;
13031 if (Ty->isFPOrFPVectorTy())
Int = Intrinsic::aarch64_neon_fmaxp;
13033 case NEON::BI__builtin_neon_vminnm_v:
13034 case NEON::BI__builtin_neon_vminnmq_v:
13035 Int = Intrinsic::aarch64_neon_fminnm;
13037 case NEON::BI__builtin_neon_vminnmh_f16:
13039 Int = Intrinsic::aarch64_neon_fminnm;
13041 case NEON::BI__builtin_neon_vmaxnm_v:
13042 case NEON::BI__builtin_neon_vmaxnmq_v:
13043 Int = Intrinsic::aarch64_neon_fmaxnm;
13045 case NEON::BI__builtin_neon_vmaxnmh_f16:
13047 Int = Intrinsic::aarch64_neon_fmaxnm;
13049 case NEON::BI__builtin_neon_vrecpss_f32: {
13054 case NEON::BI__builtin_neon_vrecpsd_f64:
13058 case NEON::BI__builtin_neon_vrecpsh_f16:
13062 case NEON::BI__builtin_neon_vqshrun_n_v:
13063 Int = Intrinsic::aarch64_neon_sqshrun;
13065 case NEON::BI__builtin_neon_vqrshrun_n_v:
13066 Int = Intrinsic::aarch64_neon_sqrshrun;
13068 case NEON::BI__builtin_neon_vqshrn_n_v:
13069 Int = usgn ? Intrinsic::aarch64_neon_uqshrn : Intrinsic::aarch64_neon_sqshrn;
13071 case NEON::BI__builtin_neon_vrshrn_n_v:
13072 Int = Intrinsic::aarch64_neon_rshrn;
13074 case NEON::BI__builtin_neon_vqrshrn_n_v:
13075 Int = usgn ? Intrinsic::aarch64_neon_uqrshrn : Intrinsic::aarch64_neon_sqrshrn;
13077 case NEON::BI__builtin_neon_vrndah_f16: {
13080 ? Intrinsic::experimental_constrained_round
13081 : Intrinsic::round;
13084 case NEON::BI__builtin_neon_vrnda_v:
13085 case NEON::BI__builtin_neon_vrndaq_v: {
13087 ? Intrinsic::experimental_constrained_round
13088 : Intrinsic::round;
13091 case NEON::BI__builtin_neon_vrndih_f16: {
13094 ? Intrinsic::experimental_constrained_nearbyint
13095 : Intrinsic::nearbyint;
13098 case NEON::BI__builtin_neon_vrndmh_f16: {
13101 ? Intrinsic::experimental_constrained_floor
13102 : Intrinsic::floor;
13105 case NEON::BI__builtin_neon_vrndm_v:
13106 case NEON::BI__builtin_neon_vrndmq_v: {
13108 ? Intrinsic::experimental_constrained_floor
13109 : Intrinsic::floor;
13112 case NEON::BI__builtin_neon_vrndnh_f16: {
13115 ? Intrinsic::experimental_constrained_roundeven
13116 : Intrinsic::roundeven;
13119 case NEON::BI__builtin_neon_vrndn_v:
13120 case NEON::BI__builtin_neon_vrndnq_v: {
13122 ? Intrinsic::experimental_constrained_roundeven
13123 : Intrinsic::roundeven;
13126 case NEON::BI__builtin_neon_vrndns_f32: {
13129 ? Intrinsic::experimental_constrained_roundeven
13130 : Intrinsic::roundeven;
13133 case NEON::BI__builtin_neon_vrndph_f16: {
13136 ? Intrinsic::experimental_constrained_ceil
13140 case NEON::BI__builtin_neon_vrndp_v:
13141 case NEON::BI__builtin_neon_vrndpq_v: {
13143 ? Intrinsic::experimental_constrained_ceil
13147 case NEON::BI__builtin_neon_vrndxh_f16: {
13150 ? Intrinsic::experimental_constrained_rint
13154 case NEON::BI__builtin_neon_vrndx_v:
13155 case NEON::BI__builtin_neon_vrndxq_v: {
13157 ? Intrinsic::experimental_constrained_rint
13161 case NEON::BI__builtin_neon_vrndh_f16: {
13164 ? Intrinsic::experimental_constrained_trunc
13165 : Intrinsic::trunc;
13168 case NEON::BI__builtin_neon_vrnd32x_f32:
13169 case NEON::BI__builtin_neon_vrnd32xq_f32:
13170 case NEON::BI__builtin_neon_vrnd32x_f64:
13171 case NEON::BI__builtin_neon_vrnd32xq_f64: {
13173 Int = Intrinsic::aarch64_neon_frint32x;
13176 case NEON::BI__builtin_neon_vrnd32z_f32:
13177 case NEON::BI__builtin_neon_vrnd32zq_f32:
13178 case NEON::BI__builtin_neon_vrnd32z_f64:
13179 case NEON::BI__builtin_neon_vrnd32zq_f64: {
13181 Int = Intrinsic::aarch64_neon_frint32z;
13184 case NEON::BI__builtin_neon_vrnd64x_f32:
13185 case NEON::BI__builtin_neon_vrnd64xq_f32:
13186 case NEON::BI__builtin_neon_vrnd64x_f64:
13187 case NEON::BI__builtin_neon_vrnd64xq_f64: {
13189 Int = Intrinsic::aarch64_neon_frint64x;
13192 case NEON::BI__builtin_neon_vrnd64z_f32:
13193 case NEON::BI__builtin_neon_vrnd64zq_f32:
13194 case NEON::BI__builtin_neon_vrnd64z_f64:
13195 case NEON::BI__builtin_neon_vrnd64zq_f64: {
13197 Int = Intrinsic::aarch64_neon_frint64z;
13200 case NEON::BI__builtin_neon_vrnd_v:
13201 case NEON::BI__builtin_neon_vrndq_v: {
13203 ? Intrinsic::experimental_constrained_trunc
13204 : Intrinsic::trunc;
13207 case NEON::BI__builtin_neon_vcvt_f64_v:
13208 case NEON::BI__builtin_neon_vcvtq_f64_v:
13209 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
13211 return usgn ?
Builder.CreateUIToFP(Ops[0], Ty,
"vcvt")
13212 :
Builder.CreateSIToFP(Ops[0], Ty,
"vcvt");
13213 case NEON::BI__builtin_neon_vcvt_f64_f32: {
13215 "unexpected vcvt_f64_f32 builtin");
13219 return Builder.CreateFPExt(Ops[0], Ty,
"vcvt");
13221 case NEON::BI__builtin_neon_vcvt_f32_f64: {
13223 "unexpected vcvt_f32_f64 builtin");
13227 return Builder.CreateFPTrunc(Ops[0], Ty,
"vcvt");
13229 case NEON::BI__builtin_neon_vcvt_s32_v:
13230 case NEON::BI__builtin_neon_vcvt_u32_v:
13231 case NEON::BI__builtin_neon_vcvt_s64_v:
13232 case NEON::BI__builtin_neon_vcvt_u64_v:
13233 case NEON::BI__builtin_neon_vcvt_s16_f16:
13234 case NEON::BI__builtin_neon_vcvt_u16_f16:
13235 case NEON::BI__builtin_neon_vcvtq_s32_v:
13236 case NEON::BI__builtin_neon_vcvtq_u32_v:
13237 case NEON::BI__builtin_neon_vcvtq_s64_v:
13238 case NEON::BI__builtin_neon_vcvtq_u64_v:
13239 case NEON::BI__builtin_neon_vcvtq_s16_f16:
13240 case NEON::BI__builtin_neon_vcvtq_u16_f16: {
13242 usgn ? Intrinsic::aarch64_neon_fcvtzu : Intrinsic::aarch64_neon_fcvtzs;
13246 case NEON::BI__builtin_neon_vcvta_s16_f16:
13247 case NEON::BI__builtin_neon_vcvta_u16_f16:
13248 case NEON::BI__builtin_neon_vcvta_s32_v:
13249 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
13250 case NEON::BI__builtin_neon_vcvtaq_s32_v:
13251 case NEON::BI__builtin_neon_vcvta_u32_v:
13252 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
13253 case NEON::BI__builtin_neon_vcvtaq_u32_v:
13254 case NEON::BI__builtin_neon_vcvta_s64_v:
13255 case NEON::BI__builtin_neon_vcvtaq_s64_v:
13256 case NEON::BI__builtin_neon_vcvta_u64_v:
13257 case NEON::BI__builtin_neon_vcvtaq_u64_v: {
13258 Int = usgn ? Intrinsic::aarch64_neon_fcvtau : Intrinsic::aarch64_neon_fcvtas;
13262 case NEON::BI__builtin_neon_vcvtm_s16_f16:
13263 case NEON::BI__builtin_neon_vcvtm_s32_v:
13264 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
13265 case NEON::BI__builtin_neon_vcvtmq_s32_v:
13266 case NEON::BI__builtin_neon_vcvtm_u16_f16:
13267 case NEON::BI__builtin_neon_vcvtm_u32_v:
13268 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
13269 case NEON::BI__builtin_neon_vcvtmq_u32_v:
13270 case NEON::BI__builtin_neon_vcvtm_s64_v:
13271 case NEON::BI__builtin_neon_vcvtmq_s64_v:
13272 case NEON::BI__builtin_neon_vcvtm_u64_v:
13273 case NEON::BI__builtin_neon_vcvtmq_u64_v: {
13274 Int = usgn ? Intrinsic::aarch64_neon_fcvtmu : Intrinsic::aarch64_neon_fcvtms;
13278 case NEON::BI__builtin_neon_vcvtn_s16_f16:
13279 case NEON::BI__builtin_neon_vcvtn_s32_v:
13280 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
13281 case NEON::BI__builtin_neon_vcvtnq_s32_v:
13282 case NEON::BI__builtin_neon_vcvtn_u16_f16:
13283 case NEON::BI__builtin_neon_vcvtn_u32_v:
13284 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
13285 case NEON::BI__builtin_neon_vcvtnq_u32_v:
13286 case NEON::BI__builtin_neon_vcvtn_s64_v:
13287 case NEON::BI__builtin_neon_vcvtnq_s64_v:
13288 case NEON::BI__builtin_neon_vcvtn_u64_v:
13289 case NEON::BI__builtin_neon_vcvtnq_u64_v: {
13290 Int = usgn ? Intrinsic::aarch64_neon_fcvtnu : Intrinsic::aarch64_neon_fcvtns;
13294 case NEON::BI__builtin_neon_vcvtp_s16_f16:
13295 case NEON::BI__builtin_neon_vcvtp_s32_v:
13296 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
13297 case NEON::BI__builtin_neon_vcvtpq_s32_v:
13298 case NEON::BI__builtin_neon_vcvtp_u16_f16:
13299 case NEON::BI__builtin_neon_vcvtp_u32_v:
13300 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
13301 case NEON::BI__builtin_neon_vcvtpq_u32_v:
13302 case NEON::BI__builtin_neon_vcvtp_s64_v:
13303 case NEON::BI__builtin_neon_vcvtpq_s64_v:
13304 case NEON::BI__builtin_neon_vcvtp_u64_v:
13305 case NEON::BI__builtin_neon_vcvtpq_u64_v: {
13306 Int = usgn ? Intrinsic::aarch64_neon_fcvtpu : Intrinsic::aarch64_neon_fcvtps;
13310 case NEON::BI__builtin_neon_vmulx_v:
13311 case NEON::BI__builtin_neon_vmulxq_v: {
13312 Int = Intrinsic::aarch64_neon_fmulx;
13315 case NEON::BI__builtin_neon_vmulxh_lane_f16:
13316 case NEON::BI__builtin_neon_vmulxh_laneq_f16: {
13320 Ops[1] =
Builder.CreateExtractElement(Ops[1], Ops[2],
"extract");
13322 Int = Intrinsic::aarch64_neon_fmulx;
13325 case NEON::BI__builtin_neon_vmul_lane_v:
13326 case NEON::BI__builtin_neon_vmul_laneq_v: {
13329 if (BuiltinID == NEON::BI__builtin_neon_vmul_laneq_v)
13332 llvm::FixedVectorType *VTy =
13334 Ops[1] =
Builder.CreateBitCast(Ops[1], VTy);
13335 Ops[1] =
Builder.CreateExtractElement(Ops[1], Ops[2],
"extract");
13339 case NEON::BI__builtin_neon_vnegd_s64:
13341 case NEON::BI__builtin_neon_vnegh_f16:
13343 case NEON::BI__builtin_neon_vpmaxnm_v:
13344 case NEON::BI__builtin_neon_vpmaxnmq_v: {
13345 Int = Intrinsic::aarch64_neon_fmaxnmp;
13348 case NEON::BI__builtin_neon_vpminnm_v:
13349 case NEON::BI__builtin_neon_vpminnmq_v: {
13350 Int = Intrinsic::aarch64_neon_fminnmp;
13353 case NEON::BI__builtin_neon_vsqrth_f16: {
13356 ? Intrinsic::experimental_constrained_sqrt
13360 case NEON::BI__builtin_neon_vsqrt_v:
13361 case NEON::BI__builtin_neon_vsqrtq_v: {
13363 ? Intrinsic::experimental_constrained_sqrt
13365 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
13368 case NEON::BI__builtin_neon_vrbit_v:
13369 case NEON::BI__builtin_neon_vrbitq_v: {
13370 Int = Intrinsic::bitreverse;
13373 case NEON::BI__builtin_neon_vaddv_u8:
13377 case NEON::BI__builtin_neon_vaddv_s8: {
13378 Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv;
13380 VTy = llvm::FixedVectorType::get(
Int8Ty, 8);
13381 llvm::Type *Tys[2] = { Ty, VTy };
13386 case NEON::BI__builtin_neon_vaddv_u16:
13389 case NEON::BI__builtin_neon_vaddv_s16: {
13390 Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv;
13392 VTy = llvm::FixedVectorType::get(
Int16Ty, 4);
13393 llvm::Type *Tys[2] = { Ty, VTy };
13398 case NEON::BI__builtin_neon_vaddvq_u8:
13401 case NEON::BI__builtin_neon_vaddvq_s8: {
13402 Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv;
13404 VTy = llvm::FixedVectorType::get(
Int8Ty, 16);
13405 llvm::Type *Tys[2] = { Ty, VTy };
13410 case NEON::BI__builtin_neon_vaddvq_u16:
13413 case NEON::BI__builtin_neon_vaddvq_s16: {
13414 Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv;
13416 VTy = llvm::FixedVectorType::get(
Int16Ty, 8);
13417 llvm::Type *Tys[2] = { Ty, VTy };
13422 case NEON::BI__builtin_neon_vmaxv_u8: {
13423 Int = Intrinsic::aarch64_neon_umaxv;
13425 VTy = llvm::FixedVectorType::get(
Int8Ty, 8);
13426 llvm::Type *Tys[2] = { Ty, VTy };
13431 case NEON::BI__builtin_neon_vmaxv_u16: {
13432 Int = Intrinsic::aarch64_neon_umaxv;
13434 VTy = llvm::FixedVectorType::get(
Int16Ty, 4);
13435 llvm::Type *Tys[2] = { Ty, VTy };
13440 case NEON::BI__builtin_neon_vmaxvq_u8: {
13441 Int = Intrinsic::aarch64_neon_umaxv;
13443 VTy = llvm::FixedVectorType::get(
Int8Ty, 16);
13444 llvm::Type *Tys[2] = { Ty, VTy };
13449 case NEON::BI__builtin_neon_vmaxvq_u16: {
13450 Int = Intrinsic::aarch64_neon_umaxv;
13452 VTy = llvm::FixedVectorType::get(
Int16Ty, 8);
13453 llvm::Type *Tys[2] = { Ty, VTy };
13458 case NEON::BI__builtin_neon_vmaxv_s8: {
13459 Int = Intrinsic::aarch64_neon_smaxv;
13461 VTy = llvm::FixedVectorType::get(
Int8Ty, 8);
13462 llvm::Type *Tys[2] = { Ty, VTy };
13467 case NEON::BI__builtin_neon_vmaxv_s16: {
13468 Int = Intrinsic::aarch64_neon_smaxv;
13470 VTy = llvm::FixedVectorType::get(
Int16Ty, 4);
13471 llvm::Type *Tys[2] = { Ty, VTy };
13476 case NEON::BI__builtin_neon_vmaxvq_s8: {
13477 Int = Intrinsic::aarch64_neon_smaxv;
13479 VTy = llvm::FixedVectorType::get(
Int8Ty, 16);
13480 llvm::Type *Tys[2] = { Ty, VTy };
13485 case NEON::BI__builtin_neon_vmaxvq_s16: {
13486 Int = Intrinsic::aarch64_neon_smaxv;
13488 VTy = llvm::FixedVectorType::get(
Int16Ty, 8);
13489 llvm::Type *Tys[2] = { Ty, VTy };
13494 case NEON::BI__builtin_neon_vmaxv_f16: {
13495 Int = Intrinsic::aarch64_neon_fmaxv;
13497 VTy = llvm::FixedVectorType::get(
HalfTy, 4);
13498 llvm::Type *Tys[2] = { Ty, VTy };
13503 case NEON::BI__builtin_neon_vmaxvq_f16: {
13504 Int = Intrinsic::aarch64_neon_fmaxv;
13506 VTy = llvm::FixedVectorType::get(
HalfTy, 8);
13507 llvm::Type *Tys[2] = { Ty, VTy };
13512 case NEON::BI__builtin_neon_vminv_u8: {
13513 Int = Intrinsic::aarch64_neon_uminv;
13515 VTy = llvm::FixedVectorType::get(
Int8Ty, 8);
13516 llvm::Type *Tys[2] = { Ty, VTy };
13521 case NEON::BI__builtin_neon_vminv_u16: {
13522 Int = Intrinsic::aarch64_neon_uminv;
13524 VTy = llvm::FixedVectorType::get(
Int16Ty, 4);
13525 llvm::Type *Tys[2] = { Ty, VTy };
13530 case NEON::BI__builtin_neon_vminvq_u8: {
13531 Int = Intrinsic::aarch64_neon_uminv;
13533 VTy = llvm::FixedVectorType::get(
Int8Ty, 16);
13534 llvm::Type *Tys[2] = { Ty, VTy };
13539 case NEON::BI__builtin_neon_vminvq_u16: {
13540 Int = Intrinsic::aarch64_neon_uminv;
13542 VTy = llvm::FixedVectorType::get(
Int16Ty, 8);
13543 llvm::Type *Tys[2] = { Ty, VTy };
13548 case NEON::BI__builtin_neon_vminv_s8: {
13549 Int = Intrinsic::aarch64_neon_sminv;
13551 VTy = llvm::FixedVectorType::get(
Int8Ty, 8);
13552 llvm::Type *Tys[2] = { Ty, VTy };
13557 case NEON::BI__builtin_neon_vminv_s16: {
13558 Int = Intrinsic::aarch64_neon_sminv;
13560 VTy = llvm::FixedVectorType::get(
Int16Ty, 4);
13561 llvm::Type *Tys[2] = { Ty, VTy };
13566 case NEON::BI__builtin_neon_vminvq_s8: {
13567 Int = Intrinsic::aarch64_neon_sminv;
13569 VTy = llvm::FixedVectorType::get(
Int8Ty, 16);
13570 llvm::Type *Tys[2] = { Ty, VTy };
13575 case NEON::BI__builtin_neon_vminvq_s16: {
13576 Int = Intrinsic::aarch64_neon_sminv;
13578 VTy = llvm::FixedVectorType::get(
Int16Ty, 8);
13579 llvm::Type *Tys[2] = { Ty, VTy };
13584 case NEON::BI__builtin_neon_vminv_f16: {
13585 Int = Intrinsic::aarch64_neon_fminv;
13587 VTy = llvm::FixedVectorType::get(
HalfTy, 4);
13588 llvm::Type *Tys[2] = { Ty, VTy };
13593 case NEON::BI__builtin_neon_vminvq_f16: {
13594 Int = Intrinsic::aarch64_neon_fminv;
13596 VTy = llvm::FixedVectorType::get(
HalfTy, 8);
13597 llvm::Type *Tys[2] = { Ty, VTy };
13602 case NEON::BI__builtin_neon_vmaxnmv_f16: {
13603 Int = Intrinsic::aarch64_neon_fmaxnmv;
13605 VTy = llvm::FixedVectorType::get(
HalfTy, 4);
13606 llvm::Type *Tys[2] = { Ty, VTy };
13611 case NEON::BI__builtin_neon_vmaxnmvq_f16: {
13612 Int = Intrinsic::aarch64_neon_fmaxnmv;
13614 VTy = llvm::FixedVectorType::get(
HalfTy, 8);
13615 llvm::Type *Tys[2] = { Ty, VTy };
13620 case NEON::BI__builtin_neon_vminnmv_f16: {
13621 Int = Intrinsic::aarch64_neon_fminnmv;
13623 VTy = llvm::FixedVectorType::get(
HalfTy, 4);
13624 llvm::Type *Tys[2] = { Ty, VTy };
13629 case NEON::BI__builtin_neon_vminnmvq_f16: {
13630 Int = Intrinsic::aarch64_neon_fminnmv;
13632 VTy = llvm::FixedVectorType::get(
HalfTy, 8);
13633 llvm::Type *Tys[2] = { Ty, VTy };
13638 case NEON::BI__builtin_neon_vmul_n_f64: {
13641 return Builder.CreateFMul(Ops[0], RHS);
13643 case NEON::BI__builtin_neon_vaddlv_u8: {
13644 Int = Intrinsic::aarch64_neon_uaddlv;
13646 VTy = llvm::FixedVectorType::get(
Int8Ty, 8);
13647 llvm::Type *Tys[2] = { Ty, VTy };
13652 case NEON::BI__builtin_neon_vaddlv_u16: {
13653 Int = Intrinsic::aarch64_neon_uaddlv;
13655 VTy = llvm::FixedVectorType::get(
Int16Ty, 4);
13656 llvm::Type *Tys[2] = { Ty, VTy };
13660 case NEON::BI__builtin_neon_vaddlvq_u8: {
13661 Int = Intrinsic::aarch64_neon_uaddlv;
13663 VTy = llvm::FixedVectorType::get(
Int8Ty, 16);
13664 llvm::Type *Tys[2] = { Ty, VTy };
13669 case NEON::BI__builtin_neon_vaddlvq_u16: {
13670 Int = Intrinsic::aarch64_neon_uaddlv;
13672 VTy = llvm::FixedVectorType::get(
Int16Ty, 8);
13673 llvm::Type *Tys[2] = { Ty, VTy };
13677 case NEON::BI__builtin_neon_vaddlv_s8: {
13678 Int = Intrinsic::aarch64_neon_saddlv;
13680 VTy = llvm::FixedVectorType::get(
Int8Ty, 8);
13681 llvm::Type *Tys[2] = { Ty, VTy };
13686 case NEON::BI__builtin_neon_vaddlv_s16: {
13687 Int = Intrinsic::aarch64_neon_saddlv;
13689 VTy = llvm::FixedVectorType::get(
Int16Ty, 4);
13690 llvm::Type *Tys[2] = { Ty, VTy };
13694 case NEON::BI__builtin_neon_vaddlvq_s8: {
13695 Int = Intrinsic::aarch64_neon_saddlv;
13697 VTy = llvm::FixedVectorType::get(
Int8Ty, 16);
13698 llvm::Type *Tys[2] = { Ty, VTy };
13703 case NEON::BI__builtin_neon_vaddlvq_s16: {
13704 Int = Intrinsic::aarch64_neon_saddlv;
13706 VTy = llvm::FixedVectorType::get(
Int16Ty, 8);
13707 llvm::Type *Tys[2] = { Ty, VTy };
13711 case NEON::BI__builtin_neon_vsri_n_v:
13712 case NEON::BI__builtin_neon_vsriq_n_v: {
13713 Int = Intrinsic::aarch64_neon_vsri;
13717 case NEON::BI__builtin_neon_vsli_n_v:
13718 case NEON::BI__builtin_neon_vsliq_n_v: {
13719 Int = Intrinsic::aarch64_neon_vsli;
13723 case NEON::BI__builtin_neon_vsra_n_v:
13724 case NEON::BI__builtin_neon_vsraq_n_v:
13725 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
13727 return Builder.CreateAdd(Ops[0], Ops[1]);
13728 case NEON::BI__builtin_neon_vrsra_n_v:
13729 case NEON::BI__builtin_neon_vrsraq_n_v: {
13730 Int = usgn ? Intrinsic::aarch64_neon_urshl : Intrinsic::aarch64_neon_srshl;
13732 TmpOps.push_back(Ops[1]);
13733 TmpOps.push_back(Ops[2]);
13735 llvm::Value *tmp =
EmitNeonCall(F, TmpOps,
"vrshr_n", 1,
true);
13736 Ops[0] =
Builder.CreateBitCast(Ops[0], VTy);
13737 return Builder.CreateAdd(Ops[0], tmp);
13739 case NEON::BI__builtin_neon_vld1_v:
13740 case NEON::BI__builtin_neon_vld1q_v: {
13743 case NEON::BI__builtin_neon_vst1_v:
13744 case NEON::BI__builtin_neon_vst1q_v:
13745 Ops[1] =
Builder.CreateBitCast(Ops[1], VTy);
13747 case NEON::BI__builtin_neon_vld1_lane_v:
13748 case NEON::BI__builtin_neon_vld1q_lane_v: {
13749 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13752 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2],
"vld1_lane");
13754 case NEON::BI__builtin_neon_vldap1_lane_s64:
13755 case NEON::BI__builtin_neon_vldap1q_lane_s64: {
13756 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13758 VTy->getElementType(), Ops[0], PtrOp0.
getAlignment());
13759 LI->setAtomic(llvm::AtomicOrdering::Acquire);
13761 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2],
"vldap1_lane");
13763 case NEON::BI__builtin_neon_vld1_dup_v:
13764 case NEON::BI__builtin_neon_vld1q_dup_v: {
13765 Value *
V = PoisonValue::get(Ty);
13768 llvm::Constant *CI = ConstantInt::get(
Int32Ty, 0);
13769 Ops[0] =
Builder.CreateInsertElement(
V, Ops[0], CI);
13772 case NEON::BI__builtin_neon_vst1_lane_v:
13773 case NEON::BI__builtin_neon_vst1q_lane_v:
13774 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13775 Ops[1] =
Builder.CreateExtractElement(Ops[1], Ops[2]);
13777 case NEON::BI__builtin_neon_vstl1_lane_s64:
13778 case NEON::BI__builtin_neon_vstl1q_lane_s64: {
13779 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13780 Ops[1] =
Builder.CreateExtractElement(Ops[1], Ops[2]);
13781 llvm::StoreInst *SI =
13783 SI->setAtomic(llvm::AtomicOrdering::Release);
13786 case NEON::BI__builtin_neon_vld2_v:
13787 case NEON::BI__builtin_neon_vld2q_v: {
13790 Ops[1] =
Builder.CreateCall(F, Ops[1],
"vld2");
13793 case NEON::BI__builtin_neon_vld3_v:
13794 case NEON::BI__builtin_neon_vld3q_v: {
13797 Ops[1] =
Builder.CreateCall(F, Ops[1],
"vld3");
13800 case NEON::BI__builtin_neon_vld4_v:
13801 case NEON::BI__builtin_neon_vld4q_v: {
13804 Ops[1] =
Builder.CreateCall(F, Ops[1],
"vld4");
13807 case NEON::BI__builtin_neon_vld2_dup_v:
13808 case NEON::BI__builtin_neon_vld2q_dup_v: {
13811 Ops[1] =
Builder.CreateCall(F, Ops[1],
"vld2");
13814 case NEON::BI__builtin_neon_vld3_dup_v:
13815 case NEON::BI__builtin_neon_vld3q_dup_v: {
13818 Ops[1] =
Builder.CreateCall(F, Ops[1],
"vld3");
13821 case NEON::BI__builtin_neon_vld4_dup_v:
13822 case NEON::BI__builtin_neon_vld4q_dup_v: {
13825 Ops[1] =
Builder.CreateCall(F, Ops[1],
"vld4");
13828 case NEON::BI__builtin_neon_vld2_lane_v:
13829 case NEON::BI__builtin_neon_vld2q_lane_v: {
13830 llvm::Type *Tys[2] = { VTy, Ops[1]->getType() };
13832 std::rotate(Ops.begin() + 1, Ops.begin() + 2, Ops.end());
13833 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13834 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
13839 case NEON::BI__builtin_neon_vld3_lane_v:
13840 case NEON::BI__builtin_neon_vld3q_lane_v: {
13841 llvm::Type *Tys[2] = { VTy, Ops[1]->getType() };
13843 std::rotate(Ops.begin() + 1, Ops.begin() + 2, Ops.end());
13844 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13845 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
13846 Ops[3] =
Builder.CreateBitCast(Ops[3], Ty);
13851 case NEON::BI__builtin_neon_vld4_lane_v:
13852 case NEON::BI__builtin_neon_vld4q_lane_v: {
13853 llvm::Type *Tys[2] = { VTy, Ops[1]->getType() };
13855 std::rotate(Ops.begin() + 1, Ops.begin() + 2, Ops.end());
13856 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13857 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
13858 Ops[3] =
Builder.CreateBitCast(Ops[3], Ty);
13859 Ops[4] =
Builder.CreateBitCast(Ops[4], Ty);
13864 case NEON::BI__builtin_neon_vst2_v:
13865 case NEON::BI__builtin_neon_vst2q_v: {
13866 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end());
13867 llvm::Type *Tys[2] = { VTy, Ops[2]->getType() };
13871 case NEON::BI__builtin_neon_vst2_lane_v:
13872 case NEON::BI__builtin_neon_vst2q_lane_v: {
13873 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end());
13875 llvm::Type *Tys[2] = { VTy, Ops[3]->getType() };
13879 case NEON::BI__builtin_neon_vst3_v:
13880 case NEON::BI__builtin_neon_vst3q_v: {
13881 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end());
13882 llvm::Type *Tys[2] = { VTy, Ops[3]->getType() };
13886 case NEON::BI__builtin_neon_vst3_lane_v:
13887 case NEON::BI__builtin_neon_vst3q_lane_v: {
13888 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end());
13890 llvm::Type *Tys[2] = { VTy, Ops[4]->getType() };
13894 case NEON::BI__builtin_neon_vst4_v:
13895 case NEON::BI__builtin_neon_vst4q_v: {
13896 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end());
13897 llvm::Type *Tys[2] = { VTy, Ops[4]->getType() };
13901 case NEON::BI__builtin_neon_vst4_lane_v:
13902 case NEON::BI__builtin_neon_vst4q_lane_v: {
13903 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end());
13905 llvm::Type *Tys[2] = { VTy, Ops[5]->getType() };
13909 case NEON::BI__builtin_neon_vtrn_v:
13910 case NEON::BI__builtin_neon_vtrnq_v: {
13911 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13912 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
13913 Value *SV =
nullptr;
13915 for (
unsigned vi = 0; vi != 2; ++vi) {
13917 for (
unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) {
13918 Indices.push_back(i+vi);
13919 Indices.push_back(i+e+vi);
13921 Value *Addr =
Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi);
13922 SV =
Builder.CreateShuffleVector(Ops[1], Ops[2], Indices,
"vtrn");
13927 case NEON::BI__builtin_neon_vuzp_v:
13928 case NEON::BI__builtin_neon_vuzpq_v: {
13929 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13930 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
13931 Value *SV =
nullptr;
13933 for (
unsigned vi = 0; vi != 2; ++vi) {
13935 for (
unsigned i = 0, e = VTy->getNumElements(); i != e; ++i)
13936 Indices.push_back(2*i+vi);
13938 Value *Addr =
Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi);
13939 SV =
Builder.CreateShuffleVector(Ops[1], Ops[2], Indices,
"vuzp");
13944 case NEON::BI__builtin_neon_vzip_v:
13945 case NEON::BI__builtin_neon_vzipq_v: {
13946 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13947 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
13948 Value *SV =
nullptr;
13950 for (
unsigned vi = 0; vi != 2; ++vi) {
13952 for (
unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) {
13953 Indices.push_back((i + vi*e) >> 1);
13954 Indices.push_back(((i + vi*e) >> 1)+e);
13956 Value *Addr =
Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi);
13957 SV =
Builder.CreateShuffleVector(Ops[1], Ops[2], Indices,
"vzip");
13962 case NEON::BI__builtin_neon_vqtbl1q_v: {
13966 case NEON::BI__builtin_neon_vqtbl2q_v: {
13970 case NEON::BI__builtin_neon_vqtbl3q_v: {
13974 case NEON::BI__builtin_neon_vqtbl4q_v: {
13978 case NEON::BI__builtin_neon_vqtbx1q_v: {
13982 case NEON::BI__builtin_neon_vqtbx2q_v: {
13986 case NEON::BI__builtin_neon_vqtbx3q_v: {
13990 case NEON::BI__builtin_neon_vqtbx4q_v: {
13994 case NEON::BI__builtin_neon_vsqadd_v:
13995 case NEON::BI__builtin_neon_vsqaddq_v: {
13996 Int = Intrinsic::aarch64_neon_usqadd;
13999 case NEON::BI__builtin_neon_vuqadd_v:
14000 case NEON::BI__builtin_neon_vuqaddq_v: {
14001 Int = Intrinsic::aarch64_neon_suqadd;
14005 case NEON::BI__builtin_neon_vluti2_laneq_bf16:
14006 case NEON::BI__builtin_neon_vluti2_laneq_f16:
14007 case NEON::BI__builtin_neon_vluti2_laneq_p16:
14008 case NEON::BI__builtin_neon_vluti2_laneq_p8:
14009 case NEON::BI__builtin_neon_vluti2_laneq_s16:
14010 case NEON::BI__builtin_neon_vluti2_laneq_s8:
14011 case NEON::BI__builtin_neon_vluti2_laneq_u16:
14012 case NEON::BI__builtin_neon_vluti2_laneq_u8: {
14013 Int = Intrinsic::aarch64_neon_vluti2_laneq;
14014 llvm::Type *Tys[2];
14020 case NEON::BI__builtin_neon_vluti2q_laneq_bf16:
14021 case NEON::BI__builtin_neon_vluti2q_laneq_f16:
14022 case NEON::BI__builtin_neon_vluti2q_laneq_p16:
14023 case NEON::BI__builtin_neon_vluti2q_laneq_p8:
14024 case NEON::BI__builtin_neon_vluti2q_laneq_s16:
14025 case NEON::BI__builtin_neon_vluti2q_laneq_s8:
14026 case NEON::BI__builtin_neon_vluti2q_laneq_u16:
14027 case NEON::BI__builtin_neon_vluti2q_laneq_u8: {
14028 Int = Intrinsic::aarch64_neon_vluti2_laneq;
14029 llvm::Type *Tys[2];
14035 case NEON::BI__builtin_neon_vluti2_lane_bf16:
14036 case NEON::BI__builtin_neon_vluti2_lane_f16:
14037 case NEON::BI__builtin_neon_vluti2_lane_p16:
14038 case NEON::BI__builtin_neon_vluti2_lane_p8:
14039 case NEON::BI__builtin_neon_vluti2_lane_s16:
14040 case NEON::BI__builtin_neon_vluti2_lane_s8:
14041 case NEON::BI__builtin_neon_vluti2_lane_u16:
14042 case NEON::BI__builtin_neon_vluti2_lane_u8: {
14043 Int = Intrinsic::aarch64_neon_vluti2_lane;
14044 llvm::Type *Tys[2];
14050 case NEON::BI__builtin_neon_vluti2q_lane_bf16:
14051 case NEON::BI__builtin_neon_vluti2q_lane_f16:
14052 case NEON::BI__builtin_neon_vluti2q_lane_p16:
14053 case NEON::BI__builtin_neon_vluti2q_lane_p8:
14054 case NEON::BI__builtin_neon_vluti2q_lane_s16:
14055 case NEON::BI__builtin_neon_vluti2q_lane_s8:
14056 case NEON::BI__builtin_neon_vluti2q_lane_u16:
14057 case NEON::BI__builtin_neon_vluti2q_lane_u8: {
14058 Int = Intrinsic::aarch64_neon_vluti2_lane;
14059 llvm::Type *Tys[2];
14065 case NEON::BI__builtin_neon_vluti4q_lane_p8:
14066 case NEON::BI__builtin_neon_vluti4q_lane_s8:
14067 case NEON::BI__builtin_neon_vluti4q_lane_u8: {
14068 Int = Intrinsic::aarch64_neon_vluti4q_lane;
14071 case NEON::BI__builtin_neon_vluti4q_laneq_p8:
14072 case NEON::BI__builtin_neon_vluti4q_laneq_s8:
14073 case NEON::BI__builtin_neon_vluti4q_laneq_u8: {
14074 Int = Intrinsic::aarch64_neon_vluti4q_laneq;
14077 case NEON::BI__builtin_neon_vluti4q_lane_bf16_x2:
14078 case NEON::BI__builtin_neon_vluti4q_lane_f16_x2:
14079 case NEON::BI__builtin_neon_vluti4q_lane_p16_x2:
14080 case NEON::BI__builtin_neon_vluti4q_lane_s16_x2:
14081 case NEON::BI__builtin_neon_vluti4q_lane_u16_x2: {
14082 Int = Intrinsic::aarch64_neon_vluti4q_lane_x2;
14085 case NEON::BI__builtin_neon_vluti4q_laneq_bf16_x2:
14086 case NEON::BI__builtin_neon_vluti4q_laneq_f16_x2:
14087 case NEON::BI__builtin_neon_vluti4q_laneq_p16_x2:
14088 case NEON::BI__builtin_neon_vluti4q_laneq_s16_x2:
14089 case NEON::BI__builtin_neon_vluti4q_laneq_u16_x2: {
14090 Int = Intrinsic::aarch64_neon_vluti4q_laneq_x2;
14094 case NEON::BI__builtin_neon_vamin_f16:
14095 case NEON::BI__builtin_neon_vaminq_f16:
14096 case NEON::BI__builtin_neon_vamin_f32:
14097 case NEON::BI__builtin_neon_vaminq_f32:
14098 case NEON::BI__builtin_neon_vaminq_f64: {
14099 Int = Intrinsic::aarch64_neon_famin;
14102 case NEON::BI__builtin_neon_vamax_f16:
14103 case NEON::BI__builtin_neon_vamaxq_f16:
14104 case NEON::BI__builtin_neon_vamax_f32:
14105 case NEON::BI__builtin_neon_vamaxq_f32:
14106 case NEON::BI__builtin_neon_vamaxq_f64: {
14107 Int = Intrinsic::aarch64_neon_famax;
14110 case NEON::BI__builtin_neon_vscale_f16:
14111 case NEON::BI__builtin_neon_vscaleq_f16:
14112 case NEON::BI__builtin_neon_vscale_f32:
14113 case NEON::BI__builtin_neon_vscaleq_f32:
14114 case NEON::BI__builtin_neon_vscaleq_f64: {
14115 Int = Intrinsic::aarch64_neon_fp8_fscale;
14123 assert((BuiltinID == BPF::BI__builtin_preserve_field_info ||
14124 BuiltinID == BPF::BI__builtin_btf_type_id ||
14125 BuiltinID == BPF::BI__builtin_preserve_type_info ||
14126 BuiltinID == BPF::BI__builtin_preserve_enum_value) &&
14127 "unexpected BPF builtin");
14134 switch (BuiltinID) {
14136 llvm_unreachable(
"Unexpected BPF builtin");
14137 case BPF::BI__builtin_preserve_field_info: {
14138 const Expr *Arg =
E->getArg(0);
14143 "using __builtin_preserve_field_info() without -g");
14156 Value *InfoKind = ConstantInt::get(
Int64Ty,
C->getSExtValue());
14159 llvm::Function *FnGetFieldInfo = llvm::Intrinsic::getOrInsertDeclaration(
14160 &
CGM.
getModule(), llvm::Intrinsic::bpf_preserve_field_info,
14161 {FieldAddr->getType()});
14162 return Builder.CreateCall(FnGetFieldInfo, {FieldAddr, InfoKind});
14164 case BPF::BI__builtin_btf_type_id:
14165 case BPF::BI__builtin_preserve_type_info: {
14171 const Expr *Arg0 =
E->getArg(0);
14176 Value *FlagValue = ConstantInt::get(
Int64Ty, Flag->getSExtValue());
14177 Value *SeqNumVal = ConstantInt::get(
Int32Ty, BuiltinSeqNum++);
14179 llvm::Function *FnDecl;
14180 if (BuiltinID == BPF::BI__builtin_btf_type_id)
14181 FnDecl = llvm::Intrinsic::getOrInsertDeclaration(
14182 &
CGM.
getModule(), llvm::Intrinsic::bpf_btf_type_id, {});
14184 FnDecl = llvm::Intrinsic::getOrInsertDeclaration(
14185 &
CGM.
getModule(), llvm::Intrinsic::bpf_preserve_type_info, {});
14186 CallInst *
Fn =
Builder.CreateCall(FnDecl, {SeqNumVal, FlagValue});
14187 Fn->setMetadata(LLVMContext::MD_preserve_access_index, DbgInfo);
14190 case BPF::BI__builtin_preserve_enum_value: {
14196 const Expr *Arg0 =
E->getArg(0);
14201 const auto *UO = cast<UnaryOperator>(Arg0->
IgnoreParens());
14202 const auto *CE = cast<CStyleCastExpr>(UO->getSubExpr());
14203 const auto *DR = cast<DeclRefExpr>(CE->getSubExpr());
14204 const auto *Enumerator = cast<EnumConstantDecl>(DR->getDecl());
14206 auto InitVal = Enumerator->getInitVal();
14207 std::string InitValStr;
14208 if (InitVal.isNegative() || InitVal >
uint64_t(INT64_MAX))
14209 InitValStr = std::to_string(InitVal.getSExtValue());
14211 InitValStr = std::to_string(InitVal.getZExtValue());
14212 std::string EnumStr = Enumerator->getNameAsString() +
":" + InitValStr;
14213 Value *EnumStrVal =
Builder.CreateGlobalString(EnumStr);
14216 Value *FlagValue = ConstantInt::get(
Int64Ty, Flag->getSExtValue());
14217 Value *SeqNumVal = ConstantInt::get(
Int32Ty, BuiltinSeqNum++);
14219 llvm::Function *IntrinsicFn = llvm::Intrinsic::getOrInsertDeclaration(
14220 &
CGM.
getModule(), llvm::Intrinsic::bpf_preserve_enum_value, {});
14222 Builder.CreateCall(IntrinsicFn, {SeqNumVal, EnumStrVal, FlagValue});
14223 Fn->setMetadata(LLVMContext::MD_preserve_access_index, DbgInfo);
14231 assert((Ops.size() & (Ops.size() - 1)) == 0 &&
14232 "Not a power-of-two sized vector!");
14233 bool AllConstants =
true;
14234 for (
unsigned i = 0, e = Ops.size(); i != e && AllConstants; ++i)
14235 AllConstants &= isa<Constant>(Ops[i]);
14238 if (AllConstants) {
14240 for (
unsigned i = 0, e = Ops.size(); i != e; ++i)
14241 CstOps.push_back(cast<Constant>(Ops[i]));
14242 return llvm::ConstantVector::get(CstOps);
14247 llvm::FixedVectorType::get(Ops[0]->getType(), Ops.size()));
14249 for (
unsigned i = 0, e = Ops.size(); i != e; ++i)
14257 unsigned NumElts) {
14259 auto *MaskTy = llvm::FixedVectorType::get(
14261 cast<IntegerType>(Mask->
getType())->getBitWidth());
14262 Value *MaskVec = CGF.
Builder.CreateBitCast(Mask, MaskTy);
14268 for (
unsigned i = 0; i != NumElts; ++i)
14270 MaskVec = CGF.
Builder.CreateShuffleVector(
14271 MaskVec, MaskVec,
ArrayRef(Indices, NumElts),
"extract");
14278 Value *Ptr = Ops[0];
14282 cast<llvm::FixedVectorType>(Ops[1]->getType())->getNumElements());
14284 return CGF.
Builder.CreateMaskedStore(Ops[1], Ptr, Alignment, MaskVec);
14289 llvm::Type *Ty = Ops[1]->getType();
14290 Value *Ptr = Ops[0];
14293 CGF, Ops[2], cast<llvm::FixedVectorType>(Ty)->getNumElements());
14295 return CGF.
Builder.CreateMaskedLoad(Ty, Ptr, Alignment, MaskVec, Ops[1]);
14300 auto *ResultTy = cast<llvm::VectorType>(Ops[1]->getType());
14301 Value *Ptr = Ops[0];
14304 CGF, Ops[2], cast<FixedVectorType>(ResultTy)->getNumElements());
14306 llvm::Function *F = CGF.
CGM.
getIntrinsic(Intrinsic::masked_expandload,
14308 return CGF.
Builder.CreateCall(F, { Ptr, MaskVec, Ops[1] });
14314 auto *ResultTy = cast<llvm::FixedVectorType>(Ops[1]->getType());
14318 Intrinsic::ID IID = IsCompress ? Intrinsic::x86_avx512_mask_compress
14319 : Intrinsic::x86_avx512_mask_expand;
14321 return CGF.
Builder.CreateCall(F, { Ops[0], Ops[1], MaskVec });
14326 auto *ResultTy = cast<llvm::FixedVectorType>(Ops[1]->getType());
14327 Value *Ptr = Ops[0];
14331 llvm::Function *F = CGF.
CGM.
getIntrinsic(Intrinsic::masked_compressstore,
14333 return CGF.
Builder.CreateCall(F, { Ops[1], Ptr, MaskVec });
14338 bool InvertLHS =
false) {
14339 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
14344 LHS = CGF.
Builder.CreateNot(LHS);
14346 return CGF.
Builder.CreateBitCast(CGF.
Builder.CreateBinOp(Opc, LHS, RHS),
14347 Ops[0]->getType());
14351 Value *Amt,
bool IsRight) {
14352 llvm::Type *Ty = Op0->
getType();
14358 unsigned NumElts = cast<llvm::FixedVectorType>(Ty)->getNumElements();
14359 Amt = CGF.
Builder.CreateIntCast(Amt, Ty->getScalarType(),
false);
14360 Amt = CGF.
Builder.CreateVectorSplat(NumElts, Amt);
14363 unsigned IID = IsRight ? Intrinsic::fshr : Intrinsic::fshl;
14365 return CGF.
Builder.CreateCall(F, {Op0, Op1, Amt});
14370 Value *Op0 = Ops[0];
14371 Value *Op1 = Ops[1];
14372 llvm::Type *Ty = Op0->
getType();
14373 uint64_t Imm = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0x7;
14375 CmpInst::Predicate Pred;
14378 Pred = IsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
14381 Pred = IsSigned ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_ULE;
14384 Pred = IsSigned ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
14387 Pred = IsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE;
14390 Pred = ICmpInst::ICMP_EQ;
14393 Pred = ICmpInst::ICMP_NE;
14396 return llvm::Constant::getNullValue(Ty);
14398 return llvm::Constant::getAllOnesValue(Ty);
14400 llvm_unreachable(
"Unexpected XOP vpcom/vpcomu predicate");
14412 if (
const auto *
C = dyn_cast<Constant>(Mask))
14413 if (
C->isAllOnesValue())
14417 CGF, Mask, cast<llvm::FixedVectorType>(Op0->
getType())->getNumElements());
14419 return CGF.
Builder.CreateSelect(Mask, Op0, Op1);
14425 if (
const auto *
C = dyn_cast<Constant>(Mask))
14426 if (
C->isAllOnesValue())
14429 auto *MaskTy = llvm::FixedVectorType::get(
14430 CGF.
Builder.getInt1Ty(), Mask->
getType()->getIntegerBitWidth());
14431 Mask = CGF.
Builder.CreateBitCast(Mask, MaskTy);
14432 Mask = CGF.
Builder.CreateExtractElement(Mask, (uint64_t)0);
14433 return CGF.
Builder.CreateSelect(Mask, Op0, Op1);
14437 unsigned NumElts,
Value *MaskIn) {
14439 const auto *
C = dyn_cast<Constant>(MaskIn);
14440 if (!
C || !
C->isAllOnesValue())
14446 for (
unsigned i = 0; i != NumElts; ++i)
14448 for (
unsigned i = NumElts; i != 8; ++i)
14449 Indices[i] = i % NumElts + NumElts;
14450 Cmp = CGF.
Builder.CreateShuffleVector(
14451 Cmp, llvm::Constant::getNullValue(Cmp->getType()), Indices);
14454 return CGF.
Builder.CreateBitCast(Cmp,
14456 std::max(NumElts, 8U)));
14461 assert((Ops.size() == 2 || Ops.size() == 4) &&
14462 "Unexpected number of arguments");
14464 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
14468 Cmp = Constant::getNullValue(
14469 llvm::FixedVectorType::get(CGF.
Builder.getInt1Ty(), NumElts));
14470 }
else if (CC == 7) {
14471 Cmp = Constant::getAllOnesValue(
14472 llvm::FixedVectorType::get(CGF.
Builder.getInt1Ty(), NumElts));
14474 ICmpInst::Predicate Pred;
14476 default: llvm_unreachable(
"Unknown condition code");
14477 case 0: Pred = ICmpInst::ICMP_EQ;
break;
14478 case 1: Pred =
Signed ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
break;
14479 case 2: Pred =
Signed ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_ULE;
break;
14480 case 4: Pred = ICmpInst::ICMP_NE;
break;
14481 case 5: Pred =
Signed ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE;
break;
14482 case 6: Pred =
Signed ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
break;
14484 Cmp = CGF.
Builder.CreateICmp(Pred, Ops[0], Ops[1]);
14487 Value *MaskIn =
nullptr;
14488 if (Ops.size() == 4)
14495 Value *Zero = Constant::getNullValue(In->getType());
14501 unsigned Rnd = cast<llvm::ConstantInt>(Ops[3])->getZExtValue();
14502 llvm::Type *Ty = Ops[1]->getType();
14506 Intrinsic::ID IID = IsSigned ? Intrinsic::x86_avx512_sitofp_round
14507 : Intrinsic::x86_avx512_uitofp_round;
14509 Res = CGF.
Builder.CreateCall(F, { Ops[0], Ops[3] });
14511 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF,
E);
14512 Res = IsSigned ? CGF.
Builder.CreateSIToFP(Ops[0], Ty)
14513 : CGF.
Builder.CreateUIToFP(Ops[0], Ty);
14524 bool Subtract =
false;
14525 Intrinsic::ID IID = Intrinsic::not_intrinsic;
14526 switch (BuiltinID) {
14528 case clang::X86::BI__builtin_ia32_vfmsubph512_mask3:
14531 case clang::X86::BI__builtin_ia32_vfmaddph512_mask:
14532 case clang::X86::BI__builtin_ia32_vfmaddph512_maskz:
14533 case clang::X86::BI__builtin_ia32_vfmaddph512_mask3:
14534 IID = llvm::Intrinsic::x86_avx512fp16_vfmadd_ph_512;
14536 case clang::X86::BI__builtin_ia32_vfmsubaddph512_mask3:
14539 case clang::X86::BI__builtin_ia32_vfmaddsubph512_mask:
14540 case clang::X86::BI__builtin_ia32_vfmaddsubph512_maskz:
14541 case clang::X86::BI__builtin_ia32_vfmaddsubph512_mask3:
14542 IID = llvm::Intrinsic::x86_avx512fp16_vfmaddsub_ph_512;
14544 case clang::X86::BI__builtin_ia32_vfmsubps512_mask3:
14547 case clang::X86::BI__builtin_ia32_vfmaddps512_mask:
14548 case clang::X86::BI__builtin_ia32_vfmaddps512_maskz:
14549 case clang::X86::BI__builtin_ia32_vfmaddps512_mask3:
14550 IID = llvm::Intrinsic::x86_avx512_vfmadd_ps_512;
break;
14551 case clang::X86::BI__builtin_ia32_vfmsubpd512_mask3:
14554 case clang::X86::BI__builtin_ia32_vfmaddpd512_mask:
14555 case clang::X86::BI__builtin_ia32_vfmaddpd512_maskz:
14556 case clang::X86::BI__builtin_ia32_vfmaddpd512_mask3:
14557 IID = llvm::Intrinsic::x86_avx512_vfmadd_pd_512;
break;
14558 case clang::X86::BI__builtin_ia32_vfmsubaddps512_mask3:
14561 case clang::X86::BI__builtin_ia32_vfmaddsubps512_mask:
14562 case clang::X86::BI__builtin_ia32_vfmaddsubps512_maskz:
14563 case clang::X86::BI__builtin_ia32_vfmaddsubps512_mask3:
14564 IID = llvm::Intrinsic::x86_avx512_vfmaddsub_ps_512;
14566 case clang::X86::BI__builtin_ia32_vfmsubaddpd512_mask3:
14569 case clang::X86::BI__builtin_ia32_vfmaddsubpd512_mask:
14570 case clang::X86::BI__builtin_ia32_vfmaddsubpd512_maskz:
14571 case clang::X86::BI__builtin_ia32_vfmaddsubpd512_mask3:
14572 IID = llvm::Intrinsic::x86_avx512_vfmaddsub_pd_512;
14574 case clang::X86::BI__builtin_ia32_vfmsubph256_round_mask3:
14577 case clang::X86::BI__builtin_ia32_vfmaddph256_round_mask:
14578 case clang::X86::BI__builtin_ia32_vfmaddph256_round_maskz:
14579 case clang::X86::BI__builtin_ia32_vfmaddph256_round_mask3:
14580 IID = llvm::Intrinsic::x86_avx10_vfmaddph256;
14582 case clang::X86::BI__builtin_ia32_vfmsubaddph256_round_mask3:
14585 case clang::X86::BI__builtin_ia32_vfmaddsubph256_round_mask:
14586 case clang::X86::BI__builtin_ia32_vfmaddsubph256_round_maskz:
14587 case clang::X86::BI__builtin_ia32_vfmaddsubph256_round_mask3:
14588 IID = llvm::Intrinsic::x86_avx10_vfmaddsubph256;
14590 case clang::X86::BI__builtin_ia32_vfmsubps256_round_mask3:
14593 case clang::X86::BI__builtin_ia32_vfmaddps256_round_mask:
14594 case clang::X86::BI__builtin_ia32_vfmaddps256_round_maskz:
14595 case clang::X86::BI__builtin_ia32_vfmaddps256_round_mask3:
14596 IID = llvm::Intrinsic::x86_avx10_vfmaddps256;
14598 case clang::X86::BI__builtin_ia32_vfmsubpd256_round_mask3:
14601 case clang::X86::BI__builtin_ia32_vfmaddpd256_round_mask:
14602 case clang::X86::BI__builtin_ia32_vfmaddpd256_round_maskz:
14603 case clang::X86::BI__builtin_ia32_vfmaddpd256_round_mask3:
14604 IID = llvm::Intrinsic::x86_avx10_vfmaddpd256;
14606 case clang::X86::BI__builtin_ia32_vfmsubaddps256_round_mask3:
14609 case clang::X86::BI__builtin_ia32_vfmaddsubps256_round_mask:
14610 case clang::X86::BI__builtin_ia32_vfmaddsubps256_round_maskz:
14611 case clang::X86::BI__builtin_ia32_vfmaddsubps256_round_mask3:
14612 IID = llvm::Intrinsic::x86_avx10_vfmaddsubps256;
14614 case clang::X86::BI__builtin_ia32_vfmsubaddpd256_round_mask3:
14617 case clang::X86::BI__builtin_ia32_vfmaddsubpd256_round_mask:
14618 case clang::X86::BI__builtin_ia32_vfmaddsubpd256_round_maskz:
14619 case clang::X86::BI__builtin_ia32_vfmaddsubpd256_round_mask3:
14620 IID = llvm::Intrinsic::x86_avx10_vfmaddsubpd256;
14634 if (IID != Intrinsic::not_intrinsic &&
14635 (cast<llvm::ConstantInt>(Ops.back())->getZExtValue() != (uint64_t)4 ||
14638 Res = CGF.
Builder.CreateCall(Intr, {A, B,
C, Ops.back() });
14640 llvm::Type *Ty = A->
getType();
14642 if (CGF.
Builder.getIsFPConstrained()) {
14643 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF,
E);
14644 FMA = CGF.
CGM.
getIntrinsic(Intrinsic::experimental_constrained_fma, Ty);
14645 Res = CGF.
Builder.CreateConstrainedFPCall(FMA, {A, B,
C});
14648 Res = CGF.
Builder.CreateCall(FMA, {A, B,
C});
14653 Value *MaskFalseVal =
nullptr;
14654 switch (BuiltinID) {
14655 case clang::X86::BI__builtin_ia32_vfmaddph512_mask:
14656 case clang::X86::BI__builtin_ia32_vfmaddps512_mask:
14657 case clang::X86::BI__builtin_ia32_vfmaddpd512_mask:
14658 case clang::X86::BI__builtin_ia32_vfmaddsubph512_mask:
14659 case clang::X86::BI__builtin_ia32_vfmaddsubps512_mask:
14660 case clang::X86::BI__builtin_ia32_vfmaddsubpd512_mask:
14661 case clang::X86::BI__builtin_ia32_vfmaddph256_round_mask:
14662 case clang::X86::BI__builtin_ia32_vfmaddps256_round_mask:
14663 case clang::X86::BI__builtin_ia32_vfmaddpd256_round_mask:
14664 case clang::X86::BI__builtin_ia32_vfmaddsubph256_round_mask:
14665 case clang::X86::BI__builtin_ia32_vfmaddsubps256_round_mask:
14666 case clang::X86::BI__builtin_ia32_vfmaddsubpd256_round_mask:
14667 MaskFalseVal = Ops[0];
14669 case clang::X86::BI__builtin_ia32_vfmaddph512_maskz:
14670 case clang::X86::BI__builtin_ia32_vfmaddps512_maskz:
14671 case clang::X86::BI__builtin_ia32_vfmaddpd512_maskz:
14672 case clang::X86::BI__builtin_ia32_vfmaddsubph512_maskz:
14673 case clang::X86::BI__builtin_ia32_vfmaddsubps512_maskz:
14674 case clang::X86::BI__builtin_ia32_vfmaddsubpd512_maskz:
14675 case clang::X86::BI__builtin_ia32_vfmaddph256_round_maskz:
14676 case clang::X86::BI__builtin_ia32_vfmaddps256_round_maskz:
14677 case clang::X86::BI__builtin_ia32_vfmaddpd256_round_maskz:
14678 case clang::X86::BI__builtin_ia32_vfmaddsubph256_round_maskz:
14679 case clang::X86::BI__builtin_ia32_vfmaddsubps256_round_maskz:
14680 case clang::X86::BI__builtin_ia32_vfmaddsubpd256_round_maskz:
14681 MaskFalseVal = Constant::getNullValue(Ops[0]->getType());
14683 case clang::X86::BI__builtin_ia32_vfmsubph512_mask3:
14684 case clang::X86::BI__builtin_ia32_vfmaddph512_mask3:
14685 case clang::X86::BI__builtin_ia32_vfmsubps512_mask3:
14686 case clang::X86::BI__builtin_ia32_vfmaddps512_mask3:
14687 case clang::X86::BI__builtin_ia32_vfmsubpd512_mask3:
14688 case clang::X86::BI__builtin_ia32_vfmaddpd512_mask3:
14689 case clang::X86::BI__builtin_ia32_vfmsubaddph512_mask3:
14690 case clang::X86::BI__builtin_ia32_vfmaddsubph512_mask3:
14691 case clang::X86::BI__builtin_ia32_vfmsubaddps512_mask3:
14692 case clang::X86::BI__builtin_ia32_vfmaddsubps512_mask3:
14693 case clang::X86::BI__builtin_ia32_vfmsubaddpd512_mask3:
14694 case clang::X86::BI__builtin_ia32_vfmaddsubpd512_mask3:
14695 case clang::X86::BI__builtin_ia32_vfmsubph256_round_mask3:
14696 case clang::X86::BI__builtin_ia32_vfmaddph256_round_mask3:
14697 case clang::X86::BI__builtin_ia32_vfmsubps256_round_mask3:
14698 case clang::X86::BI__builtin_ia32_vfmaddps256_round_mask3:
14699 case clang::X86::BI__builtin_ia32_vfmsubpd256_round_mask3:
14700 case clang::X86::BI__builtin_ia32_vfmaddpd256_round_mask3:
14701 case clang::X86::BI__builtin_ia32_vfmsubaddph256_round_mask3:
14702 case clang::X86::BI__builtin_ia32_vfmaddsubph256_round_mask3:
14703 case clang::X86::BI__builtin_ia32_vfmsubaddps256_round_mask3:
14704 case clang::X86::BI__builtin_ia32_vfmaddsubps256_round_mask3:
14705 case clang::X86::BI__builtin_ia32_vfmsubaddpd256_round_mask3:
14706 case clang::X86::BI__builtin_ia32_vfmaddsubpd256_round_mask3:
14707 MaskFalseVal = Ops[2];
14719 bool ZeroMask =
false,
unsigned PTIdx = 0,
14720 bool NegAcc =
false) {
14722 if (Ops.size() > 4)
14723 Rnd = cast<llvm::ConstantInt>(Ops[4])->getZExtValue();
14726 Ops[2] = CGF.
Builder.CreateFNeg(Ops[2]);
14728 Ops[0] = CGF.
Builder.CreateExtractElement(Ops[0], (uint64_t)0);
14729 Ops[1] = CGF.
Builder.CreateExtractElement(Ops[1], (uint64_t)0);
14730 Ops[2] = CGF.
Builder.CreateExtractElement(Ops[2], (uint64_t)0);
14735 switch (Ops[0]->getType()->getPrimitiveSizeInBits()) {
14737 IID = Intrinsic::x86_avx512fp16_vfmadd_f16;
14740 IID = Intrinsic::x86_avx512_vfmadd_f32;
14743 IID = Intrinsic::x86_avx512_vfmadd_f64;
14746 llvm_unreachable(
"Unexpected size");
14749 {Ops[0], Ops[1], Ops[2], Ops[4]});
14750 }
else if (CGF.
Builder.getIsFPConstrained()) {
14751 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF,
E);
14753 Intrinsic::experimental_constrained_fma, Ops[0]->getType());
14754 Res = CGF.
Builder.CreateConstrainedFPCall(FMA, Ops.slice(0, 3));
14757 Res = CGF.
Builder.CreateCall(FMA, Ops.slice(0, 3));
14760 if (Ops.size() > 3) {
14761 Value *PassThru = ZeroMask ? Constant::getNullValue(Res->
getType())
14767 if (NegAcc && PTIdx == 2)
14768 PassThru = CGF.
Builder.CreateExtractElement(Upper, (uint64_t)0);
14772 return CGF.
Builder.CreateInsertElement(Upper, Res, (uint64_t)0);
14777 llvm::Type *Ty = Ops[0]->getType();
14779 Ty = llvm::FixedVectorType::get(CGF.
Int64Ty,
14780 Ty->getPrimitiveSizeInBits() / 64);
14786 Constant *ShiftAmt = ConstantInt::get(Ty, 32);
14787 LHS = CGF.
Builder.CreateShl(LHS, ShiftAmt);
14788 LHS = CGF.
Builder.CreateAShr(LHS, ShiftAmt);
14789 RHS = CGF.
Builder.CreateShl(RHS, ShiftAmt);
14790 RHS = CGF.
Builder.CreateAShr(RHS, ShiftAmt);
14793 Constant *Mask = ConstantInt::get(Ty, 0xffffffff);
14794 LHS = CGF.
Builder.CreateAnd(LHS, Mask);
14795 RHS = CGF.
Builder.CreateAnd(RHS, Mask);
14798 return CGF.
Builder.CreateMul(LHS, RHS);
14806 llvm::Type *Ty = Ops[0]->getType();
14808 unsigned VecWidth = Ty->getPrimitiveSizeInBits();
14809 unsigned EltWidth = Ty->getScalarSizeInBits();
14811 if (VecWidth == 128 && EltWidth == 32)
14812 IID = Intrinsic::x86_avx512_pternlog_d_128;
14813 else if (VecWidth == 256 && EltWidth == 32)
14814 IID = Intrinsic::x86_avx512_pternlog_d_256;
14815 else if (VecWidth == 512 && EltWidth == 32)
14816 IID = Intrinsic::x86_avx512_pternlog_d_512;
14817 else if (VecWidth == 128 && EltWidth == 64)
14818 IID = Intrinsic::x86_avx512_pternlog_q_128;
14819 else if (VecWidth == 256 && EltWidth == 64)
14820 IID = Intrinsic::x86_avx512_pternlog_q_256;
14821 else if (VecWidth == 512 && EltWidth == 64)
14822 IID = Intrinsic::x86_avx512_pternlog_q_512;
14824 llvm_unreachable(
"Unexpected intrinsic");
14828 Value *PassThru = ZeroMask ? ConstantAggregateZero::get(Ty) : Ops[0];
14833 llvm::Type *DstTy) {
14834 unsigned NumberOfElements =
14835 cast<llvm::FixedVectorType>(DstTy)->getNumElements();
14837 return CGF.
Builder.CreateSExt(Mask, DstTy,
"vpmovm2");
14842 StringRef CPUStr = cast<clang::StringLiteral>(CPUExpr)->getString();
14843 return EmitX86CpuIs(CPUStr);
14849 llvm::Type *DstTy) {
14850 assert((Ops.size() == 1 || Ops.size() == 3 || Ops.size() == 4) &&
14851 "Unknown cvtph2ps intrinsic");
14854 if (Ops.size() == 4 && cast<llvm::ConstantInt>(Ops[3])->getZExtValue() != 4) {
14857 return CGF.
Builder.CreateCall(F, {Ops[0], Ops[1], Ops[2], Ops[3]});
14860 unsigned NumDstElts = cast<llvm::FixedVectorType>(DstTy)->getNumElements();
14861 Value *Src = Ops[0];
14865 cast<llvm::FixedVectorType>(Src->
getType())->getNumElements()) {
14866 assert(NumDstElts == 4 &&
"Unexpected vector size");
14871 auto *HalfTy = llvm::FixedVectorType::get(
14873 Src = CGF.
Builder.CreateBitCast(Src, HalfTy);
14876 Value *Res = CGF.
Builder.CreateFPExt(Src, DstTy,
"cvtph2ps");
14878 if (Ops.size() >= 3)
14883Value *CodeGenFunction::EmitX86CpuIs(StringRef CPUStr) {
14894 llvm::ArrayType::get(
Int32Ty, 1));
14898 cast<llvm::GlobalValue>(CpuModel)->setDSOLocal(
true);
14904 std::tie(Index,
Value) = StringSwitch<std::pair<unsigned, unsigned>>(CPUStr)
14906 .Case(STRING, {0u,
static_cast<unsigned>(llvm::X86::ENUM)})
14908 .Case(
ALIAS, {1u,
static_cast<unsigned>(llvm::X86::ENUM)})
14910 .Case(STR, {1u,
static_cast<unsigned>(llvm::X86::ENUM)})
14912 .Case(
ALIAS, {2u,
static_cast<unsigned>(llvm::X86::ENUM)})
14914 .Case(STR, {2u,
static_cast<unsigned>(llvm::X86::ENUM)})
14915#include
"llvm/TargetParser/X86TargetParser.def"
14917 assert(
Value != 0 &&
"Invalid CPUStr passed to CpuIs");
14920 llvm::Value *Idxs[] = {ConstantInt::get(
Int32Ty, 0),
14921 ConstantInt::get(
Int32Ty, Index)};
14927 return Builder.CreateICmpEQ(CpuValue,
14933 StringRef FeatureStr = cast<StringLiteral>(FeatureExpr)->getString();
14934 if (!
getContext().getTargetInfo().validateCpuSupports(FeatureStr))
14936 return EmitX86CpuSupports(FeatureStr);
14940 return EmitX86CpuSupports(llvm::X86::getCpuSupportsMask(FeatureStrs));
14944CodeGenFunction::EmitX86CpuSupports(std::array<uint32_t, 4> FeatureMask) {
14946 if (FeatureMask[0] != 0) {
14954 llvm::ArrayType::get(
Int32Ty, 1));
14958 cast<llvm::GlobalValue>(CpuModel)->setDSOLocal(
true);
14975 llvm::Type *ATy = llvm::ArrayType::get(
Int32Ty, 3);
14976 llvm::Constant *CpuFeatures2 =
14978 cast<llvm::GlobalValue>(CpuFeatures2)->setDSOLocal(
true);
14979 for (
int i = 1; i != 4; ++i) {
14980 const uint32_t M = FeatureMask[i];
14997Value *CodeGenFunction::EmitAArch64CpuInit() {
14998 llvm::FunctionType *FTy = llvm::FunctionType::get(
VoidTy,
false);
14999 llvm::FunctionCallee
Func =
15001 cast<llvm::GlobalValue>(
Func.getCallee())->setDSOLocal(
true);
15002 cast<llvm::GlobalValue>(
Func.getCallee())
15003 ->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
15008 llvm::FunctionType *FTy = llvm::FunctionType::get(
VoidTy, {
VoidPtrTy},
false);
15009 llvm::FunctionCallee
Func =
15011 auto *CalleeGV = cast<llvm::GlobalValue>(
Func.getCallee());
15012 CalleeGV->setDSOLocal(
true);
15013 CalleeGV->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
15017Value *CodeGenFunction::EmitX86CpuInit() {
15018 llvm::FunctionType *FTy = llvm::FunctionType::get(
VoidTy,
15020 llvm::FunctionCallee
Func =
15022 cast<llvm::GlobalValue>(
Func.getCallee())->setDSOLocal(
true);
15023 cast<llvm::GlobalValue>(
Func.getCallee())
15024 ->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
15028Value *CodeGenFunction::EmitAArch64CpuSupports(
const CallExpr *
E) {
15030 StringRef ArgStr = cast<StringLiteral>(ArgExpr)->getString();
15032 ArgStr.split(Features,
"+");
15033 for (
auto &Feature : Features) {
15034 Feature = Feature.trim();
15035 if (!llvm::AArch64::parseFMVExtension(Feature))
15037 if (Feature !=
"default")
15038 Features.push_back(Feature);
15040 return EmitAArch64CpuSupports(Features);
15045 uint64_t FeaturesMask = llvm::AArch64::getCpuSupportsMask(FeaturesStrs);
15047 if (FeaturesMask != 0) {
15052 llvm::Type *STy = llvm::StructType::get(
Int64Ty);
15053 llvm::Constant *AArch64CPUFeatures =
15055 cast<llvm::GlobalValue>(AArch64CPUFeatures)->setDSOLocal(
true);
15057 STy, AArch64CPUFeatures,
15072 StringRef FeatureStr = cast<StringLiteral>(FeatureExpr)->getString();
15073 if (!
getContext().getTargetInfo().validateCpuSupports(FeatureStr))
15081 llvm::Type *Int32Ty = Builder.getInt32Ty();
15082 llvm::Type *Int64Ty = Builder.getInt64Ty();
15083 llvm::ArrayType *ArrayOfInt64Ty =
15084 llvm::ArrayType::get(Int64Ty, llvm::RISCVISAInfo::FeatureBitSize);
15085 llvm::Type *StructTy = llvm::StructType::get(Int32Ty, ArrayOfInt64Ty);
15086 llvm::Constant *RISCVFeaturesBits =
15088 cast<llvm::GlobalValue>(RISCVFeaturesBits)->setDSOLocal(
true);
15089 Value *IndexVal = llvm::ConstantInt::get(Int32Ty, Index);
15090 llvm::Value *GEPIndices[] = {Builder.getInt32(0), Builder.getInt32(1),
15093 Builder.CreateInBoundsGEP(StructTy, RISCVFeaturesBits, GEPIndices);
15094 Value *FeaturesBit =
15096 return FeaturesBit;
15100 const unsigned RISCVFeatureLength = llvm::RISCVISAInfo::FeatureBitSize;
15101 uint64_t RequireBitMasks[RISCVFeatureLength] = {0};
15103 for (
auto Feat : FeaturesStrs) {
15104 auto [GroupID, BitPos] = RISCVISAInfo::getRISCVFeaturesBitsInfo(Feat);
15111 RequireBitMasks[GroupID] |= (1ULL << BitPos);
15115 for (
unsigned Idx = 0; Idx < RISCVFeatureLength; Idx++) {
15116 if (RequireBitMasks[Idx] == 0)
15126 assert(
Result &&
"Should have value here.");
15133 if (BuiltinID == Builtin::BI__builtin_cpu_is)
15134 return EmitX86CpuIs(
E);
15135 if (BuiltinID == Builtin::BI__builtin_cpu_supports)
15136 return EmitX86CpuSupports(
E);
15137 if (BuiltinID == Builtin::BI__builtin_cpu_init)
15138 return EmitX86CpuInit();
15146 bool IsMaskFCmp =
false;
15147 bool IsConjFMA =
false;
15150 unsigned ICEArguments = 0;
15155 for (
unsigned i = 0, e =
E->getNumArgs(); i != e; i++) {
15165 auto getCmpIntrinsicCall = [
this, &Ops](Intrinsic::ID
ID,
unsigned Imm) {
15166 Ops.push_back(llvm::ConstantInt::get(
Int8Ty, Imm));
15168 return Builder.CreateCall(F, Ops);
15176 auto getVectorFCmpIR = [
this, &Ops,
E](CmpInst::Predicate Pred,
15177 bool IsSignaling) {
15178 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
15181 Cmp =
Builder.CreateFCmpS(Pred, Ops[0], Ops[1]);
15183 Cmp =
Builder.CreateFCmp(Pred, Ops[0], Ops[1]);
15184 llvm::VectorType *FPVecTy = cast<llvm::VectorType>(Ops[0]->getType());
15185 llvm::VectorType *IntVecTy = llvm::VectorType::getInteger(FPVecTy);
15187 return Builder.CreateBitCast(Sext, FPVecTy);
15190 switch (BuiltinID) {
15191 default:
return nullptr;
15192 case X86::BI_mm_prefetch: {
15194 ConstantInt *
C = cast<ConstantInt>(Ops[1]);
15195 Value *RW = ConstantInt::get(
Int32Ty, (
C->getZExtValue() >> 2) & 0x1);
15196 Value *Locality = ConstantInt::get(
Int32Ty,
C->getZExtValue() & 0x3);
15201 case X86::BI_mm_clflush: {
15205 case X86::BI_mm_lfence: {
15208 case X86::BI_mm_mfence: {
15211 case X86::BI_mm_sfence: {
15214 case X86::BI_mm_pause: {
15217 case X86::BI__rdtsc: {
15220 case X86::BI__builtin_ia32_rdtscp: {
15226 case X86::BI__builtin_ia32_lzcnt_u16:
15227 case X86::BI__builtin_ia32_lzcnt_u32:
15228 case X86::BI__builtin_ia32_lzcnt_u64: {
15232 case X86::BI__builtin_ia32_tzcnt_u16:
15233 case X86::BI__builtin_ia32_tzcnt_u32:
15234 case X86::BI__builtin_ia32_tzcnt_u64: {
15238 case X86::BI__builtin_ia32_undef128:
15239 case X86::BI__builtin_ia32_undef256:
15240 case X86::BI__builtin_ia32_undef512:
15247 case X86::BI__builtin_ia32_vec_ext_v4hi:
15248 case X86::BI__builtin_ia32_vec_ext_v16qi:
15249 case X86::BI__builtin_ia32_vec_ext_v8hi:
15250 case X86::BI__builtin_ia32_vec_ext_v4si:
15251 case X86::BI__builtin_ia32_vec_ext_v4sf:
15252 case X86::BI__builtin_ia32_vec_ext_v2di:
15253 case X86::BI__builtin_ia32_vec_ext_v32qi:
15254 case X86::BI__builtin_ia32_vec_ext_v16hi:
15255 case X86::BI__builtin_ia32_vec_ext_v8si:
15256 case X86::BI__builtin_ia32_vec_ext_v4di: {
15258 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
15259 uint64_t Index = cast<ConstantInt>(Ops[1])->getZExtValue();
15260 Index &= NumElts - 1;
15263 return Builder.CreateExtractElement(Ops[0], Index);
15265 case X86::BI__builtin_ia32_vec_set_v4hi:
15266 case X86::BI__builtin_ia32_vec_set_v16qi:
15267 case X86::BI__builtin_ia32_vec_set_v8hi:
15268 case X86::BI__builtin_ia32_vec_set_v4si:
15269 case X86::BI__builtin_ia32_vec_set_v2di:
15270 case X86::BI__builtin_ia32_vec_set_v32qi:
15271 case X86::BI__builtin_ia32_vec_set_v16hi:
15272 case X86::BI__builtin_ia32_vec_set_v8si:
15273 case X86::BI__builtin_ia32_vec_set_v4di: {
15275 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
15276 unsigned Index = cast<ConstantInt>(Ops[2])->getZExtValue();
15277 Index &= NumElts - 1;
15280 return Builder.CreateInsertElement(Ops[0], Ops[1], Index);
15282 case X86::BI_mm_setcsr:
15283 case X86::BI__builtin_ia32_ldmxcsr: {
15289 case X86::BI_mm_getcsr:
15290 case X86::BI__builtin_ia32_stmxcsr: {
15296 case X86::BI__builtin_ia32_xsave:
15297 case X86::BI__builtin_ia32_xsave64:
15298 case X86::BI__builtin_ia32_xrstor:
15299 case X86::BI__builtin_ia32_xrstor64:
15300 case X86::BI__builtin_ia32_xsaveopt:
15301 case X86::BI__builtin_ia32_xsaveopt64:
15302 case X86::BI__builtin_ia32_xrstors:
15303 case X86::BI__builtin_ia32_xrstors64:
15304 case X86::BI__builtin_ia32_xsavec:
15305 case X86::BI__builtin_ia32_xsavec64:
15306 case X86::BI__builtin_ia32_xsaves:
15307 case X86::BI__builtin_ia32_xsaves64:
15308 case X86::BI__builtin_ia32_xsetbv:
15309 case X86::BI_xsetbv: {
15311#define INTRINSIC_X86_XSAVE_ID(NAME) \
15312 case X86::BI__builtin_ia32_##NAME: \
15313 ID = Intrinsic::x86_##NAME; \
15315 switch (BuiltinID) {
15316 default: llvm_unreachable(
"Unsupported intrinsic!");
15330 case X86::BI_xsetbv:
15331 ID = Intrinsic::x86_xsetbv;
15334#undef INTRINSIC_X86_XSAVE_ID
15339 Ops.push_back(Mlo);
15342 case X86::BI__builtin_ia32_xgetbv:
15343 case X86::BI_xgetbv:
15345 case X86::BI__builtin_ia32_storedqudi128_mask:
15346 case X86::BI__builtin_ia32_storedqusi128_mask:
15347 case X86::BI__builtin_ia32_storedquhi128_mask:
15348 case X86::BI__builtin_ia32_storedquqi128_mask:
15349 case X86::BI__builtin_ia32_storeupd128_mask:
15350 case X86::BI__builtin_ia32_storeups128_mask:
15351 case X86::BI__builtin_ia32_storedqudi256_mask:
15352 case X86::BI__builtin_ia32_storedqusi256_mask:
15353 case X86::BI__builtin_ia32_storedquhi256_mask:
15354 case X86::BI__builtin_ia32_storedquqi256_mask:
15355 case X86::BI__builtin_ia32_storeupd256_mask:
15356 case X86::BI__builtin_ia32_storeups256_mask:
15357 case X86::BI__builtin_ia32_storedqudi512_mask:
15358 case X86::BI__builtin_ia32_storedqusi512_mask:
15359 case X86::BI__builtin_ia32_storedquhi512_mask:
15360 case X86::BI__builtin_ia32_storedquqi512_mask:
15361 case X86::BI__builtin_ia32_storeupd512_mask:
15362 case X86::BI__builtin_ia32_storeups512_mask:
15365 case X86::BI__builtin_ia32_storesbf16128_mask:
15366 case X86::BI__builtin_ia32_storesh128_mask:
15367 case X86::BI__builtin_ia32_storess128_mask:
15368 case X86::BI__builtin_ia32_storesd128_mask:
15371 case X86::BI__builtin_ia32_cvtmask2b128:
15372 case X86::BI__builtin_ia32_cvtmask2b256:
15373 case X86::BI__builtin_ia32_cvtmask2b512:
15374 case X86::BI__builtin_ia32_cvtmask2w128:
15375 case X86::BI__builtin_ia32_cvtmask2w256:
15376 case X86::BI__builtin_ia32_cvtmask2w512:
15377 case X86::BI__builtin_ia32_cvtmask2d128:
15378 case X86::BI__builtin_ia32_cvtmask2d256:
15379 case X86::BI__builtin_ia32_cvtmask2d512:
15380 case X86::BI__builtin_ia32_cvtmask2q128:
15381 case X86::BI__builtin_ia32_cvtmask2q256:
15382 case X86::BI__builtin_ia32_cvtmask2q512:
15385 case X86::BI__builtin_ia32_cvtb2mask128:
15386 case X86::BI__builtin_ia32_cvtb2mask256:
15387 case X86::BI__builtin_ia32_cvtb2mask512:
15388 case X86::BI__builtin_ia32_cvtw2mask128:
15389 case X86::BI__builtin_ia32_cvtw2mask256:
15390 case X86::BI__builtin_ia32_cvtw2mask512:
15391 case X86::BI__builtin_ia32_cvtd2mask128:
15392 case X86::BI__builtin_ia32_cvtd2mask256:
15393 case X86::BI__builtin_ia32_cvtd2mask512:
15394 case X86::BI__builtin_ia32_cvtq2mask128:
15395 case X86::BI__builtin_ia32_cvtq2mask256:
15396 case X86::BI__builtin_ia32_cvtq2mask512:
15399 case X86::BI__builtin_ia32_cvtdq2ps512_mask:
15400 case X86::BI__builtin_ia32_cvtqq2ps512_mask:
15401 case X86::BI__builtin_ia32_cvtqq2pd512_mask:
15402 case X86::BI__builtin_ia32_vcvtw2ph512_mask:
15403 case X86::BI__builtin_ia32_vcvtdq2ph512_mask:
15404 case X86::BI__builtin_ia32_vcvtqq2ph512_mask:
15405 case X86::BI__builtin_ia32_vcvtdq2ph256_round_mask:
15406 case X86::BI__builtin_ia32_vcvtdq2ps256_round_mask:
15407 case X86::BI__builtin_ia32_vcvtqq2pd256_round_mask:
15408 case X86::BI__builtin_ia32_vcvtqq2ph256_round_mask:
15409 case X86::BI__builtin_ia32_vcvtqq2ps256_round_mask:
15410 case X86::BI__builtin_ia32_vcvtw2ph256_round_mask:
15412 case X86::BI__builtin_ia32_cvtudq2ps512_mask:
15413 case X86::BI__builtin_ia32_cvtuqq2ps512_mask:
15414 case X86::BI__builtin_ia32_cvtuqq2pd512_mask:
15415 case X86::BI__builtin_ia32_vcvtuw2ph512_mask:
15416 case X86::BI__builtin_ia32_vcvtudq2ph512_mask:
15417 case X86::BI__builtin_ia32_vcvtuqq2ph512_mask:
15418 case X86::BI__builtin_ia32_vcvtudq2ph256_round_mask:
15419 case X86::BI__builtin_ia32_vcvtudq2ps256_round_mask:
15420 case X86::BI__builtin_ia32_vcvtuqq2pd256_round_mask:
15421 case X86::BI__builtin_ia32_vcvtuqq2ph256_round_mask:
15422 case X86::BI__builtin_ia32_vcvtuqq2ps256_round_mask:
15423 case X86::BI__builtin_ia32_vcvtuw2ph256_round_mask:
15426 case X86::BI__builtin_ia32_vfmaddss3:
15427 case X86::BI__builtin_ia32_vfmaddsd3:
15428 case X86::BI__builtin_ia32_vfmaddsh3_mask:
15429 case X86::BI__builtin_ia32_vfmaddss3_mask:
15430 case X86::BI__builtin_ia32_vfmaddsd3_mask:
15432 case X86::BI__builtin_ia32_vfmaddss:
15433 case X86::BI__builtin_ia32_vfmaddsd:
15435 Constant::getNullValue(Ops[0]->getType()));
15436 case X86::BI__builtin_ia32_vfmaddsh3_maskz:
15437 case X86::BI__builtin_ia32_vfmaddss3_maskz:
15438 case X86::BI__builtin_ia32_vfmaddsd3_maskz:
15440 case X86::BI__builtin_ia32_vfmaddsh3_mask3:
15441 case X86::BI__builtin_ia32_vfmaddss3_mask3:
15442 case X86::BI__builtin_ia32_vfmaddsd3_mask3:
15444 case X86::BI__builtin_ia32_vfmsubsh3_mask3:
15445 case X86::BI__builtin_ia32_vfmsubss3_mask3:
15446 case X86::BI__builtin_ia32_vfmsubsd3_mask3:
15449 case X86::BI__builtin_ia32_vfmaddph:
15450 case X86::BI__builtin_ia32_vfmaddps:
15451 case X86::BI__builtin_ia32_vfmaddpd:
15452 case X86::BI__builtin_ia32_vfmaddph256:
15453 case X86::BI__builtin_ia32_vfmaddps256:
15454 case X86::BI__builtin_ia32_vfmaddpd256:
15455 case X86::BI__builtin_ia32_vfmaddph512_mask:
15456 case X86::BI__builtin_ia32_vfmaddph512_maskz:
15457 case X86::BI__builtin_ia32_vfmaddph512_mask3:
15458 case X86::BI__builtin_ia32_vfmaddnepbh128:
15459 case X86::BI__builtin_ia32_vfmaddnepbh256:
15460 case X86::BI__builtin_ia32_vfmaddnepbh512:
15461 case X86::BI__builtin_ia32_vfmaddps512_mask:
15462 case X86::BI__builtin_ia32_vfmaddps512_maskz:
15463 case X86::BI__builtin_ia32_vfmaddps512_mask3:
15464 case X86::BI__builtin_ia32_vfmsubps512_mask3:
15465 case X86::BI__builtin_ia32_vfmaddpd512_mask:
15466 case X86::BI__builtin_ia32_vfmaddpd512_maskz:
15467 case X86::BI__builtin_ia32_vfmaddpd512_mask3:
15468 case X86::BI__builtin_ia32_vfmsubpd512_mask3:
15469 case X86::BI__builtin_ia32_vfmsubph512_mask3:
15470 case X86::BI__builtin_ia32_vfmaddph256_round_mask:
15471 case X86::BI__builtin_ia32_vfmaddph256_round_maskz:
15472 case X86::BI__builtin_ia32_vfmaddph256_round_mask3:
15473 case X86::BI__builtin_ia32_vfmaddps256_round_mask:
15474 case X86::BI__builtin_ia32_vfmaddps256_round_maskz:
15475 case X86::BI__builtin_ia32_vfmaddps256_round_mask3:
15476 case X86::BI__builtin_ia32_vfmsubps256_round_mask3:
15477 case X86::BI__builtin_ia32_vfmaddpd256_round_mask:
15478 case X86::BI__builtin_ia32_vfmaddpd256_round_maskz:
15479 case X86::BI__builtin_ia32_vfmaddpd256_round_mask3:
15480 case X86::BI__builtin_ia32_vfmsubpd256_round_mask3:
15481 case X86::BI__builtin_ia32_vfmsubph256_round_mask3:
15483 case X86::BI__builtin_ia32_vfmaddsubph512_mask:
15484 case X86::BI__builtin_ia32_vfmaddsubph512_maskz:
15485 case X86::BI__builtin_ia32_vfmaddsubph512_mask3:
15486 case X86::BI__builtin_ia32_vfmsubaddph512_mask3:
15487 case X86::BI__builtin_ia32_vfmaddsubps512_mask:
15488 case X86::BI__builtin_ia32_vfmaddsubps512_maskz:
15489 case X86::BI__builtin_ia32_vfmaddsubps512_mask3:
15490 case X86::BI__builtin_ia32_vfmsubaddps512_mask3:
15491 case X86::BI__builtin_ia32_vfmaddsubpd512_mask:
15492 case X86::BI__builtin_ia32_vfmaddsubpd512_maskz:
15493 case X86::BI__builtin_ia32_vfmaddsubpd512_mask3:
15494 case X86::BI__builtin_ia32_vfmsubaddpd512_mask3:
15495 case X86::BI__builtin_ia32_vfmaddsubph256_round_mask:
15496 case X86::BI__builtin_ia32_vfmaddsubph256_round_maskz:
15497 case X86::BI__builtin_ia32_vfmaddsubph256_round_mask3:
15498 case X86::BI__builtin_ia32_vfmsubaddph256_round_mask3:
15499 case X86::BI__builtin_ia32_vfmaddsubps256_round_mask:
15500 case X86::BI__builtin_ia32_vfmaddsubps256_round_maskz:
15501 case X86::BI__builtin_ia32_vfmaddsubps256_round_mask3:
15502 case X86::BI__builtin_ia32_vfmsubaddps256_round_mask3:
15503 case X86::BI__builtin_ia32_vfmaddsubpd256_round_mask:
15504 case X86::BI__builtin_ia32_vfmaddsubpd256_round_maskz:
15505 case X86::BI__builtin_ia32_vfmaddsubpd256_round_mask3:
15506 case X86::BI__builtin_ia32_vfmsubaddpd256_round_mask3:
15509 case X86::BI__builtin_ia32_movdqa32store128_mask:
15510 case X86::BI__builtin_ia32_movdqa64store128_mask:
15511 case X86::BI__builtin_ia32_storeaps128_mask:
15512 case X86::BI__builtin_ia32_storeapd128_mask:
15513 case X86::BI__builtin_ia32_movdqa32store256_mask:
15514 case X86::BI__builtin_ia32_movdqa64store256_mask:
15515 case X86::BI__builtin_ia32_storeaps256_mask:
15516 case X86::BI__builtin_ia32_storeapd256_mask:
15517 case X86::BI__builtin_ia32_movdqa32store512_mask:
15518 case X86::BI__builtin_ia32_movdqa64store512_mask:
15519 case X86::BI__builtin_ia32_storeaps512_mask:
15520 case X86::BI__builtin_ia32_storeapd512_mask:
15525 case X86::BI__builtin_ia32_loadups128_mask:
15526 case X86::BI__builtin_ia32_loadups256_mask:
15527 case X86::BI__builtin_ia32_loadups512_mask:
15528 case X86::BI__builtin_ia32_loadupd128_mask:
15529 case X86::BI__builtin_ia32_loadupd256_mask:
15530 case X86::BI__builtin_ia32_loadupd512_mask:
15531 case X86::BI__builtin_ia32_loaddquqi128_mask:
15532 case X86::BI__builtin_ia32_loaddquqi256_mask:
15533 case X86::BI__builtin_ia32_loaddquqi512_mask:
15534 case X86::BI__builtin_ia32_loaddquhi128_mask:
15535 case X86::BI__builtin_ia32_loaddquhi256_mask:
15536 case X86::BI__builtin_ia32_loaddquhi512_mask:
15537 case X86::BI__builtin_ia32_loaddqusi128_mask:
15538 case X86::BI__builtin_ia32_loaddqusi256_mask:
15539 case X86::BI__builtin_ia32_loaddqusi512_mask:
15540 case X86::BI__builtin_ia32_loaddqudi128_mask:
15541 case X86::BI__builtin_ia32_loaddqudi256_mask:
15542 case X86::BI__builtin_ia32_loaddqudi512_mask:
15545 case X86::BI__builtin_ia32_loadsbf16128_mask:
15546 case X86::BI__builtin_ia32_loadsh128_mask:
15547 case X86::BI__builtin_ia32_loadss128_mask:
15548 case X86::BI__builtin_ia32_loadsd128_mask:
15551 case X86::BI__builtin_ia32_loadaps128_mask:
15552 case X86::BI__builtin_ia32_loadaps256_mask:
15553 case X86::BI__builtin_ia32_loadaps512_mask:
15554 case X86::BI__builtin_ia32_loadapd128_mask:
15555 case X86::BI__builtin_ia32_loadapd256_mask:
15556 case X86::BI__builtin_ia32_loadapd512_mask:
15557 case X86::BI__builtin_ia32_movdqa32load128_mask:
15558 case X86::BI__builtin_ia32_movdqa32load256_mask:
15559 case X86::BI__builtin_ia32_movdqa32load512_mask:
15560 case X86::BI__builtin_ia32_movdqa64load128_mask:
15561 case X86::BI__builtin_ia32_movdqa64load256_mask:
15562 case X86::BI__builtin_ia32_movdqa64load512_mask:
15567 case X86::BI__builtin_ia32_expandloaddf128_mask:
15568 case X86::BI__builtin_ia32_expandloaddf256_mask:
15569 case X86::BI__builtin_ia32_expandloaddf512_mask:
15570 case X86::BI__builtin_ia32_expandloadsf128_mask:
15571 case X86::BI__builtin_ia32_expandloadsf256_mask:
15572 case X86::BI__builtin_ia32_expandloadsf512_mask:
15573 case X86::BI__builtin_ia32_expandloaddi128_mask:
15574 case X86::BI__builtin_ia32_expandloaddi256_mask:
15575 case X86::BI__builtin_ia32_expandloaddi512_mask:
15576 case X86::BI__builtin_ia32_expandloadsi128_mask:
15577 case X86::BI__builtin_ia32_expandloadsi256_mask:
15578 case X86::BI__builtin_ia32_expandloadsi512_mask:
15579 case X86::BI__builtin_ia32_expandloadhi128_mask:
15580 case X86::BI__builtin_ia32_expandloadhi256_mask:
15581 case X86::BI__builtin_ia32_expandloadhi512_mask:
15582 case X86::BI__builtin_ia32_expandloadqi128_mask:
15583 case X86::BI__builtin_ia32_expandloadqi256_mask:
15584 case X86::BI__builtin_ia32_expandloadqi512_mask:
15587 case X86::BI__builtin_ia32_compressstoredf128_mask:
15588 case X86::BI__builtin_ia32_compressstoredf256_mask:
15589 case X86::BI__builtin_ia32_compressstoredf512_mask:
15590 case X86::BI__builtin_ia32_compressstoresf128_mask:
15591 case X86::BI__builtin_ia32_compressstoresf256_mask:
15592 case X86::BI__builtin_ia32_compressstoresf512_mask:
15593 case X86::BI__builtin_ia32_compressstoredi128_mask:
15594 case X86::BI__builtin_ia32_compressstoredi256_mask:
15595 case X86::BI__builtin_ia32_compressstoredi512_mask:
15596 case X86::BI__builtin_ia32_compressstoresi128_mask:
15597 case X86::BI__builtin_ia32_compressstoresi256_mask:
15598 case X86::BI__builtin_ia32_compressstoresi512_mask:
15599 case X86::BI__builtin_ia32_compressstorehi128_mask:
15600 case X86::BI__builtin_ia32_compressstorehi256_mask:
15601 case X86::BI__builtin_ia32_compressstorehi512_mask:
15602 case X86::BI__builtin_ia32_compressstoreqi128_mask:
15603 case X86::BI__builtin_ia32_compressstoreqi256_mask:
15604 case X86::BI__builtin_ia32_compressstoreqi512_mask:
15607 case X86::BI__builtin_ia32_expanddf128_mask:
15608 case X86::BI__builtin_ia32_expanddf256_mask:
15609 case X86::BI__builtin_ia32_expanddf512_mask:
15610 case X86::BI__builtin_ia32_expandsf128_mask:
15611 case X86::BI__builtin_ia32_expandsf256_mask:
15612 case X86::BI__builtin_ia32_expandsf512_mask:
15613 case X86::BI__builtin_ia32_expanddi128_mask:
15614 case X86::BI__builtin_ia32_expanddi256_mask:
15615 case X86::BI__builtin_ia32_expanddi512_mask:
15616 case X86::BI__builtin_ia32_expandsi128_mask:
15617 case X86::BI__builtin_ia32_expandsi256_mask:
15618 case X86::BI__builtin_ia32_expandsi512_mask:
15619 case X86::BI__builtin_ia32_expandhi128_mask:
15620 case X86::BI__builtin_ia32_expandhi256_mask:
15621 case X86::BI__builtin_ia32_expandhi512_mask:
15622 case X86::BI__builtin_ia32_expandqi128_mask:
15623 case X86::BI__builtin_ia32_expandqi256_mask:
15624 case X86::BI__builtin_ia32_expandqi512_mask:
15627 case X86::BI__builtin_ia32_compressdf128_mask:
15628 case X86::BI__builtin_ia32_compressdf256_mask:
15629 case X86::BI__builtin_ia32_compressdf512_mask:
15630 case X86::BI__builtin_ia32_compresssf128_mask:
15631 case X86::BI__builtin_ia32_compresssf256_mask:
15632 case X86::BI__builtin_ia32_compresssf512_mask:
15633 case X86::BI__builtin_ia32_compressdi128_mask:
15634 case X86::BI__builtin_ia32_compressdi256_mask:
15635 case X86::BI__builtin_ia32_compressdi512_mask:
15636 case X86::BI__builtin_ia32_compresssi128_mask:
15637 case X86::BI__builtin_ia32_compresssi256_mask:
15638 case X86::BI__builtin_ia32_compresssi512_mask:
15639 case X86::BI__builtin_ia32_compresshi128_mask:
15640 case X86::BI__builtin_ia32_compresshi256_mask:
15641 case X86::BI__builtin_ia32_compresshi512_mask:
15642 case X86::BI__builtin_ia32_compressqi128_mask:
15643 case X86::BI__builtin_ia32_compressqi256_mask:
15644 case X86::BI__builtin_ia32_compressqi512_mask:
15647 case X86::BI__builtin_ia32_gather3div2df:
15648 case X86::BI__builtin_ia32_gather3div2di:
15649 case X86::BI__builtin_ia32_gather3div4df:
15650 case X86::BI__builtin_ia32_gather3div4di:
15651 case X86::BI__builtin_ia32_gather3div4sf:
15652 case X86::BI__builtin_ia32_gather3div4si:
15653 case X86::BI__builtin_ia32_gather3div8sf:
15654 case X86::BI__builtin_ia32_gather3div8si:
15655 case X86::BI__builtin_ia32_gather3siv2df:
15656 case X86::BI__builtin_ia32_gather3siv2di:
15657 case X86::BI__builtin_ia32_gather3siv4df:
15658 case X86::BI__builtin_ia32_gather3siv4di:
15659 case X86::BI__builtin_ia32_gather3siv4sf:
15660 case X86::BI__builtin_ia32_gather3siv4si:
15661 case X86::BI__builtin_ia32_gather3siv8sf:
15662 case X86::BI__builtin_ia32_gather3siv8si:
15663 case X86::BI__builtin_ia32_gathersiv8df:
15664 case X86::BI__builtin_ia32_gathersiv16sf:
15665 case X86::BI__builtin_ia32_gatherdiv8df:
15666 case X86::BI__builtin_ia32_gatherdiv16sf:
15667 case X86::BI__builtin_ia32_gathersiv8di:
15668 case X86::BI__builtin_ia32_gathersiv16si:
15669 case X86::BI__builtin_ia32_gatherdiv8di:
15670 case X86::BI__builtin_ia32_gatherdiv16si: {
15672 switch (BuiltinID) {
15673 default: llvm_unreachable(
"Unexpected builtin");
15674 case X86::BI__builtin_ia32_gather3div2df:
15675 IID = Intrinsic::x86_avx512_mask_gather3div2_df;
15677 case X86::BI__builtin_ia32_gather3div2di:
15678 IID = Intrinsic::x86_avx512_mask_gather3div2_di;
15680 case X86::BI__builtin_ia32_gather3div4df:
15681 IID = Intrinsic::x86_avx512_mask_gather3div4_df;
15683 case X86::BI__builtin_ia32_gather3div4di:
15684 IID = Intrinsic::x86_avx512_mask_gather3div4_di;
15686 case X86::BI__builtin_ia32_gather3div4sf:
15687 IID = Intrinsic::x86_avx512_mask_gather3div4_sf;
15689 case X86::BI__builtin_ia32_gather3div4si:
15690 IID = Intrinsic::x86_avx512_mask_gather3div4_si;
15692 case X86::BI__builtin_ia32_gather3div8sf:
15693 IID = Intrinsic::x86_avx512_mask_gather3div8_sf;
15695 case X86::BI__builtin_ia32_gather3div8si:
15696 IID = Intrinsic::x86_avx512_mask_gather3div8_si;
15698 case X86::BI__builtin_ia32_gather3siv2df:
15699 IID = Intrinsic::x86_avx512_mask_gather3siv2_df;
15701 case X86::BI__builtin_ia32_gather3siv2di:
15702 IID = Intrinsic::x86_avx512_mask_gather3siv2_di;
15704 case X86::BI__builtin_ia32_gather3siv4df:
15705 IID = Intrinsic::x86_avx512_mask_gather3siv4_df;
15707 case X86::BI__builtin_ia32_gather3siv4di:
15708 IID = Intrinsic::x86_avx512_mask_gather3siv4_di;
15710 case X86::BI__builtin_ia32_gather3siv4sf:
15711 IID = Intrinsic::x86_avx512_mask_gather3siv4_sf;
15713 case X86::BI__builtin_ia32_gather3siv4si:
15714 IID = Intrinsic::x86_avx512_mask_gather3siv4_si;
15716 case X86::BI__builtin_ia32_gather3siv8sf:
15717 IID = Intrinsic::x86_avx512_mask_gather3siv8_sf;
15719 case X86::BI__builtin_ia32_gather3siv8si:
15720 IID = Intrinsic::x86_avx512_mask_gather3siv8_si;
15722 case X86::BI__builtin_ia32_gathersiv8df:
15723 IID = Intrinsic::x86_avx512_mask_gather_dpd_512;
15725 case X86::BI__builtin_ia32_gathersiv16sf:
15726 IID = Intrinsic::x86_avx512_mask_gather_dps_512;
15728 case X86::BI__builtin_ia32_gatherdiv8df:
15729 IID = Intrinsic::x86_avx512_mask_gather_qpd_512;
15731 case X86::BI__builtin_ia32_gatherdiv16sf:
15732 IID = Intrinsic::x86_avx512_mask_gather_qps_512;
15734 case X86::BI__builtin_ia32_gathersiv8di:
15735 IID = Intrinsic::x86_avx512_mask_gather_dpq_512;
15737 case X86::BI__builtin_ia32_gathersiv16si:
15738 IID = Intrinsic::x86_avx512_mask_gather_dpi_512;
15740 case X86::BI__builtin_ia32_gatherdiv8di:
15741 IID = Intrinsic::x86_avx512_mask_gather_qpq_512;
15743 case X86::BI__builtin_ia32_gatherdiv16si:
15744 IID = Intrinsic::x86_avx512_mask_gather_qpi_512;
15748 unsigned MinElts = std::min(
15749 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements(),
15750 cast<llvm::FixedVectorType>(Ops[2]->getType())->getNumElements());
15753 return Builder.CreateCall(Intr, Ops);
15756 case X86::BI__builtin_ia32_scattersiv8df:
15757 case X86::BI__builtin_ia32_scattersiv16sf:
15758 case X86::BI__builtin_ia32_scatterdiv8df:
15759 case X86::BI__builtin_ia32_scatterdiv16sf:
15760 case X86::BI__builtin_ia32_scattersiv8di:
15761 case X86::BI__builtin_ia32_scattersiv16si:
15762 case X86::BI__builtin_ia32_scatterdiv8di:
15763 case X86::BI__builtin_ia32_scatterdiv16si:
15764 case X86::BI__builtin_ia32_scatterdiv2df:
15765 case X86::BI__builtin_ia32_scatterdiv2di:
15766 case X86::BI__builtin_ia32_scatterdiv4df:
15767 case X86::BI__builtin_ia32_scatterdiv4di:
15768 case X86::BI__builtin_ia32_scatterdiv4sf:
15769 case X86::BI__builtin_ia32_scatterdiv4si:
15770 case X86::BI__builtin_ia32_scatterdiv8sf:
15771 case X86::BI__builtin_ia32_scatterdiv8si:
15772 case X86::BI__builtin_ia32_scattersiv2df:
15773 case X86::BI__builtin_ia32_scattersiv2di:
15774 case X86::BI__builtin_ia32_scattersiv4df:
15775 case X86::BI__builtin_ia32_scattersiv4di:
15776 case X86::BI__builtin_ia32_scattersiv4sf:
15777 case X86::BI__builtin_ia32_scattersiv4si:
15778 case X86::BI__builtin_ia32_scattersiv8sf:
15779 case X86::BI__builtin_ia32_scattersiv8si: {
15781 switch (BuiltinID) {
15782 default: llvm_unreachable(
"Unexpected builtin");
15783 case X86::BI__builtin_ia32_scattersiv8df:
15784 IID = Intrinsic::x86_avx512_mask_scatter_dpd_512;
15786 case X86::BI__builtin_ia32_scattersiv16sf:
15787 IID = Intrinsic::x86_avx512_mask_scatter_dps_512;
15789 case X86::BI__builtin_ia32_scatterdiv8df:
15790 IID = Intrinsic::x86_avx512_mask_scatter_qpd_512;
15792 case X86::BI__builtin_ia32_scatterdiv16sf:
15793 IID = Intrinsic::x86_avx512_mask_scatter_qps_512;
15795 case X86::BI__builtin_ia32_scattersiv8di:
15796 IID = Intrinsic::x86_avx512_mask_scatter_dpq_512;
15798 case X86::BI__builtin_ia32_scattersiv16si:
15799 IID = Intrinsic::x86_avx512_mask_scatter_dpi_512;
15801 case X86::BI__builtin_ia32_scatterdiv8di:
15802 IID = Intrinsic::x86_avx512_mask_scatter_qpq_512;
15804 case X86::BI__builtin_ia32_scatterdiv16si:
15805 IID = Intrinsic::x86_avx512_mask_scatter_qpi_512;
15807 case X86::BI__builtin_ia32_scatterdiv2df:
15808 IID = Intrinsic::x86_avx512_mask_scatterdiv2_df;
15810 case X86::BI__builtin_ia32_scatterdiv2di:
15811 IID = Intrinsic::x86_avx512_mask_scatterdiv2_di;
15813 case X86::BI__builtin_ia32_scatterdiv4df:
15814 IID = Intrinsic::x86_avx512_mask_scatterdiv4_df;
15816 case X86::BI__builtin_ia32_scatterdiv4di:
15817 IID = Intrinsic::x86_avx512_mask_scatterdiv4_di;
15819 case X86::BI__builtin_ia32_scatterdiv4sf:
15820 IID = Intrinsic::x86_avx512_mask_scatterdiv4_sf;
15822 case X86::BI__builtin_ia32_scatterdiv4si:
15823 IID = Intrinsic::x86_avx512_mask_scatterdiv4_si;
15825 case X86::BI__builtin_ia32_scatterdiv8sf:
15826 IID = Intrinsic::x86_avx512_mask_scatterdiv8_sf;
15828 case X86::BI__builtin_ia32_scatterdiv8si:
15829 IID = Intrinsic::x86_avx512_mask_scatterdiv8_si;
15831 case X86::BI__builtin_ia32_scattersiv2df:
15832 IID = Intrinsic::x86_avx512_mask_scattersiv2_df;
15834 case X86::BI__builtin_ia32_scattersiv2di:
15835 IID = Intrinsic::x86_avx512_mask_scattersiv2_di;
15837 case X86::BI__builtin_ia32_scattersiv4df:
15838 IID = Intrinsic::x86_avx512_mask_scattersiv4_df;
15840 case X86::BI__builtin_ia32_scattersiv4di:
15841 IID = Intrinsic::x86_avx512_mask_scattersiv4_di;
15843 case X86::BI__builtin_ia32_scattersiv4sf:
15844 IID = Intrinsic::x86_avx512_mask_scattersiv4_sf;
15846 case X86::BI__builtin_ia32_scattersiv4si:
15847 IID = Intrinsic::x86_avx512_mask_scattersiv4_si;
15849 case X86::BI__builtin_ia32_scattersiv8sf:
15850 IID = Intrinsic::x86_avx512_mask_scattersiv8_sf;
15852 case X86::BI__builtin_ia32_scattersiv8si:
15853 IID = Intrinsic::x86_avx512_mask_scattersiv8_si;
15857 unsigned MinElts = std::min(
15858 cast<llvm::FixedVectorType>(Ops[2]->getType())->getNumElements(),
15859 cast<llvm::FixedVectorType>(Ops[3]->getType())->getNumElements());
15862 return Builder.CreateCall(Intr, Ops);
15865 case X86::BI__builtin_ia32_vextractf128_pd256:
15866 case X86::BI__builtin_ia32_vextractf128_ps256:
15867 case X86::BI__builtin_ia32_vextractf128_si256:
15868 case X86::BI__builtin_ia32_extract128i256:
15869 case X86::BI__builtin_ia32_extractf64x4_mask:
15870 case X86::BI__builtin_ia32_extractf32x4_mask:
15871 case X86::BI__builtin_ia32_extracti64x4_mask:
15872 case X86::BI__builtin_ia32_extracti32x4_mask:
15873 case X86::BI__builtin_ia32_extractf32x8_mask:
15874 case X86::BI__builtin_ia32_extracti32x8_mask:
15875 case X86::BI__builtin_ia32_extractf32x4_256_mask:
15876 case X86::BI__builtin_ia32_extracti32x4_256_mask:
15877 case X86::BI__builtin_ia32_extractf64x2_256_mask:
15878 case X86::BI__builtin_ia32_extracti64x2_256_mask:
15879 case X86::BI__builtin_ia32_extractf64x2_512_mask:
15880 case X86::BI__builtin_ia32_extracti64x2_512_mask: {
15882 unsigned NumElts = DstTy->getNumElements();
15883 unsigned SrcNumElts =
15884 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
15885 unsigned SubVectors = SrcNumElts / NumElts;
15886 unsigned Index = cast<ConstantInt>(Ops[1])->getZExtValue();
15887 assert(llvm::isPowerOf2_32(SubVectors) &&
"Expected power of 2 subvectors");
15888 Index &= SubVectors - 1;
15892 for (
unsigned i = 0; i != NumElts; ++i)
15893 Indices[i] = i + Index;
15898 if (Ops.size() == 4)
15903 case X86::BI__builtin_ia32_vinsertf128_pd256:
15904 case X86::BI__builtin_ia32_vinsertf128_ps256:
15905 case X86::BI__builtin_ia32_vinsertf128_si256:
15906 case X86::BI__builtin_ia32_insert128i256:
15907 case X86::BI__builtin_ia32_insertf64x4:
15908 case X86::BI__builtin_ia32_insertf32x4:
15909 case X86::BI__builtin_ia32_inserti64x4:
15910 case X86::BI__builtin_ia32_inserti32x4:
15911 case X86::BI__builtin_ia32_insertf32x8:
15912 case X86::BI__builtin_ia32_inserti32x8:
15913 case X86::BI__builtin_ia32_insertf32x4_256:
15914 case X86::BI__builtin_ia32_inserti32x4_256:
15915 case X86::BI__builtin_ia32_insertf64x2_256:
15916 case X86::BI__builtin_ia32_inserti64x2_256:
15917 case X86::BI__builtin_ia32_insertf64x2_512:
15918 case X86::BI__builtin_ia32_inserti64x2_512: {
15919 unsigned DstNumElts =
15920 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
15921 unsigned SrcNumElts =
15922 cast<llvm::FixedVectorType>(Ops[1]->getType())->getNumElements();
15923 unsigned SubVectors = DstNumElts / SrcNumElts;
15924 unsigned Index = cast<ConstantInt>(Ops[2])->getZExtValue();
15925 assert(llvm::isPowerOf2_32(SubVectors) &&
"Expected power of 2 subvectors");
15926 Index &= SubVectors - 1;
15927 Index *= SrcNumElts;
15930 for (
unsigned i = 0; i != DstNumElts; ++i)
15931 Indices[i] = (i >= SrcNumElts) ? SrcNumElts + (i % SrcNumElts) : i;
15934 Ops[1],
ArrayRef(Indices, DstNumElts),
"widen");
15936 for (
unsigned i = 0; i != DstNumElts; ++i) {
15937 if (i >= Index && i < (Index + SrcNumElts))
15938 Indices[i] = (i - Index) + DstNumElts;
15943 return Builder.CreateShuffleVector(Ops[0], Op1,
15944 ArrayRef(Indices, DstNumElts),
"insert");
15946 case X86::BI__builtin_ia32_pmovqd512_mask:
15947 case X86::BI__builtin_ia32_pmovwb512_mask: {
15948 Value *Res =
Builder.CreateTrunc(Ops[0], Ops[1]->getType());
15951 case X86::BI__builtin_ia32_pmovdb512_mask:
15952 case X86::BI__builtin_ia32_pmovdw512_mask:
15953 case X86::BI__builtin_ia32_pmovqw512_mask: {
15954 if (
const auto *
C = dyn_cast<Constant>(Ops[2]))
15955 if (
C->isAllOnesValue())
15956 return Builder.CreateTrunc(Ops[0], Ops[1]->getType());
15959 switch (BuiltinID) {
15960 default: llvm_unreachable(
"Unsupported intrinsic!");
15961 case X86::BI__builtin_ia32_pmovdb512_mask:
15962 IID = Intrinsic::x86_avx512_mask_pmov_db_512;
15964 case X86::BI__builtin_ia32_pmovdw512_mask:
15965 IID = Intrinsic::x86_avx512_mask_pmov_dw_512;
15967 case X86::BI__builtin_ia32_pmovqw512_mask:
15968 IID = Intrinsic::x86_avx512_mask_pmov_qw_512;
15973 return Builder.CreateCall(Intr, Ops);
15975 case X86::BI__builtin_ia32_pblendw128:
15976 case X86::BI__builtin_ia32_blendpd:
15977 case X86::BI__builtin_ia32_blendps:
15978 case X86::BI__builtin_ia32_blendpd256:
15979 case X86::BI__builtin_ia32_blendps256:
15980 case X86::BI__builtin_ia32_pblendw256:
15981 case X86::BI__builtin_ia32_pblendd128:
15982 case X86::BI__builtin_ia32_pblendd256: {
15984 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
15985 unsigned Imm = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
15990 for (
unsigned i = 0; i != NumElts; ++i)
15991 Indices[i] = ((Imm >> (i % 8)) & 0x1) ? NumElts + i : i;
15993 return Builder.CreateShuffleVector(Ops[0], Ops[1],
15994 ArrayRef(Indices, NumElts),
"blend");
15996 case X86::BI__builtin_ia32_pshuflw:
15997 case X86::BI__builtin_ia32_pshuflw256:
15998 case X86::BI__builtin_ia32_pshuflw512: {
15999 uint32_t Imm = cast<llvm::ConstantInt>(Ops[1])->getZExtValue();
16000 auto *Ty = cast<llvm::FixedVectorType>(Ops[0]->getType());
16001 unsigned NumElts = Ty->getNumElements();
16004 Imm = (Imm & 0xff) * 0x01010101;
16007 for (
unsigned l = 0; l != NumElts; l += 8) {
16008 for (
unsigned i = 0; i != 4; ++i) {
16009 Indices[l + i] = l + (Imm & 3);
16012 for (
unsigned i = 4; i != 8; ++i)
16013 Indices[l + i] = l + i;
16016 return Builder.CreateShuffleVector(Ops[0],
ArrayRef(Indices, NumElts),
16019 case X86::BI__builtin_ia32_pshufhw:
16020 case X86::BI__builtin_ia32_pshufhw256:
16021 case X86::BI__builtin_ia32_pshufhw512: {
16022 uint32_t Imm = cast<llvm::ConstantInt>(Ops[1])->getZExtValue();
16023 auto *Ty = cast<llvm::FixedVectorType>(Ops[0]->getType());
16024 unsigned NumElts = Ty->getNumElements();
16027 Imm = (Imm & 0xff) * 0x01010101;
16030 for (
unsigned l = 0; l != NumElts; l += 8) {
16031 for (
unsigned i = 0; i != 4; ++i)
16032 Indices[l + i] = l + i;
16033 for (
unsigned i = 4; i != 8; ++i) {
16034 Indices[l + i] = l + 4 + (Imm & 3);
16039 return Builder.CreateShuffleVector(Ops[0],
ArrayRef(Indices, NumElts),
16042 case X86::BI__builtin_ia32_pshufd:
16043 case X86::BI__builtin_ia32_pshufd256:
16044 case X86::BI__builtin_ia32_pshufd512:
16045 case X86::BI__builtin_ia32_vpermilpd:
16046 case X86::BI__builtin_ia32_vpermilps:
16047 case X86::BI__builtin_ia32_vpermilpd256:
16048 case X86::BI__builtin_ia32_vpermilps256:
16049 case X86::BI__builtin_ia32_vpermilpd512:
16050 case X86::BI__builtin_ia32_vpermilps512: {
16051 uint32_t Imm = cast<llvm::ConstantInt>(Ops[1])->getZExtValue();
16052 auto *Ty = cast<llvm::FixedVectorType>(Ops[0]->getType());
16053 unsigned NumElts = Ty->getNumElements();
16054 unsigned NumLanes = Ty->getPrimitiveSizeInBits() / 128;
16055 unsigned NumLaneElts = NumElts / NumLanes;
16058 Imm = (Imm & 0xff) * 0x01010101;
16061 for (
unsigned l = 0; l != NumElts; l += NumLaneElts) {
16062 for (
unsigned i = 0; i != NumLaneElts; ++i) {
16063 Indices[i + l] = (Imm % NumLaneElts) + l;
16064 Imm /= NumLaneElts;
16068 return Builder.CreateShuffleVector(Ops[0],
ArrayRef(Indices, NumElts),
16071 case X86::BI__builtin_ia32_shufpd:
16072 case X86::BI__builtin_ia32_shufpd256:
16073 case X86::BI__builtin_ia32_shufpd512:
16074 case X86::BI__builtin_ia32_shufps:
16075 case X86::BI__builtin_ia32_shufps256:
16076 case X86::BI__builtin_ia32_shufps512: {
16077 uint32_t Imm = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
16078 auto *Ty = cast<llvm::FixedVectorType>(Ops[0]->getType());
16079 unsigned NumElts = Ty->getNumElements();
16080 unsigned NumLanes = Ty->getPrimitiveSizeInBits() / 128;
16081 unsigned NumLaneElts = NumElts / NumLanes;
16084 Imm = (Imm & 0xff) * 0x01010101;
16087 for (
unsigned l = 0; l != NumElts; l += NumLaneElts) {
16088 for (
unsigned i = 0; i != NumLaneElts; ++i) {
16089 unsigned Index = Imm % NumLaneElts;
16090 Imm /= NumLaneElts;
16091 if (i >= (NumLaneElts / 2))
16093 Indices[l + i] = l + Index;
16097 return Builder.CreateShuffleVector(Ops[0], Ops[1],
16098 ArrayRef(Indices, NumElts),
"shufp");
16100 case X86::BI__builtin_ia32_permdi256:
16101 case X86::BI__builtin_ia32_permdf256:
16102 case X86::BI__builtin_ia32_permdi512:
16103 case X86::BI__builtin_ia32_permdf512: {
16104 unsigned Imm = cast<llvm::ConstantInt>(Ops[1])->getZExtValue();
16105 auto *Ty = cast<llvm::FixedVectorType>(Ops[0]->getType());
16106 unsigned NumElts = Ty->getNumElements();
16110 for (
unsigned l = 0; l != NumElts; l += 4)
16111 for (
unsigned i = 0; i != 4; ++i)
16112 Indices[l + i] = l + ((Imm >> (2 * i)) & 0x3);
16114 return Builder.CreateShuffleVector(Ops[0],
ArrayRef(Indices, NumElts),
16117 case X86::BI__builtin_ia32_palignr128:
16118 case X86::BI__builtin_ia32_palignr256:
16119 case X86::BI__builtin_ia32_palignr512: {
16120 unsigned ShiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0xff;
16123 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
16124 assert(NumElts % 16 == 0);
16128 if (ShiftVal >= 32)
16133 if (ShiftVal > 16) {
16136 Ops[0] = llvm::Constant::getNullValue(Ops[0]->getType());
16141 for (
unsigned l = 0; l != NumElts; l += 16) {
16142 for (
unsigned i = 0; i != 16; ++i) {
16143 unsigned Idx = ShiftVal + i;
16145 Idx += NumElts - 16;
16146 Indices[l + i] = Idx + l;
16150 return Builder.CreateShuffleVector(Ops[1], Ops[0],
16151 ArrayRef(Indices, NumElts),
"palignr");
16153 case X86::BI__builtin_ia32_alignd128:
16154 case X86::BI__builtin_ia32_alignd256:
16155 case X86::BI__builtin_ia32_alignd512:
16156 case X86::BI__builtin_ia32_alignq128:
16157 case X86::BI__builtin_ia32_alignq256:
16158 case X86::BI__builtin_ia32_alignq512: {
16160 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
16161 unsigned ShiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0xff;
16164 ShiftVal &= NumElts - 1;
16167 for (
unsigned i = 0; i != NumElts; ++i)
16168 Indices[i] = i + ShiftVal;
16170 return Builder.CreateShuffleVector(Ops[1], Ops[0],
16171 ArrayRef(Indices, NumElts),
"valign");
16173 case X86::BI__builtin_ia32_shuf_f32x4_256:
16174 case X86::BI__builtin_ia32_shuf_f64x2_256:
16175 case X86::BI__builtin_ia32_shuf_i32x4_256:
16176 case X86::BI__builtin_ia32_shuf_i64x2_256:
16177 case X86::BI__builtin_ia32_shuf_f32x4:
16178 case X86::BI__builtin_ia32_shuf_f64x2:
16179 case X86::BI__builtin_ia32_shuf_i32x4:
16180 case X86::BI__builtin_ia32_shuf_i64x2: {
16181 unsigned Imm = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
16182 auto *Ty = cast<llvm::FixedVectorType>(Ops[0]->getType());
16183 unsigned NumElts = Ty->getNumElements();
16184 unsigned NumLanes = Ty->getPrimitiveSizeInBits() == 512 ? 4 : 2;
16185 unsigned NumLaneElts = NumElts / NumLanes;
16188 for (
unsigned l = 0; l != NumElts; l += NumLaneElts) {
16189 unsigned Index = (Imm % NumLanes) * NumLaneElts;
16191 if (l >= (NumElts / 2))
16193 for (
unsigned i = 0; i != NumLaneElts; ++i) {
16194 Indices[l + i] = Index + i;
16198 return Builder.CreateShuffleVector(Ops[0], Ops[1],
16199 ArrayRef(Indices, NumElts),
"shuf");
16202 case X86::BI__builtin_ia32_vperm2f128_pd256:
16203 case X86::BI__builtin_ia32_vperm2f128_ps256:
16204 case X86::BI__builtin_ia32_vperm2f128_si256:
16205 case X86::BI__builtin_ia32_permti256: {
16206 unsigned Imm = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
16208 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
16217 for (
unsigned l = 0; l != 2; ++l) {
16219 if (Imm & (1 << ((l * 4) + 3)))
16220 OutOps[l] = llvm::ConstantAggregateZero::get(Ops[0]->getType());
16221 else if (Imm & (1 << ((l * 4) + 1)))
16222 OutOps[l] = Ops[1];
16224 OutOps[l] = Ops[0];
16226 for (
unsigned i = 0; i != NumElts/2; ++i) {
16228 unsigned Idx = (l * NumElts) + i;
16231 if (Imm & (1 << (l * 4)))
16233 Indices[(l * (NumElts/2)) + i] = Idx;
16237 return Builder.CreateShuffleVector(OutOps[0], OutOps[1],
16238 ArrayRef(Indices, NumElts),
"vperm");
16241 case X86::BI__builtin_ia32_pslldqi128_byteshift:
16242 case X86::BI__builtin_ia32_pslldqi256_byteshift:
16243 case X86::BI__builtin_ia32_pslldqi512_byteshift: {
16244 unsigned ShiftVal = cast<llvm::ConstantInt>(Ops[1])->getZExtValue() & 0xff;
16245 auto *ResultType = cast<llvm::FixedVectorType>(Ops[0]->getType());
16247 unsigned NumElts = ResultType->getNumElements() * 8;
16250 if (ShiftVal >= 16)
16251 return llvm::Constant::getNullValue(ResultType);
16255 for (
unsigned l = 0; l != NumElts; l += 16) {
16256 for (
unsigned i = 0; i != 16; ++i) {
16257 unsigned Idx = NumElts + i - ShiftVal;
16258 if (Idx < NumElts) Idx -= NumElts - 16;
16259 Indices[l + i] = Idx + l;
16263 auto *VecTy = llvm::FixedVectorType::get(
Int8Ty, NumElts);
16265 Value *
Zero = llvm::Constant::getNullValue(VecTy);
16267 Zero, Cast,
ArrayRef(Indices, NumElts),
"pslldq");
16268 return Builder.CreateBitCast(SV, Ops[0]->getType(),
"cast");
16270 case X86::BI__builtin_ia32_psrldqi128_byteshift:
16271 case X86::BI__builtin_ia32_psrldqi256_byteshift:
16272 case X86::BI__builtin_ia32_psrldqi512_byteshift: {
16273 unsigned ShiftVal = cast<llvm::ConstantInt>(Ops[1])->getZExtValue() & 0xff;
16274 auto *ResultType = cast<llvm::FixedVectorType>(Ops[0]->getType());
16276 unsigned NumElts = ResultType->getNumElements() * 8;
16279 if (ShiftVal >= 16)
16280 return llvm::Constant::getNullValue(ResultType);
16284 for (
unsigned l = 0; l != NumElts; l += 16) {
16285 for (
unsigned i = 0; i != 16; ++i) {
16286 unsigned Idx = i + ShiftVal;
16287 if (Idx >= 16) Idx += NumElts - 16;
16288 Indices[l + i] = Idx + l;
16292 auto *VecTy = llvm::FixedVectorType::get(
Int8Ty, NumElts);
16294 Value *
Zero = llvm::Constant::getNullValue(VecTy);
16296 Cast, Zero,
ArrayRef(Indices, NumElts),
"psrldq");
16297 return Builder.CreateBitCast(SV, ResultType,
"cast");
16299 case X86::BI__builtin_ia32_kshiftliqi:
16300 case X86::BI__builtin_ia32_kshiftlihi:
16301 case X86::BI__builtin_ia32_kshiftlisi:
16302 case X86::BI__builtin_ia32_kshiftlidi: {
16303 unsigned ShiftVal = cast<llvm::ConstantInt>(Ops[1])->getZExtValue() & 0xff;
16304 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
16306 if (ShiftVal >= NumElts)
16307 return llvm::Constant::getNullValue(Ops[0]->getType());
16312 for (
unsigned i = 0; i != NumElts; ++i)
16313 Indices[i] = NumElts + i - ShiftVal;
16315 Value *
Zero = llvm::Constant::getNullValue(
In->getType());
16317 Zero, In,
ArrayRef(Indices, NumElts),
"kshiftl");
16318 return Builder.CreateBitCast(SV, Ops[0]->getType());
16320 case X86::BI__builtin_ia32_kshiftriqi:
16321 case X86::BI__builtin_ia32_kshiftrihi:
16322 case X86::BI__builtin_ia32_kshiftrisi:
16323 case X86::BI__builtin_ia32_kshiftridi: {
16324 unsigned ShiftVal = cast<llvm::ConstantInt>(Ops[1])->getZExtValue() & 0xff;
16325 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
16327 if (ShiftVal >= NumElts)
16328 return llvm::Constant::getNullValue(Ops[0]->getType());
16333 for (
unsigned i = 0; i != NumElts; ++i)
16334 Indices[i] = i + ShiftVal;
16336 Value *
Zero = llvm::Constant::getNullValue(
In->getType());
16338 In, Zero,
ArrayRef(Indices, NumElts),
"kshiftr");
16339 return Builder.CreateBitCast(SV, Ops[0]->getType());
16341 case X86::BI__builtin_ia32_movnti:
16342 case X86::BI__builtin_ia32_movnti64:
16343 case X86::BI__builtin_ia32_movntsd:
16344 case X86::BI__builtin_ia32_movntss: {
16345 llvm::MDNode *
Node = llvm::MDNode::get(
16348 Value *Ptr = Ops[0];
16349 Value *Src = Ops[1];
16352 if (BuiltinID == X86::BI__builtin_ia32_movntsd ||
16353 BuiltinID == X86::BI__builtin_ia32_movntss)
16354 Src =
Builder.CreateExtractElement(Src, (uint64_t)0,
"extract");
16358 SI->setMetadata(llvm::LLVMContext::MD_nontemporal,
Node);
16359 SI->setAlignment(llvm::Align(1));
16363 case X86::BI__builtin_ia32_vprotb:
16364 case X86::BI__builtin_ia32_vprotw:
16365 case X86::BI__builtin_ia32_vprotd:
16366 case X86::BI__builtin_ia32_vprotq:
16367 case X86::BI__builtin_ia32_vprotbi:
16368 case X86::BI__builtin_ia32_vprotwi:
16369 case X86::BI__builtin_ia32_vprotdi:
16370 case X86::BI__builtin_ia32_vprotqi:
16371 case X86::BI__builtin_ia32_prold128:
16372 case X86::BI__builtin_ia32_prold256:
16373 case X86::BI__builtin_ia32_prold512:
16374 case X86::BI__builtin_ia32_prolq128:
16375 case X86::BI__builtin_ia32_prolq256:
16376 case X86::BI__builtin_ia32_prolq512:
16377 case X86::BI__builtin_ia32_prolvd128:
16378 case X86::BI__builtin_ia32_prolvd256:
16379 case X86::BI__builtin_ia32_prolvd512:
16380 case X86::BI__builtin_ia32_prolvq128:
16381 case X86::BI__builtin_ia32_prolvq256:
16382 case X86::BI__builtin_ia32_prolvq512:
16384 case X86::BI__builtin_ia32_prord128:
16385 case X86::BI__builtin_ia32_prord256:
16386 case X86::BI__builtin_ia32_prord512:
16387 case X86::BI__builtin_ia32_prorq128:
16388 case X86::BI__builtin_ia32_prorq256:
16389 case X86::BI__builtin_ia32_prorq512:
16390 case X86::BI__builtin_ia32_prorvd128:
16391 case X86::BI__builtin_ia32_prorvd256:
16392 case X86::BI__builtin_ia32_prorvd512:
16393 case X86::BI__builtin_ia32_prorvq128:
16394 case X86::BI__builtin_ia32_prorvq256:
16395 case X86::BI__builtin_ia32_prorvq512:
16397 case X86::BI__builtin_ia32_selectb_128:
16398 case X86::BI__builtin_ia32_selectb_256:
16399 case X86::BI__builtin_ia32_selectb_512:
16400 case X86::BI__builtin_ia32_selectw_128:
16401 case X86::BI__builtin_ia32_selectw_256:
16402 case X86::BI__builtin_ia32_selectw_512:
16403 case X86::BI__builtin_ia32_selectd_128:
16404 case X86::BI__builtin_ia32_selectd_256:
16405 case X86::BI__builtin_ia32_selectd_512:
16406 case X86::BI__builtin_ia32_selectq_128:
16407 case X86::BI__builtin_ia32_selectq_256:
16408 case X86::BI__builtin_ia32_selectq_512:
16409 case X86::BI__builtin_ia32_selectph_128:
16410 case X86::BI__builtin_ia32_selectph_256:
16411 case X86::BI__builtin_ia32_selectph_512:
16412 case X86::BI__builtin_ia32_selectpbf_128:
16413 case X86::BI__builtin_ia32_selectpbf_256:
16414 case X86::BI__builtin_ia32_selectpbf_512:
16415 case X86::BI__builtin_ia32_selectps_128:
16416 case X86::BI__builtin_ia32_selectps_256:
16417 case X86::BI__builtin_ia32_selectps_512:
16418 case X86::BI__builtin_ia32_selectpd_128:
16419 case X86::BI__builtin_ia32_selectpd_256:
16420 case X86::BI__builtin_ia32_selectpd_512:
16422 case X86::BI__builtin_ia32_selectsh_128:
16423 case X86::BI__builtin_ia32_selectsbf_128:
16424 case X86::BI__builtin_ia32_selectss_128:
16425 case X86::BI__builtin_ia32_selectsd_128: {
16426 Value *A =
Builder.CreateExtractElement(Ops[1], (uint64_t)0);
16427 Value *B =
Builder.CreateExtractElement(Ops[2], (uint64_t)0);
16429 return Builder.CreateInsertElement(Ops[1], A, (uint64_t)0);
16431 case X86::BI__builtin_ia32_cmpb128_mask:
16432 case X86::BI__builtin_ia32_cmpb256_mask:
16433 case X86::BI__builtin_ia32_cmpb512_mask:
16434 case X86::BI__builtin_ia32_cmpw128_mask:
16435 case X86::BI__builtin_ia32_cmpw256_mask:
16436 case X86::BI__builtin_ia32_cmpw512_mask:
16437 case X86::BI__builtin_ia32_cmpd128_mask:
16438 case X86::BI__builtin_ia32_cmpd256_mask:
16439 case X86::BI__builtin_ia32_cmpd512_mask:
16440 case X86::BI__builtin_ia32_cmpq128_mask:
16441 case X86::BI__builtin_ia32_cmpq256_mask:
16442 case X86::BI__builtin_ia32_cmpq512_mask: {
16443 unsigned CC = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0x7;
16446 case X86::BI__builtin_ia32_ucmpb128_mask:
16447 case X86::BI__builtin_ia32_ucmpb256_mask:
16448 case X86::BI__builtin_ia32_ucmpb512_mask:
16449 case X86::BI__builtin_ia32_ucmpw128_mask:
16450 case X86::BI__builtin_ia32_ucmpw256_mask:
16451 case X86::BI__builtin_ia32_ucmpw512_mask:
16452 case X86::BI__builtin_ia32_ucmpd128_mask:
16453 case X86::BI__builtin_ia32_ucmpd256_mask:
16454 case X86::BI__builtin_ia32_ucmpd512_mask:
16455 case X86::BI__builtin_ia32_ucmpq128_mask:
16456 case X86::BI__builtin_ia32_ucmpq256_mask:
16457 case X86::BI__builtin_ia32_ucmpq512_mask: {
16458 unsigned CC = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0x7;
16461 case X86::BI__builtin_ia32_vpcomb:
16462 case X86::BI__builtin_ia32_vpcomw:
16463 case X86::BI__builtin_ia32_vpcomd:
16464 case X86::BI__builtin_ia32_vpcomq:
16466 case X86::BI__builtin_ia32_vpcomub:
16467 case X86::BI__builtin_ia32_vpcomuw:
16468 case X86::BI__builtin_ia32_vpcomud:
16469 case X86::BI__builtin_ia32_vpcomuq:
16472 case X86::BI__builtin_ia32_kortestcqi:
16473 case X86::BI__builtin_ia32_kortestchi:
16474 case X86::BI__builtin_ia32_kortestcsi:
16475 case X86::BI__builtin_ia32_kortestcdi: {
16477 Value *
C = llvm::Constant::getAllOnesValue(Ops[0]->getType());
16481 case X86::BI__builtin_ia32_kortestzqi:
16482 case X86::BI__builtin_ia32_kortestzhi:
16483 case X86::BI__builtin_ia32_kortestzsi:
16484 case X86::BI__builtin_ia32_kortestzdi: {
16486 Value *
C = llvm::Constant::getNullValue(Ops[0]->getType());
16491 case X86::BI__builtin_ia32_ktestcqi:
16492 case X86::BI__builtin_ia32_ktestzqi:
16493 case X86::BI__builtin_ia32_ktestchi:
16494 case X86::BI__builtin_ia32_ktestzhi:
16495 case X86::BI__builtin_ia32_ktestcsi:
16496 case X86::BI__builtin_ia32_ktestzsi:
16497 case X86::BI__builtin_ia32_ktestcdi:
16498 case X86::BI__builtin_ia32_ktestzdi: {
16500 switch (BuiltinID) {
16501 default: llvm_unreachable(
"Unsupported intrinsic!");
16502 case X86::BI__builtin_ia32_ktestcqi:
16503 IID = Intrinsic::x86_avx512_ktestc_b;
16505 case X86::BI__builtin_ia32_ktestzqi:
16506 IID = Intrinsic::x86_avx512_ktestz_b;
16508 case X86::BI__builtin_ia32_ktestchi:
16509 IID = Intrinsic::x86_avx512_ktestc_w;
16511 case X86::BI__builtin_ia32_ktestzhi:
16512 IID = Intrinsic::x86_avx512_ktestz_w;
16514 case X86::BI__builtin_ia32_ktestcsi:
16515 IID = Intrinsic::x86_avx512_ktestc_d;
16517 case X86::BI__builtin_ia32_ktestzsi:
16518 IID = Intrinsic::x86_avx512_ktestz_d;
16520 case X86::BI__builtin_ia32_ktestcdi:
16521 IID = Intrinsic::x86_avx512_ktestc_q;
16523 case X86::BI__builtin_ia32_ktestzdi:
16524 IID = Intrinsic::x86_avx512_ktestz_q;
16528 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
16532 return Builder.CreateCall(Intr, {LHS, RHS});
16535 case X86::BI__builtin_ia32_kaddqi:
16536 case X86::BI__builtin_ia32_kaddhi:
16537 case X86::BI__builtin_ia32_kaddsi:
16538 case X86::BI__builtin_ia32_kadddi: {
16540 switch (BuiltinID) {
16541 default: llvm_unreachable(
"Unsupported intrinsic!");
16542 case X86::BI__builtin_ia32_kaddqi:
16543 IID = Intrinsic::x86_avx512_kadd_b;
16545 case X86::BI__builtin_ia32_kaddhi:
16546 IID = Intrinsic::x86_avx512_kadd_w;
16548 case X86::BI__builtin_ia32_kaddsi:
16549 IID = Intrinsic::x86_avx512_kadd_d;
16551 case X86::BI__builtin_ia32_kadddi:
16552 IID = Intrinsic::x86_avx512_kadd_q;
16556 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
16561 return Builder.CreateBitCast(Res, Ops[0]->getType());
16563 case X86::BI__builtin_ia32_kandqi:
16564 case X86::BI__builtin_ia32_kandhi:
16565 case X86::BI__builtin_ia32_kandsi:
16566 case X86::BI__builtin_ia32_kanddi:
16568 case X86::BI__builtin_ia32_kandnqi:
16569 case X86::BI__builtin_ia32_kandnhi:
16570 case X86::BI__builtin_ia32_kandnsi:
16571 case X86::BI__builtin_ia32_kandndi:
16573 case X86::BI__builtin_ia32_korqi:
16574 case X86::BI__builtin_ia32_korhi:
16575 case X86::BI__builtin_ia32_korsi:
16576 case X86::BI__builtin_ia32_kordi:
16578 case X86::BI__builtin_ia32_kxnorqi:
16579 case X86::BI__builtin_ia32_kxnorhi:
16580 case X86::BI__builtin_ia32_kxnorsi:
16581 case X86::BI__builtin_ia32_kxnordi:
16583 case X86::BI__builtin_ia32_kxorqi:
16584 case X86::BI__builtin_ia32_kxorhi:
16585 case X86::BI__builtin_ia32_kxorsi:
16586 case X86::BI__builtin_ia32_kxordi:
16588 case X86::BI__builtin_ia32_knotqi:
16589 case X86::BI__builtin_ia32_knothi:
16590 case X86::BI__builtin_ia32_knotsi:
16591 case X86::BI__builtin_ia32_knotdi: {
16592 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
16595 Ops[0]->getType());
16597 case X86::BI__builtin_ia32_kmovb:
16598 case X86::BI__builtin_ia32_kmovw:
16599 case X86::BI__builtin_ia32_kmovd:
16600 case X86::BI__builtin_ia32_kmovq: {
16604 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
16606 return Builder.CreateBitCast(Res, Ops[0]->getType());
16609 case X86::BI__builtin_ia32_kunpckdi:
16610 case X86::BI__builtin_ia32_kunpcksi:
16611 case X86::BI__builtin_ia32_kunpckhi: {
16612 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
16616 for (
unsigned i = 0; i != NumElts; ++i)
16621 LHS =
Builder.CreateShuffleVector(LHS, LHS,
ArrayRef(Indices, NumElts / 2));
16622 RHS =
Builder.CreateShuffleVector(RHS, RHS,
ArrayRef(Indices, NumElts / 2));
16627 return Builder.CreateBitCast(Res, Ops[0]->getType());
16630 case X86::BI__builtin_ia32_vplzcntd_128:
16631 case X86::BI__builtin_ia32_vplzcntd_256:
16632 case X86::BI__builtin_ia32_vplzcntd_512:
16633 case X86::BI__builtin_ia32_vplzcntq_128:
16634 case X86::BI__builtin_ia32_vplzcntq_256:
16635 case X86::BI__builtin_ia32_vplzcntq_512: {
16639 case X86::BI__builtin_ia32_sqrtss:
16640 case X86::BI__builtin_ia32_sqrtsd: {
16641 Value *A =
Builder.CreateExtractElement(Ops[0], (uint64_t)0);
16643 if (
Builder.getIsFPConstrained()) {
16644 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
16647 A =
Builder.CreateConstrainedFPCall(F, {A});
16650 A =
Builder.CreateCall(F, {A});
16652 return Builder.CreateInsertElement(Ops[0], A, (uint64_t)0);
16654 case X86::BI__builtin_ia32_sqrtsh_round_mask:
16655 case X86::BI__builtin_ia32_sqrtsd_round_mask:
16656 case X86::BI__builtin_ia32_sqrtss_round_mask: {
16657 unsigned CC = cast<llvm::ConstantInt>(Ops[4])->getZExtValue();
16663 switch (BuiltinID) {
16665 llvm_unreachable(
"Unsupported intrinsic!");
16666 case X86::BI__builtin_ia32_sqrtsh_round_mask:
16667 IID = Intrinsic::x86_avx512fp16_mask_sqrt_sh;
16669 case X86::BI__builtin_ia32_sqrtsd_round_mask:
16670 IID = Intrinsic::x86_avx512_mask_sqrt_sd;
16672 case X86::BI__builtin_ia32_sqrtss_round_mask:
16673 IID = Intrinsic::x86_avx512_mask_sqrt_ss;
16678 Value *A =
Builder.CreateExtractElement(Ops[1], (uint64_t)0);
16680 if (
Builder.getIsFPConstrained()) {
16681 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
16684 A =
Builder.CreateConstrainedFPCall(F, A);
16687 A =
Builder.CreateCall(F, A);
16689 Value *Src =
Builder.CreateExtractElement(Ops[2], (uint64_t)0);
16691 return Builder.CreateInsertElement(Ops[0], A, (uint64_t)0);
16693 case X86::BI__builtin_ia32_sqrtpd256:
16694 case X86::BI__builtin_ia32_sqrtpd:
16695 case X86::BI__builtin_ia32_sqrtps256:
16696 case X86::BI__builtin_ia32_sqrtps:
16697 case X86::BI__builtin_ia32_sqrtph256:
16698 case X86::BI__builtin_ia32_sqrtph:
16699 case X86::BI__builtin_ia32_sqrtph512:
16700 case X86::BI__builtin_ia32_vsqrtnepbf16256:
16701 case X86::BI__builtin_ia32_vsqrtnepbf16:
16702 case X86::BI__builtin_ia32_vsqrtnepbf16512:
16703 case X86::BI__builtin_ia32_sqrtps512:
16704 case X86::BI__builtin_ia32_sqrtpd512: {
16705 if (Ops.size() == 2) {
16706 unsigned CC = cast<llvm::ConstantInt>(Ops[1])->getZExtValue();
16712 switch (BuiltinID) {
16714 llvm_unreachable(
"Unsupported intrinsic!");
16715 case X86::BI__builtin_ia32_sqrtph512:
16716 IID = Intrinsic::x86_avx512fp16_sqrt_ph_512;
16718 case X86::BI__builtin_ia32_sqrtps512:
16719 IID = Intrinsic::x86_avx512_sqrt_ps_512;
16721 case X86::BI__builtin_ia32_sqrtpd512:
16722 IID = Intrinsic::x86_avx512_sqrt_pd_512;
16728 if (
Builder.getIsFPConstrained()) {
16729 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
16731 Ops[0]->getType());
16732 return Builder.CreateConstrainedFPCall(F, Ops[0]);
16735 return Builder.CreateCall(F, Ops[0]);
16739 case X86::BI__builtin_ia32_pmuludq128:
16740 case X86::BI__builtin_ia32_pmuludq256:
16741 case X86::BI__builtin_ia32_pmuludq512:
16744 case X86::BI__builtin_ia32_pmuldq128:
16745 case X86::BI__builtin_ia32_pmuldq256:
16746 case X86::BI__builtin_ia32_pmuldq512:
16749 case X86::BI__builtin_ia32_pternlogd512_mask:
16750 case X86::BI__builtin_ia32_pternlogq512_mask:
16751 case X86::BI__builtin_ia32_pternlogd128_mask:
16752 case X86::BI__builtin_ia32_pternlogd256_mask:
16753 case X86::BI__builtin_ia32_pternlogq128_mask:
16754 case X86::BI__builtin_ia32_pternlogq256_mask:
16757 case X86::BI__builtin_ia32_pternlogd512_maskz:
16758 case X86::BI__builtin_ia32_pternlogq512_maskz:
16759 case X86::BI__builtin_ia32_pternlogd128_maskz:
16760 case X86::BI__builtin_ia32_pternlogd256_maskz:
16761 case X86::BI__builtin_ia32_pternlogq128_maskz:
16762 case X86::BI__builtin_ia32_pternlogq256_maskz:
16765 case X86::BI__builtin_ia32_vpshldd128:
16766 case X86::BI__builtin_ia32_vpshldd256:
16767 case X86::BI__builtin_ia32_vpshldd512:
16768 case X86::BI__builtin_ia32_vpshldq128:
16769 case X86::BI__builtin_ia32_vpshldq256:
16770 case X86::BI__builtin_ia32_vpshldq512:
16771 case X86::BI__builtin_ia32_vpshldw128:
16772 case X86::BI__builtin_ia32_vpshldw256:
16773 case X86::BI__builtin_ia32_vpshldw512:
16776 case X86::BI__builtin_ia32_vpshrdd128:
16777 case X86::BI__builtin_ia32_vpshrdd256:
16778 case X86::BI__builtin_ia32_vpshrdd512:
16779 case X86::BI__builtin_ia32_vpshrdq128:
16780 case X86::BI__builtin_ia32_vpshrdq256:
16781 case X86::BI__builtin_ia32_vpshrdq512:
16782 case X86::BI__builtin_ia32_vpshrdw128:
16783 case X86::BI__builtin_ia32_vpshrdw256:
16784 case X86::BI__builtin_ia32_vpshrdw512:
16788 case X86::BI__builtin_ia32_vpshldvd128:
16789 case X86::BI__builtin_ia32_vpshldvd256:
16790 case X86::BI__builtin_ia32_vpshldvd512:
16791 case X86::BI__builtin_ia32_vpshldvq128:
16792 case X86::BI__builtin_ia32_vpshldvq256:
16793 case X86::BI__builtin_ia32_vpshldvq512:
16794 case X86::BI__builtin_ia32_vpshldvw128:
16795 case X86::BI__builtin_ia32_vpshldvw256:
16796 case X86::BI__builtin_ia32_vpshldvw512:
16799 case X86::BI__builtin_ia32_vpshrdvd128:
16800 case X86::BI__builtin_ia32_vpshrdvd256:
16801 case X86::BI__builtin_ia32_vpshrdvd512:
16802 case X86::BI__builtin_ia32_vpshrdvq128:
16803 case X86::BI__builtin_ia32_vpshrdvq256:
16804 case X86::BI__builtin_ia32_vpshrdvq512:
16805 case X86::BI__builtin_ia32_vpshrdvw128:
16806 case X86::BI__builtin_ia32_vpshrdvw256:
16807 case X86::BI__builtin_ia32_vpshrdvw512:
16812 case X86::BI__builtin_ia32_reduce_fadd_pd512:
16813 case X86::BI__builtin_ia32_reduce_fadd_ps512:
16814 case X86::BI__builtin_ia32_reduce_fadd_ph512:
16815 case X86::BI__builtin_ia32_reduce_fadd_ph256:
16816 case X86::BI__builtin_ia32_reduce_fadd_ph128: {
16819 IRBuilder<>::FastMathFlagGuard FMFGuard(
Builder);
16820 Builder.getFastMathFlags().setAllowReassoc();
16821 return Builder.CreateCall(F, {Ops[0], Ops[1]});
16823 case X86::BI__builtin_ia32_reduce_fmul_pd512:
16824 case X86::BI__builtin_ia32_reduce_fmul_ps512:
16825 case X86::BI__builtin_ia32_reduce_fmul_ph512:
16826 case X86::BI__builtin_ia32_reduce_fmul_ph256:
16827 case X86::BI__builtin_ia32_reduce_fmul_ph128: {
16830 IRBuilder<>::FastMathFlagGuard FMFGuard(
Builder);
16831 Builder.getFastMathFlags().setAllowReassoc();
16832 return Builder.CreateCall(F, {Ops[0], Ops[1]});
16834 case X86::BI__builtin_ia32_reduce_fmax_pd512:
16835 case X86::BI__builtin_ia32_reduce_fmax_ps512:
16836 case X86::BI__builtin_ia32_reduce_fmax_ph512:
16837 case X86::BI__builtin_ia32_reduce_fmax_ph256:
16838 case X86::BI__builtin_ia32_reduce_fmax_ph128: {
16841 IRBuilder<>::FastMathFlagGuard FMFGuard(
Builder);
16842 Builder.getFastMathFlags().setNoNaNs();
16843 return Builder.CreateCall(F, {Ops[0]});
16845 case X86::BI__builtin_ia32_reduce_fmin_pd512:
16846 case X86::BI__builtin_ia32_reduce_fmin_ps512:
16847 case X86::BI__builtin_ia32_reduce_fmin_ph512:
16848 case X86::BI__builtin_ia32_reduce_fmin_ph256:
16849 case X86::BI__builtin_ia32_reduce_fmin_ph128: {
16852 IRBuilder<>::FastMathFlagGuard FMFGuard(
Builder);
16853 Builder.getFastMathFlags().setNoNaNs();
16854 return Builder.CreateCall(F, {Ops[0]});
16857 case X86::BI__builtin_ia32_rdrand16_step:
16858 case X86::BI__builtin_ia32_rdrand32_step:
16859 case X86::BI__builtin_ia32_rdrand64_step:
16860 case X86::BI__builtin_ia32_rdseed16_step:
16861 case X86::BI__builtin_ia32_rdseed32_step:
16862 case X86::BI__builtin_ia32_rdseed64_step: {
16864 switch (BuiltinID) {
16865 default: llvm_unreachable(
"Unsupported intrinsic!");
16866 case X86::BI__builtin_ia32_rdrand16_step:
16867 ID = Intrinsic::x86_rdrand_16;
16869 case X86::BI__builtin_ia32_rdrand32_step:
16870 ID = Intrinsic::x86_rdrand_32;
16872 case X86::BI__builtin_ia32_rdrand64_step:
16873 ID = Intrinsic::x86_rdrand_64;
16875 case X86::BI__builtin_ia32_rdseed16_step:
16876 ID = Intrinsic::x86_rdseed_16;
16878 case X86::BI__builtin_ia32_rdseed32_step:
16879 ID = Intrinsic::x86_rdseed_32;
16881 case X86::BI__builtin_ia32_rdseed64_step:
16882 ID = Intrinsic::x86_rdseed_64;
16891 case X86::BI__builtin_ia32_addcarryx_u32:
16892 case X86::BI__builtin_ia32_addcarryx_u64:
16893 case X86::BI__builtin_ia32_subborrow_u32:
16894 case X86::BI__builtin_ia32_subborrow_u64: {
16896 switch (BuiltinID) {
16897 default: llvm_unreachable(
"Unsupported intrinsic!");
16898 case X86::BI__builtin_ia32_addcarryx_u32:
16899 IID = Intrinsic::x86_addcarry_32;
16901 case X86::BI__builtin_ia32_addcarryx_u64:
16902 IID = Intrinsic::x86_addcarry_64;
16904 case X86::BI__builtin_ia32_subborrow_u32:
16905 IID = Intrinsic::x86_subborrow_32;
16907 case X86::BI__builtin_ia32_subborrow_u64:
16908 IID = Intrinsic::x86_subborrow_64;
16913 { Ops[0], Ops[1], Ops[2] });
16919 case X86::BI__builtin_ia32_fpclassps128_mask:
16920 case X86::BI__builtin_ia32_fpclassps256_mask:
16921 case X86::BI__builtin_ia32_fpclassps512_mask:
16922 case X86::BI__builtin_ia32_vfpclasspbf16128_mask:
16923 case X86::BI__builtin_ia32_vfpclasspbf16256_mask:
16924 case X86::BI__builtin_ia32_vfpclasspbf16512_mask:
16925 case X86::BI__builtin_ia32_fpclassph128_mask:
16926 case X86::BI__builtin_ia32_fpclassph256_mask:
16927 case X86::BI__builtin_ia32_fpclassph512_mask:
16928 case X86::BI__builtin_ia32_fpclasspd128_mask:
16929 case X86::BI__builtin_ia32_fpclasspd256_mask:
16930 case X86::BI__builtin_ia32_fpclasspd512_mask: {
16932 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
16933 Value *MaskIn = Ops[2];
16934 Ops.erase(&Ops[2]);
16937 switch (BuiltinID) {
16938 default: llvm_unreachable(
"Unsupported intrinsic!");
16939 case X86::BI__builtin_ia32_vfpclasspbf16128_mask:
16940 ID = Intrinsic::x86_avx10_fpclass_nepbf16_128;
16942 case X86::BI__builtin_ia32_vfpclasspbf16256_mask:
16943 ID = Intrinsic::x86_avx10_fpclass_nepbf16_256;
16945 case X86::BI__builtin_ia32_vfpclasspbf16512_mask:
16946 ID = Intrinsic::x86_avx10_fpclass_nepbf16_512;
16948 case X86::BI__builtin_ia32_fpclassph128_mask:
16949 ID = Intrinsic::x86_avx512fp16_fpclass_ph_128;
16951 case X86::BI__builtin_ia32_fpclassph256_mask:
16952 ID = Intrinsic::x86_avx512fp16_fpclass_ph_256;
16954 case X86::BI__builtin_ia32_fpclassph512_mask:
16955 ID = Intrinsic::x86_avx512fp16_fpclass_ph_512;
16957 case X86::BI__builtin_ia32_fpclassps128_mask:
16958 ID = Intrinsic::x86_avx512_fpclass_ps_128;
16960 case X86::BI__builtin_ia32_fpclassps256_mask:
16961 ID = Intrinsic::x86_avx512_fpclass_ps_256;
16963 case X86::BI__builtin_ia32_fpclassps512_mask:
16964 ID = Intrinsic::x86_avx512_fpclass_ps_512;
16966 case X86::BI__builtin_ia32_fpclasspd128_mask:
16967 ID = Intrinsic::x86_avx512_fpclass_pd_128;
16969 case X86::BI__builtin_ia32_fpclasspd256_mask:
16970 ID = Intrinsic::x86_avx512_fpclass_pd_256;
16972 case X86::BI__builtin_ia32_fpclasspd512_mask:
16973 ID = Intrinsic::x86_avx512_fpclass_pd_512;
16981 case X86::BI__builtin_ia32_vp2intersect_q_512:
16982 case X86::BI__builtin_ia32_vp2intersect_q_256:
16983 case X86::BI__builtin_ia32_vp2intersect_q_128:
16984 case X86::BI__builtin_ia32_vp2intersect_d_512:
16985 case X86::BI__builtin_ia32_vp2intersect_d_256:
16986 case X86::BI__builtin_ia32_vp2intersect_d_128: {
16988 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
16991 switch (BuiltinID) {
16992 default: llvm_unreachable(
"Unsupported intrinsic!");
16993 case X86::BI__builtin_ia32_vp2intersect_q_512:
16994 ID = Intrinsic::x86_avx512_vp2intersect_q_512;
16996 case X86::BI__builtin_ia32_vp2intersect_q_256:
16997 ID = Intrinsic::x86_avx512_vp2intersect_q_256;
16999 case X86::BI__builtin_ia32_vp2intersect_q_128:
17000 ID = Intrinsic::x86_avx512_vp2intersect_q_128;
17002 case X86::BI__builtin_ia32_vp2intersect_d_512:
17003 ID = Intrinsic::x86_avx512_vp2intersect_d_512;
17005 case X86::BI__builtin_ia32_vp2intersect_d_256:
17006 ID = Intrinsic::x86_avx512_vp2intersect_d_256;
17008 case X86::BI__builtin_ia32_vp2intersect_d_128:
17009 ID = Intrinsic::x86_avx512_vp2intersect_d_128;
17023 case X86::BI__builtin_ia32_vpmultishiftqb128:
17024 case X86::BI__builtin_ia32_vpmultishiftqb256:
17025 case X86::BI__builtin_ia32_vpmultishiftqb512: {
17027 switch (BuiltinID) {
17028 default: llvm_unreachable(
"Unsupported intrinsic!");
17029 case X86::BI__builtin_ia32_vpmultishiftqb128:
17030 ID = Intrinsic::x86_avx512_pmultishift_qb_128;
17032 case X86::BI__builtin_ia32_vpmultishiftqb256:
17033 ID = Intrinsic::x86_avx512_pmultishift_qb_256;
17035 case X86::BI__builtin_ia32_vpmultishiftqb512:
17036 ID = Intrinsic::x86_avx512_pmultishift_qb_512;
17043 case X86::BI__builtin_ia32_vpshufbitqmb128_mask:
17044 case X86::BI__builtin_ia32_vpshufbitqmb256_mask:
17045 case X86::BI__builtin_ia32_vpshufbitqmb512_mask: {
17047 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
17048 Value *MaskIn = Ops[2];
17049 Ops.erase(&Ops[2]);
17052 switch (BuiltinID) {
17053 default: llvm_unreachable(
"Unsupported intrinsic!");
17054 case X86::BI__builtin_ia32_vpshufbitqmb128_mask:
17055 ID = Intrinsic::x86_avx512_vpshufbitqmb_128;
17057 case X86::BI__builtin_ia32_vpshufbitqmb256_mask:
17058 ID = Intrinsic::x86_avx512_vpshufbitqmb_256;
17060 case X86::BI__builtin_ia32_vpshufbitqmb512_mask:
17061 ID = Intrinsic::x86_avx512_vpshufbitqmb_512;
17070 case X86::BI__builtin_ia32_cmpeqps:
17071 case X86::BI__builtin_ia32_cmpeqpd:
17072 return getVectorFCmpIR(CmpInst::FCMP_OEQ,
false);
17073 case X86::BI__builtin_ia32_cmpltps:
17074 case X86::BI__builtin_ia32_cmpltpd:
17075 return getVectorFCmpIR(CmpInst::FCMP_OLT,
true);
17076 case X86::BI__builtin_ia32_cmpleps:
17077 case X86::BI__builtin_ia32_cmplepd:
17078 return getVectorFCmpIR(CmpInst::FCMP_OLE,
true);
17079 case X86::BI__builtin_ia32_cmpunordps:
17080 case X86::BI__builtin_ia32_cmpunordpd:
17081 return getVectorFCmpIR(CmpInst::FCMP_UNO,
false);
17082 case X86::BI__builtin_ia32_cmpneqps:
17083 case X86::BI__builtin_ia32_cmpneqpd:
17084 return getVectorFCmpIR(CmpInst::FCMP_UNE,
false);
17085 case X86::BI__builtin_ia32_cmpnltps:
17086 case X86::BI__builtin_ia32_cmpnltpd:
17087 return getVectorFCmpIR(CmpInst::FCMP_UGE,
true);
17088 case X86::BI__builtin_ia32_cmpnleps:
17089 case X86::BI__builtin_ia32_cmpnlepd:
17090 return getVectorFCmpIR(CmpInst::FCMP_UGT,
true);
17091 case X86::BI__builtin_ia32_cmpordps:
17092 case X86::BI__builtin_ia32_cmpordpd:
17093 return getVectorFCmpIR(CmpInst::FCMP_ORD,
false);
17094 case X86::BI__builtin_ia32_cmpph128_mask:
17095 case X86::BI__builtin_ia32_cmpph256_mask:
17096 case X86::BI__builtin_ia32_cmpph512_mask:
17097 case X86::BI__builtin_ia32_cmpps128_mask:
17098 case X86::BI__builtin_ia32_cmpps256_mask:
17099 case X86::BI__builtin_ia32_cmpps512_mask:
17100 case X86::BI__builtin_ia32_cmppd128_mask:
17101 case X86::BI__builtin_ia32_cmppd256_mask:
17102 case X86::BI__builtin_ia32_cmppd512_mask:
17103 case X86::BI__builtin_ia32_vcmppd256_round_mask:
17104 case X86::BI__builtin_ia32_vcmpps256_round_mask:
17105 case X86::BI__builtin_ia32_vcmpph256_round_mask:
17106 case X86::BI__builtin_ia32_vcmppbf16512_mask:
17107 case X86::BI__builtin_ia32_vcmppbf16256_mask:
17108 case X86::BI__builtin_ia32_vcmppbf16128_mask:
17111 case X86::BI__builtin_ia32_cmpps:
17112 case X86::BI__builtin_ia32_cmpps256:
17113 case X86::BI__builtin_ia32_cmppd:
17114 case X86::BI__builtin_ia32_cmppd256: {
17122 unsigned CC = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0x1f;
17127 FCmpInst::Predicate Pred;
17131 switch (CC & 0xf) {
17132 case 0x00: Pred = FCmpInst::FCMP_OEQ; IsSignaling =
false;
break;
17133 case 0x01: Pred = FCmpInst::FCMP_OLT; IsSignaling =
true;
break;
17134 case 0x02: Pred = FCmpInst::FCMP_OLE; IsSignaling =
true;
break;
17135 case 0x03: Pred = FCmpInst::FCMP_UNO; IsSignaling =
false;
break;
17136 case 0x04: Pred = FCmpInst::FCMP_UNE; IsSignaling =
false;
break;
17137 case 0x05: Pred = FCmpInst::FCMP_UGE; IsSignaling =
true;
break;
17138 case 0x06: Pred = FCmpInst::FCMP_UGT; IsSignaling =
true;
break;
17139 case 0x07: Pred = FCmpInst::FCMP_ORD; IsSignaling =
false;
break;
17140 case 0x08: Pred = FCmpInst::FCMP_UEQ; IsSignaling =
false;
break;
17141 case 0x09: Pred = FCmpInst::FCMP_ULT; IsSignaling =
true;
break;
17142 case 0x0a: Pred = FCmpInst::FCMP_ULE; IsSignaling =
true;
break;
17143 case 0x0b: Pred = FCmpInst::FCMP_FALSE; IsSignaling =
false;
break;
17144 case 0x0c: Pred = FCmpInst::FCMP_ONE; IsSignaling =
false;
break;
17145 case 0x0d: Pred = FCmpInst::FCMP_OGE; IsSignaling =
true;
break;
17146 case 0x0e: Pred = FCmpInst::FCMP_OGT; IsSignaling =
true;
break;
17147 case 0x0f: Pred = FCmpInst::FCMP_TRUE; IsSignaling =
false;
break;
17148 default: llvm_unreachable(
"Unhandled CC");
17153 IsSignaling = !IsSignaling;
17160 if (
Builder.getIsFPConstrained() &&
17161 (Pred == FCmpInst::FCMP_TRUE || Pred == FCmpInst::FCMP_FALSE ||
17165 switch (BuiltinID) {
17166 default: llvm_unreachable(
"Unexpected builtin");
17167 case X86::BI__builtin_ia32_cmpps:
17168 IID = Intrinsic::x86_sse_cmp_ps;
17170 case X86::BI__builtin_ia32_cmpps256:
17171 IID = Intrinsic::x86_avx_cmp_ps_256;
17173 case X86::BI__builtin_ia32_cmppd:
17174 IID = Intrinsic::x86_sse2_cmp_pd;
17176 case X86::BI__builtin_ia32_cmppd256:
17177 IID = Intrinsic::x86_avx_cmp_pd_256;
17179 case X86::BI__builtin_ia32_cmpph128_mask:
17180 IID = Intrinsic::x86_avx512fp16_mask_cmp_ph_128;
17182 case X86::BI__builtin_ia32_cmpph256_mask:
17183 IID = Intrinsic::x86_avx512fp16_mask_cmp_ph_256;
17185 case X86::BI__builtin_ia32_cmpph512_mask:
17186 IID = Intrinsic::x86_avx512fp16_mask_cmp_ph_512;
17188 case X86::BI__builtin_ia32_cmpps512_mask:
17189 IID = Intrinsic::x86_avx512_mask_cmp_ps_512;
17191 case X86::BI__builtin_ia32_cmppd512_mask:
17192 IID = Intrinsic::x86_avx512_mask_cmp_pd_512;
17194 case X86::BI__builtin_ia32_cmpps128_mask:
17195 IID = Intrinsic::x86_avx512_mask_cmp_ps_128;
17197 case X86::BI__builtin_ia32_cmpps256_mask:
17198 IID = Intrinsic::x86_avx512_mask_cmp_ps_256;
17200 case X86::BI__builtin_ia32_cmppd128_mask:
17201 IID = Intrinsic::x86_avx512_mask_cmp_pd_128;
17203 case X86::BI__builtin_ia32_cmppd256_mask:
17204 IID = Intrinsic::x86_avx512_mask_cmp_pd_256;
17211 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
17217 return Builder.CreateCall(Intr, Ops);
17228 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
17231 Cmp =
Builder.CreateFCmpS(Pred, Ops[0], Ops[1]);
17233 Cmp =
Builder.CreateFCmp(Pred, Ops[0], Ops[1]);
17237 return getVectorFCmpIR(Pred, IsSignaling);
17241 case X86::BI__builtin_ia32_cmpeqss:
17242 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 0);
17243 case X86::BI__builtin_ia32_cmpltss:
17244 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 1);
17245 case X86::BI__builtin_ia32_cmpless:
17246 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 2);
17247 case X86::BI__builtin_ia32_cmpunordss:
17248 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 3);
17249 case X86::BI__builtin_ia32_cmpneqss:
17250 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 4);
17251 case X86::BI__builtin_ia32_cmpnltss:
17252 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 5);
17253 case X86::BI__builtin_ia32_cmpnless:
17254 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 6);
17255 case X86::BI__builtin_ia32_cmpordss:
17256 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 7);
17257 case X86::BI__builtin_ia32_cmpeqsd:
17258 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 0);
17259 case X86::BI__builtin_ia32_cmpltsd:
17260 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 1);
17261 case X86::BI__builtin_ia32_cmplesd:
17262 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 2);
17263 case X86::BI__builtin_ia32_cmpunordsd:
17264 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 3);
17265 case X86::BI__builtin_ia32_cmpneqsd:
17266 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 4);
17267 case X86::BI__builtin_ia32_cmpnltsd:
17268 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 5);
17269 case X86::BI__builtin_ia32_cmpnlesd:
17270 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 6);
17271 case X86::BI__builtin_ia32_cmpordsd:
17272 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 7);
17275 case X86::BI__builtin_ia32_vcvtph2ps:
17276 case X86::BI__builtin_ia32_vcvtph2ps256:
17277 case X86::BI__builtin_ia32_vcvtph2ps_mask:
17278 case X86::BI__builtin_ia32_vcvtph2ps256_mask:
17279 case X86::BI__builtin_ia32_vcvtph2ps512_mask: {
17280 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
17285 case X86::BI__builtin_ia32_cvtneps2bf16_128_mask: {
17288 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements());
17289 Intrinsic::ID IID = Intrinsic::x86_avx512bf16_mask_cvtneps2bf16_128;
17292 case X86::BI__builtin_ia32_cvtsbf162ss_32:
17295 case X86::BI__builtin_ia32_cvtneps2bf16_256_mask:
17296 case X86::BI__builtin_ia32_cvtneps2bf16_512_mask: {
17298 switch (BuiltinID) {
17299 default: llvm_unreachable(
"Unsupported intrinsic!");
17300 case X86::BI__builtin_ia32_cvtneps2bf16_256_mask:
17301 IID = Intrinsic::x86_avx512bf16_cvtneps2bf16_256;
17303 case X86::BI__builtin_ia32_cvtneps2bf16_512_mask:
17304 IID = Intrinsic::x86_avx512bf16_cvtneps2bf16_512;
17311 case X86::BI__cpuid:
17312 case X86::BI__cpuidex: {
17314 Value *SubFuncId = BuiltinID == X86::BI__cpuidex
17318 llvm::StructType *CpuidRetTy =
17320 llvm::FunctionType *FTy =
17323 StringRef
Asm, Constraints;
17324 if (
getTarget().getTriple().getArch() == llvm::Triple::x86) {
17326 Constraints =
"={ax},={bx},={cx},={dx},{ax},{cx}";
17329 Asm =
"xchgq %rbx, ${1:q}\n"
17331 "xchgq %rbx, ${1:q}";
17332 Constraints =
"={ax},=r,={cx},={dx},0,2";
17335 llvm::InlineAsm *IA = llvm::InlineAsm::get(FTy,
Asm, Constraints,
17337 Value *IACall =
Builder.CreateCall(IA, {FuncId, SubFuncId});
17340 for (
unsigned i = 0; i < 4; i++) {
17341 Value *Extracted =
Builder.CreateExtractValue(IACall, i);
17351 case X86::BI__emul:
17352 case X86::BI__emulu: {
17354 bool isSigned = (BuiltinID == X86::BI__emul);
17357 return Builder.CreateMul(LHS, RHS,
"", !isSigned, isSigned);
17359 case X86::BI__mulh:
17360 case X86::BI__umulh:
17361 case X86::BI_mul128:
17362 case X86::BI_umul128: {
17364 llvm::Type *Int128Ty = llvm::IntegerType::get(
getLLVMContext(), 128);
17366 bool IsSigned = (BuiltinID == X86::BI__mulh || BuiltinID == X86::BI_mul128);
17367 Value *LHS =
Builder.CreateIntCast(Ops[0], Int128Ty, IsSigned);
17368 Value *RHS =
Builder.CreateIntCast(Ops[1], Int128Ty, IsSigned);
17370 Value *MulResult, *HigherBits;
17372 MulResult =
Builder.CreateNSWMul(LHS, RHS);
17373 HigherBits =
Builder.CreateAShr(MulResult, 64);
17375 MulResult =
Builder.CreateNUWMul(LHS, RHS);
17376 HigherBits =
Builder.CreateLShr(MulResult, 64);
17378 HigherBits =
Builder.CreateIntCast(HigherBits, ResType, IsSigned);
17380 if (BuiltinID == X86::BI__mulh || BuiltinID == X86::BI__umulh)
17385 return Builder.CreateIntCast(MulResult, ResType, IsSigned);
17388 case X86::BI__faststorefence: {
17389 return Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent,
17390 llvm::SyncScope::System);
17392 case X86::BI__shiftleft128:
17393 case X86::BI__shiftright128: {
17395 BuiltinID == X86::BI__shiftleft128 ? Intrinsic::fshl : Intrinsic::fshr,
17400 std::swap(Ops[0], Ops[1]);
17402 return Builder.CreateCall(F, Ops);
17404 case X86::BI_ReadWriteBarrier:
17405 case X86::BI_ReadBarrier:
17406 case X86::BI_WriteBarrier: {
17407 return Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent,
17408 llvm::SyncScope::SingleThread);
17411 case X86::BI_AddressOfReturnAddress: {
17414 return Builder.CreateCall(F);
17416 case X86::BI__stosb: {
17422 case X86::BI__builtin_ia32_t2rpntlvwz0_internal:
17423 case X86::BI__builtin_ia32_t2rpntlvwz0rs_internal:
17424 case X86::BI__builtin_ia32_t2rpntlvwz0t1_internal:
17425 case X86::BI__builtin_ia32_t2rpntlvwz0rst1_internal:
17426 case X86::BI__builtin_ia32_t2rpntlvwz1_internal:
17427 case X86::BI__builtin_ia32_t2rpntlvwz1rs_internal:
17428 case X86::BI__builtin_ia32_t2rpntlvwz1t1_internal:
17429 case X86::BI__builtin_ia32_t2rpntlvwz1rst1_internal: {
17431 switch (BuiltinID) {
17433 llvm_unreachable(
"Unsupported intrinsic!");
17434 case X86::BI__builtin_ia32_t2rpntlvwz0_internal:
17435 IID = Intrinsic::x86_t2rpntlvwz0_internal;
17437 case X86::BI__builtin_ia32_t2rpntlvwz0rs_internal:
17438 IID = Intrinsic::x86_t2rpntlvwz0rs_internal;
17440 case X86::BI__builtin_ia32_t2rpntlvwz0t1_internal:
17441 IID = Intrinsic::x86_t2rpntlvwz0t1_internal;
17443 case X86::BI__builtin_ia32_t2rpntlvwz0rst1_internal:
17444 IID = Intrinsic::x86_t2rpntlvwz0rst1_internal;
17446 case X86::BI__builtin_ia32_t2rpntlvwz1_internal:
17447 IID = Intrinsic::x86_t2rpntlvwz1_internal;
17449 case X86::BI__builtin_ia32_t2rpntlvwz1rs_internal:
17450 IID = Intrinsic::x86_t2rpntlvwz1rs_internal;
17452 case X86::BI__builtin_ia32_t2rpntlvwz1t1_internal:
17453 IID = Intrinsic::x86_t2rpntlvwz1t1_internal;
17455 case X86::BI__builtin_ia32_t2rpntlvwz1rst1_internal:
17456 IID = Intrinsic::x86_t2rpntlvwz1rst1_internal;
17462 {Ops[0], Ops[1], Ops[2], Ops[5], Ops[6]});
17465 assert(PtrTy &&
"arg3 must be of pointer type");
17472 Value *VecT0 =
Builder.CreateIntrinsic(Intrinsic::x86_cast_tile_to_vector,
17478 Value *VecT1 =
Builder.CreateIntrinsic(Intrinsic::x86_cast_tile_to_vector,
17492 case X86::BI__int2c: {
17494 llvm::FunctionType *FTy = llvm::FunctionType::get(
VoidTy,
false);
17495 llvm::InlineAsm *IA =
17496 llvm::InlineAsm::get(FTy,
"int $$0x2c",
"",
true);
17497 llvm::AttributeList NoReturnAttr = llvm::AttributeList::get(
17499 llvm::Attribute::NoReturn);
17500 llvm::CallInst *CI =
Builder.CreateCall(IA);
17501 CI->setAttributes(NoReturnAttr);
17504 case X86::BI__readfsbyte:
17505 case X86::BI__readfsword:
17506 case X86::BI__readfsdword:
17507 case X86::BI__readfsqword: {
17513 Load->setVolatile(
true);
17516 case X86::BI__readgsbyte:
17517 case X86::BI__readgsword:
17518 case X86::BI__readgsdword:
17519 case X86::BI__readgsqword: {
17525 Load->setVolatile(
true);
17528 case X86::BI__builtin_ia32_encodekey128_u32: {
17529 Intrinsic::ID IID = Intrinsic::x86_encodekey128;
17533 for (
int i = 0; i < 3; ++i) {
17541 case X86::BI__builtin_ia32_encodekey256_u32: {
17542 Intrinsic::ID IID = Intrinsic::x86_encodekey256;
17547 for (
int i = 0; i < 4; ++i) {
17555 case X86::BI__builtin_ia32_aesenc128kl_u8:
17556 case X86::BI__builtin_ia32_aesdec128kl_u8:
17557 case X86::BI__builtin_ia32_aesenc256kl_u8:
17558 case X86::BI__builtin_ia32_aesdec256kl_u8: {
17560 StringRef BlockName;
17561 switch (BuiltinID) {
17563 llvm_unreachable(
"Unexpected builtin");
17564 case X86::BI__builtin_ia32_aesenc128kl_u8:
17565 IID = Intrinsic::x86_aesenc128kl;
17566 BlockName =
"aesenc128kl";
17568 case X86::BI__builtin_ia32_aesdec128kl_u8:
17569 IID = Intrinsic::x86_aesdec128kl;
17570 BlockName =
"aesdec128kl";
17572 case X86::BI__builtin_ia32_aesenc256kl_u8:
17573 IID = Intrinsic::x86_aesenc256kl;
17574 BlockName =
"aesenc256kl";
17576 case X86::BI__builtin_ia32_aesdec256kl_u8:
17577 IID = Intrinsic::x86_aesdec256kl;
17578 BlockName =
"aesdec256kl";
17584 BasicBlock *NoError =
17592 Builder.CreateCondBr(Succ, NoError, Error);
17594 Builder.SetInsertPoint(NoError);
17598 Builder.SetInsertPoint(Error);
17599 Constant *
Zero = llvm::Constant::getNullValue(Out->getType());
17606 case X86::BI__builtin_ia32_aesencwide128kl_u8:
17607 case X86::BI__builtin_ia32_aesdecwide128kl_u8:
17608 case X86::BI__builtin_ia32_aesencwide256kl_u8:
17609 case X86::BI__builtin_ia32_aesdecwide256kl_u8: {
17611 StringRef BlockName;
17612 switch (BuiltinID) {
17613 case X86::BI__builtin_ia32_aesencwide128kl_u8:
17614 IID = Intrinsic::x86_aesencwide128kl;
17615 BlockName =
"aesencwide128kl";
17617 case X86::BI__builtin_ia32_aesdecwide128kl_u8:
17618 IID = Intrinsic::x86_aesdecwide128kl;
17619 BlockName =
"aesdecwide128kl";
17621 case X86::BI__builtin_ia32_aesencwide256kl_u8:
17622 IID = Intrinsic::x86_aesencwide256kl;
17623 BlockName =
"aesencwide256kl";
17625 case X86::BI__builtin_ia32_aesdecwide256kl_u8:
17626 IID = Intrinsic::x86_aesdecwide256kl;
17627 BlockName =
"aesdecwide256kl";
17631 llvm::Type *Ty = FixedVectorType::get(
Builder.getInt64Ty(), 2);
17634 for (
int i = 0; i != 8; ++i) {
17635 Value *Ptr =
Builder.CreateConstGEP1_32(Ty, Ops[1], i);
17641 BasicBlock *NoError =
17648 Builder.CreateCondBr(Succ, NoError, Error);
17650 Builder.SetInsertPoint(NoError);
17651 for (
int i = 0; i != 8; ++i) {
17658 Builder.SetInsertPoint(Error);
17659 for (
int i = 0; i != 8; ++i) {
17661 Constant *
Zero = llvm::Constant::getNullValue(Out->getType());
17662 Value *Ptr =
Builder.CreateConstGEP1_32(Out->getType(), Ops[0], i);
17670 case X86::BI__builtin_ia32_vfcmaddcph512_mask:
17673 case X86::BI__builtin_ia32_vfmaddcph512_mask: {
17674 Intrinsic::ID IID = IsConjFMA
17675 ? Intrinsic::x86_avx512fp16_mask_vfcmadd_cph_512
17676 : Intrinsic::x86_avx512fp16_mask_vfmadd_cph_512;
17680 case X86::BI__builtin_ia32_vfcmaddcph256_round_mask:
17683 case X86::BI__builtin_ia32_vfmaddcph256_round_mask: {
17684 Intrinsic::ID IID = IsConjFMA ? Intrinsic::x86_avx10_mask_vfcmaddcph256
17685 : Intrinsic::x86_avx10_mask_vfmaddcph256;
17689 case X86::BI__builtin_ia32_vfcmaddcsh_round_mask:
17692 case X86::BI__builtin_ia32_vfmaddcsh_round_mask: {
17693 Intrinsic::ID IID = IsConjFMA ? Intrinsic::x86_avx512fp16_mask_vfcmadd_csh
17694 : Intrinsic::x86_avx512fp16_mask_vfmadd_csh;
17699 case X86::BI__builtin_ia32_vfcmaddcsh_round_mask3:
17702 case X86::BI__builtin_ia32_vfmaddcsh_round_mask3: {
17703 Intrinsic::ID IID = IsConjFMA ? Intrinsic::x86_avx512fp16_mask_vfcmadd_csh
17704 : Intrinsic::x86_avx512fp16_mask_vfmadd_csh;
17706 static constexpr int Mask[] = {0, 5, 6, 7};
17707 return Builder.CreateShuffleVector(
Call, Ops[2], Mask);
17709 case X86::BI__builtin_ia32_prefetchi:
17712 {Ops[0], llvm::ConstantInt::get(Int32Ty, 0), Ops[1],
17713 llvm::ConstantInt::get(Int32Ty, 0)});
17731 Intrinsic::ID
ID = Intrinsic::not_intrinsic;
17733#include "llvm/TargetParser/PPCTargetParser.def"
17734 auto GenAIXPPCBuiltinCpuExpr = [&](
unsigned SupportMethod,
unsigned FieldIdx,
17735 unsigned Mask, CmpInst::Predicate CompOp,
17736 unsigned OpValue) ->
Value * {
17737 if (SupportMethod == BUILTIN_PPC_FALSE)
17740 if (SupportMethod == BUILTIN_PPC_TRUE)
17743 assert(SupportMethod <= SYS_CALL &&
"Invalid value for SupportMethod.");
17745 llvm::Value *FieldValue =
nullptr;
17746 if (SupportMethod == USE_SYS_CONF) {
17747 llvm::Type *STy = llvm::StructType::get(PPC_SYSTEMCONFIG_TYPE);
17748 llvm::Constant *SysConf =
17752 llvm::Value *Idxs[] = {ConstantInt::get(
Int32Ty, 0),
17753 ConstantInt::get(
Int32Ty, FieldIdx)};
17758 }
else if (SupportMethod == SYS_CALL) {
17759 llvm::FunctionType *FTy =
17761 llvm::FunctionCallee
Func =
17767 assert(FieldValue &&
17768 "SupportMethod value is not defined in PPCTargetParser.def.");
17771 FieldValue =
Builder.CreateAnd(FieldValue, Mask);
17773 llvm::Type *ValueType = FieldValue->getType();
17774 bool IsValueType64Bit = ValueType->isIntegerTy(64);
17776 (IsValueType64Bit || ValueType->isIntegerTy(32)) &&
17777 "Only 32/64-bit integers are supported in GenAIXPPCBuiltinCpuExpr().");
17780 CompOp, FieldValue,
17781 ConstantInt::get(IsValueType64Bit ?
Int64Ty :
Int32Ty, OpValue));
17784 switch (BuiltinID) {
17785 default:
return nullptr;
17787 case Builtin::BI__builtin_cpu_is: {
17789 StringRef CPUStr = cast<clang::StringLiteral>(CPUExpr)->getString();
17792 unsigned LinuxSupportMethod, LinuxIDValue, AIXSupportMethod, AIXIDValue;
17793 typedef std::tuple<unsigned, unsigned, unsigned, unsigned>
CPUInfo;
17795 std::tie(LinuxSupportMethod, LinuxIDValue, AIXSupportMethod, AIXIDValue) =
17796 static_cast<CPUInfo>(StringSwitch<CPUInfo>(CPUStr)
17797#define PPC_CPU(NAME, Linux_SUPPORT_METHOD, LinuxID, AIX_SUPPORT_METHOD, \
17799 .Case(NAME, {Linux_SUPPORT_METHOD, LinuxID, AIX_SUPPORT_METHOD, AIXID})
17800#include "llvm/TargetParser/PPCTargetParser.def"
17801 .Default({BUILTIN_PPC_UNSUPPORTED, 0,
17802 BUILTIN_PPC_UNSUPPORTED, 0}));
17804 if (Triple.isOSAIX()) {
17805 assert((AIXSupportMethod != BUILTIN_PPC_UNSUPPORTED) &&
17806 "Invalid CPU name. Missed by SemaChecking?");
17807 return GenAIXPPCBuiltinCpuExpr(AIXSupportMethod, AIX_SYSCON_IMPL_IDX, 0,
17808 ICmpInst::ICMP_EQ, AIXIDValue);
17811 assert(Triple.isOSLinux() &&
17812 "__builtin_cpu_is() is only supported for AIX and Linux.");
17814 assert((LinuxSupportMethod != BUILTIN_PPC_UNSUPPORTED) &&
17815 "Invalid CPU name. Missed by SemaChecking?");
17817 if (LinuxSupportMethod == BUILTIN_PPC_FALSE)
17820 Value *Op0 = llvm::ConstantInt::get(
Int32Ty, PPC_FAWORD_CPUID);
17822 Value *TheCall =
Builder.CreateCall(F, {Op0},
"cpu_is");
17823 return Builder.CreateICmpEQ(TheCall,
17824 llvm::ConstantInt::get(
Int32Ty, LinuxIDValue));
17826 case Builtin::BI__builtin_cpu_supports: {
17829 StringRef CPUStr = cast<clang::StringLiteral>(CPUExpr)->getString();
17830 if (Triple.isOSAIX()) {
17831 unsigned SupportMethod, FieldIdx, Mask,
Value;
17832 CmpInst::Predicate CompOp;
17836 std::tie(SupportMethod, FieldIdx, Mask, CompOp,
Value) =
17837 static_cast<CPUSupportType
>(StringSwitch<CPUSupportType>(CPUStr)
17838#define PPC_AIX_FEATURE(NAME, DESC, SUPPORT_METHOD, INDEX, MASK, COMP_OP, \
17840 .Case(NAME, {SUPPORT_METHOD, INDEX, MASK, COMP_OP, VALUE})
17841#include "llvm/TargetParser/PPCTargetParser.def"
17842 .Default({BUILTIN_PPC_FALSE, 0, 0,
17843 CmpInst::Predicate(), 0}));
17844 return GenAIXPPCBuiltinCpuExpr(SupportMethod, FieldIdx, Mask, CompOp,
17848 assert(Triple.isOSLinux() &&
17849 "__builtin_cpu_supports() is only supported for AIX and Linux.");
17850 unsigned FeatureWord;
17852 std::tie(FeatureWord, BitMask) =
17853 StringSwitch<std::pair<unsigned, unsigned>>(CPUStr)
17854#define
PPC_LNX_FEATURE(Name, Description, EnumName, Bitmask, FA_WORD) \
17855 .Case(Name, {FA_WORD, Bitmask})
17856#include
"llvm/TargetParser/PPCTargetParser.def"
17860 Value *Op0 = llvm::ConstantInt::get(
Int32Ty, FeatureWord);
17862 Value *TheCall =
Builder.CreateCall(F, {Op0},
"cpu_supports");
17864 Builder.CreateAnd(TheCall, llvm::ConstantInt::get(
Int32Ty, BitMask));
17865 return Builder.CreateICmpNE(Mask, llvm::Constant::getNullValue(
Int32Ty));
17866#undef PPC_FAWORD_HWCAP
17867#undef PPC_FAWORD_HWCAP2
17868#undef PPC_FAWORD_CPUID
17873 case PPC::BI__builtin_ppc_get_timebase:
17877 case PPC::BI__builtin_altivec_lvx:
17878 case PPC::BI__builtin_altivec_lvxl:
17879 case PPC::BI__builtin_altivec_lvebx:
17880 case PPC::BI__builtin_altivec_lvehx:
17881 case PPC::BI__builtin_altivec_lvewx:
17882 case PPC::BI__builtin_altivec_lvsl:
17883 case PPC::BI__builtin_altivec_lvsr:
17884 case PPC::BI__builtin_vsx_lxvd2x:
17885 case PPC::BI__builtin_vsx_lxvw4x:
17886 case PPC::BI__builtin_vsx_lxvd2x_be:
17887 case PPC::BI__builtin_vsx_lxvw4x_be:
17888 case PPC::BI__builtin_vsx_lxvl:
17889 case PPC::BI__builtin_vsx_lxvll:
17894 if (!(BuiltinID == PPC::BI__builtin_vsx_lxvl ||
17895 BuiltinID == PPC::BI__builtin_vsx_lxvll)) {
17900 switch (BuiltinID) {
17901 default: llvm_unreachable(
"Unsupported ld/lvsl/lvsr intrinsic!");
17902 case PPC::BI__builtin_altivec_lvx:
17903 ID = Intrinsic::ppc_altivec_lvx;
17905 case PPC::BI__builtin_altivec_lvxl:
17906 ID = Intrinsic::ppc_altivec_lvxl;
17908 case PPC::BI__builtin_altivec_lvebx:
17909 ID = Intrinsic::ppc_altivec_lvebx;
17911 case PPC::BI__builtin_altivec_lvehx:
17912 ID = Intrinsic::ppc_altivec_lvehx;
17914 case PPC::BI__builtin_altivec_lvewx:
17915 ID = Intrinsic::ppc_altivec_lvewx;
17917 case PPC::BI__builtin_altivec_lvsl:
17918 ID = Intrinsic::ppc_altivec_lvsl;
17920 case PPC::BI__builtin_altivec_lvsr:
17921 ID = Intrinsic::ppc_altivec_lvsr;
17923 case PPC::BI__builtin_vsx_lxvd2x:
17924 ID = Intrinsic::ppc_vsx_lxvd2x;
17926 case PPC::BI__builtin_vsx_lxvw4x:
17927 ID = Intrinsic::ppc_vsx_lxvw4x;
17929 case PPC::BI__builtin_vsx_lxvd2x_be:
17930 ID = Intrinsic::ppc_vsx_lxvd2x_be;
17932 case PPC::BI__builtin_vsx_lxvw4x_be:
17933 ID = Intrinsic::ppc_vsx_lxvw4x_be;
17935 case PPC::BI__builtin_vsx_lxvl:
17936 ID = Intrinsic::ppc_vsx_lxvl;
17938 case PPC::BI__builtin_vsx_lxvll:
17939 ID = Intrinsic::ppc_vsx_lxvll;
17943 return Builder.CreateCall(F, Ops,
"");
17947 case PPC::BI__builtin_altivec_stvx:
17948 case PPC::BI__builtin_altivec_stvxl:
17949 case PPC::BI__builtin_altivec_stvebx:
17950 case PPC::BI__builtin_altivec_stvehx:
17951 case PPC::BI__builtin_altivec_stvewx:
17952 case PPC::BI__builtin_vsx_stxvd2x:
17953 case PPC::BI__builtin_vsx_stxvw4x:
17954 case PPC::BI__builtin_vsx_stxvd2x_be:
17955 case PPC::BI__builtin_vsx_stxvw4x_be:
17956 case PPC::BI__builtin_vsx_stxvl:
17957 case PPC::BI__builtin_vsx_stxvll:
17963 if (!(BuiltinID == PPC::BI__builtin_vsx_stxvl ||
17964 BuiltinID == PPC::BI__builtin_vsx_stxvll)) {
17969 switch (BuiltinID) {
17970 default: llvm_unreachable(
"Unsupported st intrinsic!");
17971 case PPC::BI__builtin_altivec_stvx:
17972 ID = Intrinsic::ppc_altivec_stvx;
17974 case PPC::BI__builtin_altivec_stvxl:
17975 ID = Intrinsic::ppc_altivec_stvxl;
17977 case PPC::BI__builtin_altivec_stvebx:
17978 ID = Intrinsic::ppc_altivec_stvebx;
17980 case PPC::BI__builtin_altivec_stvehx:
17981 ID = Intrinsic::ppc_altivec_stvehx;
17983 case PPC::BI__builtin_altivec_stvewx:
17984 ID = Intrinsic::ppc_altivec_stvewx;
17986 case PPC::BI__builtin_vsx_stxvd2x:
17987 ID = Intrinsic::ppc_vsx_stxvd2x;
17989 case PPC::BI__builtin_vsx_stxvw4x:
17990 ID = Intrinsic::ppc_vsx_stxvw4x;
17992 case PPC::BI__builtin_vsx_stxvd2x_be:
17993 ID = Intrinsic::ppc_vsx_stxvd2x_be;
17995 case PPC::BI__builtin_vsx_stxvw4x_be:
17996 ID = Intrinsic::ppc_vsx_stxvw4x_be;
17998 case PPC::BI__builtin_vsx_stxvl:
17999 ID = Intrinsic::ppc_vsx_stxvl;
18001 case PPC::BI__builtin_vsx_stxvll:
18002 ID = Intrinsic::ppc_vsx_stxvll;
18006 return Builder.CreateCall(F, Ops,
"");
18008 case PPC::BI__builtin_vsx_ldrmb: {
18014 int64_t NumBytes = cast<ConstantInt>(Op1)->getZExtValue();
18019 if (NumBytes == 16) {
18027 for (
int Idx = 0; Idx < 16; Idx++)
18028 RevMask.push_back(15 - Idx);
18029 return Builder.CreateShuffleVector(LD, LD, RevMask);
18033 llvm::Function *Lvs =
CGM.
getIntrinsic(IsLE ? Intrinsic::ppc_altivec_lvsr
18034 : Intrinsic::ppc_altivec_lvsl);
18035 llvm::Function *Vperm =
CGM.
getIntrinsic(Intrinsic::ppc_altivec_vperm);
18037 Int8Ty, Op0, ConstantInt::get(Op1->
getType(), NumBytes - 1));
18039 Value *HiLd =
Builder.CreateCall(Lvx, HiMem,
"ld.hi");
18042 Op0 = IsLE ? HiLd : LoLd;
18043 Op1 = IsLE ? LoLd : HiLd;
18044 Value *AllElts =
Builder.CreateCall(Vperm, {Op0, Op1, Mask1},
"shuffle1");
18045 Constant *
Zero = llvm::Constant::getNullValue(IsLE ? ResTy : AllElts->
getType());
18049 for (
int Idx = 0; Idx < 16; Idx++) {
18050 int Val = (NumBytes - Idx - 1 >= 0) ? (NumBytes - Idx - 1)
18051 : 16 - (NumBytes - Idx);
18052 Consts.push_back(Val);
18054 return Builder.CreateShuffleVector(
Builder.CreateBitCast(AllElts, ResTy),
18058 for (
int Idx = 0; Idx < 16; Idx++)
18059 Consts.push_back(
Builder.getInt8(NumBytes + Idx));
18060 Value *Mask2 = ConstantVector::get(Consts);
18061 return Builder.CreateBitCast(
18062 Builder.CreateCall(Vperm, {Zero, AllElts, Mask2},
"shuffle2"), ResTy);
18064 case PPC::BI__builtin_vsx_strmb: {
18068 int64_t NumBytes = cast<ConstantInt>(Op1)->getZExtValue();
18070 auto StoreSubVec = [&](
unsigned Width,
unsigned Offset,
unsigned EltNo) {
18074 Value *StVec = Op2;
18077 for (
int Idx = 0; Idx < 16; Idx++)
18078 RevMask.push_back(15 - Idx);
18079 StVec =
Builder.CreateShuffleVector(Op2, Op2, RevMask);
18085 unsigned NumElts = 0;
18088 llvm_unreachable(
"width for stores must be a power of 2");
18107 Op2, llvm::FixedVectorType::get(ConvTy, NumElts));
18110 Value *Elt =
Builder.CreateExtractElement(Vec, EltNo);
18111 if (IsLE && Width > 1) {
18113 Elt =
Builder.CreateCall(F, Elt);
18118 unsigned Stored = 0;
18119 unsigned RemainingBytes = NumBytes;
18121 if (NumBytes == 16)
18122 return StoreSubVec(16, 0, 0);
18123 if (NumBytes >= 8) {
18124 Result = StoreSubVec(8, NumBytes - 8, IsLE ? 0 : 1);
18125 RemainingBytes -= 8;
18128 if (RemainingBytes >= 4) {
18129 Result = StoreSubVec(4, NumBytes - Stored - 4,
18130 IsLE ? (Stored >> 2) : 3 - (Stored >> 2));
18131 RemainingBytes -= 4;
18134 if (RemainingBytes >= 2) {
18135 Result = StoreSubVec(2, NumBytes - Stored - 2,
18136 IsLE ? (Stored >> 1) : 7 - (Stored >> 1));
18137 RemainingBytes -= 2;
18140 if (RemainingBytes)
18142 StoreSubVec(1, NumBytes - Stored - 1, IsLE ? Stored : 15 - Stored);
18146 case PPC::BI__builtin_vsx_xvsqrtsp:
18147 case PPC::BI__builtin_vsx_xvsqrtdp: {
18150 if (
Builder.getIsFPConstrained()) {
18152 Intrinsic::experimental_constrained_sqrt, ResultType);
18153 return Builder.CreateConstrainedFPCall(F,
X);
18160 case PPC::BI__builtin_altivec_vclzb:
18161 case PPC::BI__builtin_altivec_vclzh:
18162 case PPC::BI__builtin_altivec_vclzw:
18163 case PPC::BI__builtin_altivec_vclzd: {
18166 Value *Undef = ConstantInt::get(
Builder.getInt1Ty(),
false);
18168 return Builder.CreateCall(F, {
X, Undef});
18170 case PPC::BI__builtin_altivec_vctzb:
18171 case PPC::BI__builtin_altivec_vctzh:
18172 case PPC::BI__builtin_altivec_vctzw:
18173 case PPC::BI__builtin_altivec_vctzd: {
18176 Value *Undef = ConstantInt::get(
Builder.getInt1Ty(),
false);
18178 return Builder.CreateCall(F, {
X, Undef});
18180 case PPC::BI__builtin_altivec_vinsd:
18181 case PPC::BI__builtin_altivec_vinsw:
18182 case PPC::BI__builtin_altivec_vinsd_elt:
18183 case PPC::BI__builtin_altivec_vinsw_elt: {
18189 bool IsUnaligned = (BuiltinID == PPC::BI__builtin_altivec_vinsw ||
18190 BuiltinID == PPC::BI__builtin_altivec_vinsd);
18192 bool Is32bit = (BuiltinID == PPC::BI__builtin_altivec_vinsw ||
18193 BuiltinID == PPC::BI__builtin_altivec_vinsw_elt);
18196 ConstantInt *ArgCI = dyn_cast<ConstantInt>(Op2);
18198 "Third Arg to vinsw/vinsd intrinsic must be a constant integer!");
18202 int ValidMaxValue = 0;
18204 ValidMaxValue = (Is32bit) ? 12 : 8;
18206 ValidMaxValue = (Is32bit) ? 3 : 1;
18209 int64_t ConstArg = ArgCI->getSExtValue();
18212 std::string RangeErrMsg = IsUnaligned ?
"byte" :
"element";
18213 RangeErrMsg +=
" number " + llvm::to_string(ConstArg);
18214 RangeErrMsg +=
" is outside of the valid range [0, ";
18215 RangeErrMsg += llvm::to_string(ValidMaxValue) +
"]";
18218 if (ConstArg < 0 || ConstArg > ValidMaxValue)
18222 if (!IsUnaligned) {
18223 ConstArg *= Is32bit ? 4 : 8;
18226 ConstArg = (Is32bit ? 12 : 8) - ConstArg;
18229 ID = Is32bit ? Intrinsic::ppc_altivec_vinsw : Intrinsic::ppc_altivec_vinsd;
18230 Op2 = ConstantInt::getSigned(
Int32Ty, ConstArg);
18234 ?
Builder.CreateBitCast(Op0, llvm::FixedVectorType::get(
Int32Ty, 4))
18236 llvm::FixedVectorType::get(
Int64Ty, 2));
18237 return Builder.CreateBitCast(
18240 case PPC::BI__builtin_altivec_vadduqm:
18241 case PPC::BI__builtin_altivec_vsubuqm: {
18244 llvm::Type *Int128Ty = llvm::IntegerType::get(
getLLVMContext(), 128);
18245 Op0 =
Builder.CreateBitCast(Op0, llvm::FixedVectorType::get(Int128Ty, 1));
18246 Op1 =
Builder.CreateBitCast(Op1, llvm::FixedVectorType::get(Int128Ty, 1));
18247 if (BuiltinID == PPC::BI__builtin_altivec_vadduqm)
18248 return Builder.CreateAdd(Op0, Op1,
"vadduqm");
18250 return Builder.CreateSub(Op0, Op1,
"vsubuqm");
18252 case PPC::BI__builtin_altivec_vaddcuq_c:
18253 case PPC::BI__builtin_altivec_vsubcuq_c: {
18257 llvm::Type *V1I128Ty = llvm::FixedVectorType::get(
18259 Ops.push_back(
Builder.CreateBitCast(Op0, V1I128Ty));
18260 Ops.push_back(
Builder.CreateBitCast(Op1, V1I128Ty));
18261 ID = (BuiltinID == PPC::BI__builtin_altivec_vaddcuq_c)
18262 ? Intrinsic::ppc_altivec_vaddcuq
18263 : Intrinsic::ppc_altivec_vsubcuq;
18266 case PPC::BI__builtin_altivec_vaddeuqm_c:
18267 case PPC::BI__builtin_altivec_vaddecuq_c:
18268 case PPC::BI__builtin_altivec_vsubeuqm_c:
18269 case PPC::BI__builtin_altivec_vsubecuq_c: {
18274 llvm::Type *V1I128Ty = llvm::FixedVectorType::get(
18276 Ops.push_back(
Builder.CreateBitCast(Op0, V1I128Ty));
18277 Ops.push_back(
Builder.CreateBitCast(Op1, V1I128Ty));
18278 Ops.push_back(
Builder.CreateBitCast(Op2, V1I128Ty));
18279 switch (BuiltinID) {
18281 llvm_unreachable(
"Unsupported intrinsic!");
18282 case PPC::BI__builtin_altivec_vaddeuqm_c:
18283 ID = Intrinsic::ppc_altivec_vaddeuqm;
18285 case PPC::BI__builtin_altivec_vaddecuq_c:
18286 ID = Intrinsic::ppc_altivec_vaddecuq;
18288 case PPC::BI__builtin_altivec_vsubeuqm_c:
18289 ID = Intrinsic::ppc_altivec_vsubeuqm;
18291 case PPC::BI__builtin_altivec_vsubecuq_c:
18292 ID = Intrinsic::ppc_altivec_vsubecuq;
18297 case PPC::BI__builtin_ppc_rldimi:
18298 case PPC::BI__builtin_ppc_rlwimi: {
18305 if (BuiltinID == PPC::BI__builtin_ppc_rldimi &&
18315 ? Intrinsic::ppc_rldimi
18316 : Intrinsic::ppc_rlwimi),
18317 {Op0, Op1, Op2, Op3});
18319 case PPC::BI__builtin_ppc_rlwnm: {
18326 case PPC::BI__builtin_ppc_poppar4:
18327 case PPC::BI__builtin_ppc_poppar8: {
18329 llvm::Type *ArgType = Op0->
getType();
18335 if (
Result->getType() != ResultType)
18340 case PPC::BI__builtin_ppc_cmpb: {
18343 if (
getTarget().getTriple().isPPC64()) {
18346 return Builder.CreateCall(F, {Op0, Op1},
"cmpb");
18366 Constant *ShiftAmt = ConstantInt::get(
Int64Ty, 32);
18375 Value *ResHi =
Builder.CreateShl(ResHiShift, ShiftAmt);
18376 return Builder.CreateOr(ResLo, ResHi);
18379 case PPC::BI__builtin_vsx_xvcpsgnsp:
18380 case PPC::BI__builtin_vsx_xvcpsgndp: {
18384 ID = Intrinsic::copysign;
18386 return Builder.CreateCall(F, {
X, Y});
18389 case PPC::BI__builtin_vsx_xvrspip:
18390 case PPC::BI__builtin_vsx_xvrdpip:
18391 case PPC::BI__builtin_vsx_xvrdpim:
18392 case PPC::BI__builtin_vsx_xvrspim:
18393 case PPC::BI__builtin_vsx_xvrdpi:
18394 case PPC::BI__builtin_vsx_xvrspi:
18395 case PPC::BI__builtin_vsx_xvrdpic:
18396 case PPC::BI__builtin_vsx_xvrspic:
18397 case PPC::BI__builtin_vsx_xvrdpiz:
18398 case PPC::BI__builtin_vsx_xvrspiz: {
18401 if (BuiltinID == PPC::BI__builtin_vsx_xvrdpim ||
18402 BuiltinID == PPC::BI__builtin_vsx_xvrspim)
18404 ? Intrinsic::experimental_constrained_floor
18405 : Intrinsic::floor;
18406 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpi ||
18407 BuiltinID == PPC::BI__builtin_vsx_xvrspi)
18409 ? Intrinsic::experimental_constrained_round
18410 : Intrinsic::round;
18411 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpic ||
18412 BuiltinID == PPC::BI__builtin_vsx_xvrspic)
18414 ? Intrinsic::experimental_constrained_rint
18416 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpip ||
18417 BuiltinID == PPC::BI__builtin_vsx_xvrspip)
18419 ? Intrinsic::experimental_constrained_ceil
18421 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpiz ||
18422 BuiltinID == PPC::BI__builtin_vsx_xvrspiz)
18424 ? Intrinsic::experimental_constrained_trunc
18425 : Intrinsic::trunc;
18427 return Builder.getIsFPConstrained() ?
Builder.CreateConstrainedFPCall(F,
X)
18432 case PPC::BI__builtin_vsx_xvabsdp:
18433 case PPC::BI__builtin_vsx_xvabssp: {
18441 case PPC::BI__builtin_ppc_recipdivf:
18442 case PPC::BI__builtin_ppc_recipdivd:
18443 case PPC::BI__builtin_ppc_rsqrtf:
18444 case PPC::BI__builtin_ppc_rsqrtd: {
18445 FastMathFlags FMF =
Builder.getFastMathFlags();
18446 Builder.getFastMathFlags().setFast();
18450 if (BuiltinID == PPC::BI__builtin_ppc_recipdivf ||
18451 BuiltinID == PPC::BI__builtin_ppc_recipdivd) {
18454 Builder.getFastMathFlags() &= (FMF);
18457 auto *One = ConstantFP::get(ResultType, 1.0);
18460 Builder.getFastMathFlags() &= (FMF);
18463 case PPC::BI__builtin_ppc_alignx: {
18466 ConstantInt *AlignmentCI = cast<ConstantInt>(Op0);
18467 if (AlignmentCI->getValue().ugt(llvm::Value::MaximumAlignment))
18468 AlignmentCI = ConstantInt::get(AlignmentCI->getIntegerType(),
18469 llvm::Value::MaximumAlignment);
18473 AlignmentCI,
nullptr);
18476 case PPC::BI__builtin_ppc_rdlam: {
18480 llvm::Type *Ty = Op0->
getType();
18481 Value *ShiftAmt =
Builder.CreateIntCast(Op1, Ty,
false);
18483 Value *Rotate =
Builder.CreateCall(F, {Op0, Op0, ShiftAmt});
18484 return Builder.CreateAnd(Rotate, Op2);
18486 case PPC::BI__builtin_ppc_load2r: {
18493 case PPC::BI__builtin_ppc_fnmsub:
18494 case PPC::BI__builtin_ppc_fnmsubs:
18495 case PPC::BI__builtin_vsx_xvmaddadp:
18496 case PPC::BI__builtin_vsx_xvmaddasp:
18497 case PPC::BI__builtin_vsx_xvnmaddadp:
18498 case PPC::BI__builtin_vsx_xvnmaddasp:
18499 case PPC::BI__builtin_vsx_xvmsubadp:
18500 case PPC::BI__builtin_vsx_xvmsubasp:
18501 case PPC::BI__builtin_vsx_xvnmsubadp:
18502 case PPC::BI__builtin_vsx_xvnmsubasp: {
18508 if (
Builder.getIsFPConstrained())
18509 F =
CGM.
getIntrinsic(Intrinsic::experimental_constrained_fma, ResultType);
18512 switch (BuiltinID) {
18513 case PPC::BI__builtin_vsx_xvmaddadp:
18514 case PPC::BI__builtin_vsx_xvmaddasp:
18515 if (
Builder.getIsFPConstrained())
18516 return Builder.CreateConstrainedFPCall(F, {
X, Y, Z});
18518 return Builder.CreateCall(F, {
X, Y, Z});
18519 case PPC::BI__builtin_vsx_xvnmaddadp:
18520 case PPC::BI__builtin_vsx_xvnmaddasp:
18521 if (
Builder.getIsFPConstrained())
18523 Builder.CreateConstrainedFPCall(F, {X, Y, Z}),
"neg");
18525 return Builder.CreateFNeg(
Builder.CreateCall(F, {X, Y, Z}),
"neg");
18526 case PPC::BI__builtin_vsx_xvmsubadp:
18527 case PPC::BI__builtin_vsx_xvmsubasp:
18528 if (
Builder.getIsFPConstrained())
18529 return Builder.CreateConstrainedFPCall(
18530 F, {
X, Y,
Builder.CreateFNeg(Z,
"neg")});
18533 case PPC::BI__builtin_ppc_fnmsub:
18534 case PPC::BI__builtin_ppc_fnmsubs:
18535 case PPC::BI__builtin_vsx_xvnmsubadp:
18536 case PPC::BI__builtin_vsx_xvnmsubasp:
18537 if (
Builder.getIsFPConstrained())
18539 Builder.CreateConstrainedFPCall(
18540 F, {X, Y, Builder.CreateFNeg(Z,
"neg")}),
18546 llvm_unreachable(
"Unknown FMA operation");
18550 case PPC::BI__builtin_vsx_insertword: {
18558 ConstantInt *ArgCI = dyn_cast<ConstantInt>(Op2);
18560 "Third arg to xxinsertw intrinsic must be constant integer");
18562 int64_t Index = std::clamp(ArgCI->getSExtValue(), (int64_t)0, MaxIndex);
18569 std::swap(Op0, Op1);
18573 Op1 =
Builder.CreateBitCast(Op1, llvm::FixedVectorType::get(
Int64Ty, 2));
18577 Op0 =
Builder.CreateBitCast(Op0, llvm::FixedVectorType::get(
Int64Ty, 2));
18581 Index = MaxIndex - Index;
18585 Op0 =
Builder.CreateBitCast(Op0, llvm::FixedVectorType::get(
Int32Ty, 4));
18586 Op2 = ConstantInt::getSigned(
Int32Ty, Index);
18587 return Builder.CreateCall(F, {Op0, Op1, Op2});
18590 case PPC::BI__builtin_vsx_extractuword: {
18593 llvm::Function *F =
CGM.
getIntrinsic(Intrinsic::ppc_vsx_xxextractuw);
18596 Op0 =
Builder.CreateBitCast(Op0, llvm::FixedVectorType::get(
Int64Ty, 2));
18600 ConstantInt *ArgCI = dyn_cast<ConstantInt>(Op1);
18602 "Second Arg to xxextractuw intrinsic must be a constant integer!");
18604 int64_t Index = std::clamp(ArgCI->getSExtValue(), (int64_t)0, MaxIndex);
18608 Index = MaxIndex - Index;
18609 Op1 = ConstantInt::getSigned(
Int32Ty, Index);
18614 Value *ShuffleCall =
18616 return ShuffleCall;
18618 Op1 = ConstantInt::getSigned(
Int32Ty, Index);
18619 return Builder.CreateCall(F, {Op0, Op1});
18623 case PPC::BI__builtin_vsx_xxpermdi: {
18627 ConstantInt *ArgCI = dyn_cast<ConstantInt>(Op2);
18628 assert(ArgCI &&
"Third arg must be constant integer!");
18630 unsigned Index = ArgCI->getZExtValue();
18631 Op0 =
Builder.CreateBitCast(Op0, llvm::FixedVectorType::get(
Int64Ty, 2));
18632 Op1 =
Builder.CreateBitCast(Op1, llvm::FixedVectorType::get(
Int64Ty, 2));
18637 int ElemIdx0 = (Index & 2) >> 1;
18638 int ElemIdx1 = 2 + (Index & 1);
18640 int ShuffleElts[2] = {ElemIdx0, ElemIdx1};
18641 Value *ShuffleCall =
Builder.CreateShuffleVector(Op0, Op1, ShuffleElts);
18644 return Builder.CreateBitCast(ShuffleCall, RetTy);
18647 case PPC::BI__builtin_vsx_xxsldwi: {
18651 ConstantInt *ArgCI = dyn_cast<ConstantInt>(Op2);
18652 assert(ArgCI &&
"Third argument must be a compile time constant");
18653 unsigned Index = ArgCI->getZExtValue() & 0x3;
18654 Op0 =
Builder.CreateBitCast(Op0, llvm::FixedVectorType::get(
Int32Ty, 4));
18655 Op1 =
Builder.CreateBitCast(Op1, llvm::FixedVectorType::get(
Int32Ty, 4));
18666 ElemIdx0 = (8 - Index) % 8;
18667 ElemIdx1 = (9 - Index) % 8;
18668 ElemIdx2 = (10 - Index) % 8;
18669 ElemIdx3 = (11 - Index) % 8;
18673 ElemIdx1 = Index + 1;
18674 ElemIdx2 = Index + 2;
18675 ElemIdx3 = Index + 3;
18678 int ShuffleElts[4] = {ElemIdx0, ElemIdx1, ElemIdx2, ElemIdx3};
18679 Value *ShuffleCall =
Builder.CreateShuffleVector(Op0, Op1, ShuffleElts);
18682 return Builder.CreateBitCast(ShuffleCall, RetTy);
18685 case PPC::BI__builtin_pack_vector_int128: {
18689 Value *PoisonValue =
18690 llvm::PoisonValue::get(llvm::FixedVectorType::get(Op0->
getType(), 2));
18692 PoisonValue, Op0, (uint64_t)(isLittleEndian ? 1 : 0));
18693 Res =
Builder.CreateInsertElement(Res, Op1,
18694 (uint64_t)(isLittleEndian ? 0 : 1));
18698 case PPC::BI__builtin_unpack_vector_int128: {
18701 ConstantInt *Index = cast<ConstantInt>(Op1);
18707 ConstantInt::get(Index->getIntegerType(), 1 - Index->getZExtValue());
18709 return Builder.CreateExtractElement(Unpacked, Index);
18712 case PPC::BI__builtin_ppc_sthcx: {
18716 return Builder.CreateCall(F, {Op0, Op1});
18725#define CUSTOM_BUILTIN(Name, Intr, Types, Accumulate, Feature) \
18726 case PPC::BI__builtin_##Name:
18727#include "clang/Basic/BuiltinsPPC.def"
18730 for (
unsigned i = 0, e =
E->getNumArgs(); i != e; i++)
18740 if (BuiltinID == PPC::BI__builtin_mma_disassemble_acc ||
18741 BuiltinID == PPC::BI__builtin_vsx_disassemble_pair ||
18742 BuiltinID == PPC::BI__builtin_mma_disassemble_pair) {
18743 unsigned NumVecs = 2;
18744 auto Intrinsic = Intrinsic::ppc_vsx_disassemble_pair;
18745 if (BuiltinID == PPC::BI__builtin_mma_disassemble_acc) {
18747 Intrinsic = Intrinsic::ppc_mma_disassemble_acc;
18753 llvm::Type *VTy = llvm::FixedVectorType::get(
Int8Ty, 16);
18754 Value *Ptr = Ops[0];
18755 for (
unsigned i=0; i<NumVecs; i++) {
18757 llvm::ConstantInt* Index = llvm::ConstantInt::get(
IntTy, i);
18763 if (BuiltinID == PPC::BI__builtin_vsx_build_pair ||
18764 BuiltinID == PPC::BI__builtin_mma_build_acc) {
18772 std::reverse(Ops.begin() + 1, Ops.end());
18775 switch (BuiltinID) {
18776 #define CUSTOM_BUILTIN(Name, Intr, Types, Acc, Feature) \
18777 case PPC::BI__builtin_##Name: \
18778 ID = Intrinsic::ppc_##Intr; \
18779 Accumulate = Acc; \
18781 #include "clang/Basic/BuiltinsPPC.def"
18783 if (BuiltinID == PPC::BI__builtin_vsx_lxvp ||
18784 BuiltinID == PPC::BI__builtin_vsx_stxvp ||
18785 BuiltinID == PPC::BI__builtin_mma_lxvp ||
18786 BuiltinID == PPC::BI__builtin_mma_stxvp) {
18787 if (BuiltinID == PPC::BI__builtin_vsx_lxvp ||
18788 BuiltinID == PPC::BI__builtin_mma_lxvp) {
18795 return Builder.CreateCall(F, Ops,
"");
18801 CallOps.push_back(Acc);
18803 for (
unsigned i=1; i<Ops.size(); i++)
18804 CallOps.push_back(Ops[i]);
18810 case PPC::BI__builtin_ppc_compare_and_swap:
18811 case PPC::BI__builtin_ppc_compare_and_swaplp: {
18820 llvm::AtomicOrdering::Monotonic, llvm::AtomicOrdering::Monotonic,
true);
18828 Value *LoadedVal = Pair.first.getScalarVal();
18832 case PPC::BI__builtin_ppc_fetch_and_add:
18833 case PPC::BI__builtin_ppc_fetch_and_addlp: {
18835 llvm::AtomicOrdering::Monotonic);
18837 case PPC::BI__builtin_ppc_fetch_and_and:
18838 case PPC::BI__builtin_ppc_fetch_and_andlp: {
18840 llvm::AtomicOrdering::Monotonic);
18843 case PPC::BI__builtin_ppc_fetch_and_or:
18844 case PPC::BI__builtin_ppc_fetch_and_orlp: {
18846 llvm::AtomicOrdering::Monotonic);
18848 case PPC::BI__builtin_ppc_fetch_and_swap:
18849 case PPC::BI__builtin_ppc_fetch_and_swaplp: {
18851 llvm::AtomicOrdering::Monotonic);
18853 case PPC::BI__builtin_ppc_ldarx:
18854 case PPC::BI__builtin_ppc_lwarx:
18855 case PPC::BI__builtin_ppc_lharx:
18856 case PPC::BI__builtin_ppc_lbarx:
18858 case PPC::BI__builtin_ppc_mfspr: {
18864 return Builder.CreateCall(F, {Op0});
18866 case PPC::BI__builtin_ppc_mtspr: {
18873 return Builder.CreateCall(F, {Op0, Op1});
18875 case PPC::BI__builtin_ppc_popcntb: {
18877 llvm::Type *ArgType = ArgValue->
getType();
18879 return Builder.CreateCall(F, {ArgValue},
"popcntb");
18881 case PPC::BI__builtin_ppc_mtfsf: {
18891 case PPC::BI__builtin_ppc_swdiv_nochk:
18892 case PPC::BI__builtin_ppc_swdivs_nochk: {
18895 FastMathFlags FMF =
Builder.getFastMathFlags();
18896 Builder.getFastMathFlags().setFast();
18897 Value *FDiv =
Builder.CreateFDiv(Op0, Op1,
"swdiv_nochk");
18898 Builder.getFastMathFlags() &= (FMF);
18901 case PPC::BI__builtin_ppc_fric:
18903 *
this,
E, Intrinsic::rint,
18904 Intrinsic::experimental_constrained_rint))
18906 case PPC::BI__builtin_ppc_frim:
18907 case PPC::BI__builtin_ppc_frims:
18909 *
this,
E, Intrinsic::floor,
18910 Intrinsic::experimental_constrained_floor))
18912 case PPC::BI__builtin_ppc_frin:
18913 case PPC::BI__builtin_ppc_frins:
18915 *
this,
E, Intrinsic::round,
18916 Intrinsic::experimental_constrained_round))
18918 case PPC::BI__builtin_ppc_frip:
18919 case PPC::BI__builtin_ppc_frips:
18921 *
this,
E, Intrinsic::ceil,
18922 Intrinsic::experimental_constrained_ceil))
18924 case PPC::BI__builtin_ppc_friz:
18925 case PPC::BI__builtin_ppc_frizs:
18927 *
this,
E, Intrinsic::trunc,
18928 Intrinsic::experimental_constrained_trunc))
18930 case PPC::BI__builtin_ppc_fsqrt:
18931 case PPC::BI__builtin_ppc_fsqrts:
18933 *
this,
E, Intrinsic::sqrt,
18934 Intrinsic::experimental_constrained_sqrt))
18936 case PPC::BI__builtin_ppc_test_data_class: {
18941 {Op0, Op1},
"test_data_class");
18943 case PPC::BI__builtin_ppc_maxfe: {
18949 {Op0, Op1, Op2, Op3});
18951 case PPC::BI__builtin_ppc_maxfl: {
18957 {Op0, Op1, Op2, Op3});
18959 case PPC::BI__builtin_ppc_maxfs: {
18965 {Op0, Op1, Op2, Op3});
18967 case PPC::BI__builtin_ppc_minfe: {
18973 {Op0, Op1, Op2, Op3});
18975 case PPC::BI__builtin_ppc_minfl: {
18981 {Op0, Op1, Op2, Op3});
18983 case PPC::BI__builtin_ppc_minfs: {
18989 {Op0, Op1, Op2, Op3});
18991 case PPC::BI__builtin_ppc_swdiv:
18992 case PPC::BI__builtin_ppc_swdivs: {
18995 return Builder.CreateFDiv(Op0, Op1,
"swdiv");
18997 case PPC::BI__builtin_ppc_set_fpscr_rn:
18999 {EmitScalarExpr(E->getArg(0))});
19000 case PPC::BI__builtin_ppc_mffs:
19013 Attribute::getWithDereferenceableBytes(
Call->getContext(), 64));
19014 Call->addRetAttr(Attribute::getWithAlignment(
Call->getContext(), Align(4)));
19018 auto *RetTy = cast<llvm::PointerType>(CGF.
ConvertType(BuiltinRetType));
19019 if (RetTy ==
Call->getType())
19028 Attribute::getWithDereferenceableBytes(
Call->getContext(), 256));
19029 Call->addRetAttr(Attribute::getWithAlignment(
Call->getContext(), Align(8)));
19044 llvm::LoadInst *LD;
19048 if (Cov == CodeObjectVersionKind::COV_None) {
19049 StringRef Name =
"__oclc_ABI_version";
19050 auto *ABIVersionC = CGF.
CGM.
getModule().getNamedGlobal(Name);
19052 ABIVersionC =
new llvm::GlobalVariable(
19054 llvm::GlobalValue::ExternalLinkage,
nullptr, Name,
nullptr,
19055 llvm::GlobalVariable::NotThreadLocal,
19066 llvm::ConstantInt::get(CGF.
Int32Ty, CodeObjectVersionKind::COV_5));
19070 CGF.
Int8Ty, EmitAMDGPUImplicitArgPtr(CGF), 12 + Index * 2);
19074 CGF.
Int8Ty, EmitAMDGPUDispatchPtr(CGF), 4 + Index * 2);
19076 auto Result = CGF.
Builder.CreateSelect(IsCOV5, ImplicitGEP, DispatchGEP);
19080 Value *GEP =
nullptr;
19081 if (Cov >= CodeObjectVersionKind::COV_5) {
19083 GEP = CGF.
Builder.CreateConstGEP1_32(
19084 CGF.
Int8Ty, EmitAMDGPUImplicitArgPtr(CGF), 12 + Index * 2);
19087 GEP = CGF.
Builder.CreateConstGEP1_32(
19088 CGF.
Int8Ty, EmitAMDGPUDispatchPtr(CGF), 4 + Index * 2);
19095 llvm::MDNode *RNode = MDHelper.createRange(
APInt(16, 1),
19097 LD->setMetadata(llvm::LLVMContext::MD_range, RNode);
19098 LD->setMetadata(llvm::LLVMContext::MD_noundef,
19100 LD->setMetadata(llvm::LLVMContext::MD_invariant_load,
19107 const unsigned XOffset = 12;
19108 auto *DP = EmitAMDGPUDispatchPtr(CGF);
19110 auto *Offset = llvm::ConstantInt::get(CGF.
Int32Ty, XOffset + Index * 4);
19118 LD->setMetadata(llvm::LLVMContext::MD_range,
19119 MDB.createRange(
APInt(32, 1), APInt::getZero(32)));
19120 LD->setMetadata(llvm::LLVMContext::MD_invariant_load,
19133 llvm::AtomicOrdering &AO,
19134 llvm::SyncScope::ID &SSID) {
19135 int ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
19138 assert(llvm::isValidAtomicOrderingCABI(ord));
19139 switch (
static_cast<llvm::AtomicOrderingCABI
>(ord)) {
19140 case llvm::AtomicOrderingCABI::acquire:
19141 case llvm::AtomicOrderingCABI::consume:
19142 AO = llvm::AtomicOrdering::Acquire;
19144 case llvm::AtomicOrderingCABI::release:
19145 AO = llvm::AtomicOrdering::Release;
19147 case llvm::AtomicOrderingCABI::acq_rel:
19148 AO = llvm::AtomicOrdering::AcquireRelease;
19150 case llvm::AtomicOrderingCABI::seq_cst:
19151 AO = llvm::AtomicOrdering::SequentiallyConsistent;
19153 case llvm::AtomicOrderingCABI::relaxed:
19154 AO = llvm::AtomicOrdering::Monotonic;
19160 if (llvm::getConstantStringInfo(
Scope, scp)) {
19166 int scope = cast<llvm::ConstantInt>(
Scope)->getZExtValue();
19169 SSID = llvm::SyncScope::System;
19181 SSID = llvm::SyncScope::SingleThread;
19184 SSID = llvm::SyncScope::System;
19192 llvm::Value *Arg =
nullptr;
19193 if ((ICEArguments & (1 << Idx)) == 0) {
19198 std::optional<llvm::APSInt>
Result =
19200 assert(
Result &&
"Expected argument to be a constant");
19209 return RT.getFDotIntrinsic();
19211 return RT.getSDotIntrinsic();
19213 return RT.getUDotIntrinsic();
19218 return RT.getFirstBitSHighIntrinsic();
19222 return RT.getFirstBitUHighIntrinsic();
19229 case llvm::Triple::spirv:
19230 return llvm::Intrinsic::spv_wave_reduce_sum;
19231 case llvm::Triple::dxil: {
19233 return llvm::Intrinsic::dx_wave_reduce_usum;
19234 return llvm::Intrinsic::dx_wave_reduce_sum;
19237 llvm_unreachable(
"Intrinsic WaveActiveSum"
19238 " not supported by target architecture");
19248 switch (BuiltinID) {
19249 case Builtin::BI__builtin_hlsl_resource_getpointer: {
19254 llvm::Type *RetTy = llvm::PointerType::getUnqual(
getLLVMContext());
19256 return Builder.CreateIntrinsic(
19260 case Builtin::BI__builtin_hlsl_all: {
19262 return Builder.CreateIntrinsic(
19267 case Builtin::BI__builtin_hlsl_any: {
19269 return Builder.CreateIntrinsic(
19274 case Builtin::BI__builtin_hlsl_asdouble:
19276 case Builtin::BI__builtin_hlsl_elementwise_clamp: {
19283 Ty = VecTy->getElementType();
19285 Intrinsic::ID Intr;
19294 return Builder.CreateIntrinsic(
19298 case Builtin::BI__builtin_hlsl_cross: {
19303 "cross operands must have a float representation");
19308 "input vectors must have 3 elements each");
19309 return Builder.CreateIntrinsic(
19313 case Builtin::BI__builtin_hlsl_dot: {
19316 llvm::Type *T0 = Op0->
getType();
19317 llvm::Type *T1 = Op1->
getType();
19320 if (!T0->isVectorTy() && !T1->isVectorTy()) {
19321 if (T0->isFloatingPointTy())
19322 return Builder.CreateFMul(Op0, Op1,
"hlsl.dot");
19324 if (T0->isIntegerTy())
19325 return Builder.CreateMul(Op0, Op1,
"hlsl.dot");
19328 "Scalar dot product is only supported on ints and floats.");
19333 assert(T0->isVectorTy() && T1->isVectorTy() &&
19334 "Dot product of vector and scalar is not supported.");
19337 [[maybe_unused]]
auto *VecTy1 =
19341 "Dot product of vectors need the same element types.");
19344 "Dot product requires vectors to be of the same size.");
19346 return Builder.CreateIntrinsic(
19347 T0->getScalarType(),
19351 case Builtin::BI__builtin_hlsl_dot4add_i8packed: {
19357 return Builder.CreateIntrinsic(
19359 "hlsl.dot4add.i8packed");
19361 case Builtin::BI__builtin_hlsl_dot4add_u8packed: {
19367 return Builder.CreateIntrinsic(
19369 "hlsl.dot4add.u8packed");
19371 case Builtin::BI__builtin_hlsl_elementwise_firstbithigh: {
19374 return Builder.CreateIntrinsic(
19379 case Builtin::BI__builtin_hlsl_elementwise_firstbitlow: {
19382 return Builder.CreateIntrinsic(
19385 nullptr,
"hlsl.firstbitlow");
19387 case Builtin::BI__builtin_hlsl_lerp: {
19392 llvm_unreachable(
"lerp operand must have a float representation");
19393 return Builder.CreateIntrinsic(
19397 case Builtin::BI__builtin_hlsl_normalize: {
19401 "normalize operand must have a float representation");
19403 return Builder.CreateIntrinsic(
19406 nullptr,
"hlsl.normalize");
19408 case Builtin::BI__builtin_hlsl_elementwise_degrees: {
19412 "degree operand must have a float representation");
19414 return Builder.CreateIntrinsic(
19418 case Builtin::BI__builtin_hlsl_elementwise_frac: {
19421 llvm_unreachable(
"frac operand must have a float representation");
19422 return Builder.CreateIntrinsic(
19426case Builtin::BI__builtin_hlsl_elementwise_isinf: {
19428 llvm::Type *Xty = Op0->
getType();
19429 llvm::Type *retType = llvm::Type::getInt1Ty(this->
getLLVMContext());
19430 if (Xty->isVectorTy()) {
19432 retType = llvm::VectorType::get(
19433 retType, ElementCount::getFixed(XVecTy->getNumElements()));
19436 llvm_unreachable(
"isinf operand must have a float representation");
19437 return Builder.CreateIntrinsic(retType, Intrinsic::dx_isinf,
19440 case Builtin::BI__builtin_hlsl_mad: {
19445 return Builder.CreateIntrinsic(
19446 M->
getType(), Intrinsic::fmuladd,
19451 return Builder.CreateIntrinsic(
19452 M->
getType(), Intrinsic::dx_imad,
19456 return Builder.CreateNSWAdd(Mul, B);
19460 return Builder.CreateIntrinsic(
19461 M->
getType(), Intrinsic::dx_umad,
19465 return Builder.CreateNUWAdd(Mul, B);
19467 case Builtin::BI__builtin_hlsl_elementwise_rcp: {
19470 llvm_unreachable(
"rcp operand must have a float representation");
19471 llvm::Type *Ty = Op0->
getType();
19472 llvm::Type *EltTy = Ty->getScalarType();
19473 Constant *One = Ty->isVectorTy()
19474 ? ConstantVector::getSplat(
19475 ElementCount::getFixed(
19476 cast<FixedVectorType>(Ty)->getNumElements()),
19477 ConstantFP::get(EltTy, 1.0))
19478 : ConstantFP::get(EltTy, 1.0);
19479 return Builder.CreateFDiv(One, Op0,
"hlsl.rcp");
19481 case Builtin::BI__builtin_hlsl_elementwise_rsqrt: {
19484 llvm_unreachable(
"rsqrt operand must have a float representation");
19485 return Builder.CreateIntrinsic(
19489 case Builtin::BI__builtin_hlsl_elementwise_saturate: {
19492 "saturate operand must have a float representation");
19493 return Builder.CreateIntrinsic(
19496 nullptr,
"hlsl.saturate");
19498 case Builtin::BI__builtin_hlsl_select: {
19512 Builder.CreateSelect(OpCond, OpTrue, OpFalse,
"hlsl.select");
19519 case Builtin::BI__builtin_hlsl_step: {
19524 "step operands must have a float representation");
19525 return Builder.CreateIntrinsic(
19529 case Builtin::BI__builtin_hlsl_wave_active_all_true: {
19531 assert(Op->
getType()->isIntegerTy(1) &&
19532 "Intrinsic WaveActiveAllTrue operand must be a bool");
19536 Intrinsic::getOrInsertDeclaration(&
CGM.
getModule(), ID), {Op});
19538 case Builtin::BI__builtin_hlsl_wave_active_any_true: {
19540 assert(Op->
getType()->isIntegerTy(1) &&
19541 "Intrinsic WaveActiveAnyTrue operand must be a bool");
19545 Intrinsic::getOrInsertDeclaration(&
CGM.
getModule(), ID), {Op});
19547 case Builtin::BI__builtin_hlsl_wave_active_count_bits: {
19551 Intrinsic::getOrInsertDeclaration(&
CGM.
getModule(), ID),
19554 case Builtin::BI__builtin_hlsl_wave_active_sum: {
19557 llvm::FunctionType *FT = llvm::FunctionType::get(
19569 ArrayRef{OpExpr},
"hlsl.wave.active.sum");
19571 case Builtin::BI__builtin_hlsl_wave_get_lane_index: {
19576 case llvm::Triple::dxil:
19579 case llvm::Triple::spirv:
19581 llvm::FunctionType::get(
IntTy, {},
false),
19582 "__hlsl_wave_get_lane_index", {},
false,
true));
19585 "Intrinsic WaveGetLaneIndex not supported by target architecture");
19588 case Builtin::BI__builtin_hlsl_wave_is_first_lane: {
19591 Intrinsic::getOrInsertDeclaration(&
CGM.
getModule(), ID));
19593 case Builtin::BI__builtin_hlsl_wave_read_lane_at: {
19598 llvm::FunctionType *FT = llvm::FunctionType::get(
19609 ArrayRef{OpExpr, OpIndex},
"hlsl.wave.readlane");
19611 case Builtin::BI__builtin_hlsl_elementwise_sign: {
19612 auto *Arg0 =
E->getArg(0);
19614 llvm::Type *Xty = Op0->
getType();
19615 llvm::Type *retType = llvm::Type::getInt32Ty(this->
getLLVMContext());
19616 if (Xty->isVectorTy()) {
19618 retType = llvm::VectorType::get(
19619 retType, ElementCount::getFixed(XVecTy->getNumElements()));
19623 "sign operand must have a float or int representation");
19626 Value *Cmp =
Builder.CreateICmpEQ(Op0, ConstantInt::get(Xty, 0));
19627 return Builder.CreateSelect(Cmp, ConstantInt::get(retType, 0),
19628 ConstantInt::get(retType, 1),
"hlsl.sign");
19631 return Builder.CreateIntrinsic(
19635 case Builtin::BI__builtin_hlsl_elementwise_radians: {
19638 "radians operand must have a float representation");
19639 return Builder.CreateIntrinsic(
19642 nullptr,
"hlsl.radians");
19644 case Builtin::BI__builtin_hlsl_buffer_update_counter: {
19648 return Builder.CreateIntrinsic(
19653 case Builtin::BI__builtin_hlsl_elementwise_splitdouble: {
19658 "asuint operands types mismatch");
19661 case Builtin::BI__builtin_hlsl_elementwise_clip:
19663 "clip operands types mismatch");
19665 case Builtin::BI__builtin_hlsl_group_memory_barrier_with_group_sync: {
19669 Intrinsic::getOrInsertDeclaration(&
CGM.
getModule(), ID));
19677 constexpr const char *
Tag =
"amdgpu-as";
19679 LLVMContext &Ctx = Inst->getContext();
19681 for (
unsigned K = 2; K <
E->getNumArgs(); ++K) {
19684 if (llvm::getConstantStringInfo(
V, AS)) {
19685 MMRAs.push_back({
Tag, AS});
19690 "expected an address space name as a string literal");
19694 MMRAs.erase(llvm::unique(MMRAs), MMRAs.end());
19695 Inst->setMetadata(LLVMContext::MD_mmra, MMRAMetadata::getMD(Ctx, MMRAs));
19700 llvm::AtomicOrdering AO = llvm::AtomicOrdering::SequentiallyConsistent;
19701 llvm::SyncScope::ID SSID;
19702 switch (BuiltinID) {
19703 case AMDGPU::BI__builtin_amdgcn_div_scale:
19704 case AMDGPU::BI__builtin_amdgcn_div_scalef: {
19717 llvm::Value *Tmp =
Builder.CreateCall(Callee, {
X, Y, Z});
19720 llvm::Value *Flag =
Builder.CreateExtractValue(Tmp, 1);
19724 llvm::Value *FlagExt =
Builder.CreateZExt(Flag, RealFlagType);
19728 case AMDGPU::BI__builtin_amdgcn_div_fmas:
19729 case AMDGPU::BI__builtin_amdgcn_div_fmasf: {
19737 llvm::Value *Src3ToBool =
Builder.CreateIsNotNull(Src3);
19738 return Builder.CreateCall(F, {Src0, Src1, Src2, Src3ToBool});
19741 case AMDGPU::BI__builtin_amdgcn_ds_swizzle:
19742 return emitBuiltinWithOneOverloadedType<2>(*
this,
E,
19743 Intrinsic::amdgcn_ds_swizzle);
19744 case AMDGPU::BI__builtin_amdgcn_mov_dpp8:
19745 case AMDGPU::BI__builtin_amdgcn_mov_dpp:
19746 case AMDGPU::BI__builtin_amdgcn_update_dpp: {
19750 unsigned ICEArguments = 0;
19755 unsigned Size = DataTy->getPrimitiveSizeInBits();
19756 llvm::Type *
IntTy =
19757 llvm::IntegerType::get(
Builder.getContext(), std::max(Size, 32u));
19760 ? Intrinsic::amdgcn_mov_dpp8
19761 : Intrinsic::amdgcn_update_dpp,
19763 assert(
E->getNumArgs() == 5 ||
E->getNumArgs() == 6 ||
19764 E->getNumArgs() == 2);
19765 bool InsertOld = BuiltinID == AMDGPU::BI__builtin_amdgcn_mov_dpp;
19767 Args.push_back(llvm::PoisonValue::get(
IntTy));
19768 for (
unsigned I = 0; I !=
E->getNumArgs(); ++I) {
19770 if (I < (BuiltinID == AMDGPU::BI__builtin_amdgcn_update_dpp ? 2u : 1u) &&
19772 if (!DataTy->isIntegerTy())
19774 V, llvm::IntegerType::get(
Builder.getContext(), Size));
19777 llvm::Type *ExpTy =
19778 F->getFunctionType()->getFunctionParamType(I + InsertOld);
19779 Args.push_back(
Builder.CreateTruncOrBitCast(
V, ExpTy));
19782 if (Size < 32 && !DataTy->isIntegerTy())
19784 V, llvm::IntegerType::get(
Builder.getContext(), Size));
19785 return Builder.CreateTruncOrBitCast(
V, DataTy);
19787 case AMDGPU::BI__builtin_amdgcn_permlane16:
19788 case AMDGPU::BI__builtin_amdgcn_permlanex16:
19789 return emitBuiltinWithOneOverloadedType<6>(
19791 BuiltinID == AMDGPU::BI__builtin_amdgcn_permlane16
19792 ? Intrinsic::amdgcn_permlane16
19793 : Intrinsic::amdgcn_permlanex16);
19794 case AMDGPU::BI__builtin_amdgcn_permlane64:
19795 return emitBuiltinWithOneOverloadedType<1>(*
this,
E,
19796 Intrinsic::amdgcn_permlane64);
19797 case AMDGPU::BI__builtin_amdgcn_readlane:
19798 return emitBuiltinWithOneOverloadedType<2>(*
this,
E,
19799 Intrinsic::amdgcn_readlane);
19800 case AMDGPU::BI__builtin_amdgcn_readfirstlane:
19801 return emitBuiltinWithOneOverloadedType<1>(*
this,
E,
19802 Intrinsic::amdgcn_readfirstlane);
19803 case AMDGPU::BI__builtin_amdgcn_div_fixup:
19804 case AMDGPU::BI__builtin_amdgcn_div_fixupf:
19805 case AMDGPU::BI__builtin_amdgcn_div_fixuph:
19806 return emitBuiltinWithOneOverloadedType<3>(*
this,
E,
19807 Intrinsic::amdgcn_div_fixup);
19808 case AMDGPU::BI__builtin_amdgcn_trig_preop:
19809 case AMDGPU::BI__builtin_amdgcn_trig_preopf:
19811 case AMDGPU::BI__builtin_amdgcn_rcp:
19812 case AMDGPU::BI__builtin_amdgcn_rcpf:
19813 case AMDGPU::BI__builtin_amdgcn_rcph:
19814 return emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::amdgcn_rcp);
19815 case AMDGPU::BI__builtin_amdgcn_sqrt:
19816 case AMDGPU::BI__builtin_amdgcn_sqrtf:
19817 case AMDGPU::BI__builtin_amdgcn_sqrth:
19818 return emitBuiltinWithOneOverloadedType<1>(*
this,
E,
19819 Intrinsic::amdgcn_sqrt);
19820 case AMDGPU::BI__builtin_amdgcn_rsq:
19821 case AMDGPU::BI__builtin_amdgcn_rsqf:
19822 case AMDGPU::BI__builtin_amdgcn_rsqh:
19823 return emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::amdgcn_rsq);
19824 case AMDGPU::BI__builtin_amdgcn_rsq_clamp:
19825 case AMDGPU::BI__builtin_amdgcn_rsq_clampf:
19826 return emitBuiltinWithOneOverloadedType<1>(*
this,
E,
19827 Intrinsic::amdgcn_rsq_clamp);
19828 case AMDGPU::BI__builtin_amdgcn_sinf:
19829 case AMDGPU::BI__builtin_amdgcn_sinh:
19830 return emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::amdgcn_sin);
19831 case AMDGPU::BI__builtin_amdgcn_cosf:
19832 case AMDGPU::BI__builtin_amdgcn_cosh:
19833 return emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::amdgcn_cos);
19834 case AMDGPU::BI__builtin_amdgcn_dispatch_ptr:
19835 return EmitAMDGPUDispatchPtr(*
this,
E);
19836 case AMDGPU::BI__builtin_amdgcn_logf:
19837 return emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::amdgcn_log);
19838 case AMDGPU::BI__builtin_amdgcn_exp2f:
19839 return emitBuiltinWithOneOverloadedType<1>(*
this,
E,
19840 Intrinsic::amdgcn_exp2);
19841 case AMDGPU::BI__builtin_amdgcn_log_clampf:
19842 return emitBuiltinWithOneOverloadedType<1>(*
this,
E,
19843 Intrinsic::amdgcn_log_clamp);
19844 case AMDGPU::BI__builtin_amdgcn_ldexp:
19845 case AMDGPU::BI__builtin_amdgcn_ldexpf: {
19848 llvm::Function *F =
19849 CGM.
getIntrinsic(Intrinsic::ldexp, {Src0->getType(), Src1->getType()});
19850 return Builder.CreateCall(F, {Src0, Src1});
19852 case AMDGPU::BI__builtin_amdgcn_ldexph: {
19857 llvm::Function *F =
19861 case AMDGPU::BI__builtin_amdgcn_frexp_mant:
19862 case AMDGPU::BI__builtin_amdgcn_frexp_mantf:
19863 case AMDGPU::BI__builtin_amdgcn_frexp_manth:
19864 return emitBuiltinWithOneOverloadedType<1>(*
this,
E,
19865 Intrinsic::amdgcn_frexp_mant);
19866 case AMDGPU::BI__builtin_amdgcn_frexp_exp:
19867 case AMDGPU::BI__builtin_amdgcn_frexp_expf: {
19871 return Builder.CreateCall(F, Src0);
19873 case AMDGPU::BI__builtin_amdgcn_frexp_exph: {
19877 return Builder.CreateCall(F, Src0);
19879 case AMDGPU::BI__builtin_amdgcn_fract:
19880 case AMDGPU::BI__builtin_amdgcn_fractf:
19881 case AMDGPU::BI__builtin_amdgcn_fracth:
19882 return emitBuiltinWithOneOverloadedType<1>(*
this,
E,
19883 Intrinsic::amdgcn_fract);
19884 case AMDGPU::BI__builtin_amdgcn_lerp:
19885 return emitBuiltinWithOneOverloadedType<3>(*
this,
E,
19886 Intrinsic::amdgcn_lerp);
19887 case AMDGPU::BI__builtin_amdgcn_ubfe:
19888 return emitBuiltinWithOneOverloadedType<3>(*
this,
E,
19889 Intrinsic::amdgcn_ubfe);
19890 case AMDGPU::BI__builtin_amdgcn_sbfe:
19891 return emitBuiltinWithOneOverloadedType<3>(*
this,
E,
19892 Intrinsic::amdgcn_sbfe);
19893 case AMDGPU::BI__builtin_amdgcn_ballot_w32:
19894 case AMDGPU::BI__builtin_amdgcn_ballot_w64: {
19898 return Builder.CreateCall(F, { Src });
19900 case AMDGPU::BI__builtin_amdgcn_uicmp:
19901 case AMDGPU::BI__builtin_amdgcn_uicmpl:
19902 case AMDGPU::BI__builtin_amdgcn_sicmp:
19903 case AMDGPU::BI__builtin_amdgcn_sicmpl: {
19910 {
Builder.getInt64Ty(), Src0->getType() });
19911 return Builder.CreateCall(F, { Src0, Src1, Src2 });
19913 case AMDGPU::BI__builtin_amdgcn_fcmp:
19914 case AMDGPU::BI__builtin_amdgcn_fcmpf: {
19921 {
Builder.getInt64Ty(), Src0->getType() });
19922 return Builder.CreateCall(F, { Src0, Src1, Src2 });
19924 case AMDGPU::BI__builtin_amdgcn_class:
19925 case AMDGPU::BI__builtin_amdgcn_classf:
19926 case AMDGPU::BI__builtin_amdgcn_classh:
19928 case AMDGPU::BI__builtin_amdgcn_fmed3f:
19929 case AMDGPU::BI__builtin_amdgcn_fmed3h:
19930 return emitBuiltinWithOneOverloadedType<3>(*
this,
E,
19931 Intrinsic::amdgcn_fmed3);
19932 case AMDGPU::BI__builtin_amdgcn_ds_append:
19933 case AMDGPU::BI__builtin_amdgcn_ds_consume: {
19934 Intrinsic::ID Intrin = BuiltinID == AMDGPU::BI__builtin_amdgcn_ds_append ?
19935 Intrinsic::amdgcn_ds_append : Intrinsic::amdgcn_ds_consume;
19940 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b64_i32:
19941 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b64_v2i32:
19942 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v4i16:
19943 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v4f16:
19944 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v4bf16:
19945 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v8i16:
19946 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v8f16:
19947 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v8bf16:
19948 case AMDGPU::BI__builtin_amdgcn_ds_read_tr4_b64_v2i32:
19949 case AMDGPU::BI__builtin_amdgcn_ds_read_tr8_b64_v2i32:
19950 case AMDGPU::BI__builtin_amdgcn_ds_read_tr6_b96_v3i32:
19951 case AMDGPU::BI__builtin_amdgcn_ds_read_tr16_b64_v4f16:
19952 case AMDGPU::BI__builtin_amdgcn_ds_read_tr16_b64_v4bf16:
19953 case AMDGPU::BI__builtin_amdgcn_ds_read_tr16_b64_v4i16: {
19955 switch (BuiltinID) {
19956 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b64_i32:
19957 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b64_v2i32:
19958 IID = Intrinsic::amdgcn_global_load_tr_b64;
19960 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v4i16:
19961 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v4f16:
19962 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v4bf16:
19963 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v8i16:
19964 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v8f16:
19965 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v8bf16:
19966 IID = Intrinsic::amdgcn_global_load_tr_b128;
19968 case AMDGPU::BI__builtin_amdgcn_ds_read_tr4_b64_v2i32:
19969 IID = Intrinsic::amdgcn_ds_read_tr4_b64;
19971 case AMDGPU::BI__builtin_amdgcn_ds_read_tr8_b64_v2i32:
19972 IID = Intrinsic::amdgcn_ds_read_tr8_b64;
19974 case AMDGPU::BI__builtin_amdgcn_ds_read_tr6_b96_v3i32:
19975 IID = Intrinsic::amdgcn_ds_read_tr6_b96;
19977 case AMDGPU::BI__builtin_amdgcn_ds_read_tr16_b64_v4i16:
19978 case AMDGPU::BI__builtin_amdgcn_ds_read_tr16_b64_v4f16:
19979 case AMDGPU::BI__builtin_amdgcn_ds_read_tr16_b64_v4bf16:
19980 IID = Intrinsic::amdgcn_ds_read_tr16_b64;
19986 return Builder.CreateCall(F, {Addr});
19988 case AMDGPU::BI__builtin_amdgcn_get_fpenv: {
19991 return Builder.CreateCall(F);
19993 case AMDGPU::BI__builtin_amdgcn_set_fpenv: {
19999 case AMDGPU::BI__builtin_amdgcn_read_exec:
20001 case AMDGPU::BI__builtin_amdgcn_read_exec_lo:
20003 case AMDGPU::BI__builtin_amdgcn_read_exec_hi:
20005 case AMDGPU::BI__builtin_amdgcn_image_bvh_intersect_ray:
20006 case AMDGPU::BI__builtin_amdgcn_image_bvh_intersect_ray_h:
20007 case AMDGPU::BI__builtin_amdgcn_image_bvh_intersect_ray_l:
20008 case AMDGPU::BI__builtin_amdgcn_image_bvh_intersect_ray_lh: {
20018 RayOrigin =
Builder.CreateShuffleVector(RayOrigin, RayOrigin,
20022 RayInverseDir =
Builder.CreateShuffleVector(RayInverseDir, RayInverseDir,
20026 {NodePtr->getType(), RayDir->getType()});
20027 return Builder.CreateCall(F, {NodePtr, RayExtent, RayOrigin, RayDir,
20028 RayInverseDir, TextureDescr});
20031 case AMDGPU::BI__builtin_amdgcn_ds_bvh_stack_rtn: {
20033 for (
int i = 0, e =
E->getNumArgs(); i != e; ++i)
20041 Value *I0 =
Builder.CreateInsertElement(PoisonValue::get(RetTy), Rtn,
20043 return Builder.CreateInsertElement(I0, A, 1);
20045 case AMDGPU::BI__builtin_amdgcn_mfma_scale_f32_16x16x128_f8f6f4:
20046 case AMDGPU::BI__builtin_amdgcn_mfma_scale_f32_32x32x64_f8f6f4: {
20047 llvm::FixedVectorType *VT = FixedVectorType::get(
Builder.getInt32Ty(), 8);
20049 BuiltinID == AMDGPU::BI__builtin_amdgcn_mfma_scale_f32_32x32x64_f8f6f4
20050 ? Intrinsic::amdgcn_mfma_scale_f32_32x32x64_f8f6f4
20051 : Intrinsic::amdgcn_mfma_scale_f32_16x16x128_f8f6f4,
20055 for (
unsigned I = 0, N =
E->getNumArgs(); I != N; ++I)
20057 return Builder.CreateCall(F, Args);
20059 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w32:
20060 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_tied_w32:
20061 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w64:
20062 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_tied_w64:
20063 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w32:
20064 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_tied_w32:
20065 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w64:
20066 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_tied_w64:
20067 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w32:
20068 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w64:
20069 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w32:
20070 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w64:
20071 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w32:
20072 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w64:
20073 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w32:
20074 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w64:
20075 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w32_gfx12:
20076 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w64_gfx12:
20077 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w32_gfx12:
20078 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w64_gfx12:
20079 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w32_gfx12:
20080 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w64_gfx12:
20081 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w32_gfx12:
20082 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w64_gfx12:
20083 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w32_gfx12:
20084 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w64_gfx12:
20085 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w32_gfx12:
20086 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w64_gfx12:
20087 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_fp8_w32_gfx12:
20088 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_fp8_w64_gfx12:
20089 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_bf8_w32_gfx12:
20090 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_bf8_w64_gfx12:
20091 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_fp8_w32_gfx12:
20092 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_fp8_w64_gfx12:
20093 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_bf8_w32_gfx12:
20094 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_bf8_w64_gfx12:
20095 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x32_iu4_w32_gfx12:
20096 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x32_iu4_w64_gfx12:
20097 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_f16_w32:
20098 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_f16_w64:
20099 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf16_w32:
20100 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf16_w64:
20101 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x32_f16_w32:
20102 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x32_f16_w64:
20103 case AMDGPU::BI__builtin_amdgcn_swmmac_bf16_16x16x32_bf16_w32:
20104 case AMDGPU::BI__builtin_amdgcn_swmmac_bf16_16x16x32_bf16_w64:
20105 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu8_w32:
20106 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu8_w64:
20107 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu4_w32:
20108 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu4_w64:
20109 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x64_iu4_w32:
20110 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x64_iu4_w64:
20111 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_fp8_w32:
20112 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_fp8_w64:
20113 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_bf8_w32:
20114 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_bf8_w64:
20115 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_fp8_w32:
20116 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_fp8_w64:
20117 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_bf8_w32:
20118 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_bf8_w64: {
20131 bool AppendFalseForOpselArg =
false;
20132 unsigned BuiltinWMMAOp;
20134 switch (BuiltinID) {
20135 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w32:
20136 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w64:
20137 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w32_gfx12:
20138 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w64_gfx12:
20139 ArgsForMatchingMatrixTypes = {2, 0};
20140 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x16_f16;
20142 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w32:
20143 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w64:
20144 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w32_gfx12:
20145 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w64_gfx12:
20146 ArgsForMatchingMatrixTypes = {2, 0};
20147 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x16_bf16;
20149 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w32_gfx12:
20150 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w64_gfx12:
20151 AppendFalseForOpselArg =
true;
20153 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w32:
20154 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w64:
20155 ArgsForMatchingMatrixTypes = {2, 0};
20156 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f16_16x16x16_f16;
20158 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w32_gfx12:
20159 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w64_gfx12:
20160 AppendFalseForOpselArg =
true;
20162 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w32:
20163 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w64:
20164 ArgsForMatchingMatrixTypes = {2, 0};
20165 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_bf16_16x16x16_bf16;
20167 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_tied_w32:
20168 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_tied_w64:
20169 ArgsForMatchingMatrixTypes = {2, 0};
20170 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f16_16x16x16_f16_tied;
20172 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_tied_w32:
20173 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_tied_w64:
20174 ArgsForMatchingMatrixTypes = {2, 0};
20175 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_bf16_16x16x16_bf16_tied;
20177 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w32:
20178 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w64:
20179 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w32_gfx12:
20180 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w64_gfx12:
20181 ArgsForMatchingMatrixTypes = {4, 1};
20182 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_i32_16x16x16_iu8;
20184 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w32:
20185 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w64:
20186 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w32_gfx12:
20187 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w64_gfx12:
20188 ArgsForMatchingMatrixTypes = {4, 1};
20189 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_i32_16x16x16_iu4;
20191 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_fp8_w32_gfx12:
20192 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_fp8_w64_gfx12:
20193 ArgsForMatchingMatrixTypes = {2, 0};
20194 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x16_fp8_fp8;
20196 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_bf8_w32_gfx12:
20197 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_bf8_w64_gfx12:
20198 ArgsForMatchingMatrixTypes = {2, 0};
20199 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x16_fp8_bf8;
20201 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_fp8_w32_gfx12:
20202 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_fp8_w64_gfx12:
20203 ArgsForMatchingMatrixTypes = {2, 0};
20204 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x16_bf8_fp8;
20206 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_bf8_w32_gfx12:
20207 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_bf8_w64_gfx12:
20208 ArgsForMatchingMatrixTypes = {2, 0};
20209 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x16_bf8_bf8;
20211 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x32_iu4_w32_gfx12:
20212 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x32_iu4_w64_gfx12:
20213 ArgsForMatchingMatrixTypes = {4, 1};
20214 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_i32_16x16x32_iu4;
20216 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_f16_w32:
20217 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_f16_w64:
20218 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
20219 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x32_f16;
20221 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf16_w32:
20222 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf16_w64:
20223 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
20224 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x32_bf16;
20226 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x32_f16_w32:
20227 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x32_f16_w64:
20228 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
20229 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f16_16x16x32_f16;
20231 case AMDGPU::BI__builtin_amdgcn_swmmac_bf16_16x16x32_bf16_w32:
20232 case AMDGPU::BI__builtin_amdgcn_swmmac_bf16_16x16x32_bf16_w64:
20233 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
20234 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_bf16_16x16x32_bf16;
20236 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu8_w32:
20237 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu8_w64:
20238 ArgsForMatchingMatrixTypes = {4, 1, 3, 5};
20239 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_i32_16x16x32_iu8;
20241 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu4_w32:
20242 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu4_w64:
20243 ArgsForMatchingMatrixTypes = {4, 1, 3, 5};
20244 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_i32_16x16x32_iu4;
20246 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x64_iu4_w32:
20247 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x64_iu4_w64:
20248 ArgsForMatchingMatrixTypes = {4, 1, 3, 5};
20249 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_i32_16x16x64_iu4;
20251 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_fp8_w32:
20252 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_fp8_w64:
20253 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
20254 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x32_fp8_fp8;
20256 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_bf8_w32:
20257 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_bf8_w64:
20258 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
20259 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x32_fp8_bf8;
20261 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_fp8_w32:
20262 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_fp8_w64:
20263 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
20264 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x32_bf8_fp8;
20266 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_bf8_w32:
20267 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_bf8_w64:
20268 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
20269 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x32_bf8_bf8;
20274 for (
int i = 0, e =
E->getNumArgs(); i != e; ++i)
20276 if (AppendFalseForOpselArg)
20277 Args.push_back(
Builder.getFalse());
20280 for (
auto ArgIdx : ArgsForMatchingMatrixTypes)
20281 ArgTypes.push_back(Args[ArgIdx]->getType());
20284 return Builder.CreateCall(F, Args);
20288 case AMDGPU::BI__builtin_amdgcn_workitem_id_x:
20290 case AMDGPU::BI__builtin_amdgcn_workitem_id_y:
20292 case AMDGPU::BI__builtin_amdgcn_workitem_id_z:
20296 case AMDGPU::BI__builtin_amdgcn_workgroup_size_x:
20297 return EmitAMDGPUWorkGroupSize(*
this, 0);
20298 case AMDGPU::BI__builtin_amdgcn_workgroup_size_y:
20299 return EmitAMDGPUWorkGroupSize(*
this, 1);
20300 case AMDGPU::BI__builtin_amdgcn_workgroup_size_z:
20301 return EmitAMDGPUWorkGroupSize(*
this, 2);
20304 case AMDGPU::BI__builtin_amdgcn_grid_size_x:
20305 return EmitAMDGPUGridSize(*
this, 0);
20306 case AMDGPU::BI__builtin_amdgcn_grid_size_y:
20307 return EmitAMDGPUGridSize(*
this, 1);
20308 case AMDGPU::BI__builtin_amdgcn_grid_size_z:
20309 return EmitAMDGPUGridSize(*
this, 2);
20312 case AMDGPU::BI__builtin_r600_recipsqrt_ieee:
20313 case AMDGPU::BI__builtin_r600_recipsqrt_ieeef:
20314 return emitBuiltinWithOneOverloadedType<1>(*
this,
E,
20315 Intrinsic::r600_recipsqrt_ieee);
20316 case AMDGPU::BI__builtin_r600_read_tidig_x:
20318 case AMDGPU::BI__builtin_r600_read_tidig_y:
20320 case AMDGPU::BI__builtin_r600_read_tidig_z:
20322 case AMDGPU::BI__builtin_amdgcn_alignbit: {
20327 return Builder.CreateCall(F, { Src0, Src1, Src2 });
20329 case AMDGPU::BI__builtin_amdgcn_fence: {
20332 FenceInst *Fence =
Builder.CreateFence(AO, SSID);
20333 if (
E->getNumArgs() > 2)
20337 case AMDGPU::BI__builtin_amdgcn_atomic_inc32:
20338 case AMDGPU::BI__builtin_amdgcn_atomic_inc64:
20339 case AMDGPU::BI__builtin_amdgcn_atomic_dec32:
20340 case AMDGPU::BI__builtin_amdgcn_atomic_dec64:
20341 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_f64:
20342 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_f32:
20343 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_v2f16:
20344 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_v2bf16:
20345 case AMDGPU::BI__builtin_amdgcn_ds_faddf:
20346 case AMDGPU::BI__builtin_amdgcn_ds_fminf:
20347 case AMDGPU::BI__builtin_amdgcn_ds_fmaxf:
20348 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_f32:
20349 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_f64:
20350 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_v2f16:
20351 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_v2f16:
20352 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_f32:
20353 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_f64:
20354 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_v2bf16:
20355 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_v2bf16:
20356 case AMDGPU::BI__builtin_amdgcn_global_atomic_fmin_f64:
20357 case AMDGPU::BI__builtin_amdgcn_global_atomic_fmax_f64:
20358 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fmin_f64:
20359 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fmax_f64: {
20360 llvm::AtomicRMWInst::BinOp BinOp;
20361 switch (BuiltinID) {
20362 case AMDGPU::BI__builtin_amdgcn_atomic_inc32:
20363 case AMDGPU::BI__builtin_amdgcn_atomic_inc64:
20364 BinOp = llvm::AtomicRMWInst::UIncWrap;
20366 case AMDGPU::BI__builtin_amdgcn_atomic_dec32:
20367 case AMDGPU::BI__builtin_amdgcn_atomic_dec64:
20368 BinOp = llvm::AtomicRMWInst::UDecWrap;
20370 case AMDGPU::BI__builtin_amdgcn_ds_faddf:
20371 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_f64:
20372 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_f32:
20373 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_v2f16:
20374 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_v2bf16:
20375 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_f32:
20376 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_f64:
20377 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_v2f16:
20378 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_v2f16:
20379 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_f32:
20380 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_f64:
20381 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_v2bf16:
20382 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_v2bf16:
20383 BinOp = llvm::AtomicRMWInst::FAdd;
20385 case AMDGPU::BI__builtin_amdgcn_ds_fminf:
20386 case AMDGPU::BI__builtin_amdgcn_global_atomic_fmin_f64:
20387 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fmin_f64:
20388 BinOp = llvm::AtomicRMWInst::FMin;
20390 case AMDGPU::BI__builtin_amdgcn_global_atomic_fmax_f64:
20391 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fmax_f64:
20392 case AMDGPU::BI__builtin_amdgcn_ds_fmaxf:
20393 BinOp = llvm::AtomicRMWInst::FMax;
20399 llvm::Type *OrigTy = Val->
getType();
20404 if (BuiltinID == AMDGPU::BI__builtin_amdgcn_ds_faddf ||
20405 BuiltinID == AMDGPU::BI__builtin_amdgcn_ds_fminf ||
20406 BuiltinID == AMDGPU::BI__builtin_amdgcn_ds_fmaxf) {
20416 if (
E->getNumArgs() >= 4) {
20428 AO = AtomicOrdering::Monotonic;
20431 if (BuiltinID == AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_v2bf16 ||
20432 BuiltinID == AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_v2bf16 ||
20433 BuiltinID == AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_v2bf16) {
20434 llvm::Type *V2BF16Ty = FixedVectorType::get(
20435 llvm::Type::getBFloatTy(
Builder.getContext()), 2);
20436 Val =
Builder.CreateBitCast(Val, V2BF16Ty);
20440 llvm::AtomicRMWInst *RMW =
20443 RMW->setVolatile(
true);
20445 unsigned AddrSpace = Ptr.
getType()->getAddressSpace();
20446 if (AddrSpace != llvm::AMDGPUAS::LOCAL_ADDRESS) {
20450 RMW->setMetadata(
"amdgpu.no.fine.grained.memory", EmptyMD);
20454 if (BinOp == llvm::AtomicRMWInst::FAdd && Val->
getType()->isFloatTy())
20455 RMW->setMetadata(
"amdgpu.ignore.denormal.mode", EmptyMD);
20458 return Builder.CreateBitCast(RMW, OrigTy);
20460 case AMDGPU::BI__builtin_amdgcn_s_sendmsg_rtn:
20461 case AMDGPU::BI__builtin_amdgcn_s_sendmsg_rtnl: {
20467 return Builder.CreateCall(F, {Arg});
20469 case AMDGPU::BI__builtin_amdgcn_permlane16_swap:
20470 case AMDGPU::BI__builtin_amdgcn_permlane32_swap: {
20478 CGM.
getIntrinsic(BuiltinID == AMDGPU::BI__builtin_amdgcn_permlane16_swap
20479 ? Intrinsic::amdgcn_permlane16_swap
20480 : Intrinsic::amdgcn_permlane32_swap);
20481 llvm::CallInst *
Call =
20482 Builder.CreateCall(F, {VDstOld, VSrcOld, FI, BoundCtrl});
20484 llvm::Value *Elt0 =
Builder.CreateExtractValue(
Call, 0);
20485 llvm::Value *Elt1 =
Builder.CreateExtractValue(
Call, 1);
20489 llvm::Value *Insert0 =
Builder.CreateInsertElement(
20490 llvm::PoisonValue::get(ResultType), Elt0, UINT64_C(0));
20491 llvm::Value *AsVector =
20492 Builder.CreateInsertElement(Insert0, Elt1, UINT64_C(1));
20495 case AMDGPU::BI__builtin_amdgcn_bitop3_b32:
20496 case AMDGPU::BI__builtin_amdgcn_bitop3_b16:
20497 return emitBuiltinWithOneOverloadedType<4>(*
this,
E,
20498 Intrinsic::amdgcn_bitop3);
20499 case AMDGPU::BI__builtin_amdgcn_make_buffer_rsrc:
20500 return emitBuiltinWithOneOverloadedType<4>(
20501 *
this,
E, Intrinsic::amdgcn_make_buffer_rsrc);
20502 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_b8:
20503 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_b16:
20504 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_b32:
20505 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_b64:
20506 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_b96:
20507 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_b128:
20508 return emitBuiltinWithOneOverloadedType<5>(
20509 *
this,
E, Intrinsic::amdgcn_raw_ptr_buffer_store);
20510 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b8:
20511 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b16:
20512 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b32:
20513 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b64:
20514 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b96:
20515 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b128: {
20516 llvm::Type *RetTy =
nullptr;
20517 switch (BuiltinID) {
20518 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b8:
20521 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b16:
20524 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b32:
20527 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b64:
20528 RetTy = llvm::FixedVectorType::get(
Int32Ty, 2);
20530 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b96:
20531 RetTy = llvm::FixedVectorType::get(
Int32Ty, 3);
20533 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b128:
20534 RetTy = llvm::FixedVectorType::get(
Int32Ty, 4);
20543 case AMDGPU::BI__builtin_amdgcn_s_prefetch_data:
20544 return emitBuiltinWithOneOverloadedType<2>(
20545 *
this,
E, Intrinsic::amdgcn_s_prefetch_data);
20553 switch (BuiltinID) {
20554 case SPIRV::BI__builtin_spirv_distance: {
20559 "Distance operands must have a float representation");
20562 "Distance operands must be a vector");
20563 return Builder.CreateIntrinsic(
20564 X->getType()->getScalarType(), Intrinsic::spv_distance,
20567 case SPIRV::BI__builtin_spirv_length: {
20570 "length operand must have a float representation");
20572 "length operand must be a vector");
20573 return Builder.CreateIntrinsic(
20574 X->getType()->getScalarType(), Intrinsic::spv_length,
20585 unsigned IntrinsicID,
20587 unsigned NumArgs =
E->getNumArgs() - 1;
20589 for (
unsigned I = 0; I < NumArgs; ++I)
20601 switch (BuiltinID) {
20602 case SystemZ::BI__builtin_tbegin: {
20604 Value *Control = llvm::ConstantInt::get(
Int32Ty, 0xff0c);
20606 return Builder.CreateCall(F, {TDB, Control});
20608 case SystemZ::BI__builtin_tbegin_nofloat: {
20610 Value *Control = llvm::ConstantInt::get(
Int32Ty, 0xff0c);
20612 return Builder.CreateCall(F, {TDB, Control});
20614 case SystemZ::BI__builtin_tbeginc: {
20616 Value *Control = llvm::ConstantInt::get(
Int32Ty, 0xff08);
20618 return Builder.CreateCall(F, {TDB, Control});
20620 case SystemZ::BI__builtin_tabort: {
20625 case SystemZ::BI__builtin_non_tx_store: {
20637 case SystemZ::BI__builtin_s390_vclzb:
20638 case SystemZ::BI__builtin_s390_vclzh:
20639 case SystemZ::BI__builtin_s390_vclzf:
20640 case SystemZ::BI__builtin_s390_vclzg:
20641 case SystemZ::BI__builtin_s390_vclzq: {
20644 Value *Undef = ConstantInt::get(
Builder.getInt1Ty(),
false);
20646 return Builder.CreateCall(F, {
X, Undef});
20649 case SystemZ::BI__builtin_s390_vctzb:
20650 case SystemZ::BI__builtin_s390_vctzh:
20651 case SystemZ::BI__builtin_s390_vctzf:
20652 case SystemZ::BI__builtin_s390_vctzg:
20653 case SystemZ::BI__builtin_s390_vctzq: {
20656 Value *Undef = ConstantInt::get(
Builder.getInt1Ty(),
false);
20658 return Builder.CreateCall(F, {
X, Undef});
20661 case SystemZ::BI__builtin_s390_verllb:
20662 case SystemZ::BI__builtin_s390_verllh:
20663 case SystemZ::BI__builtin_s390_verllf:
20664 case SystemZ::BI__builtin_s390_verllg: {
20669 unsigned NumElts = cast<llvm::FixedVectorType>(ResultType)->getNumElements();
20670 Amt =
Builder.CreateIntCast(Amt, ResultType->getScalarType(),
false);
20671 Amt =
Builder.CreateVectorSplat(NumElts, Amt);
20673 return Builder.CreateCall(F, { Src, Src, Amt });
20676 case SystemZ::BI__builtin_s390_verllvb:
20677 case SystemZ::BI__builtin_s390_verllvh:
20678 case SystemZ::BI__builtin_s390_verllvf:
20679 case SystemZ::BI__builtin_s390_verllvg: {
20684 return Builder.CreateCall(F, { Src, Src, Amt });
20687 case SystemZ::BI__builtin_s390_vfsqsb:
20688 case SystemZ::BI__builtin_s390_vfsqdb: {
20691 if (
Builder.getIsFPConstrained()) {
20693 return Builder.CreateConstrainedFPCall(F, {
X });
20699 case SystemZ::BI__builtin_s390_vfmasb:
20700 case SystemZ::BI__builtin_s390_vfmadb: {
20705 if (
Builder.getIsFPConstrained()) {
20707 return Builder.CreateConstrainedFPCall(F, {
X, Y, Z});
20710 return Builder.CreateCall(F, {
X, Y, Z});
20713 case SystemZ::BI__builtin_s390_vfmssb:
20714 case SystemZ::BI__builtin_s390_vfmsdb: {
20719 if (
Builder.getIsFPConstrained()) {
20721 return Builder.CreateConstrainedFPCall(F, {
X, Y,
Builder.CreateFNeg(Z,
"neg")});
20727 case SystemZ::BI__builtin_s390_vfnmasb:
20728 case SystemZ::BI__builtin_s390_vfnmadb: {
20733 if (
Builder.getIsFPConstrained()) {
20735 return Builder.CreateFNeg(
Builder.CreateConstrainedFPCall(F, {X, Y, Z}),
"neg");
20738 return Builder.CreateFNeg(
Builder.CreateCall(F, {X, Y, Z}),
"neg");
20741 case SystemZ::BI__builtin_s390_vfnmssb:
20742 case SystemZ::BI__builtin_s390_vfnmsdb: {
20747 if (
Builder.getIsFPConstrained()) {
20750 return Builder.CreateFNeg(
Builder.CreateConstrainedFPCall(F, {X, Y, NegZ}));
20757 case SystemZ::BI__builtin_s390_vflpsb:
20758 case SystemZ::BI__builtin_s390_vflpdb: {
20764 case SystemZ::BI__builtin_s390_vflnsb:
20765 case SystemZ::BI__builtin_s390_vflndb: {
20771 case SystemZ::BI__builtin_s390_vfisb:
20772 case SystemZ::BI__builtin_s390_vfidb: {
20780 Intrinsic::ID
ID = Intrinsic::not_intrinsic;
20782 switch (M4.getZExtValue()) {
20785 switch (M5.getZExtValue()) {
20787 case 0:
ID = Intrinsic::rint;
20788 CI = Intrinsic::experimental_constrained_rint;
break;
20792 switch (M5.getZExtValue()) {
20794 case 0:
ID = Intrinsic::nearbyint;
20795 CI = Intrinsic::experimental_constrained_nearbyint;
break;
20796 case 1:
ID = Intrinsic::round;
20797 CI = Intrinsic::experimental_constrained_round;
break;
20798 case 5:
ID = Intrinsic::trunc;
20799 CI = Intrinsic::experimental_constrained_trunc;
break;
20800 case 6:
ID = Intrinsic::ceil;
20801 CI = Intrinsic::experimental_constrained_ceil;
break;
20802 case 7:
ID = Intrinsic::floor;
20803 CI = Intrinsic::experimental_constrained_floor;
break;
20807 if (ID != Intrinsic::not_intrinsic) {
20808 if (
Builder.getIsFPConstrained()) {
20810 return Builder.CreateConstrainedFPCall(F,
X);
20816 switch (BuiltinID) {
20817 case SystemZ::BI__builtin_s390_vfisb:
ID = Intrinsic::s390_vfisb;
break;
20818 case SystemZ::BI__builtin_s390_vfidb:
ID = Intrinsic::s390_vfidb;
break;
20819 default: llvm_unreachable(
"Unknown BuiltinID");
20824 return Builder.CreateCall(F, {
X, M4Value, M5Value});
20826 case SystemZ::BI__builtin_s390_vfmaxsb:
20827 case SystemZ::BI__builtin_s390_vfmaxdb: {
20835 Intrinsic::ID
ID = Intrinsic::not_intrinsic;
20837 switch (M4.getZExtValue()) {
20839 case 4:
ID = Intrinsic::maxnum;
20840 CI = Intrinsic::experimental_constrained_maxnum;
break;
20842 if (ID != Intrinsic::not_intrinsic) {
20843 if (
Builder.getIsFPConstrained()) {
20845 return Builder.CreateConstrainedFPCall(F, {
X, Y});
20848 return Builder.CreateCall(F, {
X, Y});
20851 switch (BuiltinID) {
20852 case SystemZ::BI__builtin_s390_vfmaxsb:
ID = Intrinsic::s390_vfmaxsb;
break;
20853 case SystemZ::BI__builtin_s390_vfmaxdb:
ID = Intrinsic::s390_vfmaxdb;
break;
20854 default: llvm_unreachable(
"Unknown BuiltinID");
20858 return Builder.CreateCall(F, {
X, Y, M4Value});
20860 case SystemZ::BI__builtin_s390_vfminsb:
20861 case SystemZ::BI__builtin_s390_vfmindb: {
20869 Intrinsic::ID
ID = Intrinsic::not_intrinsic;
20871 switch (M4.getZExtValue()) {
20873 case 4:
ID = Intrinsic::minnum;
20874 CI = Intrinsic::experimental_constrained_minnum;
break;
20876 if (ID != Intrinsic::not_intrinsic) {
20877 if (
Builder.getIsFPConstrained()) {
20879 return Builder.CreateConstrainedFPCall(F, {
X, Y});
20882 return Builder.CreateCall(F, {
X, Y});
20885 switch (BuiltinID) {
20886 case SystemZ::BI__builtin_s390_vfminsb:
ID = Intrinsic::s390_vfminsb;
break;
20887 case SystemZ::BI__builtin_s390_vfmindb:
ID = Intrinsic::s390_vfmindb;
break;
20888 default: llvm_unreachable(
"Unknown BuiltinID");
20892 return Builder.CreateCall(F, {
X, Y, M4Value});
20895 case SystemZ::BI__builtin_s390_vlbrh:
20896 case SystemZ::BI__builtin_s390_vlbrf:
20897 case SystemZ::BI__builtin_s390_vlbrg:
20898 case SystemZ::BI__builtin_s390_vlbrq: {
20907#define INTRINSIC_WITH_CC(NAME) \
20908 case SystemZ::BI__builtin_##NAME: \
20909 return EmitSystemZIntrinsicWithCC(*this, Intrinsic::NAME, E)
20991#undef INTRINSIC_WITH_CC
21000struct NVPTXMmaLdstInfo {
21001 unsigned NumResults;
21007#define MMA_INTR(geom_op_type, layout) \
21008 Intrinsic::nvvm_wmma_##geom_op_type##_##layout##_stride
21009#define MMA_LDST(n, geom_op_type) \
21010 { n, MMA_INTR(geom_op_type, col), MMA_INTR(geom_op_type, row) }
21012static NVPTXMmaLdstInfo getNVPTXMmaLdstInfo(
unsigned BuiltinID) {
21013 switch (BuiltinID) {
21015 case NVPTX::BI__hmma_m16n16k16_ld_a:
21016 return MMA_LDST(8, m16n16k16_load_a_f16);
21017 case NVPTX::BI__hmma_m16n16k16_ld_b:
21018 return MMA_LDST(8, m16n16k16_load_b_f16);
21019 case NVPTX::BI__hmma_m16n16k16_ld_c_f16:
21020 return MMA_LDST(4, m16n16k16_load_c_f16);
21021 case NVPTX::BI__hmma_m16n16k16_ld_c_f32:
21022 return MMA_LDST(8, m16n16k16_load_c_f32);
21023 case NVPTX::BI__hmma_m32n8k16_ld_a:
21024 return MMA_LDST(8, m32n8k16_load_a_f16);
21025 case NVPTX::BI__hmma_m32n8k16_ld_b:
21026 return MMA_LDST(8, m32n8k16_load_b_f16);
21027 case NVPTX::BI__hmma_m32n8k16_ld_c_f16:
21028 return MMA_LDST(4, m32n8k16_load_c_f16);
21029 case NVPTX::BI__hmma_m32n8k16_ld_c_f32:
21030 return MMA_LDST(8, m32n8k16_load_c_f32);
21031 case NVPTX::BI__hmma_m8n32k16_ld_a:
21032 return MMA_LDST(8, m8n32k16_load_a_f16);
21033 case NVPTX::BI__hmma_m8n32k16_ld_b:
21034 return MMA_LDST(8, m8n32k16_load_b_f16);
21035 case NVPTX::BI__hmma_m8n32k16_ld_c_f16:
21036 return MMA_LDST(4, m8n32k16_load_c_f16);
21037 case NVPTX::BI__hmma_m8n32k16_ld_c_f32:
21038 return MMA_LDST(8, m8n32k16_load_c_f32);
21041 case NVPTX::BI__imma_m16n16k16_ld_a_s8:
21042 return MMA_LDST(2, m16n16k16_load_a_s8);
21043 case NVPTX::BI__imma_m16n16k16_ld_a_u8:
21044 return MMA_LDST(2, m16n16k16_load_a_u8);
21045 case NVPTX::BI__imma_m16n16k16_ld_b_s8:
21046 return MMA_LDST(2, m16n16k16_load_b_s8);
21047 case NVPTX::BI__imma_m16n16k16_ld_b_u8:
21048 return MMA_LDST(2, m16n16k16_load_b_u8);
21049 case NVPTX::BI__imma_m16n16k16_ld_c:
21050 return MMA_LDST(8, m16n16k16_load_c_s32);
21051 case NVPTX::BI__imma_m32n8k16_ld_a_s8:
21052 return MMA_LDST(4, m32n8k16_load_a_s8);
21053 case NVPTX::BI__imma_m32n8k16_ld_a_u8:
21054 return MMA_LDST(4, m32n8k16_load_a_u8);
21055 case NVPTX::BI__imma_m32n8k16_ld_b_s8:
21056 return MMA_LDST(1, m32n8k16_load_b_s8);
21057 case NVPTX::BI__imma_m32n8k16_ld_b_u8:
21058 return MMA_LDST(1, m32n8k16_load_b_u8);
21059 case NVPTX::BI__imma_m32n8k16_ld_c:
21060 return MMA_LDST(8, m32n8k16_load_c_s32);
21061 case NVPTX::BI__imma_m8n32k16_ld_a_s8:
21062 return MMA_LDST(1, m8n32k16_load_a_s8);
21063 case NVPTX::BI__imma_m8n32k16_ld_a_u8:
21064 return MMA_LDST(1, m8n32k16_load_a_u8);
21065 case NVPTX::BI__imma_m8n32k16_ld_b_s8:
21066 return MMA_LDST(4, m8n32k16_load_b_s8);
21067 case NVPTX::BI__imma_m8n32k16_ld_b_u8:
21068 return MMA_LDST(4, m8n32k16_load_b_u8);
21069 case NVPTX::BI__imma_m8n32k16_ld_c:
21070 return MMA_LDST(8, m8n32k16_load_c_s32);
21074 case NVPTX::BI__imma_m8n8k32_ld_a_s4:
21075 return {1, 0,
MMA_INTR(m8n8k32_load_a_s4, row)};
21076 case NVPTX::BI__imma_m8n8k32_ld_a_u4:
21077 return {1, 0,
MMA_INTR(m8n8k32_load_a_u4, row)};
21078 case NVPTX::BI__imma_m8n8k32_ld_b_s4:
21079 return {1,
MMA_INTR(m8n8k32_load_b_s4, col), 0};
21080 case NVPTX::BI__imma_m8n8k32_ld_b_u4:
21081 return {1,
MMA_INTR(m8n8k32_load_b_u4, col), 0};
21082 case NVPTX::BI__imma_m8n8k32_ld_c:
21083 return MMA_LDST(2, m8n8k32_load_c_s32);
21084 case NVPTX::BI__bmma_m8n8k128_ld_a_b1:
21085 return {1, 0,
MMA_INTR(m8n8k128_load_a_b1, row)};
21086 case NVPTX::BI__bmma_m8n8k128_ld_b_b1:
21087 return {1,
MMA_INTR(m8n8k128_load_b_b1, col), 0};
21088 case NVPTX::BI__bmma_m8n8k128_ld_c:
21089 return MMA_LDST(2, m8n8k128_load_c_s32);
21092 case NVPTX::BI__dmma_m8n8k4_ld_a:
21093 return MMA_LDST(1, m8n8k4_load_a_f64);
21094 case NVPTX::BI__dmma_m8n8k4_ld_b:
21095 return MMA_LDST(1, m8n8k4_load_b_f64);
21096 case NVPTX::BI__dmma_m8n8k4_ld_c:
21097 return MMA_LDST(2, m8n8k4_load_c_f64);
21100 case NVPTX::BI__mma_bf16_m16n16k16_ld_a:
21101 return MMA_LDST(4, m16n16k16_load_a_bf16);
21102 case NVPTX::BI__mma_bf16_m16n16k16_ld_b:
21103 return MMA_LDST(4, m16n16k16_load_b_bf16);
21104 case NVPTX::BI__mma_bf16_m8n32k16_ld_a:
21105 return MMA_LDST(2, m8n32k16_load_a_bf16);
21106 case NVPTX::BI__mma_bf16_m8n32k16_ld_b:
21107 return MMA_LDST(8, m8n32k16_load_b_bf16);
21108 case NVPTX::BI__mma_bf16_m32n8k16_ld_a:
21109 return MMA_LDST(8, m32n8k16_load_a_bf16);
21110 case NVPTX::BI__mma_bf16_m32n8k16_ld_b:
21111 return MMA_LDST(2, m32n8k16_load_b_bf16);
21112 case NVPTX::BI__mma_tf32_m16n16k8_ld_a:
21113 return MMA_LDST(4, m16n16k8_load_a_tf32);
21114 case NVPTX::BI__mma_tf32_m16n16k8_ld_b:
21115 return MMA_LDST(4, m16n16k8_load_b_tf32);
21116 case NVPTX::BI__mma_tf32_m16n16k8_ld_c:
21117 return MMA_LDST(8, m16n16k8_load_c_f32);
21123 case NVPTX::BI__hmma_m16n16k16_st_c_f16:
21124 return MMA_LDST(4, m16n16k16_store_d_f16);
21125 case NVPTX::BI__hmma_m16n16k16_st_c_f32:
21126 return MMA_LDST(8, m16n16k16_store_d_f32);
21127 case NVPTX::BI__hmma_m32n8k16_st_c_f16:
21128 return MMA_LDST(4, m32n8k16_store_d_f16);
21129 case NVPTX::BI__hmma_m32n8k16_st_c_f32:
21130 return MMA_LDST(8, m32n8k16_store_d_f32);
21131 case NVPTX::BI__hmma_m8n32k16_st_c_f16:
21132 return MMA_LDST(4, m8n32k16_store_d_f16);
21133 case NVPTX::BI__hmma_m8n32k16_st_c_f32:
21134 return MMA_LDST(8, m8n32k16_store_d_f32);
21139 case NVPTX::BI__imma_m16n16k16_st_c_i32:
21140 return MMA_LDST(8, m16n16k16_store_d_s32);
21141 case NVPTX::BI__imma_m32n8k16_st_c_i32:
21142 return MMA_LDST(8, m32n8k16_store_d_s32);
21143 case NVPTX::BI__imma_m8n32k16_st_c_i32:
21144 return MMA_LDST(8, m8n32k16_store_d_s32);
21145 case NVPTX::BI__imma_m8n8k32_st_c_i32:
21146 return MMA_LDST(2, m8n8k32_store_d_s32);
21147 case NVPTX::BI__bmma_m8n8k128_st_c_i32:
21148 return MMA_LDST(2, m8n8k128_store_d_s32);
21151 case NVPTX::BI__dmma_m8n8k4_st_c_f64:
21152 return MMA_LDST(2, m8n8k4_store_d_f64);
21155 case NVPTX::BI__mma_m16n16k8_st_c_f32:
21156 return MMA_LDST(8, m16n16k8_store_d_f32);
21159 llvm_unreachable(
"Unknown MMA builtin");
21166struct NVPTXMmaInfo {
21175 std::array<unsigned, 8> Variants;
21177 unsigned getMMAIntrinsic(
int Layout,
bool Satf) {
21178 unsigned Index = Layout + 4 * Satf;
21179 if (Index >= Variants.size())
21181 return Variants[Index];
21187static NVPTXMmaInfo getNVPTXMmaInfo(
unsigned BuiltinID) {
21189#define MMA_VARIANTS(geom, type) \
21190 Intrinsic::nvvm_wmma_##geom##_mma_row_row_##type, \
21191 Intrinsic::nvvm_wmma_##geom##_mma_row_col_##type, \
21192 Intrinsic::nvvm_wmma_##geom##_mma_col_row_##type, \
21193 Intrinsic::nvvm_wmma_##geom##_mma_col_col_##type
21194#define MMA_SATF_VARIANTS(geom, type) \
21195 MMA_VARIANTS(geom, type), \
21196 Intrinsic::nvvm_wmma_##geom##_mma_row_row_##type##_satfinite, \
21197 Intrinsic::nvvm_wmma_##geom##_mma_row_col_##type##_satfinite, \
21198 Intrinsic::nvvm_wmma_##geom##_mma_col_row_##type##_satfinite, \
21199 Intrinsic::nvvm_wmma_##geom##_mma_col_col_##type##_satfinite
21201#define MMA_VARIANTS_I4(geom, type) \
21203 Intrinsic::nvvm_wmma_##geom##_mma_row_col_##type, \
21207 Intrinsic::nvvm_wmma_##geom##_mma_row_col_##type##_satfinite, \
21211#define MMA_VARIANTS_B1_XOR(geom, type) \
21213 Intrinsic::nvvm_wmma_##geom##_mma_xor_popc_row_col_##type, \
21220#define MMA_VARIANTS_B1_AND(geom, type) \
21222 Intrinsic::nvvm_wmma_##geom##_mma_and_popc_row_col_##type, \
21230 switch (BuiltinID) {
21234 case NVPTX::BI__hmma_m16n16k16_mma_f16f16:
21236 case NVPTX::BI__hmma_m16n16k16_mma_f32f16:
21238 case NVPTX::BI__hmma_m16n16k16_mma_f16f32:
21240 case NVPTX::BI__hmma_m16n16k16_mma_f32f32:
21242 case NVPTX::BI__hmma_m32n8k16_mma_f16f16:
21244 case NVPTX::BI__hmma_m32n8k16_mma_f32f16:
21246 case NVPTX::BI__hmma_m32n8k16_mma_f16f32:
21248 case NVPTX::BI__hmma_m32n8k16_mma_f32f32:
21250 case NVPTX::BI__hmma_m8n32k16_mma_f16f16:
21252 case NVPTX::BI__hmma_m8n32k16_mma_f32f16:
21254 case NVPTX::BI__hmma_m8n32k16_mma_f16f32:
21256 case NVPTX::BI__hmma_m8n32k16_mma_f32f32:
21260 case NVPTX::BI__imma_m16n16k16_mma_s8:
21262 case NVPTX::BI__imma_m16n16k16_mma_u8:
21264 case NVPTX::BI__imma_m32n8k16_mma_s8:
21266 case NVPTX::BI__imma_m32n8k16_mma_u8:
21268 case NVPTX::BI__imma_m8n32k16_mma_s8:
21270 case NVPTX::BI__imma_m8n32k16_mma_u8:
21274 case NVPTX::BI__imma_m8n8k32_mma_s4:
21276 case NVPTX::BI__imma_m8n8k32_mma_u4:
21278 case NVPTX::BI__bmma_m8n8k128_mma_xor_popc_b1:
21280 case NVPTX::BI__bmma_m8n8k128_mma_and_popc_b1:
21284 case NVPTX::BI__dmma_m8n8k4_mma_f64:
21288 case NVPTX::BI__mma_bf16_m16n16k16_mma_f32:
21289 return {4, 4, 8, 8, {{
MMA_VARIANTS(m16n16k16, bf16)}}};
21290 case NVPTX::BI__mma_bf16_m8n32k16_mma_f32:
21291 return {2, 8, 8, 8, {{
MMA_VARIANTS(m8n32k16, bf16)}}};
21292 case NVPTX::BI__mma_bf16_m32n8k16_mma_f32:
21293 return {8, 2, 8, 8, {{
MMA_VARIANTS(m32n8k16, bf16)}}};
21294 case NVPTX::BI__mma_tf32_m16n16k8_mma_f32:
21295 return {4, 4, 8, 8, {{
MMA_VARIANTS(m16n16k8, tf32)}}};
21297 llvm_unreachable(
"Unexpected builtin ID.");
21300#undef MMA_SATF_VARIANTS
21301#undef MMA_VARIANTS_I4
21302#undef MMA_VARIANTS_B1_AND
21303#undef MMA_VARIANTS_B1_XOR
21312 return CGF.
Builder.CreateCall(
21314 {Ptr, ConstantInt::get(CGF.Builder.getInt32Ty(), Align.getQuantity())});
21326 MDNode *MD = MDNode::get(CGF.
Builder.getContext(), {});
21327 LD->setMetadata(LLVMContext::MD_invariant_load, MD);
21335 llvm::Type *ElemTy =
21337 return CGF.
Builder.CreateCall(
21339 {Ptr, CGF.EmitScalarExpr(E->getArg(1))});
21342static Value *MakeCpAsync(
unsigned IntrinsicID,
unsigned IntrinsicIDS,
21345 return E->getNumArgs() == 3
21347 {CGF.EmitScalarExpr(E->getArg(0)),
21348 CGF.EmitScalarExpr(E->getArg(1)),
21349 CGF.EmitScalarExpr(E->getArg(2))})
21351 {CGF.EmitScalarExpr(E->getArg(0)),
21352 CGF.EmitScalarExpr(E->getArg(1))});
21355static Value *MakeHalfType(
unsigned IntrinsicID,
unsigned BuiltinID,
21358 if (!(
C.getLangOpts().NativeHalfType ||
21359 !
C.getTargetInfo().useFP16ConversionIntrinsics())) {
21361 " requires native half type support.");
21365 if (BuiltinID == NVPTX::BI__nvvm_ldg_h || BuiltinID == NVPTX::BI__nvvm_ldg_h2)
21366 return MakeLdg(CGF,
E);
21368 if (IntrinsicID == Intrinsic::nvvm_ldu_global_f)
21369 return MakeLdu(IntrinsicID, CGF,
E);
21373 auto *FTy = F->getFunctionType();
21374 unsigned ICEArguments = 0;
21376 C.GetBuiltinType(BuiltinID, Error, &ICEArguments);
21378 for (
unsigned i = 0, e =
E->getNumArgs(); i != e; ++i) {
21379 assert((ICEArguments & (1 << i)) == 0);
21381 auto *PTy = FTy->getParamType(i);
21382 if (PTy != ArgValue->
getType())
21383 ArgValue = CGF.
Builder.CreateBitCast(ArgValue, PTy);
21384 Args.push_back(ArgValue);
21387 return CGF.
Builder.CreateCall(F, Args);
21393 switch (BuiltinID) {
21394 case NVPTX::BI__nvvm_atom_add_gen_i:
21395 case NVPTX::BI__nvvm_atom_add_gen_l:
21396 case NVPTX::BI__nvvm_atom_add_gen_ll:
21399 case NVPTX::BI__nvvm_atom_sub_gen_i:
21400 case NVPTX::BI__nvvm_atom_sub_gen_l:
21401 case NVPTX::BI__nvvm_atom_sub_gen_ll:
21404 case NVPTX::BI__nvvm_atom_and_gen_i:
21405 case NVPTX::BI__nvvm_atom_and_gen_l:
21406 case NVPTX::BI__nvvm_atom_and_gen_ll:
21409 case NVPTX::BI__nvvm_atom_or_gen_i:
21410 case NVPTX::BI__nvvm_atom_or_gen_l:
21411 case NVPTX::BI__nvvm_atom_or_gen_ll:
21414 case NVPTX::BI__nvvm_atom_xor_gen_i:
21415 case NVPTX::BI__nvvm_atom_xor_gen_l:
21416 case NVPTX::BI__nvvm_atom_xor_gen_ll:
21419 case NVPTX::BI__nvvm_atom_xchg_gen_i:
21420 case NVPTX::BI__nvvm_atom_xchg_gen_l:
21421 case NVPTX::BI__nvvm_atom_xchg_gen_ll:
21424 case NVPTX::BI__nvvm_atom_max_gen_i:
21425 case NVPTX::BI__nvvm_atom_max_gen_l:
21426 case NVPTX::BI__nvvm_atom_max_gen_ll:
21429 case NVPTX::BI__nvvm_atom_max_gen_ui:
21430 case NVPTX::BI__nvvm_atom_max_gen_ul:
21431 case NVPTX::BI__nvvm_atom_max_gen_ull:
21434 case NVPTX::BI__nvvm_atom_min_gen_i:
21435 case NVPTX::BI__nvvm_atom_min_gen_l:
21436 case NVPTX::BI__nvvm_atom_min_gen_ll:
21439 case NVPTX::BI__nvvm_atom_min_gen_ui:
21440 case NVPTX::BI__nvvm_atom_min_gen_ul:
21441 case NVPTX::BI__nvvm_atom_min_gen_ull:
21444 case NVPTX::BI__nvvm_atom_cas_gen_us:
21445 case NVPTX::BI__nvvm_atom_cas_gen_i:
21446 case NVPTX::BI__nvvm_atom_cas_gen_l:
21447 case NVPTX::BI__nvvm_atom_cas_gen_ll:
21452 case NVPTX::BI__nvvm_atom_add_gen_f:
21453 case NVPTX::BI__nvvm_atom_add_gen_d: {
21458 AtomicOrdering::SequentiallyConsistent);
21461 case NVPTX::BI__nvvm_atom_inc_gen_ui: {
21466 return Builder.CreateCall(FnALI32, {Ptr, Val});
21469 case NVPTX::BI__nvvm_atom_dec_gen_ui: {
21474 return Builder.CreateCall(FnALD32, {Ptr, Val});
21477 case NVPTX::BI__nvvm_ldg_c:
21478 case NVPTX::BI__nvvm_ldg_sc:
21479 case NVPTX::BI__nvvm_ldg_c2:
21480 case NVPTX::BI__nvvm_ldg_sc2:
21481 case NVPTX::BI__nvvm_ldg_c4:
21482 case NVPTX::BI__nvvm_ldg_sc4:
21483 case NVPTX::BI__nvvm_ldg_s:
21484 case NVPTX::BI__nvvm_ldg_s2:
21485 case NVPTX::BI__nvvm_ldg_s4:
21486 case NVPTX::BI__nvvm_ldg_i:
21487 case NVPTX::BI__nvvm_ldg_i2:
21488 case NVPTX::BI__nvvm_ldg_i4:
21489 case NVPTX::BI__nvvm_ldg_l:
21490 case NVPTX::BI__nvvm_ldg_l2:
21491 case NVPTX::BI__nvvm_ldg_ll:
21492 case NVPTX::BI__nvvm_ldg_ll2:
21493 case NVPTX::BI__nvvm_ldg_uc:
21494 case NVPTX::BI__nvvm_ldg_uc2:
21495 case NVPTX::BI__nvvm_ldg_uc4:
21496 case NVPTX::BI__nvvm_ldg_us:
21497 case NVPTX::BI__nvvm_ldg_us2:
21498 case NVPTX::BI__nvvm_ldg_us4:
21499 case NVPTX::BI__nvvm_ldg_ui:
21500 case NVPTX::BI__nvvm_ldg_ui2:
21501 case NVPTX::BI__nvvm_ldg_ui4:
21502 case NVPTX::BI__nvvm_ldg_ul:
21503 case NVPTX::BI__nvvm_ldg_ul2:
21504 case NVPTX::BI__nvvm_ldg_ull:
21505 case NVPTX::BI__nvvm_ldg_ull2:
21506 case NVPTX::BI__nvvm_ldg_f:
21507 case NVPTX::BI__nvvm_ldg_f2:
21508 case NVPTX::BI__nvvm_ldg_f4:
21509 case NVPTX::BI__nvvm_ldg_d:
21510 case NVPTX::BI__nvvm_ldg_d2:
21514 return MakeLdg(*
this,
E);
21516 case NVPTX::BI__nvvm_ldu_c:
21517 case NVPTX::BI__nvvm_ldu_sc:
21518 case NVPTX::BI__nvvm_ldu_c2:
21519 case NVPTX::BI__nvvm_ldu_sc2:
21520 case NVPTX::BI__nvvm_ldu_c4:
21521 case NVPTX::BI__nvvm_ldu_sc4:
21522 case NVPTX::BI__nvvm_ldu_s:
21523 case NVPTX::BI__nvvm_ldu_s2:
21524 case NVPTX::BI__nvvm_ldu_s4:
21525 case NVPTX::BI__nvvm_ldu_i:
21526 case NVPTX::BI__nvvm_ldu_i2:
21527 case NVPTX::BI__nvvm_ldu_i4:
21528 case NVPTX::BI__nvvm_ldu_l:
21529 case NVPTX::BI__nvvm_ldu_l2:
21530 case NVPTX::BI__nvvm_ldu_ll:
21531 case NVPTX::BI__nvvm_ldu_ll2:
21532 case NVPTX::BI__nvvm_ldu_uc:
21533 case NVPTX::BI__nvvm_ldu_uc2:
21534 case NVPTX::BI__nvvm_ldu_uc4:
21535 case NVPTX::BI__nvvm_ldu_us:
21536 case NVPTX::BI__nvvm_ldu_us2:
21537 case NVPTX::BI__nvvm_ldu_us4:
21538 case NVPTX::BI__nvvm_ldu_ui:
21539 case NVPTX::BI__nvvm_ldu_ui2:
21540 case NVPTX::BI__nvvm_ldu_ui4:
21541 case NVPTX::BI__nvvm_ldu_ul:
21542 case NVPTX::BI__nvvm_ldu_ul2:
21543 case NVPTX::BI__nvvm_ldu_ull:
21544 case NVPTX::BI__nvvm_ldu_ull2:
21545 return MakeLdu(Intrinsic::nvvm_ldu_global_i, *
this,
E);
21546 case NVPTX::BI__nvvm_ldu_f:
21547 case NVPTX::BI__nvvm_ldu_f2:
21548 case NVPTX::BI__nvvm_ldu_f4:
21549 case NVPTX::BI__nvvm_ldu_d:
21550 case NVPTX::BI__nvvm_ldu_d2:
21551 return MakeLdu(Intrinsic::nvvm_ldu_global_f, *
this,
E);
21553 case NVPTX::BI__nvvm_atom_cta_add_gen_i:
21554 case NVPTX::BI__nvvm_atom_cta_add_gen_l:
21555 case NVPTX::BI__nvvm_atom_cta_add_gen_ll:
21556 return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_i_cta, *
this,
E);
21557 case NVPTX::BI__nvvm_atom_sys_add_gen_i:
21558 case NVPTX::BI__nvvm_atom_sys_add_gen_l:
21559 case NVPTX::BI__nvvm_atom_sys_add_gen_ll:
21560 return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_i_sys, *
this,
E);
21561 case NVPTX::BI__nvvm_atom_cta_add_gen_f:
21562 case NVPTX::BI__nvvm_atom_cta_add_gen_d:
21563 return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_f_cta, *
this,
E);
21564 case NVPTX::BI__nvvm_atom_sys_add_gen_f:
21565 case NVPTX::BI__nvvm_atom_sys_add_gen_d:
21566 return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_f_sys, *
this,
E);
21567 case NVPTX::BI__nvvm_atom_cta_xchg_gen_i:
21568 case NVPTX::BI__nvvm_atom_cta_xchg_gen_l:
21569 case NVPTX::BI__nvvm_atom_cta_xchg_gen_ll:
21570 return MakeScopedAtomic(Intrinsic::nvvm_atomic_exch_gen_i_cta, *
this,
E);
21571 case NVPTX::BI__nvvm_atom_sys_xchg_gen_i:
21572 case NVPTX::BI__nvvm_atom_sys_xchg_gen_l:
21573 case NVPTX::BI__nvvm_atom_sys_xchg_gen_ll:
21574 return MakeScopedAtomic(Intrinsic::nvvm_atomic_exch_gen_i_sys, *
this,
E);
21575 case NVPTX::BI__nvvm_atom_cta_max_gen_i:
21576 case NVPTX::BI__nvvm_atom_cta_max_gen_ui:
21577 case NVPTX::BI__nvvm_atom_cta_max_gen_l:
21578 case NVPTX::BI__nvvm_atom_cta_max_gen_ul:
21579 case NVPTX::BI__nvvm_atom_cta_max_gen_ll:
21580 case NVPTX::BI__nvvm_atom_cta_max_gen_ull:
21581 return MakeScopedAtomic(Intrinsic::nvvm_atomic_max_gen_i_cta, *
this,
E);
21582 case NVPTX::BI__nvvm_atom_sys_max_gen_i:
21583 case NVPTX::BI__nvvm_atom_sys_max_gen_ui:
21584 case NVPTX::BI__nvvm_atom_sys_max_gen_l:
21585 case NVPTX::BI__nvvm_atom_sys_max_gen_ul:
21586 case NVPTX::BI__nvvm_atom_sys_max_gen_ll:
21587 case NVPTX::BI__nvvm_atom_sys_max_gen_ull:
21588 return MakeScopedAtomic(Intrinsic::nvvm_atomic_max_gen_i_sys, *
this,
E);
21589 case NVPTX::BI__nvvm_atom_cta_min_gen_i:
21590 case NVPTX::BI__nvvm_atom_cta_min_gen_ui:
21591 case NVPTX::BI__nvvm_atom_cta_min_gen_l:
21592 case NVPTX::BI__nvvm_atom_cta_min_gen_ul:
21593 case NVPTX::BI__nvvm_atom_cta_min_gen_ll:
21594 case NVPTX::BI__nvvm_atom_cta_min_gen_ull:
21595 return MakeScopedAtomic(Intrinsic::nvvm_atomic_min_gen_i_cta, *
this,
E);
21596 case NVPTX::BI__nvvm_atom_sys_min_gen_i:
21597 case NVPTX::BI__nvvm_atom_sys_min_gen_ui:
21598 case NVPTX::BI__nvvm_atom_sys_min_gen_l:
21599 case NVPTX::BI__nvvm_atom_sys_min_gen_ul:
21600 case NVPTX::BI__nvvm_atom_sys_min_gen_ll:
21601 case NVPTX::BI__nvvm_atom_sys_min_gen_ull:
21602 return MakeScopedAtomic(Intrinsic::nvvm_atomic_min_gen_i_sys, *
this,
E);
21603 case NVPTX::BI__nvvm_atom_cta_inc_gen_ui:
21604 return MakeScopedAtomic(Intrinsic::nvvm_atomic_inc_gen_i_cta, *
this,
E);
21605 case NVPTX::BI__nvvm_atom_cta_dec_gen_ui:
21606 return MakeScopedAtomic(Intrinsic::nvvm_atomic_dec_gen_i_cta, *
this,
E);
21607 case NVPTX::BI__nvvm_atom_sys_inc_gen_ui:
21608 return MakeScopedAtomic(Intrinsic::nvvm_atomic_inc_gen_i_sys, *
this,
E);
21609 case NVPTX::BI__nvvm_atom_sys_dec_gen_ui:
21610 return MakeScopedAtomic(Intrinsic::nvvm_atomic_dec_gen_i_sys, *
this,
E);
21611 case NVPTX::BI__nvvm_atom_cta_and_gen_i:
21612 case NVPTX::BI__nvvm_atom_cta_and_gen_l:
21613 case NVPTX::BI__nvvm_atom_cta_and_gen_ll:
21614 return MakeScopedAtomic(Intrinsic::nvvm_atomic_and_gen_i_cta, *
this,
E);
21615 case NVPTX::BI__nvvm_atom_sys_and_gen_i:
21616 case NVPTX::BI__nvvm_atom_sys_and_gen_l:
21617 case NVPTX::BI__nvvm_atom_sys_and_gen_ll:
21618 return MakeScopedAtomic(Intrinsic::nvvm_atomic_and_gen_i_sys, *
this,
E);
21619 case NVPTX::BI__nvvm_atom_cta_or_gen_i:
21620 case NVPTX::BI__nvvm_atom_cta_or_gen_l:
21621 case NVPTX::BI__nvvm_atom_cta_or_gen_ll:
21622 return MakeScopedAtomic(Intrinsic::nvvm_atomic_or_gen_i_cta, *
this,
E);
21623 case NVPTX::BI__nvvm_atom_sys_or_gen_i:
21624 case NVPTX::BI__nvvm_atom_sys_or_gen_l:
21625 case NVPTX::BI__nvvm_atom_sys_or_gen_ll:
21626 return MakeScopedAtomic(Intrinsic::nvvm_atomic_or_gen_i_sys, *
this,
E);
21627 case NVPTX::BI__nvvm_atom_cta_xor_gen_i:
21628 case NVPTX::BI__nvvm_atom_cta_xor_gen_l:
21629 case NVPTX::BI__nvvm_atom_cta_xor_gen_ll:
21630 return MakeScopedAtomic(Intrinsic::nvvm_atomic_xor_gen_i_cta, *
this,
E);
21631 case NVPTX::BI__nvvm_atom_sys_xor_gen_i:
21632 case NVPTX::BI__nvvm_atom_sys_xor_gen_l:
21633 case NVPTX::BI__nvvm_atom_sys_xor_gen_ll:
21634 return MakeScopedAtomic(Intrinsic::nvvm_atomic_xor_gen_i_sys, *
this,
E);
21635 case NVPTX::BI__nvvm_atom_cta_cas_gen_us:
21636 case NVPTX::BI__nvvm_atom_cta_cas_gen_i:
21637 case NVPTX::BI__nvvm_atom_cta_cas_gen_l:
21638 case NVPTX::BI__nvvm_atom_cta_cas_gen_ll: {
21640 llvm::Type *ElemTy =
21644 Intrinsic::nvvm_atomic_cas_gen_i_cta, {ElemTy, Ptr->getType()}),
21645 {Ptr, EmitScalarExpr(E->getArg(1)), EmitScalarExpr(E->getArg(2))});
21647 case NVPTX::BI__nvvm_atom_sys_cas_gen_us:
21648 case NVPTX::BI__nvvm_atom_sys_cas_gen_i:
21649 case NVPTX::BI__nvvm_atom_sys_cas_gen_l:
21650 case NVPTX::BI__nvvm_atom_sys_cas_gen_ll: {
21652 llvm::Type *ElemTy =
21656 Intrinsic::nvvm_atomic_cas_gen_i_sys, {ElemTy, Ptr->getType()}),
21657 {Ptr, EmitScalarExpr(E->getArg(1)), EmitScalarExpr(E->getArg(2))});
21659 case NVPTX::BI__nvvm_match_all_sync_i32p:
21660 case NVPTX::BI__nvvm_match_all_sync_i64p: {
21666 ? Intrinsic::nvvm_match_all_sync_i32p
21667 : Intrinsic::nvvm_match_all_sync_i64p),
21672 return Builder.CreateExtractValue(ResultPair, 0);
21676 case NVPTX::BI__hmma_m16n16k16_ld_a:
21677 case NVPTX::BI__hmma_m16n16k16_ld_b:
21678 case NVPTX::BI__hmma_m16n16k16_ld_c_f16:
21679 case NVPTX::BI__hmma_m16n16k16_ld_c_f32:
21680 case NVPTX::BI__hmma_m32n8k16_ld_a:
21681 case NVPTX::BI__hmma_m32n8k16_ld_b:
21682 case NVPTX::BI__hmma_m32n8k16_ld_c_f16:
21683 case NVPTX::BI__hmma_m32n8k16_ld_c_f32:
21684 case NVPTX::BI__hmma_m8n32k16_ld_a:
21685 case NVPTX::BI__hmma_m8n32k16_ld_b:
21686 case NVPTX::BI__hmma_m8n32k16_ld_c_f16:
21687 case NVPTX::BI__hmma_m8n32k16_ld_c_f32:
21689 case NVPTX::BI__imma_m16n16k16_ld_a_s8:
21690 case NVPTX::BI__imma_m16n16k16_ld_a_u8:
21691 case NVPTX::BI__imma_m16n16k16_ld_b_s8:
21692 case NVPTX::BI__imma_m16n16k16_ld_b_u8:
21693 case NVPTX::BI__imma_m16n16k16_ld_c:
21694 case NVPTX::BI__imma_m32n8k16_ld_a_s8:
21695 case NVPTX::BI__imma_m32n8k16_ld_a_u8:
21696 case NVPTX::BI__imma_m32n8k16_ld_b_s8:
21697 case NVPTX::BI__imma_m32n8k16_ld_b_u8:
21698 case NVPTX::BI__imma_m32n8k16_ld_c:
21699 case NVPTX::BI__imma_m8n32k16_ld_a_s8:
21700 case NVPTX::BI__imma_m8n32k16_ld_a_u8:
21701 case NVPTX::BI__imma_m8n32k16_ld_b_s8:
21702 case NVPTX::BI__imma_m8n32k16_ld_b_u8:
21703 case NVPTX::BI__imma_m8n32k16_ld_c:
21705 case NVPTX::BI__imma_m8n8k32_ld_a_s4:
21706 case NVPTX::BI__imma_m8n8k32_ld_a_u4:
21707 case NVPTX::BI__imma_m8n8k32_ld_b_s4:
21708 case NVPTX::BI__imma_m8n8k32_ld_b_u4:
21709 case NVPTX::BI__imma_m8n8k32_ld_c:
21710 case NVPTX::BI__bmma_m8n8k128_ld_a_b1:
21711 case NVPTX::BI__bmma_m8n8k128_ld_b_b1:
21712 case NVPTX::BI__bmma_m8n8k128_ld_c:
21714 case NVPTX::BI__dmma_m8n8k4_ld_a:
21715 case NVPTX::BI__dmma_m8n8k4_ld_b:
21716 case NVPTX::BI__dmma_m8n8k4_ld_c:
21718 case NVPTX::BI__mma_bf16_m16n16k16_ld_a:
21719 case NVPTX::BI__mma_bf16_m16n16k16_ld_b:
21720 case NVPTX::BI__mma_bf16_m8n32k16_ld_a:
21721 case NVPTX::BI__mma_bf16_m8n32k16_ld_b:
21722 case NVPTX::BI__mma_bf16_m32n8k16_ld_a:
21723 case NVPTX::BI__mma_bf16_m32n8k16_ld_b:
21724 case NVPTX::BI__mma_tf32_m16n16k8_ld_a:
21725 case NVPTX::BI__mma_tf32_m16n16k8_ld_b:
21726 case NVPTX::BI__mma_tf32_m16n16k8_ld_c: {
21730 std::optional<llvm::APSInt> isColMajorArg =
21732 if (!isColMajorArg)
21734 bool isColMajor = isColMajorArg->getSExtValue();
21735 NVPTXMmaLdstInfo II = getNVPTXMmaLdstInfo(BuiltinID);
21736 unsigned IID = isColMajor ? II.IID_col : II.IID_row;
21744 assert(II.NumResults);
21745 if (II.NumResults == 1) {
21749 for (
unsigned i = 0; i < II.NumResults; ++i) {
21754 llvm::ConstantInt::get(
IntTy, i)),
21761 case NVPTX::BI__hmma_m16n16k16_st_c_f16:
21762 case NVPTX::BI__hmma_m16n16k16_st_c_f32:
21763 case NVPTX::BI__hmma_m32n8k16_st_c_f16:
21764 case NVPTX::BI__hmma_m32n8k16_st_c_f32:
21765 case NVPTX::BI__hmma_m8n32k16_st_c_f16:
21766 case NVPTX::BI__hmma_m8n32k16_st_c_f32:
21767 case NVPTX::BI__imma_m16n16k16_st_c_i32:
21768 case NVPTX::BI__imma_m32n8k16_st_c_i32:
21769 case NVPTX::BI__imma_m8n32k16_st_c_i32:
21770 case NVPTX::BI__imma_m8n8k32_st_c_i32:
21771 case NVPTX::BI__bmma_m8n8k128_st_c_i32:
21772 case NVPTX::BI__dmma_m8n8k4_st_c_f64:
21773 case NVPTX::BI__mma_m16n16k8_st_c_f32: {
21777 std::optional<llvm::APSInt> isColMajorArg =
21779 if (!isColMajorArg)
21781 bool isColMajor = isColMajorArg->getSExtValue();
21782 NVPTXMmaLdstInfo II = getNVPTXMmaLdstInfo(BuiltinID);
21783 unsigned IID = isColMajor ? II.IID_col : II.IID_row;
21788 llvm::Type *ParamType = Intrinsic->getFunctionType()->getParamType(1);
21790 for (
unsigned i = 0; i < II.NumResults; ++i) {
21794 llvm::ConstantInt::get(
IntTy, i)),
21796 Values.push_back(
Builder.CreateBitCast(
V, ParamType));
21798 Values.push_back(Ldm);
21805 case NVPTX::BI__hmma_m16n16k16_mma_f16f16:
21806 case NVPTX::BI__hmma_m16n16k16_mma_f32f16:
21807 case NVPTX::BI__hmma_m16n16k16_mma_f32f32:
21808 case NVPTX::BI__hmma_m16n16k16_mma_f16f32:
21809 case NVPTX::BI__hmma_m32n8k16_mma_f16f16:
21810 case NVPTX::BI__hmma_m32n8k16_mma_f32f16:
21811 case NVPTX::BI__hmma_m32n8k16_mma_f32f32:
21812 case NVPTX::BI__hmma_m32n8k16_mma_f16f32:
21813 case NVPTX::BI__hmma_m8n32k16_mma_f16f16:
21814 case NVPTX::BI__hmma_m8n32k16_mma_f32f16:
21815 case NVPTX::BI__hmma_m8n32k16_mma_f32f32:
21816 case NVPTX::BI__hmma_m8n32k16_mma_f16f32:
21817 case NVPTX::BI__imma_m16n16k16_mma_s8:
21818 case NVPTX::BI__imma_m16n16k16_mma_u8:
21819 case NVPTX::BI__imma_m32n8k16_mma_s8:
21820 case NVPTX::BI__imma_m32n8k16_mma_u8:
21821 case NVPTX::BI__imma_m8n32k16_mma_s8:
21822 case NVPTX::BI__imma_m8n32k16_mma_u8:
21823 case NVPTX::BI__imma_m8n8k32_mma_s4:
21824 case NVPTX::BI__imma_m8n8k32_mma_u4:
21825 case NVPTX::BI__bmma_m8n8k128_mma_xor_popc_b1:
21826 case NVPTX::BI__bmma_m8n8k128_mma_and_popc_b1:
21827 case NVPTX::BI__dmma_m8n8k4_mma_f64:
21828 case NVPTX::BI__mma_bf16_m16n16k16_mma_f32:
21829 case NVPTX::BI__mma_bf16_m8n32k16_mma_f32:
21830 case NVPTX::BI__mma_bf16_m32n8k16_mma_f32:
21831 case NVPTX::BI__mma_tf32_m16n16k8_mma_f32: {
21836 std::optional<llvm::APSInt> LayoutArg =
21840 int Layout = LayoutArg->getSExtValue();
21841 if (Layout < 0 || Layout > 3)
21843 llvm::APSInt SatfArg;
21844 if (BuiltinID == NVPTX::BI__bmma_m8n8k128_mma_xor_popc_b1 ||
21845 BuiltinID == NVPTX::BI__bmma_m8n8k128_mma_and_popc_b1)
21847 else if (std::optional<llvm::APSInt> OptSatfArg =
21849 SatfArg = *OptSatfArg;
21852 bool Satf = SatfArg.getSExtValue();
21853 NVPTXMmaInfo MI = getNVPTXMmaInfo(BuiltinID);
21854 unsigned IID = MI.getMMAIntrinsic(Layout, Satf);
21860 llvm::Type *AType = Intrinsic->getFunctionType()->getParamType(0);
21862 for (
unsigned i = 0; i < MI.NumEltsA; ++i) {
21866 llvm::ConstantInt::get(
IntTy, i)),
21868 Values.push_back(
Builder.CreateBitCast(
V, AType));
21871 llvm::Type *BType = Intrinsic->getFunctionType()->getParamType(MI.NumEltsA);
21872 for (
unsigned i = 0; i < MI.NumEltsB; ++i) {
21876 llvm::ConstantInt::get(
IntTy, i)),
21878 Values.push_back(
Builder.CreateBitCast(
V, BType));
21881 llvm::Type *CType =
21882 Intrinsic->getFunctionType()->getParamType(MI.NumEltsA + MI.NumEltsB);
21883 for (
unsigned i = 0; i < MI.NumEltsC; ++i) {
21887 llvm::ConstantInt::get(
IntTy, i)),
21889 Values.push_back(
Builder.CreateBitCast(
V, CType));
21893 for (
unsigned i = 0; i < MI.NumEltsD; ++i)
21897 llvm::ConstantInt::get(
IntTy, i)),
21902 case NVPTX::BI__nvvm_ex2_approx_f16:
21903 return MakeHalfType(Intrinsic::nvvm_ex2_approx_f16, BuiltinID,
E, *
this);
21904 case NVPTX::BI__nvvm_ex2_approx_f16x2:
21905 return MakeHalfType(Intrinsic::nvvm_ex2_approx_f16x2, BuiltinID,
E, *
this);
21906 case NVPTX::BI__nvvm_ff2f16x2_rn:
21907 return MakeHalfType(Intrinsic::nvvm_ff2f16x2_rn, BuiltinID,
E, *
this);
21908 case NVPTX::BI__nvvm_ff2f16x2_rn_relu:
21909 return MakeHalfType(Intrinsic::nvvm_ff2f16x2_rn_relu, BuiltinID,
E, *
this);
21910 case NVPTX::BI__nvvm_ff2f16x2_rz:
21911 return MakeHalfType(Intrinsic::nvvm_ff2f16x2_rz, BuiltinID,
E, *
this);
21912 case NVPTX::BI__nvvm_ff2f16x2_rz_relu:
21913 return MakeHalfType(Intrinsic::nvvm_ff2f16x2_rz_relu, BuiltinID,
E, *
this);
21914 case NVPTX::BI__nvvm_fma_rn_f16:
21915 return MakeHalfType(Intrinsic::nvvm_fma_rn_f16, BuiltinID,
E, *
this);
21916 case NVPTX::BI__nvvm_fma_rn_f16x2:
21917 return MakeHalfType(Intrinsic::nvvm_fma_rn_f16x2, BuiltinID,
E, *
this);
21918 case NVPTX::BI__nvvm_fma_rn_ftz_f16:
21919 return MakeHalfType(Intrinsic::nvvm_fma_rn_ftz_f16, BuiltinID,
E, *
this);
21920 case NVPTX::BI__nvvm_fma_rn_ftz_f16x2:
21921 return MakeHalfType(Intrinsic::nvvm_fma_rn_ftz_f16x2, BuiltinID,
E, *
this);
21922 case NVPTX::BI__nvvm_fma_rn_ftz_relu_f16:
21923 return MakeHalfType(Intrinsic::nvvm_fma_rn_ftz_relu_f16, BuiltinID,
E,
21925 case NVPTX::BI__nvvm_fma_rn_ftz_relu_f16x2:
21926 return MakeHalfType(Intrinsic::nvvm_fma_rn_ftz_relu_f16x2, BuiltinID,
E,
21928 case NVPTX::BI__nvvm_fma_rn_ftz_sat_f16:
21929 return MakeHalfType(Intrinsic::nvvm_fma_rn_ftz_sat_f16, BuiltinID,
E,
21931 case NVPTX::BI__nvvm_fma_rn_ftz_sat_f16x2:
21932 return MakeHalfType(Intrinsic::nvvm_fma_rn_ftz_sat_f16x2, BuiltinID,
E,
21934 case NVPTX::BI__nvvm_fma_rn_relu_f16:
21935 return MakeHalfType(Intrinsic::nvvm_fma_rn_relu_f16, BuiltinID,
E, *
this);
21936 case NVPTX::BI__nvvm_fma_rn_relu_f16x2:
21937 return MakeHalfType(Intrinsic::nvvm_fma_rn_relu_f16x2, BuiltinID,
E, *
this);
21938 case NVPTX::BI__nvvm_fma_rn_sat_f16:
21939 return MakeHalfType(Intrinsic::nvvm_fma_rn_sat_f16, BuiltinID,
E, *
this);
21940 case NVPTX::BI__nvvm_fma_rn_sat_f16x2:
21941 return MakeHalfType(Intrinsic::nvvm_fma_rn_sat_f16x2, BuiltinID,
E, *
this);
21942 case NVPTX::BI__nvvm_fmax_f16:
21943 return MakeHalfType(Intrinsic::nvvm_fmax_f16, BuiltinID,
E, *
this);
21944 case NVPTX::BI__nvvm_fmax_f16x2:
21945 return MakeHalfType(Intrinsic::nvvm_fmax_f16x2, BuiltinID,
E, *
this);
21946 case NVPTX::BI__nvvm_fmax_ftz_f16:
21947 return MakeHalfType(Intrinsic::nvvm_fmax_ftz_f16, BuiltinID,
E, *
this);
21948 case NVPTX::BI__nvvm_fmax_ftz_f16x2:
21949 return MakeHalfType(Intrinsic::nvvm_fmax_ftz_f16x2, BuiltinID,
E, *
this);
21950 case NVPTX::BI__nvvm_fmax_ftz_nan_f16:
21951 return MakeHalfType(Intrinsic::nvvm_fmax_ftz_nan_f16, BuiltinID,
E, *
this);
21952 case NVPTX::BI__nvvm_fmax_ftz_nan_f16x2:
21953 return MakeHalfType(Intrinsic::nvvm_fmax_ftz_nan_f16x2, BuiltinID,
E,
21955 case NVPTX::BI__nvvm_fmax_ftz_nan_xorsign_abs_f16:
21956 return MakeHalfType(Intrinsic::nvvm_fmax_ftz_nan_xorsign_abs_f16, BuiltinID,
21958 case NVPTX::BI__nvvm_fmax_ftz_nan_xorsign_abs_f16x2:
21959 return MakeHalfType(Intrinsic::nvvm_fmax_ftz_nan_xorsign_abs_f16x2,
21960 BuiltinID,
E, *
this);
21961 case NVPTX::BI__nvvm_fmax_ftz_xorsign_abs_f16:
21962 return MakeHalfType(Intrinsic::nvvm_fmax_ftz_xorsign_abs_f16, BuiltinID,
E,
21964 case NVPTX::BI__nvvm_fmax_ftz_xorsign_abs_f16x2:
21965 return MakeHalfType(Intrinsic::nvvm_fmax_ftz_xorsign_abs_f16x2, BuiltinID,
21967 case NVPTX::BI__nvvm_fmax_nan_f16:
21968 return MakeHalfType(Intrinsic::nvvm_fmax_nan_f16, BuiltinID,
E, *
this);
21969 case NVPTX::BI__nvvm_fmax_nan_f16x2:
21970 return MakeHalfType(Intrinsic::nvvm_fmax_nan_f16x2, BuiltinID,
E, *
this);
21971 case NVPTX::BI__nvvm_fmax_nan_xorsign_abs_f16:
21972 return MakeHalfType(Intrinsic::nvvm_fmax_nan_xorsign_abs_f16, BuiltinID,
E,
21974 case NVPTX::BI__nvvm_fmax_nan_xorsign_abs_f16x2:
21975 return MakeHalfType(Intrinsic::nvvm_fmax_nan_xorsign_abs_f16x2, BuiltinID,
21977 case NVPTX::BI__nvvm_fmax_xorsign_abs_f16:
21978 return MakeHalfType(Intrinsic::nvvm_fmax_xorsign_abs_f16, BuiltinID,
E,
21980 case NVPTX::BI__nvvm_fmax_xorsign_abs_f16x2:
21981 return MakeHalfType(Intrinsic::nvvm_fmax_xorsign_abs_f16x2, BuiltinID,
E,
21983 case NVPTX::BI__nvvm_fmin_f16:
21984 return MakeHalfType(Intrinsic::nvvm_fmin_f16, BuiltinID,
E, *
this);
21985 case NVPTX::BI__nvvm_fmin_f16x2:
21986 return MakeHalfType(Intrinsic::nvvm_fmin_f16x2, BuiltinID,
E, *
this);
21987 case NVPTX::BI__nvvm_fmin_ftz_f16:
21988 return MakeHalfType(Intrinsic::nvvm_fmin_ftz_f16, BuiltinID,
E, *
this);
21989 case NVPTX::BI__nvvm_fmin_ftz_f16x2:
21990 return MakeHalfType(Intrinsic::nvvm_fmin_ftz_f16x2, BuiltinID,
E, *
this);
21991 case NVPTX::BI__nvvm_fmin_ftz_nan_f16:
21992 return MakeHalfType(Intrinsic::nvvm_fmin_ftz_nan_f16, BuiltinID,
E, *
this);
21993 case NVPTX::BI__nvvm_fmin_ftz_nan_f16x2:
21994 return MakeHalfType(Intrinsic::nvvm_fmin_ftz_nan_f16x2, BuiltinID,
E,
21996 case NVPTX::BI__nvvm_fmin_ftz_nan_xorsign_abs_f16:
21997 return MakeHalfType(Intrinsic::nvvm_fmin_ftz_nan_xorsign_abs_f16, BuiltinID,
21999 case NVPTX::BI__nvvm_fmin_ftz_nan_xorsign_abs_f16x2:
22000 return MakeHalfType(Intrinsic::nvvm_fmin_ftz_nan_xorsign_abs_f16x2,
22001 BuiltinID,
E, *
this);
22002 case NVPTX::BI__nvvm_fmin_ftz_xorsign_abs_f16:
22003 return MakeHalfType(Intrinsic::nvvm_fmin_ftz_xorsign_abs_f16, BuiltinID,
E,
22005 case NVPTX::BI__nvvm_fmin_ftz_xorsign_abs_f16x2:
22006 return MakeHalfType(Intrinsic::nvvm_fmin_ftz_xorsign_abs_f16x2, BuiltinID,
22008 case NVPTX::BI__nvvm_fmin_nan_f16:
22009 return MakeHalfType(Intrinsic::nvvm_fmin_nan_f16, BuiltinID,
E, *
this);
22010 case NVPTX::BI__nvvm_fmin_nan_f16x2:
22011 return MakeHalfType(Intrinsic::nvvm_fmin_nan_f16x2, BuiltinID,
E, *
this);
22012 case NVPTX::BI__nvvm_fmin_nan_xorsign_abs_f16:
22013 return MakeHalfType(Intrinsic::nvvm_fmin_nan_xorsign_abs_f16, BuiltinID,
E,
22015 case NVPTX::BI__nvvm_fmin_nan_xorsign_abs_f16x2:
22016 return MakeHalfType(Intrinsic::nvvm_fmin_nan_xorsign_abs_f16x2, BuiltinID,
22018 case NVPTX::BI__nvvm_fmin_xorsign_abs_f16:
22019 return MakeHalfType(Intrinsic::nvvm_fmin_xorsign_abs_f16, BuiltinID,
E,
22021 case NVPTX::BI__nvvm_fmin_xorsign_abs_f16x2:
22022 return MakeHalfType(Intrinsic::nvvm_fmin_xorsign_abs_f16x2, BuiltinID,
E,
22024 case NVPTX::BI__nvvm_ldg_h:
22025 case NVPTX::BI__nvvm_ldg_h2:
22026 return MakeHalfType(Intrinsic::not_intrinsic, BuiltinID,
E, *
this);
22027 case NVPTX::BI__nvvm_ldu_h:
22028 case NVPTX::BI__nvvm_ldu_h2:
22029 return MakeHalfType(Intrinsic::nvvm_ldu_global_f, BuiltinID,
E, *
this);
22030 case NVPTX::BI__nvvm_cp_async_ca_shared_global_4:
22031 return MakeCpAsync(Intrinsic::nvvm_cp_async_ca_shared_global_4,
22032 Intrinsic::nvvm_cp_async_ca_shared_global_4_s, *
this,
E,
22034 case NVPTX::BI__nvvm_cp_async_ca_shared_global_8:
22035 return MakeCpAsync(Intrinsic::nvvm_cp_async_ca_shared_global_8,
22036 Intrinsic::nvvm_cp_async_ca_shared_global_8_s, *
this,
E,
22038 case NVPTX::BI__nvvm_cp_async_ca_shared_global_16:
22039 return MakeCpAsync(Intrinsic::nvvm_cp_async_ca_shared_global_16,
22040 Intrinsic::nvvm_cp_async_ca_shared_global_16_s, *
this,
E,
22042 case NVPTX::BI__nvvm_cp_async_cg_shared_global_16:
22043 return MakeCpAsync(Intrinsic::nvvm_cp_async_cg_shared_global_16,
22044 Intrinsic::nvvm_cp_async_cg_shared_global_16_s, *
this,
E,
22046 case NVPTX::BI__nvvm_read_ptx_sreg_clusterid_x:
22049 case NVPTX::BI__nvvm_read_ptx_sreg_clusterid_y:
22052 case NVPTX::BI__nvvm_read_ptx_sreg_clusterid_z:
22055 case NVPTX::BI__nvvm_read_ptx_sreg_clusterid_w:
22058 case NVPTX::BI__nvvm_read_ptx_sreg_nclusterid_x:
22061 case NVPTX::BI__nvvm_read_ptx_sreg_nclusterid_y:
22064 case NVPTX::BI__nvvm_read_ptx_sreg_nclusterid_z:
22067 case NVPTX::BI__nvvm_read_ptx_sreg_nclusterid_w:
22070 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_ctaid_x:
22073 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_ctaid_y:
22076 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_ctaid_z:
22079 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_ctaid_w:
22082 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_nctaid_x:
22085 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_nctaid_y:
22088 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_nctaid_z:
22091 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_nctaid_w:
22094 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_ctarank:
22097 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_nctarank:
22100 case NVPTX::BI__nvvm_is_explicit_cluster:
22103 case NVPTX::BI__nvvm_isspacep_shared_cluster:
22107 case NVPTX::BI__nvvm_mapa:
22110 {EmitScalarExpr(E->getArg(0)), EmitScalarExpr(E->getArg(1))});
22111 case NVPTX::BI__nvvm_mapa_shared_cluster:
22114 {EmitScalarExpr(E->getArg(0)), EmitScalarExpr(E->getArg(1))});
22115 case NVPTX::BI__nvvm_getctarank:
22119 case NVPTX::BI__nvvm_getctarank_shared_cluster:
22123 case NVPTX::BI__nvvm_barrier_cluster_arrive:
22126 case NVPTX::BI__nvvm_barrier_cluster_arrive_relaxed:
22129 case NVPTX::BI__nvvm_barrier_cluster_wait:
22132 case NVPTX::BI__nvvm_fence_sc_cluster:
22141struct BuiltinAlignArgs {
22142 llvm::Value *Src =
nullptr;
22143 llvm::Type *SrcType =
nullptr;
22144 llvm::Value *Alignment =
nullptr;
22145 llvm::Value *Mask =
nullptr;
22146 llvm::IntegerType *IntType =
nullptr;
22154 SrcType = Src->getType();
22155 if (SrcType->isPointerTy()) {
22156 IntType = IntegerType::get(
22160 assert(SrcType->isIntegerTy());
22161 IntType = cast<llvm::IntegerType>(SrcType);
22164 Alignment = CGF.
Builder.CreateZExtOrTrunc(Alignment, IntType,
"alignment");
22165 auto *One = llvm::ConstantInt::get(IntType, 1);
22166 Mask = CGF.
Builder.CreateSub(Alignment, One,
"mask");
22173 BuiltinAlignArgs Args(
E, *
this);
22174 llvm::Value *SrcAddress = Args.Src;
22175 if (Args.SrcType->isPointerTy())
22177 Builder.CreateBitOrPointerCast(Args.Src, Args.IntType,
"src_addr");
22179 Builder.CreateAnd(SrcAddress, Args.Mask,
"set_bits"),
22180 llvm::Constant::getNullValue(Args.IntType),
"is_aligned"));
22187 BuiltinAlignArgs Args(
E, *
this);
22188 llvm::Value *SrcForMask = Args.Src;
22194 if (Args.Src->getType()->isPointerTy()) {
22204 SrcForMask =
Builder.CreateAdd(SrcForMask, Args.Mask,
"over_boundary");
22208 llvm::Value *InvertedMask =
Builder.CreateNot(Args.Mask,
"inverted_mask");
22209 llvm::Value *
Result =
nullptr;
22210 if (Args.Src->getType()->isPointerTy()) {
22212 Intrinsic::ptrmask, {Args.SrcType, Args.IntType},
22213 {SrcForMask, InvertedMask},
nullptr,
"aligned_result");
22215 Result =
Builder.CreateAnd(SrcForMask, InvertedMask,
"aligned_result");
22217 assert(
Result->getType() == Args.SrcType);
22223 switch (BuiltinID) {
22224 case WebAssembly::BI__builtin_wasm_memory_size: {
22229 return Builder.CreateCall(Callee, I);
22231 case WebAssembly::BI__builtin_wasm_memory_grow: {
22237 return Builder.CreateCall(Callee, Args);
22239 case WebAssembly::BI__builtin_wasm_tls_size: {
22242 return Builder.CreateCall(Callee);
22244 case WebAssembly::BI__builtin_wasm_tls_align: {
22247 return Builder.CreateCall(Callee);
22249 case WebAssembly::BI__builtin_wasm_tls_base: {
22251 return Builder.CreateCall(Callee);
22253 case WebAssembly::BI__builtin_wasm_throw: {
22257 return Builder.CreateCall(Callee, {
Tag, Obj});
22259 case WebAssembly::BI__builtin_wasm_rethrow: {
22261 return Builder.CreateCall(Callee);
22263 case WebAssembly::BI__builtin_wasm_memory_atomic_wait32: {
22270 case WebAssembly::BI__builtin_wasm_memory_atomic_wait64: {
22277 case WebAssembly::BI__builtin_wasm_memory_atomic_notify: {
22281 return Builder.CreateCall(Callee, {Addr, Count});
22283 case WebAssembly::BI__builtin_wasm_trunc_s_i32_f32:
22284 case WebAssembly::BI__builtin_wasm_trunc_s_i32_f64:
22285 case WebAssembly::BI__builtin_wasm_trunc_s_i64_f32:
22286 case WebAssembly::BI__builtin_wasm_trunc_s_i64_f64: {
22291 return Builder.CreateCall(Callee, {Src});
22293 case WebAssembly::BI__builtin_wasm_trunc_u_i32_f32:
22294 case WebAssembly::BI__builtin_wasm_trunc_u_i32_f64:
22295 case WebAssembly::BI__builtin_wasm_trunc_u_i64_f32:
22296 case WebAssembly::BI__builtin_wasm_trunc_u_i64_f64: {
22301 return Builder.CreateCall(Callee, {Src});
22303 case WebAssembly::BI__builtin_wasm_trunc_saturate_s_i32_f32:
22304 case WebAssembly::BI__builtin_wasm_trunc_saturate_s_i32_f64:
22305 case WebAssembly::BI__builtin_wasm_trunc_saturate_s_i64_f32:
22306 case WebAssembly::BI__builtin_wasm_trunc_saturate_s_i64_f64:
22307 case WebAssembly::BI__builtin_wasm_trunc_saturate_s_i16x8_f16x8:
22308 case WebAssembly::BI__builtin_wasm_trunc_saturate_s_i32x4_f32x4: {
22313 return Builder.CreateCall(Callee, {Src});
22315 case WebAssembly::BI__builtin_wasm_trunc_saturate_u_i32_f32:
22316 case WebAssembly::BI__builtin_wasm_trunc_saturate_u_i32_f64:
22317 case WebAssembly::BI__builtin_wasm_trunc_saturate_u_i64_f32:
22318 case WebAssembly::BI__builtin_wasm_trunc_saturate_u_i64_f64:
22319 case WebAssembly::BI__builtin_wasm_trunc_saturate_u_i16x8_f16x8:
22320 case WebAssembly::BI__builtin_wasm_trunc_saturate_u_i32x4_f32x4: {
22325 return Builder.CreateCall(Callee, {Src});
22327 case WebAssembly::BI__builtin_wasm_min_f32:
22328 case WebAssembly::BI__builtin_wasm_min_f64:
22329 case WebAssembly::BI__builtin_wasm_min_f16x8:
22330 case WebAssembly::BI__builtin_wasm_min_f32x4:
22331 case WebAssembly::BI__builtin_wasm_min_f64x2: {
22336 return Builder.CreateCall(Callee, {LHS, RHS});
22338 case WebAssembly::BI__builtin_wasm_max_f32:
22339 case WebAssembly::BI__builtin_wasm_max_f64:
22340 case WebAssembly::BI__builtin_wasm_max_f16x8:
22341 case WebAssembly::BI__builtin_wasm_max_f32x4:
22342 case WebAssembly::BI__builtin_wasm_max_f64x2: {
22347 return Builder.CreateCall(Callee, {LHS, RHS});
22349 case WebAssembly::BI__builtin_wasm_pmin_f16x8:
22350 case WebAssembly::BI__builtin_wasm_pmin_f32x4:
22351 case WebAssembly::BI__builtin_wasm_pmin_f64x2: {
22356 return Builder.CreateCall(Callee, {LHS, RHS});
22358 case WebAssembly::BI__builtin_wasm_pmax_f16x8:
22359 case WebAssembly::BI__builtin_wasm_pmax_f32x4:
22360 case WebAssembly::BI__builtin_wasm_pmax_f64x2: {
22365 return Builder.CreateCall(Callee, {LHS, RHS});
22367 case WebAssembly::BI__builtin_wasm_ceil_f16x8:
22368 case WebAssembly::BI__builtin_wasm_floor_f16x8:
22369 case WebAssembly::BI__builtin_wasm_trunc_f16x8:
22370 case WebAssembly::BI__builtin_wasm_nearest_f16x8:
22371 case WebAssembly::BI__builtin_wasm_ceil_f32x4:
22372 case WebAssembly::BI__builtin_wasm_floor_f32x4:
22373 case WebAssembly::BI__builtin_wasm_trunc_f32x4:
22374 case WebAssembly::BI__builtin_wasm_nearest_f32x4:
22375 case WebAssembly::BI__builtin_wasm_ceil_f64x2:
22376 case WebAssembly::BI__builtin_wasm_floor_f64x2:
22377 case WebAssembly::BI__builtin_wasm_trunc_f64x2:
22378 case WebAssembly::BI__builtin_wasm_nearest_f64x2: {
22380 switch (BuiltinID) {
22381 case WebAssembly::BI__builtin_wasm_ceil_f16x8:
22382 case WebAssembly::BI__builtin_wasm_ceil_f32x4:
22383 case WebAssembly::BI__builtin_wasm_ceil_f64x2:
22384 IntNo = Intrinsic::ceil;
22386 case WebAssembly::BI__builtin_wasm_floor_f16x8:
22387 case WebAssembly::BI__builtin_wasm_floor_f32x4:
22388 case WebAssembly::BI__builtin_wasm_floor_f64x2:
22389 IntNo = Intrinsic::floor;
22391 case WebAssembly::BI__builtin_wasm_trunc_f16x8:
22392 case WebAssembly::BI__builtin_wasm_trunc_f32x4:
22393 case WebAssembly::BI__builtin_wasm_trunc_f64x2:
22394 IntNo = Intrinsic::trunc;
22396 case WebAssembly::BI__builtin_wasm_nearest_f16x8:
22397 case WebAssembly::BI__builtin_wasm_nearest_f32x4:
22398 case WebAssembly::BI__builtin_wasm_nearest_f64x2:
22399 IntNo = Intrinsic::nearbyint;
22402 llvm_unreachable(
"unexpected builtin ID");
22408 case WebAssembly::BI__builtin_wasm_ref_null_extern: {
22410 return Builder.CreateCall(Callee);
22412 case WebAssembly::BI__builtin_wasm_ref_null_func: {
22414 return Builder.CreateCall(Callee);
22416 case WebAssembly::BI__builtin_wasm_swizzle_i8x16: {
22420 return Builder.CreateCall(Callee, {Src, Indices});
22422 case WebAssembly::BI__builtin_wasm_abs_i8x16:
22423 case WebAssembly::BI__builtin_wasm_abs_i16x8:
22424 case WebAssembly::BI__builtin_wasm_abs_i32x4:
22425 case WebAssembly::BI__builtin_wasm_abs_i64x2: {
22428 Constant *
Zero = llvm::Constant::getNullValue(Vec->
getType());
22429 Value *ICmp =
Builder.CreateICmpSLT(Vec, Zero,
"abscond");
22430 return Builder.CreateSelect(ICmp, Neg, Vec,
"abs");
22432 case WebAssembly::BI__builtin_wasm_avgr_u_i8x16:
22433 case WebAssembly::BI__builtin_wasm_avgr_u_i16x8: {
22438 return Builder.CreateCall(Callee, {LHS, RHS});
22440 case WebAssembly::BI__builtin_wasm_q15mulr_sat_s_i16x8: {
22444 return Builder.CreateCall(Callee, {LHS, RHS});
22446 case WebAssembly::BI__builtin_wasm_extadd_pairwise_i8x16_s_i16x8:
22447 case WebAssembly::BI__builtin_wasm_extadd_pairwise_i8x16_u_i16x8:
22448 case WebAssembly::BI__builtin_wasm_extadd_pairwise_i16x8_s_i32x4:
22449 case WebAssembly::BI__builtin_wasm_extadd_pairwise_i16x8_u_i32x4: {
22452 switch (BuiltinID) {
22453 case WebAssembly::BI__builtin_wasm_extadd_pairwise_i8x16_s_i16x8:
22454 case WebAssembly::BI__builtin_wasm_extadd_pairwise_i16x8_s_i32x4:
22455 IntNo = Intrinsic::wasm_extadd_pairwise_signed;
22457 case WebAssembly::BI__builtin_wasm_extadd_pairwise_i8x16_u_i16x8:
22458 case WebAssembly::BI__builtin_wasm_extadd_pairwise_i16x8_u_i32x4:
22459 IntNo = Intrinsic::wasm_extadd_pairwise_unsigned;
22462 llvm_unreachable(
"unexpected builtin ID");
22466 return Builder.CreateCall(Callee, Vec);
22468 case WebAssembly::BI__builtin_wasm_bitselect: {
22474 return Builder.CreateCall(Callee, {V1, V2,
C});
22476 case WebAssembly::BI__builtin_wasm_dot_s_i32x4_i16x8: {
22480 return Builder.CreateCall(Callee, {LHS, RHS});
22482 case WebAssembly::BI__builtin_wasm_any_true_v128:
22483 case WebAssembly::BI__builtin_wasm_all_true_i8x16:
22484 case WebAssembly::BI__builtin_wasm_all_true_i16x8:
22485 case WebAssembly::BI__builtin_wasm_all_true_i32x4:
22486 case WebAssembly::BI__builtin_wasm_all_true_i64x2: {
22488 switch (BuiltinID) {
22489 case WebAssembly::BI__builtin_wasm_any_true_v128:
22490 IntNo = Intrinsic::wasm_anytrue;
22492 case WebAssembly::BI__builtin_wasm_all_true_i8x16:
22493 case WebAssembly::BI__builtin_wasm_all_true_i16x8:
22494 case WebAssembly::BI__builtin_wasm_all_true_i32x4:
22495 case WebAssembly::BI__builtin_wasm_all_true_i64x2:
22496 IntNo = Intrinsic::wasm_alltrue;
22499 llvm_unreachable(
"unexpected builtin ID");
22503 return Builder.CreateCall(Callee, {Vec});
22505 case WebAssembly::BI__builtin_wasm_bitmask_i8x16:
22506 case WebAssembly::BI__builtin_wasm_bitmask_i16x8:
22507 case WebAssembly::BI__builtin_wasm_bitmask_i32x4:
22508 case WebAssembly::BI__builtin_wasm_bitmask_i64x2: {
22512 return Builder.CreateCall(Callee, {Vec});
22514 case WebAssembly::BI__builtin_wasm_abs_f16x8:
22515 case WebAssembly::BI__builtin_wasm_abs_f32x4:
22516 case WebAssembly::BI__builtin_wasm_abs_f64x2: {
22519 return Builder.CreateCall(Callee, {Vec});
22521 case WebAssembly::BI__builtin_wasm_sqrt_f16x8:
22522 case WebAssembly::BI__builtin_wasm_sqrt_f32x4:
22523 case WebAssembly::BI__builtin_wasm_sqrt_f64x2: {
22526 return Builder.CreateCall(Callee, {Vec});
22528 case WebAssembly::BI__builtin_wasm_narrow_s_i8x16_i16x8:
22529 case WebAssembly::BI__builtin_wasm_narrow_u_i8x16_i16x8:
22530 case WebAssembly::BI__builtin_wasm_narrow_s_i16x8_i32x4:
22531 case WebAssembly::BI__builtin_wasm_narrow_u_i16x8_i32x4: {
22535 switch (BuiltinID) {
22536 case WebAssembly::BI__builtin_wasm_narrow_s_i8x16_i16x8:
22537 case WebAssembly::BI__builtin_wasm_narrow_s_i16x8_i32x4:
22538 IntNo = Intrinsic::wasm_narrow_signed;
22540 case WebAssembly::BI__builtin_wasm_narrow_u_i8x16_i16x8:
22541 case WebAssembly::BI__builtin_wasm_narrow_u_i16x8_i32x4:
22542 IntNo = Intrinsic::wasm_narrow_unsigned;
22545 llvm_unreachable(
"unexpected builtin ID");
22549 return Builder.CreateCall(Callee, {Low, High});
22551 case WebAssembly::BI__builtin_wasm_trunc_sat_s_zero_f64x2_i32x4:
22552 case WebAssembly::BI__builtin_wasm_trunc_sat_u_zero_f64x2_i32x4: {
22555 switch (BuiltinID) {
22556 case WebAssembly::BI__builtin_wasm_trunc_sat_s_zero_f64x2_i32x4:
22557 IntNo = Intrinsic::fptosi_sat;
22559 case WebAssembly::BI__builtin_wasm_trunc_sat_u_zero_f64x2_i32x4:
22560 IntNo = Intrinsic::fptoui_sat;
22563 llvm_unreachable(
"unexpected builtin ID");
22565 llvm::Type *SrcT = Vec->
getType();
22566 llvm::Type *TruncT = SrcT->getWithNewType(
Builder.getInt32Ty());
22569 Value *Splat = Constant::getNullValue(TruncT);
22572 case WebAssembly::BI__builtin_wasm_shuffle_i8x16: {
22577 while (OpIdx < 18) {
22578 std::optional<llvm::APSInt> LaneConst =
22580 assert(LaneConst &&
"Constant arg isn't actually constant?");
22581 Ops[OpIdx++] = llvm::ConstantInt::get(
getLLVMContext(), *LaneConst);
22584 return Builder.CreateCall(Callee, Ops);
22586 case WebAssembly::BI__builtin_wasm_relaxed_madd_f16x8:
22587 case WebAssembly::BI__builtin_wasm_relaxed_nmadd_f16x8:
22588 case WebAssembly::BI__builtin_wasm_relaxed_madd_f32x4:
22589 case WebAssembly::BI__builtin_wasm_relaxed_nmadd_f32x4:
22590 case WebAssembly::BI__builtin_wasm_relaxed_madd_f64x2:
22591 case WebAssembly::BI__builtin_wasm_relaxed_nmadd_f64x2: {
22596 switch (BuiltinID) {
22597 case WebAssembly::BI__builtin_wasm_relaxed_madd_f16x8:
22598 case WebAssembly::BI__builtin_wasm_relaxed_madd_f32x4:
22599 case WebAssembly::BI__builtin_wasm_relaxed_madd_f64x2:
22600 IntNo = Intrinsic::wasm_relaxed_madd;
22602 case WebAssembly::BI__builtin_wasm_relaxed_nmadd_f16x8:
22603 case WebAssembly::BI__builtin_wasm_relaxed_nmadd_f32x4:
22604 case WebAssembly::BI__builtin_wasm_relaxed_nmadd_f64x2:
22605 IntNo = Intrinsic::wasm_relaxed_nmadd;
22608 llvm_unreachable(
"unexpected builtin ID");
22611 return Builder.CreateCall(Callee, {A, B,
C});
22613 case WebAssembly::BI__builtin_wasm_relaxed_laneselect_i8x16:
22614 case WebAssembly::BI__builtin_wasm_relaxed_laneselect_i16x8:
22615 case WebAssembly::BI__builtin_wasm_relaxed_laneselect_i32x4:
22616 case WebAssembly::BI__builtin_wasm_relaxed_laneselect_i64x2: {
22622 return Builder.CreateCall(Callee, {A, B,
C});
22624 case WebAssembly::BI__builtin_wasm_relaxed_swizzle_i8x16: {
22628 return Builder.CreateCall(Callee, {Src, Indices});
22630 case WebAssembly::BI__builtin_wasm_relaxed_min_f32x4:
22631 case WebAssembly::BI__builtin_wasm_relaxed_max_f32x4:
22632 case WebAssembly::BI__builtin_wasm_relaxed_min_f64x2:
22633 case WebAssembly::BI__builtin_wasm_relaxed_max_f64x2: {
22637 switch (BuiltinID) {
22638 case WebAssembly::BI__builtin_wasm_relaxed_min_f32x4:
22639 case WebAssembly::BI__builtin_wasm_relaxed_min_f64x2:
22640 IntNo = Intrinsic::wasm_relaxed_min;
22642 case WebAssembly::BI__builtin_wasm_relaxed_max_f32x4:
22643 case WebAssembly::BI__builtin_wasm_relaxed_max_f64x2:
22644 IntNo = Intrinsic::wasm_relaxed_max;
22647 llvm_unreachable(
"unexpected builtin ID");
22650 return Builder.CreateCall(Callee, {LHS, RHS});
22652 case WebAssembly::BI__builtin_wasm_relaxed_trunc_s_i32x4_f32x4:
22653 case WebAssembly::BI__builtin_wasm_relaxed_trunc_u_i32x4_f32x4:
22654 case WebAssembly::BI__builtin_wasm_relaxed_trunc_s_zero_i32x4_f64x2:
22655 case WebAssembly::BI__builtin_wasm_relaxed_trunc_u_zero_i32x4_f64x2: {
22658 switch (BuiltinID) {
22659 case WebAssembly::BI__builtin_wasm_relaxed_trunc_s_i32x4_f32x4:
22660 IntNo = Intrinsic::wasm_relaxed_trunc_signed;
22662 case WebAssembly::BI__builtin_wasm_relaxed_trunc_u_i32x4_f32x4:
22663 IntNo = Intrinsic::wasm_relaxed_trunc_unsigned;
22665 case WebAssembly::BI__builtin_wasm_relaxed_trunc_s_zero_i32x4_f64x2:
22666 IntNo = Intrinsic::wasm_relaxed_trunc_signed_zero;
22668 case WebAssembly::BI__builtin_wasm_relaxed_trunc_u_zero_i32x4_f64x2:
22669 IntNo = Intrinsic::wasm_relaxed_trunc_unsigned_zero;
22672 llvm_unreachable(
"unexpected builtin ID");
22675 return Builder.CreateCall(Callee, {Vec});
22677 case WebAssembly::BI__builtin_wasm_relaxed_q15mulr_s_i16x8: {
22681 return Builder.CreateCall(Callee, {LHS, RHS});
22683 case WebAssembly::BI__builtin_wasm_relaxed_dot_i8x16_i7x16_s_i16x8: {
22688 return Builder.CreateCall(Callee, {LHS, RHS});
22690 case WebAssembly::BI__builtin_wasm_relaxed_dot_i8x16_i7x16_add_s_i32x4: {
22695 CGM.
getIntrinsic(Intrinsic::wasm_relaxed_dot_i8x16_i7x16_add_signed);
22696 return Builder.CreateCall(Callee, {LHS, RHS, Acc});
22698 case WebAssembly::BI__builtin_wasm_relaxed_dot_bf16x8_add_f32_f32x4: {
22704 return Builder.CreateCall(Callee, {LHS, RHS, Acc});
22706 case WebAssembly::BI__builtin_wasm_loadf16_f32: {
22709 return Builder.CreateCall(Callee, {Addr});
22711 case WebAssembly::BI__builtin_wasm_storef16_f32: {
22715 return Builder.CreateCall(Callee, {Val, Addr});
22717 case WebAssembly::BI__builtin_wasm_splat_f16x8: {
22720 return Builder.CreateCall(Callee, {Val});
22722 case WebAssembly::BI__builtin_wasm_extract_lane_f16x8: {
22728 case WebAssembly::BI__builtin_wasm_replace_lane_f16x8: {
22735 case WebAssembly::BI__builtin_wasm_table_get: {
22746 "Unexpected reference type for __builtin_wasm_table_get");
22747 return Builder.CreateCall(Callee, {Table, Index});
22749 case WebAssembly::BI__builtin_wasm_table_set: {
22761 "Unexpected reference type for __builtin_wasm_table_set");
22762 return Builder.CreateCall(Callee, {Table, Index, Val});
22764 case WebAssembly::BI__builtin_wasm_table_size: {
22770 case WebAssembly::BI__builtin_wasm_table_grow: {
22783 "Unexpected reference type for __builtin_wasm_table_grow");
22785 return Builder.CreateCall(Callee, {Table, Val, NElems});
22787 case WebAssembly::BI__builtin_wasm_table_fill: {
22801 "Unexpected reference type for __builtin_wasm_table_fill");
22803 return Builder.CreateCall(Callee, {Table, Index, Val, NElems});
22805 case WebAssembly::BI__builtin_wasm_table_copy: {
22815 return Builder.CreateCall(Callee, {TableX, TableY, SrcIdx, DstIdx, NElems});
22822static std::pair<Intrinsic::ID, unsigned>
22825 unsigned BuiltinID;
22826 Intrinsic::ID IntrinsicID;
22829 static Info Infos[] = {
22830#define CUSTOM_BUILTIN_MAPPING(x,s) \
22831 { Hexagon::BI__builtin_HEXAGON_##x, Intrinsic::hexagon_##x, s },
22863#include "clang/Basic/BuiltinsHexagonMapCustomDep.def"
22864#undef CUSTOM_BUILTIN_MAPPING
22867 auto CmpInfo = [] (Info A, Info B) {
return A.BuiltinID < B.BuiltinID; };
22868 static const bool SortOnce = (llvm::sort(Infos, CmpInfo),
true);
22871 const Info *F = llvm::lower_bound(Infos, Info{BuiltinID, 0, 0}, CmpInfo);
22872 if (F == std::end(Infos) || F->BuiltinID != BuiltinID)
22873 return {Intrinsic::not_intrinsic, 0};
22875 return {F->IntrinsicID, F->VecLen};
22884 auto MakeCircOp = [
this,
E](
unsigned IntID,
bool IsLoad) {
22898 for (
unsigned i = 1, e =
E->getNumArgs(); i != e; ++i)
22904 llvm::Value *NewBase = IsLoad ?
Builder.CreateExtractValue(
Result, 1)
22908 llvm::Value *RetVal =
22918 auto MakeBrevLd = [
this,
E](
unsigned IntID, llvm::Type *DestTy) {
22935 CGM.
getIntrinsic(IntID), {BaseAddress, EmitScalarExpr(E->getArg(2))});
22938 llvm::Value *DestVal =
Builder.CreateExtractValue(
Result, 0);
22943 DestVal =
Builder.CreateTrunc(DestVal, DestTy);
22950 auto V2Q = [
this, VecLen] (llvm::Value *Vec) {
22951 Intrinsic::ID
ID = VecLen == 128 ? Intrinsic::hexagon_V6_vandvrt_128B
22952 : Intrinsic::hexagon_V6_vandvrt;
22954 {Vec,
Builder.getInt32(-1)});
22956 auto Q2V = [
this, VecLen] (llvm::Value *Pred) {
22957 Intrinsic::ID
ID = VecLen == 128 ? Intrinsic::hexagon_V6_vandqrt_128B
22958 : Intrinsic::hexagon_V6_vandqrt;
22960 {Pred,
Builder.getInt32(-1)});
22963 switch (BuiltinID) {
22967 case Hexagon::BI__builtin_HEXAGON_V6_vaddcarry:
22968 case Hexagon::BI__builtin_HEXAGON_V6_vaddcarry_128B:
22969 case Hexagon::BI__builtin_HEXAGON_V6_vsubcarry:
22970 case Hexagon::BI__builtin_HEXAGON_V6_vsubcarry_128B: {
22977 {EmitScalarExpr(E->getArg(0)), EmitScalarExpr(E->getArg(1)), PredIn});
22979 llvm::Value *PredOut =
Builder.CreateExtractValue(
Result, 1);
22987 case Hexagon::BI__builtin_HEXAGON_V6_vaddcarryo:
22988 case Hexagon::BI__builtin_HEXAGON_V6_vaddcarryo_128B:
22989 case Hexagon::BI__builtin_HEXAGON_V6_vsubcarryo:
22990 case Hexagon::BI__builtin_HEXAGON_V6_vsubcarryo_128B: {
22996 {EmitScalarExpr(E->getArg(0)), EmitScalarExpr(E->getArg(1))});
22998 llvm::Value *PredOut =
Builder.CreateExtractValue(
Result, 1);
23004 case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstoreq:
23005 case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstorenq:
23006 case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstorentq:
23007 case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstorentnq:
23008 case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstoreq_128B:
23009 case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstorenq_128B:
23010 case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstorentq_128B:
23011 case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstorentnq_128B: {
23013 const Expr *PredOp =
E->getArg(0);
23015 if (
auto *Cast = dyn_cast<ImplicitCastExpr>(PredOp)) {
23016 if (
Cast->getCastKind() == CK_BitCast)
23017 PredOp =
Cast->getSubExpr();
23020 for (
int i = 1, e =
E->getNumArgs(); i != e; ++i)
23025 case Hexagon::BI__builtin_HEXAGON_L2_loadrub_pci:
23026 case Hexagon::BI__builtin_HEXAGON_L2_loadrb_pci:
23027 case Hexagon::BI__builtin_HEXAGON_L2_loadruh_pci:
23028 case Hexagon::BI__builtin_HEXAGON_L2_loadrh_pci:
23029 case Hexagon::BI__builtin_HEXAGON_L2_loadri_pci:
23030 case Hexagon::BI__builtin_HEXAGON_L2_loadrd_pci:
23031 case Hexagon::BI__builtin_HEXAGON_L2_loadrub_pcr:
23032 case Hexagon::BI__builtin_HEXAGON_L2_loadrb_pcr:
23033 case Hexagon::BI__builtin_HEXAGON_L2_loadruh_pcr:
23034 case Hexagon::BI__builtin_HEXAGON_L2_loadrh_pcr:
23035 case Hexagon::BI__builtin_HEXAGON_L2_loadri_pcr:
23036 case Hexagon::BI__builtin_HEXAGON_L2_loadrd_pcr:
23037 return MakeCircOp(ID,
true);
23038 case Hexagon::BI__builtin_HEXAGON_S2_storerb_pci:
23039 case Hexagon::BI__builtin_HEXAGON_S2_storerh_pci:
23040 case Hexagon::BI__builtin_HEXAGON_S2_storerf_pci:
23041 case Hexagon::BI__builtin_HEXAGON_S2_storeri_pci:
23042 case Hexagon::BI__builtin_HEXAGON_S2_storerd_pci:
23043 case Hexagon::BI__builtin_HEXAGON_S2_storerb_pcr:
23044 case Hexagon::BI__builtin_HEXAGON_S2_storerh_pcr:
23045 case Hexagon::BI__builtin_HEXAGON_S2_storerf_pcr:
23046 case Hexagon::BI__builtin_HEXAGON_S2_storeri_pcr:
23047 case Hexagon::BI__builtin_HEXAGON_S2_storerd_pcr:
23048 return MakeCircOp(ID,
false);
23049 case Hexagon::BI__builtin_brev_ldub:
23050 return MakeBrevLd(Intrinsic::hexagon_L2_loadrub_pbr,
Int8Ty);
23051 case Hexagon::BI__builtin_brev_ldb:
23052 return MakeBrevLd(Intrinsic::hexagon_L2_loadrb_pbr,
Int8Ty);
23053 case Hexagon::BI__builtin_brev_lduh:
23054 return MakeBrevLd(Intrinsic::hexagon_L2_loadruh_pbr,
Int16Ty);
23055 case Hexagon::BI__builtin_brev_ldh:
23056 return MakeBrevLd(Intrinsic::hexagon_L2_loadrh_pbr,
Int16Ty);
23057 case Hexagon::BI__builtin_brev_ldw:
23058 return MakeBrevLd(Intrinsic::hexagon_L2_loadri_pbr,
Int32Ty);
23059 case Hexagon::BI__builtin_brev_ldd:
23060 return MakeBrevLd(Intrinsic::hexagon_L2_loadrd_pbr,
Int64Ty);
23068 StringRef CPUStr = cast<clang::StringLiteral>(CPUExpr)->getString();
23076 llvm::Constant *RISCVCPUModel =
23078 cast<llvm::GlobalValue>(RISCVCPUModel)->setDSOLocal(
true);
23080 auto loadRISCVCPUID = [&](
unsigned Index) {
23083 Ptr, llvm::MaybeAlign());
23087 const llvm::RISCV::CPUModel Model = llvm::RISCV::getCPUModel(CPUStr);
23090 Value *VendorID = loadRISCVCPUID(0);
23092 Builder.CreateICmpEQ(VendorID,
Builder.getInt32(Model.MVendorID));
23095 Value *ArchID = loadRISCVCPUID(1);
23100 Value *ImpID = loadRISCVCPUID(2);
23111 if (BuiltinID == Builtin::BI__builtin_cpu_supports)
23113 if (BuiltinID == Builtin::BI__builtin_cpu_init)
23115 if (BuiltinID == Builtin::BI__builtin_cpu_is)
23122 unsigned ICEArguments = 0;
23130 if (BuiltinID == RISCVVector::BI__builtin_rvv_vget_v ||
23131 BuiltinID == RISCVVector::BI__builtin_rvv_vset_v)
23132 ICEArguments = 1 << 1;
23137 if (BuiltinID == RISCV::BI__builtin_riscv_ntl_load)
23138 ICEArguments |= (1 << 1);
23139 if (BuiltinID == RISCV::BI__builtin_riscv_ntl_store)
23140 ICEArguments |= (1 << 2);
23142 for (
unsigned i = 0, e =
E->getNumArgs(); i != e; i++) {
23147 Ops.push_back(AggValue);
23153 Intrinsic::ID
ID = Intrinsic::not_intrinsic;
23156 constexpr unsigned RVV_VTA = 0x1;
23157 constexpr unsigned RVV_VMA = 0x2;
23158 int PolicyAttrs = 0;
23159 bool IsMasked =
false;
23161 unsigned SegInstSEW = 8;
23165 switch (BuiltinID) {
23166 default: llvm_unreachable(
"unexpected builtin ID");
23167 case RISCV::BI__builtin_riscv_orc_b_32:
23168 case RISCV::BI__builtin_riscv_orc_b_64:
23169 case RISCV::BI__builtin_riscv_clmul_32:
23170 case RISCV::BI__builtin_riscv_clmul_64:
23171 case RISCV::BI__builtin_riscv_clmulh_32:
23172 case RISCV::BI__builtin_riscv_clmulh_64:
23173 case RISCV::BI__builtin_riscv_clmulr_32:
23174 case RISCV::BI__builtin_riscv_clmulr_64:
23175 case RISCV::BI__builtin_riscv_xperm4_32:
23176 case RISCV::BI__builtin_riscv_xperm4_64:
23177 case RISCV::BI__builtin_riscv_xperm8_32:
23178 case RISCV::BI__builtin_riscv_xperm8_64:
23179 case RISCV::BI__builtin_riscv_brev8_32:
23180 case RISCV::BI__builtin_riscv_brev8_64:
23181 case RISCV::BI__builtin_riscv_zip_32:
23182 case RISCV::BI__builtin_riscv_unzip_32: {
23183 switch (BuiltinID) {
23184 default: llvm_unreachable(
"unexpected builtin ID");
23186 case RISCV::BI__builtin_riscv_orc_b_32:
23187 case RISCV::BI__builtin_riscv_orc_b_64:
23188 ID = Intrinsic::riscv_orc_b;
23192 case RISCV::BI__builtin_riscv_clmul_32:
23193 case RISCV::BI__builtin_riscv_clmul_64:
23194 ID = Intrinsic::riscv_clmul;
23196 case RISCV::BI__builtin_riscv_clmulh_32:
23197 case RISCV::BI__builtin_riscv_clmulh_64:
23198 ID = Intrinsic::riscv_clmulh;
23200 case RISCV::BI__builtin_riscv_clmulr_32:
23201 case RISCV::BI__builtin_riscv_clmulr_64:
23202 ID = Intrinsic::riscv_clmulr;
23206 case RISCV::BI__builtin_riscv_xperm8_32:
23207 case RISCV::BI__builtin_riscv_xperm8_64:
23208 ID = Intrinsic::riscv_xperm8;
23210 case RISCV::BI__builtin_riscv_xperm4_32:
23211 case RISCV::BI__builtin_riscv_xperm4_64:
23212 ID = Intrinsic::riscv_xperm4;
23216 case RISCV::BI__builtin_riscv_brev8_32:
23217 case RISCV::BI__builtin_riscv_brev8_64:
23218 ID = Intrinsic::riscv_brev8;
23220 case RISCV::BI__builtin_riscv_zip_32:
23221 ID = Intrinsic::riscv_zip;
23223 case RISCV::BI__builtin_riscv_unzip_32:
23224 ID = Intrinsic::riscv_unzip;
23228 IntrinsicTypes = {ResultType};
23235 case RISCV::BI__builtin_riscv_sha256sig0:
23236 ID = Intrinsic::riscv_sha256sig0;
23238 case RISCV::BI__builtin_riscv_sha256sig1:
23239 ID = Intrinsic::riscv_sha256sig1;
23241 case RISCV::BI__builtin_riscv_sha256sum0:
23242 ID = Intrinsic::riscv_sha256sum0;
23244 case RISCV::BI__builtin_riscv_sha256sum1:
23245 ID = Intrinsic::riscv_sha256sum1;
23249 case RISCV::BI__builtin_riscv_sm4ks:
23250 ID = Intrinsic::riscv_sm4ks;
23252 case RISCV::BI__builtin_riscv_sm4ed:
23253 ID = Intrinsic::riscv_sm4ed;
23257 case RISCV::BI__builtin_riscv_sm3p0:
23258 ID = Intrinsic::riscv_sm3p0;
23260 case RISCV::BI__builtin_riscv_sm3p1:
23261 ID = Intrinsic::riscv_sm3p1;
23264 case RISCV::BI__builtin_riscv_clz_32:
23265 case RISCV::BI__builtin_riscv_clz_64: {
23268 if (
Result->getType() != ResultType)
23273 case RISCV::BI__builtin_riscv_ctz_32:
23274 case RISCV::BI__builtin_riscv_ctz_64: {
23277 if (
Result->getType() != ResultType)
23284 case RISCV::BI__builtin_riscv_ntl_load: {
23286 unsigned DomainVal = 5;
23287 if (Ops.size() == 2)
23288 DomainVal = cast<ConstantInt>(Ops[1])->getZExtValue();
23290 llvm::MDNode *RISCVDomainNode = llvm::MDNode::get(
23292 llvm::ConstantAsMetadata::get(
Builder.getInt32(DomainVal)));
23293 llvm::MDNode *NontemporalNode = llvm::MDNode::get(
23297 if(ResTy->isScalableTy()) {
23298 const ScalableVectorType *SVTy = cast<ScalableVectorType>(ResTy);
23299 llvm::Type *ScalarTy = ResTy->getScalarType();
23300 Width = ScalarTy->getPrimitiveSizeInBits() *
23301 SVTy->getElementCount().getKnownMinValue();
23303 Width = ResTy->getPrimitiveSizeInBits();
23307 Load->setMetadata(llvm::LLVMContext::MD_nontemporal, NontemporalNode);
23308 Load->setMetadata(
CGM.
getModule().getMDKindID(
"riscv-nontemporal-domain"),
23313 case RISCV::BI__builtin_riscv_ntl_store: {
23314 unsigned DomainVal = 5;
23315 if (Ops.size() == 3)
23316 DomainVal = cast<ConstantInt>(Ops[2])->getZExtValue();
23318 llvm::MDNode *RISCVDomainNode = llvm::MDNode::get(
23320 llvm::ConstantAsMetadata::get(
Builder.getInt32(DomainVal)));
23321 llvm::MDNode *NontemporalNode = llvm::MDNode::get(
23325 Store->setMetadata(llvm::LLVMContext::MD_nontemporal, NontemporalNode);
23332 case RISCV::BI__builtin_riscv_cv_alu_addN:
23333 ID = Intrinsic::riscv_cv_alu_addN;
23335 case RISCV::BI__builtin_riscv_cv_alu_addRN:
23336 ID = Intrinsic::riscv_cv_alu_addRN;
23338 case RISCV::BI__builtin_riscv_cv_alu_adduN:
23339 ID = Intrinsic::riscv_cv_alu_adduN;
23341 case RISCV::BI__builtin_riscv_cv_alu_adduRN:
23342 ID = Intrinsic::riscv_cv_alu_adduRN;
23344 case RISCV::BI__builtin_riscv_cv_alu_clip:
23345 ID = Intrinsic::riscv_cv_alu_clip;
23347 case RISCV::BI__builtin_riscv_cv_alu_clipu:
23348 ID = Intrinsic::riscv_cv_alu_clipu;
23350 case RISCV::BI__builtin_riscv_cv_alu_extbs:
23353 case RISCV::BI__builtin_riscv_cv_alu_extbz:
23356 case RISCV::BI__builtin_riscv_cv_alu_exths:
23359 case RISCV::BI__builtin_riscv_cv_alu_exthz:
23362 case RISCV::BI__builtin_riscv_cv_alu_slet:
23365 case RISCV::BI__builtin_riscv_cv_alu_sletu:
23368 case RISCV::BI__builtin_riscv_cv_alu_subN:
23369 ID = Intrinsic::riscv_cv_alu_subN;
23371 case RISCV::BI__builtin_riscv_cv_alu_subRN:
23372 ID = Intrinsic::riscv_cv_alu_subRN;
23374 case RISCV::BI__builtin_riscv_cv_alu_subuN:
23375 ID = Intrinsic::riscv_cv_alu_subuN;
23377 case RISCV::BI__builtin_riscv_cv_alu_subuRN:
23378 ID = Intrinsic::riscv_cv_alu_subuRN;
23382#include "clang/Basic/riscv_vector_builtin_cg.inc"
23385#include "clang/Basic/riscv_sifive_vector_builtin_cg.inc"
23388 assert(ID != Intrinsic::not_intrinsic);
23391 return Builder.CreateCall(F, Ops,
"");
Defines the clang::ASTContext interface.
#define PPC_LNX_FEATURE(NAME, DESC, ENUMNAME, ENUMVAL, HWCAPN)
static constexpr SparcCPUInfo CPUInfo[]
#define X86_CPU_SUBTYPE(ENUM, STR)
#define X86_CPU_SUBTYPE_ALIAS(ENUM, ALIAS)
#define X86_VENDOR(ENUM, STRING)
#define X86_CPU_TYPE_ALIAS(ENUM, ALIAS)
#define X86_CPU_TYPE(ENUM, STR)
static constexpr Builtin::Info BuiltinInfo[]
static void Accumulate(SMap &SM, CFGBlock *B)
static Value * EmitSpecialRegisterBuiltin(CodeGenFunction &CGF, const CallExpr *E, llvm::Type *RegisterType, llvm::Type *ValueType, SpecialRegisterAccessKind AccessKind, StringRef SysReg="")
static llvm::Value * ARMMVEVectorReinterpret(CGBuilderTy &Builder, CodeGenFunction *CGF, llvm::Value *V, llvm::Type *DestType)
static Value * MakeBinaryAtomicValue(CodeGenFunction &CGF, llvm::AtomicRMWInst::BinOp Kind, const CallExpr *E, AtomicOrdering Ordering=AtomicOrdering::SequentiallyConsistent)
Utility to insert an atomic instruction based on Intrinsic::ID and the expression node.
static char bitActionToX86BTCode(BitTest::ActionKind A)
#define NEONMAP2(NameBase, LLVMIntrinsic, AltLLVMIntrinsic, TypeModifier)
static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, CGHLSLRuntime &RT, QualType QT)
static Value * EmitAtomicCmpXchg128ForMSIntrin(CodeGenFunction &CGF, const CallExpr *E, AtomicOrdering SuccessOrdering)
#define INTRINSIC_X86_XSAVE_ID(NAME)
static CanQualType getOSLogArgType(ASTContext &C, int Size)
Get the argument type for arguments to os_log_helper.
static Value * EmitOverflowCheckedAbs(CodeGenFunction &CGF, const CallExpr *E, bool SanitizeOverflow)
static llvm::VectorType * GetFloatNeonType(CodeGenFunction *CGF, NeonTypeFlags IntTypeFlags)
static Value * tryUseTestFPKind(CodeGenFunction &CGF, unsigned BuiltinID, Value *V)
static llvm::Value * MVEImmediateShr(CGBuilderTy &Builder, llvm::Value *V, uint32_t Shift, bool Unsigned)
static bool areBOSTypesCompatible(int From, int To)
Checks if using the result of __builtin_object_size(p, From) in place of __builtin_object_size(p,...
static llvm::Value * SignOrZeroExtend(CGBuilderTy &Builder, llvm::Value *V, llvm::Type *T, bool Unsigned)
static void InsertExplicitZeroOperand(CGBuilderTy &Builder, llvm::Type *Ty, SmallVectorImpl< Value * > &Ops)
static const ARMVectorIntrinsicInfo AArch64SMEIntrinsicMap[]
static Value * EmitAArch64TblBuiltinExpr(CodeGenFunction &CGF, unsigned BuiltinID, const CallExpr *E, SmallVectorImpl< Value * > &Ops, llvm::Triple::ArchType Arch)
#define MMA_VARIANTS_B1_AND(geom, type)
static void swapCommutativeSMEOperands(unsigned BuiltinID, SmallVectorImpl< Value * > &Ops)
static bool AArch64SISDIntrinsicsProvenSorted
static Value * EmitX86CompressExpand(CodeGenFunction &CGF, ArrayRef< Value * > Ops, bool IsCompress)
static const ARMVectorIntrinsicInfo AArch64SVEIntrinsicMap[]
static bool HasExtraNeonArgument(unsigned BuiltinID)
Return true if BuiltinID is an overloaded Neon intrinsic with an extra argument that specifies the ve...
static bool TypeRequiresBuiltinLaunderImp(const ASTContext &Ctx, QualType Ty, llvm::SmallPtrSetImpl< const Decl * > &Seen)
static Value * EmitAtomicIncrementValue(CodeGenFunction &CGF, const CallExpr *E, AtomicOrdering Ordering=AtomicOrdering::SequentiallyConsistent)
static std::pair< Intrinsic::ID, unsigned > getIntrinsicForHexagonNonClangBuiltin(unsigned BuiltinID)
static Value * emitRangedBuiltin(CodeGenFunction &CGF, unsigned IntrinsicID, int low, int high)
#define MMA_INTR(geom_op_type, layout)
static Value * EmitX86MaskedCompare(CodeGenFunction &CGF, unsigned CC, bool Signed, ArrayRef< Value * > Ops)
static Value * emitUnaryMaybeConstrainedFPBuiltin(CodeGenFunction &CGF, const CallExpr *E, unsigned IntrinsicID, unsigned ConstrainedIntrinsicID)
static Intrinsic::ID getDotProductIntrinsic(CGHLSLRuntime &RT, QualType QT)
#define NEONMAP1(NameBase, LLVMIntrinsic, TypeModifier)
static bool AArch64SVEIntrinsicsProvenSorted
static RValue EmitMSVCRTSetJmp(CodeGenFunction &CGF, MSVCSetJmpKind SJKind, const CallExpr *E)
MSVC handles setjmp a bit differently on different platforms.
static const ARMVectorIntrinsicInfo * findARMVectorIntrinsicInMap(ArrayRef< ARMVectorIntrinsicInfo > IntrinsicMap, unsigned BuiltinID, bool &MapProvenSorted)
static Value * EmitScalarFMAExpr(CodeGenFunction &CGF, const CallExpr *E, MutableArrayRef< Value * > Ops, Value *Upper, bool ZeroMask=false, unsigned PTIdx=0, bool NegAcc=false)
static Value * loadRISCVFeatureBits(unsigned Index, CGBuilderTy &Builder, CodeGenModule &CGM)
#define MUTATE_LDBL(func)
static Value * EmitX86ExpandLoad(CodeGenFunction &CGF, ArrayRef< Value * > Ops)
static unsigned CountCountedByAttrs(const RecordDecl *RD)
static Value * emitMaybeConstrainedFPToIntRoundBuiltin(CodeGenFunction &CGF, const CallExpr *E, unsigned IntrinsicID, unsigned ConstrainedIntrinsicID)
static Value * EmitX86MaskedLoad(CodeGenFunction &CGF, ArrayRef< Value * > Ops, Align Alignment)
static bool TypeRequiresBuiltinLaunder(CodeGenModule &CGM, QualType Ty)
Determine if the specified type requires laundering by checking if it is a dynamic class type or cont...
static void InsertExplicitUndefOperand(CGBuilderTy &Builder, llvm::Type *Ty, SmallVectorImpl< Value * > &Ops)
static Value * EmitISOVolatileLoad(CodeGenFunction &CGF, const CallExpr *E)
static struct WidthAndSignedness EncompassingIntegerType(ArrayRef< struct WidthAndSignedness > Types)
static Integer GetIntegerConstantValue(const Expr *E, ASTContext &Context)
#define MMA_VARIANTS(geom, type)
static bool AArch64SMEIntrinsicsProvenSorted
static llvm::Value * VectorZip(CGBuilderTy &Builder, llvm::Value *V0, llvm::Value *V1)
static Value * EmitTargetArchBuiltinExpr(CodeGenFunction *CGF, unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Triple::ArchType Arch)
constexpr unsigned SVEBitsPerBlock
static std::optional< CodeGenFunction::MSVCIntrin > translateX86ToMsvcIntrin(unsigned BuiltinID)
static const std::pair< unsigned, unsigned > NEONEquivalentIntrinsicMap[]
#define NEONMAP0(NameBase)
static Value * EmitX86MaskedStore(CodeGenFunction &CGF, ArrayRef< Value * > Ops, Align Alignment)
static Value * handleHlslSplitdouble(const CallExpr *E, CodeGenFunction *CGF)
static Value * emitBinaryMaybeConstrainedFPBuiltin(CodeGenFunction &CGF, const CallExpr *E, unsigned IntrinsicID, unsigned ConstrainedIntrinsicID)
static RValue EmitBinaryAtomicPost(CodeGenFunction &CGF, llvm::AtomicRMWInst::BinOp Kind, const CallExpr *E, Instruction::BinaryOps Op, bool Invert=false)
Utility to insert an atomic instruction based Intrinsic::ID and the expression node,...
static bool HasNoIndirectArgumentsOrResults(CGFunctionInfo const &FnInfo)
Checks no arguments or results are passed indirectly in the ABI (i.e.
static Value * EmitX86Muldq(CodeGenFunction &CGF, bool IsSigned, ArrayRef< Value * > Ops)
Value * readX18AsPtr(CodeGenFunction &CGF)
Helper for the read/write/add/inc X18 builtins: read the X18 register and return it as an i8 pointer.
static llvm::Value * ARMMVEVectorElementReverse(CGBuilderTy &Builder, llvm::Value *V, unsigned ReverseWidth)
#define MMA_SATF_VARIANTS(geom, type)
static std::optional< CodeGenFunction::MSVCIntrin > translateAarch64ToMsvcIntrin(unsigned BuiltinID)
static std::optional< CodeGenFunction::MSVCIntrin > translateArmToMsvcIntrin(unsigned BuiltinID)
static llvm::Value * EmitBitTestIntrinsic(CodeGenFunction &CGF, unsigned BuiltinID, const CallExpr *E)
Emit a _bittest* intrinsic.
static Value * emitBuiltinWithOneOverloadedType(CodeGenFunction &CGF, const CallExpr *E, unsigned IntrinsicID, llvm::StringRef Name="")
static const ARMVectorIntrinsicInfo ARMSIMDIntrinsicMap[]
static Value * EmitSignBit(CodeGenFunction &CGF, Value *V)
Emit the computation of the sign bit for a floating point value.
static Value * EmitFAbs(CodeGenFunction &CGF, Value *V)
EmitFAbs - Emit a call to @llvm.fabs().
#define CUSTOM_BUILTIN_MAPPING(x, s)
static Value * EmitX86CvtF16ToFloatExpr(CodeGenFunction &CGF, ArrayRef< Value * > Ops, llvm::Type *DstTy)
static bool isSpecialUnsignedMultiplySignedResult(unsigned BuiltinID, WidthAndSignedness Op1Info, WidthAndSignedness Op2Info, WidthAndSignedness ResultInfo)
static llvm::Value * getDefaultBuiltinObjectSizeResult(unsigned Type, llvm::IntegerType *ResType)
static llvm::Value * emitPPCLoadReserveIntrinsic(CodeGenFunction &CGF, unsigned BuiltinID, const CallExpr *E)
static llvm::Value * VectorUnzip(CGBuilderTy &Builder, llvm::Value *V, bool Odd)
static Value * EmitX86SExtMask(CodeGenFunction &CGF, Value *Op, llvm::Type *DstTy)
static Value * emitTernaryMaybeConstrainedFPBuiltin(CodeGenFunction &CGF, const CallExpr *E, unsigned IntrinsicID, unsigned ConstrainedIntrinsicID)
static WidthAndSignedness getIntegerWidthAndSignedness(const clang::ASTContext &context, const clang::QualType Type)
static Value * EmitX86FunnelShift(CodeGenFunction &CGF, Value *Op0, Value *Op1, Value *Amt, bool IsRight)
static RValue EmitCheckedMixedSignMultiply(CodeGenFunction &CGF, const clang::Expr *Op1, WidthAndSignedness Op1Info, const clang::Expr *Op2, WidthAndSignedness Op2Info, const clang::Expr *ResultArg, QualType ResultQTy, WidthAndSignedness ResultInfo)
Emit a checked mixed-sign multiply.
static llvm::ScalableVectorType * getSVEVectorForElementType(llvm::Type *EltTy)
static unsigned mutateLongDoubleBuiltin(unsigned BuiltinID)
#define INTRINSIC_WITH_CC(NAME)
static llvm::FixedVectorType * GetNeonType(CodeGenFunction *CGF, NeonTypeFlags TypeFlags, bool HasLegalHalfType=true, bool V1Ty=false, bool AllowBFloatArgsAndRet=true)
static RValue EmitBinaryAtomic(CodeGenFunction &CGF, llvm::AtomicRMWInst::BinOp Kind, const CallExpr *E)
static llvm::Value * ARMMVEConstantSplat(CGBuilderTy &Builder, llvm::Type *VT)
static Value * EmitX86MaskLogic(CodeGenFunction &CGF, Instruction::BinaryOps Opc, ArrayRef< Value * > Ops, bool InvertLHS=false)
static Value * EmitFromInt(CodeGenFunction &CGF, llvm::Value *V, QualType T, llvm::Type *ResultType)
static Value * EmitAMDGCNBallotForExec(CodeGenFunction &CGF, const CallExpr *E, llvm::Type *RegisterType, llvm::Type *ValueType, bool isExecHi)
static void emitSincosBuiltin(CodeGenFunction &CGF, const CallExpr *E, llvm::Intrinsic::ID IntrinsicID)
static void initializeAlloca(CodeGenFunction &CGF, AllocaInst *AI, Value *Size, Align AlignmentInBytes)
static Value * EmitX86Select(CodeGenFunction &CGF, Value *Mask, Value *Op0, Value *Op1)
SpecialRegisterAccessKind
static Value * EmitAtomicCmpXchgForMSIntrin(CodeGenFunction &CGF, const CallExpr *E, AtomicOrdering SuccessOrdering=AtomicOrdering::SequentiallyConsistent)
This function should be invoked to emit atomic cmpxchg for Microsoft's _InterlockedCompareExchange* i...
static Address CheckAtomicAlignment(CodeGenFunction &CGF, const CallExpr *E)
static Value * EmitX86FMAExpr(CodeGenFunction &CGF, const CallExpr *E, ArrayRef< Value * > Ops, unsigned BuiltinID, bool IsAddSub)
static Value * getMaskVecValue(CodeGenFunction &CGF, Value *Mask, unsigned NumElts)
static bool isSpecialMixedSignMultiply(unsigned BuiltinID, WidthAndSignedness Op1Info, WidthAndSignedness Op2Info, WidthAndSignedness ResultInfo)
Determine if a binop is a checked mixed-sign multiply we can specialize.
static Value * MakeAtomicCmpXchgValue(CodeGenFunction &CGF, const CallExpr *E, bool ReturnBool)
Utility to insert an atomic cmpxchg instruction.
static Value * emitBinaryExpMaybeConstrainedFPBuiltin(CodeGenFunction &CGF, const CallExpr *E, llvm::Intrinsic::ID IntrinsicID, llvm::Intrinsic::ID ConstrainedIntrinsicID)
static Value * EmitToInt(CodeGenFunction &CGF, llvm::Value *V, QualType T, llvm::IntegerType *IntType)
Emit the conversions required to turn the given value into an integer of the given size.
static llvm::Value * ARMMVEVectorSplat(CGBuilderTy &Builder, llvm::Value *V)
static Value * EmitX86MaskedCompareResult(CodeGenFunction &CGF, Value *Cmp, unsigned NumElts, Value *MaskIn)
static Value * EmitX86CompressStore(CodeGenFunction &CGF, ArrayRef< Value * > Ops)
static bool NEONSIMDIntrinsicsProvenSorted
static const ARMVectorIntrinsicInfo AArch64SIMDIntrinsicMap[]
static Value * EmitNontemporalStore(CodeGenFunction &CGF, const CallExpr *E)
static Intrinsic::ID getFirstBitHighIntrinsic(CGHLSLRuntime &RT, QualType QT)
static llvm::Value * EmitOverflowIntrinsic(CodeGenFunction &CGF, const llvm::Intrinsic::ID IntrinsicID, llvm::Value *X, llvm::Value *Y, llvm::Value *&Carry)
Emit a call to llvm.
static Value * EmitCommonNeonSISDBuiltinExpr(CodeGenFunction &CGF, const ARMVectorIntrinsicInfo &SISDInfo, SmallVectorImpl< Value * > &Ops, const CallExpr *E)
static Value * emitFPIntBuiltin(CodeGenFunction &CGF, const CallExpr *E, unsigned IntrinsicID)
#define MMA_LDST(n, geom_op_type)
static Value * EmitX86vpcom(CodeGenFunction &CGF, ArrayRef< Value * > Ops, bool IsSigned)
static Value * emitFrexpBuiltin(CodeGenFunction &CGF, const CallExpr *E, llvm::Intrinsic::ID IntrinsicID)
@ _InterlockedExchangeAdd_rel
@ _InterlockedIncrement_acq
@ _InterlockedExchange_nf
@ _InterlockedIncrement_nf
@ _InterlockedExchange_acq
@ _InterlockedCompareExchange128_rel
@ _InterlockedCompareExchange128_acq
@ _InterlockedCompareExchange_acq
@ _InterlockedExchangeAdd_nf
@ _InterlockedCompareExchange_nf
@ _InterlockedDecrement_rel
@ _InterlockedExchangeSub
@ _InterlockedExchangeAdd_acq
@ _InterlockedIncrement_rel
@ _InterlockedCompareExchange128_nf
@ _InterlockedCompareExchange128
@ _InterlockedExchange_rel
@ _InterlockedCompareExchange
@ _InterlockedDecrement_nf
@ _InterlockedExchangeAdd
@ _InterlockedDecrement_acq
@ _InterlockedCompareExchange_rel
static Value * EmitX86ConvertToMask(CodeGenFunction &CGF, Value *In)
static Value * EmitISOVolatileStore(CodeGenFunction &CGF, const CallExpr *E)
static Value * EmitSystemZIntrinsicWithCC(CodeGenFunction &CGF, unsigned IntrinsicID, const CallExpr *E)
Handle a SystemZ function in which the final argument is a pointer to an int that receives the post-i...
static RValue EmitHipStdParUnsupportedBuiltin(CodeGenFunction *CGF, const FunctionDecl *FD)
static llvm::Value * EmitX86BitTestIntrinsic(CodeGenFunction &CGF, BitTest BT, const CallExpr *E, Value *BitBase, Value *BitPos)
static RValue EmitCheckedUnsignedMultiplySignedResult(CodeGenFunction &CGF, const clang::Expr *Op1, WidthAndSignedness Op1Info, const clang::Expr *Op2, WidthAndSignedness Op2Info, const clang::Expr *ResultArg, QualType ResultQTy, WidthAndSignedness ResultInfo)
static Value * emitCallMaybeConstrainedFPBuiltin(CodeGenFunction &CGF, unsigned IntrinsicID, unsigned ConstrainedIntrinsicID, llvm::Type *Ty, ArrayRef< Value * > Args)
static RValue emitLibraryCall(CodeGenFunction &CGF, const FunctionDecl *FD, const CallExpr *E, llvm::Constant *calleeValue)
static Value * handleAsDoubleBuiltin(CodeGenFunction &CGF, const CallExpr *E)
static Value * EmitNontemporalLoad(CodeGenFunction &CGF, const CallExpr *E)
static Value * EmitX86Ternlog(CodeGenFunction &CGF, bool ZeroMask, ArrayRef< Value * > Ops)
static llvm::AtomicOrdering getBitTestAtomicOrdering(BitTest::InterlockingKind I)
#define MMA_VARIANTS_B1_XOR(geom, type)
#define MMA_VARIANTS_I4(geom, type)
static Value * EmitX86ConvertIntToFp(CodeGenFunction &CGF, const CallExpr *E, ArrayRef< Value * > Ops, bool IsSigned)
static Value * packTBLDVectorList(CodeGenFunction &CGF, ArrayRef< Value * > Ops, Value *ExtOp, Value *IndexOp, llvm::Type *ResTy, unsigned IntID, const char *Name)
static Value * EmitAbs(CodeGenFunction &CGF, Value *ArgValue, bool HasNSW)
static Value * EmitX86ScalarSelect(CodeGenFunction &CGF, Value *Mask, Value *Op0, Value *Op1)
static Value * EmitAtomicDecrementValue(CodeGenFunction &CGF, const CallExpr *E, AtomicOrdering Ordering=AtomicOrdering::SequentiallyConsistent)
static Value * handleHlslClip(const CallExpr *E, CodeGenFunction *CGF)
static bool AArch64SIMDIntrinsicsProvenSorted
static const ARMVectorIntrinsicInfo AArch64SISDIntrinsicMap[]
CodeGenFunction::ComplexPairTy ComplexPairTy
#define ALIAS(NAME, TOK, FLAGS)
llvm::MachO::Record Record
static std::string getName(const CallEvent &Call)
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
HLSLResourceBindingAttr::RegisterType RegisterType
static QualType getPointeeType(const MemRegion *R)
Enumerates target-specific builtins in their own namespaces within namespace clang.
Defines the clang::TargetOptions class.
C Language Family Type Representation.
__DEVICE__ float modf(float __x, float *__iptr)
__DEVICE__ double nan(const char *)
__device__ __2f16 float __ockl_bool s
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
unsigned getIntWidth(QualType T) const
const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const
Get or compute information about the layout of the specified record (struct/union/class) D,...
Builtin::Context & BuiltinInfo
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
QualType getObjCIdType() const
Represents the Objective-CC id type.
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
QualType GetBuiltinType(unsigned ID, GetBuiltinTypeError &Error, unsigned *IntegerConstantArgs=nullptr) const
Return the type for the specified builtin.
const TargetInfo & getTargetInfo() const
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
unsigned getTargetAddressSpace(LangAS AS) const
@ GE_Missing_type
Missing a type.
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
uint64_t getFieldOffset(unsigned FieldNo) const
getFieldOffset - Get the offset of the given field index, in bits.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
static std::unique_ptr< AtomicScopeModel > create(AtomicScopeModelKind K)
Create an atomic scope model by AtomicScopeModelKind.
bool isLibFunction(unsigned ID) const
Return true if this is a builtin for a libc/libm function, with a "__builtin_" prefix (e....
llvm::StringRef getName(unsigned ID) const
Return the identifier name for the specified builtin, e.g.
bool isConstWithoutErrnoAndExceptions(unsigned ID) const
Return true if this function has no side effects and doesn't read memory, except for possibly errno o...
bool isConstWithoutExceptions(unsigned ID) const
bool isConst(unsigned ID) const
Return true if this function has no side effects and doesn't read memory.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
CharUnits - This is an opaque type for sizes expressed in character units.
llvm::Align getAsAlign() const
getAsAlign - Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit b...
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits One()
One - Construct a CharUnits quantity of one.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
XRayInstrSet XRayInstrumentationBundle
Set of XRay instrumentation kinds to emit.
ABIArgInfo - Helper class to encapsulate information about how a specific C type should be passed to ...
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
llvm::Value * emitRawPointer(CodeGenFunction &CGF) const
Return the pointer contained in this class after authenticating it and adding offset to it if necessa...
CharUnits getAlignment() const
llvm::Type * getElementType() const
Return the type of the values stored in this address.
Address withElementType(llvm::Type *ElemTy) const
Return address with different element type, but same pointer and alignment.
Address withAlignment(CharUnits NewAlignment) const
Return address with different alignment, but same pointer and element type.
llvm::PointerType * getType() const
Return the type of the pointer value.
Address getAddress() const
A scoped helper to set the current debug location to the specified location or preferred location of ...
static ApplyDebugLocation CreateArtificial(CodeGenFunction &CGF)
Apply TemporaryLocation if it is valid.
static ApplyDebugLocation CreateEmpty(CodeGenFunction &CGF)
Set the IRBuilder to not attach debug locations.
llvm::StoreInst * CreateStore(llvm::Value *Val, Address Addr, bool IsVolatile=false)
llvm::StoreInst * CreateAlignedStore(llvm::Value *Val, llvm::Value *Addr, CharUnits Align, bool IsVolatile=false)
Address CreateGEP(CodeGenFunction &CGF, Address Addr, llvm::Value *Index, const llvm::Twine &Name="")
llvm::CallInst * CreateMemMove(Address Dest, Address Src, llvm::Value *Size, bool IsVolatile=false)
llvm::CallInst * CreateMemCpyInline(Address Dest, Address Src, uint64_t Size)
llvm::AtomicRMWInst * CreateAtomicRMW(llvm::AtomicRMWInst::BinOp Op, Address Addr, llvm::Value *Val, llvm::AtomicOrdering Ordering, llvm::SyncScope::ID SSID=llvm::SyncScope::System)
llvm::CallInst * CreateMemSetInline(Address Dest, llvm::Value *Value, uint64_t Size)
llvm::StoreInst * CreateDefaultAlignedStore(llvm::Value *Val, llvm::Value *Addr, bool IsVolatile=false)
llvm::CallInst * CreateMemSet(Address Dest, llvm::Value *Value, llvm::Value *Size, bool IsVolatile=false)
Address CreateStructGEP(Address Addr, unsigned Index, const llvm::Twine &Name="")
llvm::AtomicCmpXchgInst * CreateAtomicCmpXchg(Address Addr, llvm::Value *Cmp, llvm::Value *New, llvm::AtomicOrdering SuccessOrdering, llvm::AtomicOrdering FailureOrdering, llvm::SyncScope::ID SSID=llvm::SyncScope::System)
llvm::LoadInst * CreateLoad(Address Addr, const llvm::Twine &Name="")
Address CreateConstByteGEP(Address Addr, CharUnits Offset, const llvm::Twine &Name="")
Address CreateLaunderInvariantGroup(Address Addr)
llvm::CallInst * CreateMemCpy(Address Dest, Address Src, llvm::Value *Size, bool IsVolatile=false)
llvm::LoadInst * CreateAlignedLoad(llvm::Type *Ty, llvm::Value *Addr, CharUnits Align, const llvm::Twine &Name="")
Address CreateAddrSpaceCast(Address Addr, llvm::Type *Ty, llvm::Type *ElementTy, const llvm::Twine &Name="")
Address CreateConstInBoundsGEP(Address Addr, uint64_t Index, const llvm::Twine &Name="")
Given addr = T* ... produce name = getelementptr inbounds addr, i64 index where i64 is actually the t...
Address CreateInBoundsGEP(Address Addr, ArrayRef< llvm::Value * > IdxList, llvm::Type *ElementType, CharUnits Align, const Twine &Name="")
virtual std::string getDeviceSideName(const NamedDecl *ND)=0
Returns function or variable name on device side even if the current compilation is for host.
virtual llvm::GlobalVariable * getThrowInfo(QualType T)
All available information about a concrete callee.
static CGCallee forDirect(llvm::Constant *functionPtr, const CGCalleeInfo &abstractInfo=CGCalleeInfo())
llvm::DIType * getOrCreateStandaloneType(QualType Ty, SourceLocation Loc)
Emit standalone debug info for a type.
llvm::DILocation * CreateTrapFailureMessageFor(llvm::DebugLoc TrapLocation, StringRef Category, StringRef FailureMsg)
Create a debug location from TrapLocation that adds an artificial inline frame where the frame name i...
CGFunctionInfo - Class to encapsulate the information about a function definition.
ABIArgInfo & getReturnInfo()
MutableArrayRef< ArgInfo > arguments()
virtual void EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF, Address DestPtr, Address SrcPtr, llvm::Value *Size)=0
EnqueuedBlockInfo emitOpenCLEnqueuedBlock(CodeGenFunction &CGF, const Expr *E)
CallArgList - Type for representing both the value and type of arguments in a call.
void add(RValue rvalue, QualType type)
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
llvm::Value * EmitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E, llvm::Triple::ArchType Arch)
llvm::Value * EmitFromMemory(llvm::Value *Value, QualType Ty)
EmitFromMemory - Change a scalar value from its memory representation to its value representation.
llvm::Value * EmitMSVCBuiltinExpr(MSVCIntrin BuiltinID, const CallExpr *E)
void FinishFunction(SourceLocation EndLoc=SourceLocation())
FinishFunction - Complete IR generation of the current function.
llvm::Value * EmitLifetimeStart(llvm::TypeSize Size, llvm::Value *Addr)
std::pair< RValue, llvm::Value * > EmitAtomicCompareExchange(LValue Obj, RValue Expected, RValue Desired, SourceLocation Loc, llvm::AtomicOrdering Success=llvm::AtomicOrdering::SequentiallyConsistent, llvm::AtomicOrdering Failure=llvm::AtomicOrdering::SequentiallyConsistent, bool IsWeak=false, AggValueSlot Slot=AggValueSlot::ignored())
static TypeEvaluationKind getEvaluationKind(QualType T)
getEvaluationKind - Return the TypeEvaluationKind of QualType T.
llvm::Value * EmitSVEPredicateCast(llvm::Value *Pred, llvm::ScalableVectorType *VTy)
llvm::CallInst * EmitTrapCall(llvm::Intrinsic::ID IntrID)
Emit a call to trap or debugtrap and attach function attribute "trap-func-name" if specified.
SanitizerSet SanOpts
Sanitizers enabled for this function.
RValue EmitBuiltinIsAligned(const CallExpr *E)
Emit IR for __builtin_is_aligned.
LValue EmitAggExprToLValue(const Expr *E)
EmitAggExprToLValue - Emit the computation of the specified expression of aggregate type into a tempo...
void EmitNonNullArgCheck(RValue RV, QualType ArgType, SourceLocation ArgLoc, AbstractCallee AC, unsigned ParmNum)
Create a check for a function parameter that may potentially be declared as non-null.
llvm::Value * EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue)
llvm::Value * EmitHexagonBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
void GetAArch64SVEProcessedOperands(unsigned BuiltinID, const CallExpr *E, SmallVectorImpl< llvm::Value * > &Ops, SVETypeFlags TypeFlags)
llvm::Value * EmitAMDGPUBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
void EmitLifetimeEnd(llvm::Value *Size, llvm::Value *Addr)
void pushLifetimeExtendedDestroy(CleanupKind kind, Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray)
void EmitTrapCheck(llvm::Value *Checked, SanitizerHandler CheckHandlerID, bool NoMerge=false)
Create a basic block that will call the trap intrinsic, and emit a conditional branch to it,...
llvm::Value * EmitCheckedArgForBuiltin(const Expr *E, BuiltinCheckKind Kind)
Emits an argument for a call to a builtin.
llvm::Value * EmitSVEGatherLoad(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
LValue EmitHLSLOutArgExpr(const HLSLOutArgExpr *E, CallArgList &Args, QualType Ty)
CleanupKind getARCCleanupKind()
Retrieves the default cleanup kind for an ARC cleanup.
llvm::Value * EmitRISCVCpuSupports(const CallExpr *E)
llvm::Value * EmitNVPTXBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
llvm::Value * EmitAArch64SVEBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
RValue emitBuiltinOSLogFormat(const CallExpr &E)
Emit IR for __builtin_os_log_format.
LValue EmitLValue(const Expr *E, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
EmitLValue - Emit code to compute a designator that specifies the location of the expression.
llvm::Value * EmitVAStartEnd(llvm::Value *ArgValue, bool IsStart)
Emits a call to an LLVM variable-argument intrinsic, either llvm.va_start or llvm....
llvm::Value * EmitSVEMaskedStore(const CallExpr *, SmallVectorImpl< llvm::Value * > &Ops, unsigned BuiltinID)
llvm::Value * EmitSVEReinterpret(llvm::Value *Val, llvm::Type *Ty)
llvm::BasicBlock * createBasicBlock(const Twine &name="", llvm::Function *parent=nullptr, llvm::BasicBlock *before=nullptr)
createBasicBlock - Create an LLVM basic block.
llvm::Value * EmitSEHExceptionInfo()
RValue EmitBuiltinAlignTo(const CallExpr *E, bool AlignUp)
Emit IR for __builtin_align_up/__builtin_align_down.
const LangOptions & getLangOpts() const
llvm::Value * EmitLoadOfCountedByField(const Expr *Base, const FieldDecl *FAMDecl, const FieldDecl *CountDecl)
Build an expression accessing the "counted_by" field.
void ProcessOrderScopeAMDGCN(llvm::Value *Order, llvm::Value *Scope, llvm::AtomicOrdering &AO, llvm::SyncScope::ID &SSID)
llvm::Constant * EmitCheckTypeDescriptor(QualType T)
Emit a description of a type in a format suitable for passing to a runtime sanitizer handler.
void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false)
EmitBlock - Emit the given block.
void EmitUnreachable(SourceLocation Loc)
Emit a reached-unreachable diagnostic if Loc is valid and runtime checking is enabled.
llvm::Value * EmitSVETupleCreate(const SVETypeFlags &TypeFlags, llvm::Type *ReturnType, ArrayRef< llvm::Value * > Ops)
Address makeNaturalAddressForPointer(llvm::Value *Ptr, QualType T, CharUnits Alignment=CharUnits::Zero(), bool ForPointeeType=false, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
Construct an address with the natural alignment of T.
llvm::Value * EmitCheckedArgForAssume(const Expr *E)
Emits an argument for a call to a __builtin_assume.
ComplexPairTy EmitComplexExpr(const Expr *E, bool IgnoreReal=false, bool IgnoreImag=false)
EmitComplexExpr - Emit the computation of the specified expression of complex type,...
void EmitAnyExprToMem(const Expr *E, Address Location, Qualifiers Quals, bool IsInitializer)
EmitAnyExprToMem - Emits the code necessary to evaluate an arbitrary expression into the given memory...
TypeCheckKind
Situations in which we might emit a check for the suitability of a pointer or glvalue.
@ TCK_Store
Checking the destination of a store. Must be suitably sized and aligned.
@ TCK_Load
Checking the operand of a load. Must be suitably sized and aligned.
llvm::Value * EmitSMELdrStr(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
llvm::Value * EmitNeonSplat(llvm::Value *V, llvm::Constant *Idx, const llvm::ElementCount &Count)
llvm::Type * ConvertTypeForMem(QualType T)
llvm::Value * EmitSVEMaskedLoad(const CallExpr *, llvm::Type *ReturnTy, SmallVectorImpl< llvm::Value * > &Ops, unsigned BuiltinID, bool IsZExtReturn)
bool AlwaysEmitXRayCustomEvents() const
AlwaysEmitXRayCustomEvents - Return true if we must unconditionally emit XRay custom event handling c...
llvm::Value * EmitSVEDupX(llvm::Value *Scalar)
RawAddress CreateMemTemp(QualType T, const Twine &Name="tmp", RawAddress *Alloca=nullptr)
CreateMemTemp - Create a temporary memory object of the given type, with appropriate alignmen and cas...
@ Default
! No language constraints on evaluation order.
const TargetInfo & getTarget() const
llvm::Value * vectorWrapScalar16(llvm::Value *Op)
llvm::Function * LookupNeonLLVMIntrinsic(unsigned IntrinsicID, unsigned Modifier, llvm::Type *ArgTy, const CallExpr *E)
llvm::Value * getTypeSize(QualType Ty)
Returns calculated size of the specified type.
llvm::Value * EmitSEHExceptionCode()
Address EmitPointerWithAlignment(const Expr *Addr, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
EmitPointerWithAlignment - Given an expression with a pointer type, emit the value and compute our be...
llvm::Value * EmitTargetBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue)
EmitTargetBuiltinExpr - Emit the given builtin call.
RValue EmitAnyExprToTemp(const Expr *E)
EmitAnyExprToTemp - Similarly to EmitAnyExpr(), however, the result will always be accessible even if...
RValue EmitCoroutineIntrinsic(const CallExpr *E, unsigned int IID)
llvm::Value * EmitAArch64SMEBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
RValue EmitAMDGPUDevicePrintfCallExpr(const CallExpr *E)
Address EmitArrayToPointerDecay(const Expr *Array, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
RValue EmitBuiltinNewDeleteCall(const FunctionProtoType *Type, const CallExpr *TheCallExpr, bool IsDelete)
llvm::Value * EmitRISCVCpuInit()
void EmitCheck(ArrayRef< std::pair< llvm::Value *, SanitizerKind::SanitizerOrdinal > > Checked, SanitizerHandler Check, ArrayRef< llvm::Constant * > StaticArgs, ArrayRef< llvm::Value * > DynamicArgs)
Create a basic block that will either trap or call a handler function in the UBSan runtime with the p...
RValue EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue)
RValue EmitAnyExpr(const Expr *E, AggValueSlot aggSlot=AggValueSlot::ignored(), bool ignoreResult=false)
EmitAnyExpr - Emit code to compute the specified expression which can have any type.
llvm::Value * EmitSVEPrefetchLoad(const SVETypeFlags &TypeFlags, SmallVectorImpl< llvm::Value * > &Ops, unsigned BuiltinID)
llvm::Value * EmitAArch64CompareBuiltinExpr(llvm::Value *Op, llvm::Type *Ty, const llvm::CmpInst::Predicate Fp, const llvm::CmpInst::Predicate Ip, const llvm::Twine &Name="")
void StartFunction(GlobalDecl GD, QualType RetTy, llvm::Function *Fn, const CGFunctionInfo &FnInfo, const FunctionArgList &Args, SourceLocation Loc=SourceLocation(), SourceLocation StartLoc=SourceLocation())
Emit code for the start of a function.
AggValueSlot CreateAggTemp(QualType T, const Twine &Name="tmp", RawAddress *Alloca=nullptr)
CreateAggTemp - Create a temporary memory object for the given aggregate type.
llvm::ScalableVectorType * getSVEType(const SVETypeFlags &TypeFlags)
RValue emitRotate(const CallExpr *E, bool IsRotateRight)
llvm::Constant * EmitCheckSourceLocation(SourceLocation Loc)
Emit a description of a source location in a format suitable for passing to a runtime sanitizer handl...
void ErrorUnsupported(const Stmt *S, const char *Type)
ErrorUnsupported - Print out an error that codegen doesn't support the specified stmt yet.
CGDebugInfo * getDebugInfo()
const FieldDecl * FindFlexibleArrayMemberFieldAndOffset(ASTContext &Ctx, const RecordDecl *RD, const FieldDecl *FAMDecl, uint64_t &Offset)
llvm::Value * EmitRISCVCpuIs(const CallExpr *E)
Address EmitVAListRef(const Expr *E)
llvm::Value * EmitNeonShiftVector(llvm::Value *V, llvm::Type *Ty, bool negateForRightShift)
llvm::Value * EmitSVEMovl(const SVETypeFlags &TypeFlags, llvm::ArrayRef< llvm::Value * > Ops, unsigned BuiltinID)
void emitAlignmentAssumption(llvm::Value *PtrValue, QualType Ty, SourceLocation Loc, SourceLocation AssumptionLoc, llvm::Value *Alignment, llvm::Value *OffsetValue=nullptr)
const TargetCodeGenInfo & getTargetHooks() const
llvm::Value * EmitARMBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Triple::ArchType Arch)
llvm::Type * getEltType(const SVETypeFlags &TypeFlags)
void EmitAggExpr(const Expr *E, AggValueSlot AS)
EmitAggExpr - Emit the computation of the specified expression of aggregate type.
bool ShouldXRayInstrumentFunction() const
ShouldXRayInstrument - Return true if the current function should be instrumented with XRay nop sleds...
llvm::Value * EmitSVEPMull(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned BuiltinID)
llvm::Value * EmitToMemory(llvm::Value *Value, QualType Ty)
EmitToMemory - Change a scalar value from its value representation to its in-memory representation.
bool IsInPreservedAIRegion
True if CodeGen currently emits code inside presereved access index region.
llvm::Value * EmitARCRetain(QualType type, llvm::Value *value)
bool AlwaysEmitXRayTypedEvents() const
AlwaysEmitXRayTypedEvents - Return true if clang must unconditionally emit XRay typed event handling ...
void SetSqrtFPAccuracy(llvm::Value *Val)
Set the minimum required accuracy of the given sqrt operation based on CodeGenOpts.
RValue EmitCall(const CGFunctionInfo &CallInfo, const CGCallee &Callee, ReturnValueSlot ReturnValue, const CallArgList &Args, llvm::CallBase **CallOrInvoke, bool IsMustTail, SourceLocation Loc, bool IsVirtualFunctionPointerThunk=false)
EmitCall - Generate a call of the given function, expecting the given result type,...
llvm::Value * EmitSVEScatterStore(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
llvm::CallInst * EmitNounwindRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
ASTContext & getContext() const
llvm::Function * generateBuiltinOSLogHelperFunction(const analyze_os_log::OSLogBufferLayout &Layout, CharUnits BufferAlignment)
llvm::Value * EmitLoadOfScalar(Address Addr, bool Volatile, QualType Ty, SourceLocation Loc, AlignmentSource Source=AlignmentSource::Type, bool isNontemporal=false)
EmitLoadOfScalar - Load a scalar value from an address, taking care to appropriately convert from the...
CGCallee EmitCallee(const Expr *E)
const Decl * CurFuncDecl
CurFuncDecl - Holds the Decl for the current outermost non-closure context.
llvm::Value * EmitScalarOrConstFoldImmArg(unsigned ICEArguments, unsigned Idx, const CallExpr *E)
void checkTargetFeatures(const CallExpr *E, const FunctionDecl *TargetDecl)
llvm::Value * BuildVector(ArrayRef< llvm::Value * > Ops)
llvm::Value * EmitWebAssemblyBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
llvm::Value * EmitARMCDEBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Triple::ArchType Arch)
llvm::Value * GetCountedByFieldExprGEP(const Expr *Base, const FieldDecl *FAMDecl, const FieldDecl *CountDecl)
llvm::CallInst * EmitRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
llvm::Value * EmitSVEPredicateTupleCast(llvm::Value *PredTuple, llvm::StructType *Ty)
llvm::Type * ConvertType(QualType T)
void EmitWritebacks(const CallArgList &Args)
EmitWriteback - Emit callbacks for function.
llvm::CallBase * EmitRuntimeCallOrInvoke(llvm::FunctionCallee callee, ArrayRef< llvm::Value * > args, const Twine &name="")
llvm::Value * EmitSystemZBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
llvm::Value * EmitSMEReadWrite(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
void EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc, LValue LV, QualType Type, SanitizerSet SkippedChecks=SanitizerSet(), llvm::Value *ArraySize=nullptr)
llvm::Value * EmitSMELd1St1(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
llvm::Value * EmitPPCBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
static Destroyer destroyARCStrongPrecise
void EmitARCIntrinsicUse(ArrayRef< llvm::Value * > values)
RValue EmitNVPTXDevicePrintfCallExpr(const CallExpr *E)
llvm::Value * EvaluateExprAsBool(const Expr *E)
EvaluateExprAsBool - Perform the usual unary conversions on the specified expression and compare the ...
llvm::Value * EmitSVEStructLoad(const SVETypeFlags &TypeFlags, SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
Address EmitMSVAListRef(const Expr *E)
Emit a "reference" to a __builtin_ms_va_list; this is always the value of the expression,...
llvm::Value * EmitCheckedInBoundsGEP(llvm::Type *ElemTy, llvm::Value *Ptr, ArrayRef< llvm::Value * > IdxList, bool SignedIndices, bool IsSubtraction, SourceLocation Loc, const Twine &Name="")
Same as IRBuilder::CreateInBoundsGEP, but additionally emits a check to detect undefined behavior whe...
llvm::Value * EmitNeonRShiftImm(llvm::Value *Vec, llvm::Value *Amt, llvm::Type *Ty, bool usgn, const char *name)
SmallVector< llvm::Type *, 2 > getSVEOverloadTypes(const SVETypeFlags &TypeFlags, llvm::Type *ReturnType, ArrayRef< llvm::Value * > Ops)
static bool hasAggregateEvaluationKind(QualType T)
LValue MakeAddrLValue(Address Addr, QualType T, AlignmentSource Source=AlignmentSource::Type)
llvm::Value * EmitARMMVEBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Triple::ArchType Arch)
LValue MakeNaturalAlignAddrLValue(llvm::Value *V, QualType T, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
llvm::Value * EmitSVEStructStore(const SVETypeFlags &TypeFlags, SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
Address GetAddrOfLocalVar(const VarDecl *VD)
GetAddrOfLocalVar - Return the address of a local variable.
llvm::Value * EmitSEHAbnormalTermination()
llvm::Value * EmitX86BuiltinExpr(unsigned BuiltinID, const CallExpr *E)
Address ReturnValue
ReturnValue - The temporary alloca to hold the return value.
llvm::Value * EmitSVEAllTruePred(const SVETypeFlags &TypeFlags)
RValue GetUndefRValue(QualType Ty)
GetUndefRValue - Get an appropriate 'undef' rvalue for the given type.
llvm::Type * SVEBuiltinMemEltTy(const SVETypeFlags &TypeFlags)
SVEBuiltinMemEltTy - Returns the memory element type for this memory access builtin.
llvm::LLVMContext & getLLVMContext()
llvm::Value * EmitScalarExpr(const Expr *E, bool IgnoreResultAssign=false)
EmitScalarExpr - Emit the computation of the specified expression of LLVM scalar type,...
void AddAMDGPUFenceAddressSpaceMMRA(llvm::Instruction *Inst, const CallExpr *E)
llvm::Value * EmitSMEZero(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
llvm::Value * EmitRISCVBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue)
llvm::Value * EmitCommonNeonBuiltinExpr(unsigned BuiltinID, unsigned LLVMIntrinsic, unsigned AltLLVMIntrinsic, const char *NameHint, unsigned Modifier, const CallExpr *E, SmallVectorImpl< llvm::Value * > &Ops, Address PtrOp0, Address PtrOp1, llvm::Triple::ArchType Arch)
llvm::Value * EmitNeonCall(llvm::Function *F, SmallVectorImpl< llvm::Value * > &O, const char *name, unsigned shift=0, bool rightshift=false)
llvm::Value * EmitAnnotationCall(llvm::Function *AnnotationFn, llvm::Value *AnnotatedVal, StringRef AnnotationStr, SourceLocation Location, const AnnotateAttr *Attr)
Emit an annotation call (intrinsic).
llvm::ScalableVectorType * getSVEPredType(const SVETypeFlags &TypeFlags)
llvm::Value * EmitSVEGatherPrefetch(const SVETypeFlags &TypeFlags, SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
void EmitStoreOfScalar(llvm::Value *Value, Address Addr, bool Volatile, QualType Ty, AlignmentSource Source=AlignmentSource::Type, bool isInit=false, bool isNontemporal=false)
EmitStoreOfScalar - Store a scalar value to an address, taking care to appropriately convert from the...
llvm::Value * EmitSPIRVBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
llvm::Value * EmitBPFBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
llvm::Value * EmitSVETupleSetOrGet(const SVETypeFlags &TypeFlags, ArrayRef< llvm::Value * > Ops)
This class organizes the cross-function state that is used while generating LLVM code.
CGHLSLRuntime & getHLSLRuntime()
Return a reference to the configured HLSL runtime.
llvm::Module & getModule() const
llvm::FunctionCallee CreateRuntimeFunction(llvm::FunctionType *Ty, StringRef Name, llvm::AttributeList ExtraAttrs=llvm::AttributeList(), bool Local=false, bool AssumeConvergent=false)
Create or return a runtime function declaration with the specified type and name.
llvm::Constant * getRawFunctionPointer(GlobalDecl GD, llvm::Type *Ty=nullptr)
Return a function pointer for a reference to the given function.
llvm::Constant * getBuiltinLibFunction(const FunctionDecl *FD, unsigned BuiltinID)
Given a builtin id for a function like "__builtin_fabsf", return a Function* for "fabsf".
DiagnosticsEngine & getDiags() const
void ErrorUnsupported(const Stmt *S, const char *Type)
Print out an error that codegen doesn't support the specified stmt yet.
const LangOptions & getLangOpts() const
CGCUDARuntime & getCUDARuntime()
Return a reference to the configured CUDA runtime.
CodeGenTypes & getTypes()
CGOpenCLRuntime & getOpenCLRuntime()
Return a reference to the configured OpenCL runtime.
const TargetInfo & getTarget() const
const llvm::DataLayout & getDataLayout() const
void Error(SourceLocation loc, StringRef error)
Emit a general error that something can't be done.
CGCXXABI & getCXXABI() const
llvm::Constant * GetFunctionStart(const ValueDecl *Decl)
const llvm::Triple & getTriple() const
void DecorateInstructionWithTBAA(llvm::Instruction *Inst, TBAAAccessInfo TBAAInfo)
DecorateInstructionWithTBAA - Decorate the instruction with a TBAA tag.
llvm::Constant * CreateRuntimeVariable(llvm::Type *Ty, StringRef Name)
Create a new runtime global variable with the specified type and name.
TBAAAccessInfo getTBAAAccessInfo(QualType AccessType)
getTBAAAccessInfo - Get TBAA information that describes an access to an object of the given type.
ASTContext & getContext() const
const CodeGenOptions & getCodeGenOpts() const
StringRef getMangledName(GlobalDecl GD)
CharUnits getNaturalPointeeTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
llvm::LLVMContext & getLLVMContext()
llvm::Function * getIntrinsic(unsigned IID, ArrayRef< llvm::Type * > Tys={})
CGObjCRuntime & getObjCRuntime()
Return a reference to the configured Objective-C runtime.
void SetLLVMFunctionAttributes(GlobalDecl GD, const CGFunctionInfo &Info, llvm::Function *F, bool IsThunk)
Set the LLVM function attributes (sext, zext, etc).
void SetLLVMFunctionAttributesForDefinition(const Decl *D, llvm::Function *F)
Set the LLVM function attributes which only apply to a function definition.
ConstantAddress GetAddrOfConstantCString(const std::string &Str, const char *GlobalName=nullptr)
Returns a pointer to a character array containing the literal and a terminating '\0' character.
llvm::Type * ConvertType(QualType T)
ConvertType - Convert type T into a llvm::Type.
llvm::FunctionType * GetFunctionType(const CGFunctionInfo &Info)
GetFunctionType - Get the LLVM function type for.
const CGFunctionInfo & arrangeBuiltinFunctionDeclaration(QualType resultType, const FunctionArgList &args)
A builtin function is a freestanding function using the default C conventions.
const CGFunctionInfo & arrangeBuiltinFunctionCall(QualType resultType, const CallArgList &args)
llvm::Constant * emitAbstract(const Expr *E, QualType T)
Emit the result of the given expression as an abstract constant, asserting that it succeeded.
Information for lazily generating a cleanup.
FunctionArgList - Type for representing both the decl and type of parameters to a function.
LValue - This represents an lvalue references.
llvm::Value * getRawBitFieldPointer(CodeGenFunction &CGF) const
llvm::Value * getPointer(CodeGenFunction &CGF) const
Address getAddress() const
void setNontemporal(bool Value)
llvm::Value * emitRawPointer(CodeGenFunction &CGF) const
RValue - This trivial value class is used to represent the result of an expression that is evaluated.
llvm::Value * getAggregatePointer(QualType PointeeType, CodeGenFunction &CGF) const
static RValue getIgnored()
static RValue get(llvm::Value *V)
static RValue getAggregate(Address addr, bool isVolatile=false)
Convert an Address to an RValue.
static RValue getComplex(llvm::Value *V1, llvm::Value *V2)
llvm::Value * getScalarVal() const
getScalarVal() - Return the Value* of this scalar value.
An abstract representation of an aligned address.
llvm::Value * getPointer() const
static RawAddress invalid()
ReturnValueSlot - Contains the address where the return value of a function can be stored,...
virtual llvm::Value * encodeReturnAddress(CodeGen::CodeGenFunction &CGF, llvm::Value *Address) const
Performs the code-generation required to convert the address of an instruction into a return address ...
virtual llvm::Value * decodeReturnAddress(CodeGen::CodeGenFunction &CGF, llvm::Value *Address) const
Performs the code-generation required to convert a return address as stored by the system into the ac...
const T & getABIInfo() const
virtual int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const
Determines the DWARF register number for the stack pointer, for exception-handling purposes.
virtual llvm::Value * testFPKind(llvm::Value *V, unsigned BuiltinID, CGBuilderTy &Builder, CodeGenModule &CGM) const
Performs a target specific test of a floating point value for things like IsNaN, Infinity,...
Complex values, per C99 6.2.5p11.
Represents a concrete matrix type with constant number of rows and columns.
Represents a sugar type with __counted_by or __sized_by annotations, including their _or_null variant...
DynamicCountPointerKind getKind() const
RecordDecl * getOuterLexicalRecordContext()
Retrieve the outermost lexically enclosing record context.
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
DeclContext * getDeclContext()
static bool isFlexibleArrayMemberLike(ASTContext &Context, const Decl *D, QualType Ty, LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel, bool IgnoreTemplateOrMacroSubstitution)
Whether it resembles a flexible array member.
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
This represents one expression.
bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsInt - Return true if this is a constant which we can fold and convert to an integer,...
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx, SmallVectorImpl< PartialDiagnosticAt > *Diag=nullptr) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
bool EvaluateAsFloat(llvm::APFloat &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsFloat - Return true if this is a constant which we can fold and convert to a floating point...
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
@ NPC_ValueDependentIsNotNull
Specifies that a value-dependent expression should be considered to never be a null pointer constant.
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsRValue - Return true if this is a constant which we can fold to an rvalue using any crazy t...
bool HasSideEffects(const ASTContext &Ctx, bool IncludePossibleEffects=true) const
HasSideEffects - This routine returns true for all those expressions which have any effect other than...
std::optional< std::string > tryEvaluateString(ASTContext &Ctx) const
If the current Expr can be evaluated to a pointer to a null-terminated constant string,...
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx, SourceLocation *Loc=nullptr) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
bool tryEvaluateObjectSize(uint64_t &Result, ASTContext &Ctx, unsigned Type) const
If the current Expr is a pointer, this will try to statically determine the number of bytes available...
const ValueDecl * getAsBuiltinConstantDeclRef(const ASTContext &Context) const
If this expression is an unambiguous reference to a single declaration, in the style of __builtin_fun...
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
const FieldDecl * findCountedByField() const
Find the FieldDecl specified in a FAM's "counted_by" attribute.
Represents a function declaration or definition.
const ParmVarDecl * getParamDecl(unsigned i) const
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
Represents a prototype with parameter type info, e.g.
@ SME_PStateSMEnabledMask
@ SME_PStateSMCompatibleMask
GlobalDecl - represents a global declaration.
const Decl * getDecl() const
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
static ImplicitParamDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, IdentifierInfo *Id, QualType T, ImplicitParamKind ParamKind)
Create implicit parameter.
StrictFlexArraysLevelKind
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
std::string getNameAsString() const
Get a human-readable name for the declaration, even if it is one of the special kinds of names (C++ c...
Flags to identify the types for overloaded Neon builtins.
EltType getEltType() const
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isWebAssemblyFuncrefType() const
Returns true if it is a WebAssembly Funcref Type.
LangAS getAddressSpace() const
Return the address space of this type.
bool isWebAssemblyExternrefType() const
Returns true if it is a WebAssembly Externref Type.
The collection of all-type qualifiers we support.
Represents a struct/union/class.
field_range fields() const
Flags to identify the types for overloaded SVE builtins.
bool isZExtReturn() const
bool isReverseUSDOT() const
bool isOverloadNone() const
MemEltType getMemEltType() const
bool isGatherLoad() const
bool isOverloadCvt() const
EltType getEltType() const
bool isOverloadDefault() const
bool isOverloadWhileRW() const
bool isReverseMergeAnyAccOp() const
bool isReductionQV() const
bool isInsertOp1SVALL() const
bool isAppendSVALL() const
bool isReverseMergeAnyBinOp() const
bool isStructStore() const
bool isTupleCreate() const
bool isGatherPrefetch() const
bool hasSplatOperand() const
MergeType getMergeType() const
bool isByteIndexed() const
bool isStructLoad() const
bool isOverloadWhileOrMultiVecCvt() const
unsigned getSplatOperand() const
bool isScatterStore() const
bool isReverseCompare() const
Scope - A scope is a transient data structure that is used while parsing the program.
Encodes a location in the source.
SourceLocation getBeginLoc() const LLVM_READONLY
bool areArgsDestroyedLeftToRightInCallee() const
Are arguments to a call destroyed left to right in the callee? This is a fundamental language change,...
Exposes information about the current target.
TargetOptions & getTargetOpts() const
Retrieve the target options.
virtual bool hasLegalHalfType() const
Determine whether _Float16 is supported on this target.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
bool isLittleEndian() const
unsigned getMaxOpenCLWorkGroupSize() const
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
virtual bool checkArithmeticFenceSupported() const
Controls if __arithmetic_fence is supported in the targeted backend.
unsigned getSuitableAlign() const
Return the alignment that is the largest alignment ever used for any scalar/SIMD data type on the tar...
virtual std::string_view getClobbers() const =0
Returns a string of target-specific clobbers, in LLVM format.
llvm::CodeObjectVersionKind CodeObjectVersion
Code object version for AMDGPU.
The base class of the type hierarchy.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isBlockPointerType() const
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
bool isComplexType() const
isComplexType() does not include complex integers (a GCC extension).
bool hasIntegerRepresentation() const
Determine whether this type has an integer representation of some sort, e.g., it is an integer type o...
bool isCountAttributedType() const
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool hasUnsignedIntegerRepresentation() const
Determine whether this type has an unsigned integer representation of some sort, e....
bool hasSignedIntegerRepresentation() const
Determine whether this type has an signed integer representation of some sort, e.g....
bool isObjCObjectPointerType() const
bool hasFloatingRepresentation() const
Determine whether this type has a floating-point representation of some sort, e.g....
bool isVectorType() const
bool isFloatingType() const
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
bool isSizelessVectorType() const
Returns true for all scalable vector types.
QualType getSizelessVectorEltType(const ASTContext &Ctx) const
Returns the representative type for the element of a sizeless vector builtin type.
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a GCC generic vector type.
unsigned getNumElements() const
QualType getElementType() const
SmallVector< OSLogBufferItem, 4 > Items
unsigned char getNumArgsByte() const
unsigned char getSummaryByte() const
Defines the clang::TargetInfo interface.
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
llvm::Constant * initializationPatternFor(CodeGenModule &, llvm::Type *)
TypeEvaluationKind
The kind of evaluation to perform on values of a particular type.
@ EHCleanup
Denotes a cleanup that should run when a scope is exited using exceptional control flow (a throw stat...
constexpr XRayInstrMask Typed
constexpr XRayInstrMask Custom
bool computeOSLogBufferLayout(clang::ASTContext &Ctx, const clang::CallExpr *E, OSLogBufferLayout &layout)
const void * Store
Store - This opaque type encapsulates an immutable mapping from locations to values.
bool Dup(InterpState &S, CodePtr OpPC)
bool Zero(InterpState &S, CodePtr OpPC)
bool Mul(InterpState &S, CodePtr OpPC)
bool Neg(InterpState &S, CodePtr OpPC)
bool Load(InterpState &S, CodePtr OpPC)
bool Cast(InterpState &S, CodePtr OpPC)
bool Ret(InterpState &S, CodePtr &PC)
The JSON file list parser is used to communicate input to InstallAPI.
@ OK_BitField
A bitfield object is a bitfield on a C or C++ record.
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ DType
'dtype' clause, an alias for 'device_type', stored separately for diagnostic purposes.
bool operator<(DeclarationName LHS, DeclarationName RHS)
Ordering on two declaration names.
@ Asm
Assembly: we accept this only so that we can preprocess it.
@ Result
The result type of a method or function.
LangAS
Defines the address space values used by the address space qualifier of QualType.
const FunctionProtoType * T
SyncScope
Defines synch scope values used internally by clang.
llvm::StringRef getAsString(SyncScope S)
@ Success
Template argument deduction was successful.
@ Other
Other implicit parameter.
Diagnostic wrappers for TextAPI types for error reporting.
llvm::PointerType * VoidPtrTy
llvm::IntegerType * Int64Ty
llvm::PointerType * ConstGlobalsPtrTy
void* in the address space for constant globals
CharUnits getIntAlign() const
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
llvm::Type * HalfTy
half, bfloat, float, double
llvm::IntegerType * SizeTy
llvm::IntegerType * Int32Ty
llvm::IntegerType * IntPtrTy
llvm::IntegerType * IntTy
int
llvm::IntegerType * Int16Ty
llvm::PointerType * Int8PtrTy
llvm::PointerType * UnqualPtrTy
llvm::PointerType * AllocaInt8PtrTy
LangAS getASTAllocaAddressSpace() const
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
void clear(SanitizerMask K=SanitizerKind::All)
Disable the sanitizers specified in K.
void set(SanitizerMask K, bool Value)
Enable or disable a certain (single) sanitizer.
bool has(SanitizerMask K) const
Check if a certain (single) sanitizer is enabled.
bool has(XRayInstrMask K) const
#define scalbln(__x, __y)
#define copysign(__x, __y)
#define remquo(__x, __y, __z)
#define nextafter(__x, __y)
#define nexttoward(__x, __y)
#define remainder(__x, __y)
#define fma(__x, __y, __z)