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"
75using namespace CodeGen;
79 Align AlignmentInBytes) {
81 switch (CGF.
getLangOpts().getTrivialAutoVarInit()) {
82 case LangOptions::TrivialAutoVarInitKind::Uninitialized:
85 case LangOptions::TrivialAutoVarInitKind::Zero:
86 Byte = CGF.
Builder.getInt8(0x00);
88 case LangOptions::TrivialAutoVarInitKind::Pattern: {
90 Byte = llvm::dyn_cast<llvm::ConstantInt>(
98 I->addAnnotationMetadata(
"auto-init");
104 Constant *FZeroConst = ConstantFP::getZero(CGF->
FloatTy);
109 FZeroConst = ConstantVector::getSplat(
110 ElementCount::getFixed(VecTy->getNumElements()), FZeroConst);
111 auto *FCompInst = CGF->
Builder.CreateFCmpOLT(Op0, FZeroConst);
112 CMP = CGF->
Builder.CreateIntrinsic(
114 {FCompInst},
nullptr);
116 CMP = CGF->
Builder.CreateFCmpOLT(Op0, FZeroConst);
119 LastInstr = CGF->
Builder.CreateIntrinsic(
120 CGF->
VoidTy, llvm::Intrinsic::dx_discard, {CMP},
nullptr);
125 CGF->
Builder.CreateCondBr(CMP, LT0, End);
127 CGF->
Builder.SetInsertPoint(LT0);
129 CGF->
Builder.CreateIntrinsic(CGF->
VoidTy, llvm::Intrinsic::spv_discard, {},
132 LastInstr = CGF->
Builder.CreateBr(End);
134 CGF->
Builder.SetInsertPoint(End);
136 llvm_unreachable(
"Backend Codegen not supported.");
144 const auto *OutArg1 = dyn_cast<HLSLOutArgExpr>(
E->getArg(1));
145 const auto *OutArg2 = dyn_cast<HLSLOutArgExpr>(
E->getArg(2));
156 Value *LowBits =
nullptr;
157 Value *HighBits =
nullptr;
161 llvm::Type *RetElementTy = CGF->
Int32Ty;
163 RetElementTy = llvm::VectorType::get(
164 CGF->
Int32Ty, ElementCount::getFixed(Op0VecTy->getNumElements()));
165 auto *RetTy = llvm::StructType::get(RetElementTy, RetElementTy);
167 CallInst *CI = CGF->
Builder.CreateIntrinsic(
168 RetTy, Intrinsic::dx_splitdouble, {Op0},
nullptr,
"hlsl.splitdouble");
170 LowBits = CGF->
Builder.CreateExtractValue(CI, 0);
171 HighBits = CGF->
Builder.CreateExtractValue(CI, 1);
176 if (!Op0->
getType()->isVectorTy()) {
177 FixedVectorType *DestTy = FixedVectorType::get(CGF->
Int32Ty, 2);
178 Value *Bitcast = CGF->
Builder.CreateBitCast(Op0, DestTy);
180 LowBits = CGF->
Builder.CreateExtractElement(Bitcast, (uint64_t)0);
181 HighBits = CGF->
Builder.CreateExtractElement(Bitcast, 1);
184 if (
const auto *VecTy =
186 NumElements = VecTy->getNumElements();
188 FixedVectorType *Uint32VecTy =
189 FixedVectorType::get(CGF->
Int32Ty, NumElements * 2);
190 Value *Uint32Vec = CGF->
Builder.CreateBitCast(Op0, Uint32VecTy);
191 if (NumElements == 1) {
192 LowBits = CGF->
Builder.CreateExtractElement(Uint32Vec, (uint64_t)0);
193 HighBits = CGF->
Builder.CreateExtractElement(Uint32Vec, 1);
196 for (
int I = 0,
E = NumElements; I !=
E; ++I) {
197 EvenMask.push_back(I * 2);
198 OddMask.push_back(I * 2 + 1);
200 LowBits = CGF->
Builder.CreateShuffleVector(Uint32Vec, EvenMask);
201 HighBits = CGF->
Builder.CreateShuffleVector(Uint32Vec, OddMask);
215 "asdouble operands types mismatch");
219 llvm::Type *ResultType = CGF.
DoubleTy;
222 N = VTy->getNumElements();
223 ResultType = llvm::FixedVectorType::get(CGF.
DoubleTy, N);
227 return CGF.
Builder.CreateIntrinsic(
228 ResultType, Intrinsic::dx_asdouble,
232 OpLowBits = CGF.
Builder.CreateVectorSplat(1, OpLowBits);
233 OpHighBits = CGF.
Builder.CreateVectorSplat(1, OpHighBits);
237 for (
int i = 0; i < N; i++) {
239 Mask.push_back(i + N);
242 Value *BitVec = CGF.
Builder.CreateShuffleVector(OpLowBits, OpHighBits, Mask);
244 return CGF.
Builder.CreateBitCast(BitVec, ResultType);
251 llvm::Metadata *Ops[] = {llvm::MDString::get(Context,
"x18")};
252 llvm::MDNode *RegName = llvm::MDNode::get(Context, Ops);
253 llvm::Value *Metadata = llvm::MetadataAsValue::get(Context, RegName);
256 llvm::Value *X18 = CGF.
Builder.CreateCall(F, Metadata);
263 unsigned BuiltinID) {
272 static SmallDenseMap<unsigned, StringRef, 64> F128Builtins{
273 {Builtin::BI__builtin___fprintf_chk,
"__fprintf_chkieee128"},
274 {Builtin::BI__builtin___printf_chk,
"__printf_chkieee128"},
275 {Builtin::BI__builtin___snprintf_chk,
"__snprintf_chkieee128"},
276 {Builtin::BI__builtin___sprintf_chk,
"__sprintf_chkieee128"},
277 {Builtin::BI__builtin___vfprintf_chk,
"__vfprintf_chkieee128"},
278 {Builtin::BI__builtin___vprintf_chk,
"__vprintf_chkieee128"},
279 {Builtin::BI__builtin___vsnprintf_chk,
"__vsnprintf_chkieee128"},
280 {Builtin::BI__builtin___vsprintf_chk,
"__vsprintf_chkieee128"},
281 {Builtin::BI__builtin_fprintf,
"__fprintfieee128"},
282 {Builtin::BI__builtin_printf,
"__printfieee128"},
283 {Builtin::BI__builtin_snprintf,
"__snprintfieee128"},
284 {Builtin::BI__builtin_sprintf,
"__sprintfieee128"},
285 {Builtin::BI__builtin_vfprintf,
"__vfprintfieee128"},
286 {Builtin::BI__builtin_vprintf,
"__vprintfieee128"},
287 {Builtin::BI__builtin_vsnprintf,
"__vsnprintfieee128"},
288 {Builtin::BI__builtin_vsprintf,
"__vsprintfieee128"},
289 {Builtin::BI__builtin_fscanf,
"__fscanfieee128"},
290 {Builtin::BI__builtin_scanf,
"__scanfieee128"},
291 {Builtin::BI__builtin_sscanf,
"__sscanfieee128"},
292 {Builtin::BI__builtin_vfscanf,
"__vfscanfieee128"},
293 {Builtin::BI__builtin_vscanf,
"__vscanfieee128"},
294 {Builtin::BI__builtin_vsscanf,
"__vsscanfieee128"},
295 {Builtin::BI__builtin_nexttowardf128,
"__nexttowardieee128"},
301 static SmallDenseMap<unsigned, StringRef, 4> AIXLongDouble64Builtins{
302 {Builtin::BI__builtin_frexpl,
"frexp"},
303 {Builtin::BI__builtin_ldexpl,
"ldexp"},
304 {Builtin::BI__builtin_modfl,
"modf"},
310 if (FD->
hasAttr<AsmLabelAttr>())
316 &
getTarget().getLongDoubleFormat() == &llvm::APFloat::IEEEquad() &&
317 F128Builtins.contains(BuiltinID))
318 Name = F128Builtins[BuiltinID];
321 &llvm::APFloat::IEEEdouble() &&
322 AIXLongDouble64Builtins.contains(BuiltinID))
323 Name = AIXLongDouble64Builtins[BuiltinID];
328 llvm::FunctionType *Ty =
331 return GetOrCreateLLVMFunction(Name, Ty,
D,
false);
337 QualType T, llvm::IntegerType *IntType) {
340 if (
V->getType()->isPointerTy())
341 return CGF.
Builder.CreatePtrToInt(
V, IntType);
343 assert(
V->getType() == IntType);
351 if (ResultType->isPointerTy())
352 return CGF.
Builder.CreateIntToPtr(
V, ResultType);
354 assert(
V->getType() == ResultType);
365 if (Align % Bytes != 0) {
378 AtomicOrdering Ordering = AtomicOrdering::SequentiallyConsistent) {
388 llvm::IntegerType *IntType = llvm::IntegerType::get(
392 llvm::Type *ValueType = Val->getType();
420 llvm::AtomicRMWInst::BinOp Kind,
429 llvm::AtomicRMWInst::BinOp Kind,
431 Instruction::BinaryOps Op,
432 bool Invert =
false) {
441 llvm::IntegerType *IntType = llvm::IntegerType::get(
445 llvm::Type *ValueType = Val->getType();
449 Kind, DestAddr, Val, llvm::AtomicOrdering::SequentiallyConsistent);
454 llvm::ConstantInt::getAllOnesValue(IntType));
478 llvm::IntegerType *IntType = llvm::IntegerType::get(
482 llvm::Type *ValueType = Cmp->getType();
487 DestAddr, Cmp, New, llvm::AtomicOrdering::SequentiallyConsistent,
488 llvm::AtomicOrdering::SequentiallyConsistent);
491 return CGF.
Builder.CreateZExt(CGF.
Builder.CreateExtractValue(Pair, 1),
514 AtomicOrdering SuccessOrdering = AtomicOrdering::SequentiallyConsistent) {
526 auto *RTy = Exchange->getType();
530 if (RTy->isPointerTy()) {
536 auto FailureOrdering = SuccessOrdering == AtomicOrdering::Release ?
537 AtomicOrdering::Monotonic :
545 DestAddr, Comparand, Exchange, SuccessOrdering, FailureOrdering);
546 CmpXchg->setVolatile(
true);
549 if (RTy->isPointerTy()) {
570 AtomicOrdering SuccessOrdering) {
571 assert(
E->getNumArgs() == 4);
577 assert(DestPtr->getType()->isPointerTy());
578 assert(!ExchangeHigh->getType()->isPointerTy());
579 assert(!ExchangeLow->getType()->isPointerTy());
582 auto FailureOrdering = SuccessOrdering == AtomicOrdering::Release
583 ? AtomicOrdering::Monotonic
588 llvm::Type *Int128Ty = llvm::IntegerType::get(CGF.
getLLVMContext(), 128);
589 Address DestAddr(DestPtr, Int128Ty,
594 ExchangeHigh = CGF.
Builder.CreateZExt(ExchangeHigh, Int128Ty);
595 ExchangeLow = CGF.
Builder.CreateZExt(ExchangeLow, Int128Ty);
597 CGF.
Builder.CreateShl(ExchangeHigh, llvm::ConstantInt::get(Int128Ty, 64));
598 llvm::Value *Exchange = CGF.
Builder.CreateOr(ExchangeHigh, ExchangeLow);
604 SuccessOrdering, FailureOrdering);
610 CXI->setVolatile(
true);
622 AtomicOrdering Ordering = AtomicOrdering::SequentiallyConsistent) {
628 AtomicRMWInst::Add, DestAddr, ConstantInt::get(IntTy, 1), Ordering);
629 return CGF.
Builder.CreateAdd(
Result, ConstantInt::get(IntTy, 1));
634 AtomicOrdering Ordering = AtomicOrdering::SequentiallyConsistent) {
640 AtomicRMWInst::Sub, DestAddr, ConstantInt::get(IntTy, 1), Ordering);
641 return CGF.
Builder.CreateSub(
Result, ConstantInt::get(IntTy, 1));
652 Load->setVolatile(
true);
662 llvm::StoreInst *Store =
664 Store->setVolatile(
true);
673 unsigned ConstrainedIntrinsicID) {
676 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF,
E);
677 if (CGF.
Builder.getIsFPConstrained()) {
679 return CGF.
Builder.CreateConstrainedFPCall(F, { Src0 });
682 return CGF.
Builder.CreateCall(F, Src0);
690 unsigned ConstrainedIntrinsicID) {
694 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF,
E);
695 if (CGF.
Builder.getIsFPConstrained()) {
697 return CGF.
Builder.CreateConstrainedFPCall(F, { Src0, Src1 });
700 return CGF.
Builder.CreateCall(F, { Src0, Src1 });
707 llvm::Intrinsic::ID ConstrainedIntrinsicID) {
711 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF,
E);
712 if (CGF.
Builder.getIsFPConstrained()) {
714 {Src0->getType(), Src1->getType()});
715 return CGF.
Builder.CreateConstrainedFPCall(F, {Src0, Src1});
720 return CGF.
Builder.CreateCall(F, {Src0, Src1});
727 unsigned ConstrainedIntrinsicID) {
732 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF,
E);
733 if (CGF.
Builder.getIsFPConstrained()) {
735 return CGF.
Builder.CreateConstrainedFPCall(F, { Src0, Src1, Src2 });
738 return CGF.
Builder.CreateCall(F, { Src0, Src1, Src2 });
745 unsigned IntrinsicID,
746 unsigned ConstrainedIntrinsicID,
750 if (CGF.
Builder.getIsFPConstrained())
755 if (CGF.
Builder.getIsFPConstrained())
756 return CGF.
Builder.CreateConstrainedFPCall(F, Args);
758 return CGF.
Builder.CreateCall(F, Args);
767 unsigned IntrinsicID,
768 llvm::StringRef Name =
"") {
769 static_assert(N,
"expect non-empty argument");
771 for (
unsigned I = 0; I < N; ++I)
774 return CGF.
Builder.CreateCall(F, Args, Name);
779 unsigned IntrinsicID) {
786 return CGF.
Builder.CreateCall(F, {Src0, Src1, Src2, Src3});
792 unsigned IntrinsicID) {
797 return CGF.
Builder.CreateCall(F, {Src0, Src1});
803 unsigned IntrinsicID,
804 unsigned ConstrainedIntrinsicID) {
808 if (CGF.
Builder.getIsFPConstrained()) {
809 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF,
E);
811 {ResultType, Src0->getType()});
812 return CGF.
Builder.CreateConstrainedFPCall(F, {Src0});
816 return CGF.
Builder.CreateCall(F, Src0);
821 llvm::Intrinsic::ID IntrinsicID) {
829 llvm::Value *
Call = CGF.
Builder.CreateCall(F, Src0);
831 llvm::Value *Exp = CGF.
Builder.CreateExtractValue(
Call, 1);
839 llvm::Intrinsic::ID IntrinsicID) {
844 llvm::Function *F = CGF.
CGM.
getIntrinsic(IntrinsicID, {Val->getType()});
845 llvm::Value *
Call = CGF.
Builder.CreateCall(F, Val);
847 llvm::Value *SinResult = CGF.
Builder.CreateExtractValue(
Call, 0);
848 llvm::Value *CosResult = CGF.
Builder.CreateExtractValue(
Call, 1);
854 llvm::StoreInst *StoreSin =
856 llvm::StoreInst *StoreCos =
863 MDNode *
Domain = MDHelper.createAnonymousAliasScopeDomain();
864 MDNode *AliasScope = MDHelper.createAnonymousAliasScope(
Domain);
865 MDNode *AliasScopeList = MDNode::get(
Call->getContext(), AliasScope);
866 StoreSin->setMetadata(LLVMContext::MD_alias_scope, AliasScopeList);
867 StoreCos->setMetadata(LLVMContext::MD_noalias, AliasScopeList);
874 Call->setDoesNotAccessMemory();
883 llvm::Type *Ty =
V->getType();
884 int Width = Ty->getPrimitiveSizeInBits();
885 llvm::Type *IntTy = llvm::IntegerType::get(
C, Width);
887 if (Ty->isPPC_FP128Ty()) {
897 Value *ShiftCst = llvm::ConstantInt::get(IntTy, Width);
902 IntTy = llvm::IntegerType::get(
C, Width);
905 Value *Zero = llvm::Constant::getNullValue(IntTy);
906 return CGF.
Builder.CreateICmpSLT(
V, Zero);
915 auto IsIndirect = [&](
ABIArgInfo const &info) {
916 return info.isIndirect() || info.isIndirectAliased() || info.isInAlloca();
921 return IsIndirect(ArgInfo.info);
926 const CallExpr *
E, llvm::Constant *calleeValue) {
927 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF,
E);
929 llvm::CallBase *callOrInvoke =
nullptr;
933 nullptr, &callOrInvoke, &FnInfo);
938 bool ConstWithoutErrnoAndExceptions =
942 if (ConstWithoutErrnoAndExceptions && CGF.
CGM.
getLangOpts().MathErrno &&
943 !CGF.
Builder.getIsFPConstrained() &&
Call.isScalar() &&
964 const llvm::Intrinsic::ID IntrinsicID,
965 llvm::Value *
X, llvm::Value *Y,
966 llvm::Value *&Carry) {
968 assert(
X->getType() == Y->getType() &&
969 "Arguments must be the same type. (Did you forget to make sure both "
970 "arguments have the same integer width?)");
973 llvm::Value *Tmp = CGF.
Builder.CreateCall(Callee, {
X, Y});
974 Carry = CGF.
Builder.CreateExtractValue(Tmp, 1);
975 return CGF.
Builder.CreateExtractValue(Tmp, 0);
982 llvm::ConstantRange CR(APInt(32, low), APInt(32, high));
983 Call->addRangeRetAttr(CR);
984 Call->addRetAttr(llvm::Attribute::AttrKind::NoUndef);
989 struct WidthAndSignedness {
995static WidthAndSignedness
1007static struct WidthAndSignedness
1009 assert(Types.size() > 0 &&
"Empty list of types.");
1013 for (
const auto &
Type : Types) {
1022 for (
const auto &
Type : Types) {
1024 if (Width < MinWidth) {
1033 Intrinsic::ID inst = IsStart ? Intrinsic::vastart : Intrinsic::vaend;
1044 return From == To || (From == 0 && To == 1) || (From == 3 && To == 2);
1049 return ConstantInt::get(ResType, (
Type & 2) ? 0 : -1,
true);
1053CodeGenFunction::evaluateOrEmitBuiltinObjectSize(
const Expr *
E,
unsigned Type,
1054 llvm::IntegerType *ResType,
1055 llvm::Value *EmittedE,
1059 return emitBuiltinObjectSize(
E,
Type, ResType, EmittedE, IsDynamic);
1060 return ConstantInt::get(ResType, ObjectSize,
true);
1074 if ((!FAMDecl || FD == FAMDecl) &&
1076 Ctx, FD, FD->getType(), StrictFlexArraysLevel,
1104 if (FD->getType()->isCountAttributedType())
1116CodeGenFunction::emitFlexibleArrayMemberSize(
const Expr *
E,
unsigned Type,
1117 llvm::IntegerType *ResType) {
1146 const Expr *Idx =
nullptr;
1148 if (
const auto *UO = dyn_cast<UnaryOperator>(
Base);
1149 UO && UO->getOpcode() == UO_AddrOf) {
1151 if (
const auto *ASE = dyn_cast<ArraySubscriptExpr>(SubExpr)) {
1152 Base = ASE->getBase()->IgnoreParenImpCasts();
1155 if (
const auto *IL = dyn_cast<IntegerLiteral>(Idx)) {
1156 int64_t Val = IL->getValue().getSExtValue();
1173 if (
const auto *ME = dyn_cast<MemberExpr>(
Base)) {
1175 const ValueDecl *VD = ME->getMemberDecl();
1177 FAMDecl = dyn_cast<FieldDecl>(VD);
1180 }
else if (
const auto *DRE = dyn_cast<DeclRefExpr>(
Base)) {
1182 QualType Ty = DRE->getDecl()->getType();
1235 if (isa<DeclRefExpr>(
Base))
1259 CountedByInst =
Builder.CreateIntCast(CountedByInst, ResType, IsSigned);
1262 Value *IdxInst =
nullptr;
1270 IdxInst =
Builder.CreateIntCast(IdxInst, ResType, IdxSigned);
1275 Builder.CreateSub(CountedByInst, IdxInst,
"", !IsSigned, IsSigned);
1281 llvm::Constant *ElemSize =
1282 llvm::ConstantInt::get(ResType,
Size.getQuantity(), IsSigned);
1284 Builder.CreateMul(CountedByInst, ElemSize,
"", !IsSigned, IsSigned);
1285 Res =
Builder.CreateIntCast(Res, ResType, IsSigned);
1294 return Builder.CreateSelect(Cmp, Res, ConstantInt::get(ResType, 0, IsSigned));
1307CodeGenFunction::emitBuiltinObjectSize(
const Expr *
E,
unsigned Type,
1308 llvm::IntegerType *ResType,
1309 llvm::Value *EmittedE,
bool IsDynamic) {
1313 auto *Param = dyn_cast<ParmVarDecl>(
D->getDecl());
1314 auto *PS =
D->getDecl()->
getAttr<PassObjectSizeAttr>();
1315 if (Param !=
nullptr && PS !=
nullptr &&
1317 auto Iter = SizeArguments.find(Param);
1318 assert(
Iter != SizeArguments.end());
1321 auto DIter = LocalDeclMap.find(
D);
1322 assert(DIter != LocalDeclMap.end());
1332 if (
Value *
V = emitFlexibleArrayMemberSize(
E,
Type, ResType))
1343 assert(Ptr->
getType()->isPointerTy() &&
1344 "Non-pointer passed to __builtin_object_size?");
1360 enum ActionKind : uint8_t { TestOnly, Complement, Reset,
Set };
1361 enum InterlockingKind : uint8_t {
1370 InterlockingKind Interlocking;
1373 static BitTest decodeBitTestBuiltin(
unsigned BuiltinID);
1378BitTest BitTest::decodeBitTestBuiltin(
unsigned BuiltinID) {
1379 switch (BuiltinID) {
1381 case Builtin::BI_bittest:
1382 return {TestOnly, Unlocked,
false};
1383 case Builtin::BI_bittestandcomplement:
1384 return {Complement, Unlocked,
false};
1385 case Builtin::BI_bittestandreset:
1386 return {Reset, Unlocked,
false};
1387 case Builtin::BI_bittestandset:
1388 return {
Set, Unlocked,
false};
1389 case Builtin::BI_interlockedbittestandreset:
1390 return {Reset, Sequential,
false};
1391 case Builtin::BI_interlockedbittestandset:
1392 return {
Set, Sequential,
false};
1395 case Builtin::BI_bittest64:
1396 return {TestOnly, Unlocked,
true};
1397 case Builtin::BI_bittestandcomplement64:
1398 return {Complement, Unlocked,
true};
1399 case Builtin::BI_bittestandreset64:
1400 return {Reset, Unlocked,
true};
1401 case Builtin::BI_bittestandset64:
1402 return {
Set, Unlocked,
true};
1403 case Builtin::BI_interlockedbittestandreset64:
1404 return {Reset, Sequential,
true};
1405 case Builtin::BI_interlockedbittestandset64:
1406 return {
Set, Sequential,
true};
1409 case Builtin::BI_interlockedbittestandset_acq:
1410 return {
Set, Acquire,
false};
1411 case Builtin::BI_interlockedbittestandset_rel:
1412 return {
Set, Release,
false};
1413 case Builtin::BI_interlockedbittestandset_nf:
1414 return {
Set, NoFence,
false};
1415 case Builtin::BI_interlockedbittestandreset_acq:
1416 return {Reset, Acquire,
false};
1417 case Builtin::BI_interlockedbittestandreset_rel:
1418 return {Reset, Release,
false};
1419 case Builtin::BI_interlockedbittestandreset_nf:
1420 return {Reset, NoFence,
false};
1422 llvm_unreachable(
"expected only bittest intrinsics");
1427 case BitTest::TestOnly:
return '\0';
1428 case BitTest::Complement:
return 'c';
1429 case BitTest::Reset:
return 'r';
1430 case BitTest::Set:
return 's';
1432 llvm_unreachable(
"invalid action");
1440 char SizeSuffix = BT.Is64Bit ?
'q' :
'l';
1444 raw_svector_ostream AsmOS(
Asm);
1445 if (BT.Interlocking != BitTest::Unlocked)
1450 AsmOS << SizeSuffix <<
" $2, ($1)";
1453 std::string Constraints =
"={@ccc},r,r,~{cc},~{memory}";
1455 if (!MachineClobbers.empty()) {
1457 Constraints += MachineClobbers;
1459 llvm::IntegerType *IntType = llvm::IntegerType::get(
1462 llvm::FunctionType *FTy =
1463 llvm::FunctionType::get(CGF.
Int8Ty, {CGF.UnqualPtrTy, IntType},
false);
1465 llvm::InlineAsm *IA =
1466 llvm::InlineAsm::get(FTy,
Asm, Constraints,
true);
1467 return CGF.
Builder.CreateCall(IA, {BitBase, BitPos});
1470static llvm::AtomicOrdering
1473 case BitTest::Unlocked:
return llvm::AtomicOrdering::NotAtomic;
1474 case BitTest::Sequential:
return llvm::AtomicOrdering::SequentiallyConsistent;
1475 case BitTest::Acquire:
return llvm::AtomicOrdering::Acquire;
1476 case BitTest::Release:
return llvm::AtomicOrdering::Release;
1477 case BitTest::NoFence:
return llvm::AtomicOrdering::Monotonic;
1479 llvm_unreachable(
"invalid interlocking");
1492 BitTest BT = BitTest::decodeBitTestBuiltin(BuiltinID);
1504 BitPos, llvm::ConstantInt::get(BitPos->
getType(), 3),
"bittest.byteidx");
1506 "bittest.byteaddr"),
1510 llvm::ConstantInt::get(CGF.
Int8Ty, 0x7));
1513 Value *Mask =
nullptr;
1514 if (BT.Action != BitTest::TestOnly) {
1515 Mask = CGF.
Builder.CreateShl(llvm::ConstantInt::get(CGF.
Int8Ty, 1), PosLow,
1522 Value *OldByte =
nullptr;
1523 if (Ordering != llvm::AtomicOrdering::NotAtomic) {
1526 llvm::AtomicRMWInst::BinOp RMWOp = llvm::AtomicRMWInst::Or;
1527 if (BT.Action == BitTest::Reset) {
1528 Mask = CGF.
Builder.CreateNot(Mask);
1529 RMWOp = llvm::AtomicRMWInst::And;
1535 Value *NewByte =
nullptr;
1536 switch (BT.Action) {
1537 case BitTest::TestOnly:
1540 case BitTest::Complement:
1541 NewByte = CGF.
Builder.CreateXor(OldByte, Mask);
1543 case BitTest::Reset:
1544 NewByte = CGF.
Builder.CreateAnd(OldByte, CGF.
Builder.CreateNot(Mask));
1547 NewByte = CGF.
Builder.CreateOr(OldByte, Mask);
1556 Value *ShiftedByte = CGF.
Builder.CreateLShr(OldByte, PosLow,
"bittest.shr");
1558 ShiftedByte, llvm::ConstantInt::get(CGF.
Int8Ty, 1),
"bittest.res");
1567 raw_svector_ostream AsmOS(
Asm);
1568 llvm::IntegerType *RetType = CGF.
Int32Ty;
1570 switch (BuiltinID) {
1571 case clang::PPC::BI__builtin_ppc_ldarx:
1575 case clang::PPC::BI__builtin_ppc_lwarx:
1579 case clang::PPC::BI__builtin_ppc_lharx:
1583 case clang::PPC::BI__builtin_ppc_lbarx:
1588 llvm_unreachable(
"Expected only PowerPC load reserve intrinsics");
1591 AsmOS <<
"$0, ${1:y}";
1593 std::string Constraints =
"=r,*Z,~{memory}";
1595 if (!MachineClobbers.empty()) {
1597 Constraints += MachineClobbers;
1601 llvm::FunctionType *FTy = llvm::FunctionType::get(RetType, {PtrType},
false);
1603 llvm::InlineAsm *IA =
1604 llvm::InlineAsm::get(FTy,
Asm, Constraints,
true);
1605 llvm::CallInst *CI = CGF.
Builder.CreateCall(IA, {Addr});
1607 0, Attribute::get(CGF.
getLLVMContext(), Attribute::ElementType, RetType));
1612enum class MSVCSetJmpKind {
1624 llvm::Value *Arg1 =
nullptr;
1625 llvm::Type *Arg1Ty =
nullptr;
1627 bool IsVarArg =
false;
1628 if (SJKind == MSVCSetJmpKind::_setjmp3) {
1631 Arg1 = llvm::ConstantInt::get(CGF.
IntTy, 0);
1634 Name = SJKind == MSVCSetJmpKind::_setjmp ?
"_setjmp" :
"_setjmpex";
1637 Arg1 = CGF.
Builder.CreateCall(
1640 Arg1 = CGF.
Builder.CreateCall(
1642 llvm::ConstantInt::get(CGF.
Int32Ty, 0));
1646 llvm::Type *ArgTypes[2] = {CGF.
Int8PtrTy, Arg1Ty};
1647 llvm::AttributeList ReturnsTwiceAttr = llvm::AttributeList::get(
1649 llvm::Attribute::ReturnsTwice);
1651 llvm::FunctionType::get(CGF.
IntTy, ArgTypes, IsVarArg), Name,
1652 ReturnsTwiceAttr,
true);
1654 llvm::Value *Buf = CGF.
Builder.CreateBitOrPointerCast(
1656 llvm::Value *Args[] = {Buf, Arg1};
1658 CB->setAttributes(ReturnsTwiceAttr);
1707static std::optional<CodeGenFunction::MSVCIntrin>
1710 switch (BuiltinID) {
1712 return std::nullopt;
1713 case clang::ARM::BI_BitScanForward:
1714 case clang::ARM::BI_BitScanForward64:
1715 return MSVCIntrin::_BitScanForward;
1716 case clang::ARM::BI_BitScanReverse:
1717 case clang::ARM::BI_BitScanReverse64:
1718 return MSVCIntrin::_BitScanReverse;
1719 case clang::ARM::BI_InterlockedAnd64:
1720 return MSVCIntrin::_InterlockedAnd;
1721 case clang::ARM::BI_InterlockedExchange64:
1722 return MSVCIntrin::_InterlockedExchange;
1723 case clang::ARM::BI_InterlockedExchangeAdd64:
1724 return MSVCIntrin::_InterlockedExchangeAdd;
1725 case clang::ARM::BI_InterlockedExchangeSub64:
1726 return MSVCIntrin::_InterlockedExchangeSub;
1727 case clang::ARM::BI_InterlockedOr64:
1728 return MSVCIntrin::_InterlockedOr;
1729 case clang::ARM::BI_InterlockedXor64:
1730 return MSVCIntrin::_InterlockedXor;
1731 case clang::ARM::BI_InterlockedDecrement64:
1732 return MSVCIntrin::_InterlockedDecrement;
1733 case clang::ARM::BI_InterlockedIncrement64:
1734 return MSVCIntrin::_InterlockedIncrement;
1735 case clang::ARM::BI_InterlockedExchangeAdd8_acq:
1736 case clang::ARM::BI_InterlockedExchangeAdd16_acq:
1737 case clang::ARM::BI_InterlockedExchangeAdd_acq:
1738 case clang::ARM::BI_InterlockedExchangeAdd64_acq:
1739 return MSVCIntrin::_InterlockedExchangeAdd_acq;
1740 case clang::ARM::BI_InterlockedExchangeAdd8_rel:
1741 case clang::ARM::BI_InterlockedExchangeAdd16_rel:
1742 case clang::ARM::BI_InterlockedExchangeAdd_rel:
1743 case clang::ARM::BI_InterlockedExchangeAdd64_rel:
1744 return MSVCIntrin::_InterlockedExchangeAdd_rel;
1745 case clang::ARM::BI_InterlockedExchangeAdd8_nf:
1746 case clang::ARM::BI_InterlockedExchangeAdd16_nf:
1747 case clang::ARM::BI_InterlockedExchangeAdd_nf:
1748 case clang::ARM::BI_InterlockedExchangeAdd64_nf:
1749 return MSVCIntrin::_InterlockedExchangeAdd_nf;
1750 case clang::ARM::BI_InterlockedExchange8_acq:
1751 case clang::ARM::BI_InterlockedExchange16_acq:
1752 case clang::ARM::BI_InterlockedExchange_acq:
1753 case clang::ARM::BI_InterlockedExchange64_acq:
1754 case clang::ARM::BI_InterlockedExchangePointer_acq:
1755 return MSVCIntrin::_InterlockedExchange_acq;
1756 case clang::ARM::BI_InterlockedExchange8_rel:
1757 case clang::ARM::BI_InterlockedExchange16_rel:
1758 case clang::ARM::BI_InterlockedExchange_rel:
1759 case clang::ARM::BI_InterlockedExchange64_rel:
1760 case clang::ARM::BI_InterlockedExchangePointer_rel:
1761 return MSVCIntrin::_InterlockedExchange_rel;
1762 case clang::ARM::BI_InterlockedExchange8_nf:
1763 case clang::ARM::BI_InterlockedExchange16_nf:
1764 case clang::ARM::BI_InterlockedExchange_nf:
1765 case clang::ARM::BI_InterlockedExchange64_nf:
1766 case clang::ARM::BI_InterlockedExchangePointer_nf:
1767 return MSVCIntrin::_InterlockedExchange_nf;
1768 case clang::ARM::BI_InterlockedCompareExchange8_acq:
1769 case clang::ARM::BI_InterlockedCompareExchange16_acq:
1770 case clang::ARM::BI_InterlockedCompareExchange_acq:
1771 case clang::ARM::BI_InterlockedCompareExchange64_acq:
1772 case clang::ARM::BI_InterlockedCompareExchangePointer_acq:
1773 return MSVCIntrin::_InterlockedCompareExchange_acq;
1774 case clang::ARM::BI_InterlockedCompareExchange8_rel:
1775 case clang::ARM::BI_InterlockedCompareExchange16_rel:
1776 case clang::ARM::BI_InterlockedCompareExchange_rel:
1777 case clang::ARM::BI_InterlockedCompareExchange64_rel:
1778 case clang::ARM::BI_InterlockedCompareExchangePointer_rel:
1779 return MSVCIntrin::_InterlockedCompareExchange_rel;
1780 case clang::ARM::BI_InterlockedCompareExchange8_nf:
1781 case clang::ARM::BI_InterlockedCompareExchange16_nf:
1782 case clang::ARM::BI_InterlockedCompareExchange_nf:
1783 case clang::ARM::BI_InterlockedCompareExchange64_nf:
1784 return MSVCIntrin::_InterlockedCompareExchange_nf;
1785 case clang::ARM::BI_InterlockedOr8_acq:
1786 case clang::ARM::BI_InterlockedOr16_acq:
1787 case clang::ARM::BI_InterlockedOr_acq:
1788 case clang::ARM::BI_InterlockedOr64_acq:
1789 return MSVCIntrin::_InterlockedOr_acq;
1790 case clang::ARM::BI_InterlockedOr8_rel:
1791 case clang::ARM::BI_InterlockedOr16_rel:
1792 case clang::ARM::BI_InterlockedOr_rel:
1793 case clang::ARM::BI_InterlockedOr64_rel:
1794 return MSVCIntrin::_InterlockedOr_rel;
1795 case clang::ARM::BI_InterlockedOr8_nf:
1796 case clang::ARM::BI_InterlockedOr16_nf:
1797 case clang::ARM::BI_InterlockedOr_nf:
1798 case clang::ARM::BI_InterlockedOr64_nf:
1799 return MSVCIntrin::_InterlockedOr_nf;
1800 case clang::ARM::BI_InterlockedXor8_acq:
1801 case clang::ARM::BI_InterlockedXor16_acq:
1802 case clang::ARM::BI_InterlockedXor_acq:
1803 case clang::ARM::BI_InterlockedXor64_acq:
1804 return MSVCIntrin::_InterlockedXor_acq;
1805 case clang::ARM::BI_InterlockedXor8_rel:
1806 case clang::ARM::BI_InterlockedXor16_rel:
1807 case clang::ARM::BI_InterlockedXor_rel:
1808 case clang::ARM::BI_InterlockedXor64_rel:
1809 return MSVCIntrin::_InterlockedXor_rel;
1810 case clang::ARM::BI_InterlockedXor8_nf:
1811 case clang::ARM::BI_InterlockedXor16_nf:
1812 case clang::ARM::BI_InterlockedXor_nf:
1813 case clang::ARM::BI_InterlockedXor64_nf:
1814 return MSVCIntrin::_InterlockedXor_nf;
1815 case clang::ARM::BI_InterlockedAnd8_acq:
1816 case clang::ARM::BI_InterlockedAnd16_acq:
1817 case clang::ARM::BI_InterlockedAnd_acq:
1818 case clang::ARM::BI_InterlockedAnd64_acq:
1819 return MSVCIntrin::_InterlockedAnd_acq;
1820 case clang::ARM::BI_InterlockedAnd8_rel:
1821 case clang::ARM::BI_InterlockedAnd16_rel:
1822 case clang::ARM::BI_InterlockedAnd_rel:
1823 case clang::ARM::BI_InterlockedAnd64_rel:
1824 return MSVCIntrin::_InterlockedAnd_rel;
1825 case clang::ARM::BI_InterlockedAnd8_nf:
1826 case clang::ARM::BI_InterlockedAnd16_nf:
1827 case clang::ARM::BI_InterlockedAnd_nf:
1828 case clang::ARM::BI_InterlockedAnd64_nf:
1829 return MSVCIntrin::_InterlockedAnd_nf;
1830 case clang::ARM::BI_InterlockedIncrement16_acq:
1831 case clang::ARM::BI_InterlockedIncrement_acq:
1832 case clang::ARM::BI_InterlockedIncrement64_acq:
1833 return MSVCIntrin::_InterlockedIncrement_acq;
1834 case clang::ARM::BI_InterlockedIncrement16_rel:
1835 case clang::ARM::BI_InterlockedIncrement_rel:
1836 case clang::ARM::BI_InterlockedIncrement64_rel:
1837 return MSVCIntrin::_InterlockedIncrement_rel;
1838 case clang::ARM::BI_InterlockedIncrement16_nf:
1839 case clang::ARM::BI_InterlockedIncrement_nf:
1840 case clang::ARM::BI_InterlockedIncrement64_nf:
1841 return MSVCIntrin::_InterlockedIncrement_nf;
1842 case clang::ARM::BI_InterlockedDecrement16_acq:
1843 case clang::ARM::BI_InterlockedDecrement_acq:
1844 case clang::ARM::BI_InterlockedDecrement64_acq:
1845 return MSVCIntrin::_InterlockedDecrement_acq;
1846 case clang::ARM::BI_InterlockedDecrement16_rel:
1847 case clang::ARM::BI_InterlockedDecrement_rel:
1848 case clang::ARM::BI_InterlockedDecrement64_rel:
1849 return MSVCIntrin::_InterlockedDecrement_rel;
1850 case clang::ARM::BI_InterlockedDecrement16_nf:
1851 case clang::ARM::BI_InterlockedDecrement_nf:
1852 case clang::ARM::BI_InterlockedDecrement64_nf:
1853 return MSVCIntrin::_InterlockedDecrement_nf;
1855 llvm_unreachable(
"must return from switch");
1858static std::optional<CodeGenFunction::MSVCIntrin>
1861 switch (BuiltinID) {
1863 return std::nullopt;
1864 case clang::AArch64::BI_BitScanForward:
1865 case clang::AArch64::BI_BitScanForward64:
1866 return MSVCIntrin::_BitScanForward;
1867 case clang::AArch64::BI_BitScanReverse:
1868 case clang::AArch64::BI_BitScanReverse64:
1869 return MSVCIntrin::_BitScanReverse;
1870 case clang::AArch64::BI_InterlockedAnd64:
1871 return MSVCIntrin::_InterlockedAnd;
1872 case clang::AArch64::BI_InterlockedExchange64:
1873 return MSVCIntrin::_InterlockedExchange;
1874 case clang::AArch64::BI_InterlockedExchangeAdd64:
1875 return MSVCIntrin::_InterlockedExchangeAdd;
1876 case clang::AArch64::BI_InterlockedExchangeSub64:
1877 return MSVCIntrin::_InterlockedExchangeSub;
1878 case clang::AArch64::BI_InterlockedOr64:
1879 return MSVCIntrin::_InterlockedOr;
1880 case clang::AArch64::BI_InterlockedXor64:
1881 return MSVCIntrin::_InterlockedXor;
1882 case clang::AArch64::BI_InterlockedDecrement64:
1883 return MSVCIntrin::_InterlockedDecrement;
1884 case clang::AArch64::BI_InterlockedIncrement64:
1885 return MSVCIntrin::_InterlockedIncrement;
1886 case clang::AArch64::BI_InterlockedExchangeAdd8_acq:
1887 case clang::AArch64::BI_InterlockedExchangeAdd16_acq:
1888 case clang::AArch64::BI_InterlockedExchangeAdd_acq:
1889 case clang::AArch64::BI_InterlockedExchangeAdd64_acq:
1890 return MSVCIntrin::_InterlockedExchangeAdd_acq;
1891 case clang::AArch64::BI_InterlockedExchangeAdd8_rel:
1892 case clang::AArch64::BI_InterlockedExchangeAdd16_rel:
1893 case clang::AArch64::BI_InterlockedExchangeAdd_rel:
1894 case clang::AArch64::BI_InterlockedExchangeAdd64_rel:
1895 return MSVCIntrin::_InterlockedExchangeAdd_rel;
1896 case clang::AArch64::BI_InterlockedExchangeAdd8_nf:
1897 case clang::AArch64::BI_InterlockedExchangeAdd16_nf:
1898 case clang::AArch64::BI_InterlockedExchangeAdd_nf:
1899 case clang::AArch64::BI_InterlockedExchangeAdd64_nf:
1900 return MSVCIntrin::_InterlockedExchangeAdd_nf;
1901 case clang::AArch64::BI_InterlockedExchange8_acq:
1902 case clang::AArch64::BI_InterlockedExchange16_acq:
1903 case clang::AArch64::BI_InterlockedExchange_acq:
1904 case clang::AArch64::BI_InterlockedExchange64_acq:
1905 case clang::AArch64::BI_InterlockedExchangePointer_acq:
1906 return MSVCIntrin::_InterlockedExchange_acq;
1907 case clang::AArch64::BI_InterlockedExchange8_rel:
1908 case clang::AArch64::BI_InterlockedExchange16_rel:
1909 case clang::AArch64::BI_InterlockedExchange_rel:
1910 case clang::AArch64::BI_InterlockedExchange64_rel:
1911 case clang::AArch64::BI_InterlockedExchangePointer_rel:
1912 return MSVCIntrin::_InterlockedExchange_rel;
1913 case clang::AArch64::BI_InterlockedExchange8_nf:
1914 case clang::AArch64::BI_InterlockedExchange16_nf:
1915 case clang::AArch64::BI_InterlockedExchange_nf:
1916 case clang::AArch64::BI_InterlockedExchange64_nf:
1917 case clang::AArch64::BI_InterlockedExchangePointer_nf:
1918 return MSVCIntrin::_InterlockedExchange_nf;
1919 case clang::AArch64::BI_InterlockedCompareExchange8_acq:
1920 case clang::AArch64::BI_InterlockedCompareExchange16_acq:
1921 case clang::AArch64::BI_InterlockedCompareExchange_acq:
1922 case clang::AArch64::BI_InterlockedCompareExchange64_acq:
1923 case clang::AArch64::BI_InterlockedCompareExchangePointer_acq:
1924 return MSVCIntrin::_InterlockedCompareExchange_acq;
1925 case clang::AArch64::BI_InterlockedCompareExchange8_rel:
1926 case clang::AArch64::BI_InterlockedCompareExchange16_rel:
1927 case clang::AArch64::BI_InterlockedCompareExchange_rel:
1928 case clang::AArch64::BI_InterlockedCompareExchange64_rel:
1929 case clang::AArch64::BI_InterlockedCompareExchangePointer_rel:
1930 return MSVCIntrin::_InterlockedCompareExchange_rel;
1931 case clang::AArch64::BI_InterlockedCompareExchange8_nf:
1932 case clang::AArch64::BI_InterlockedCompareExchange16_nf:
1933 case clang::AArch64::BI_InterlockedCompareExchange_nf:
1934 case clang::AArch64::BI_InterlockedCompareExchange64_nf:
1935 return MSVCIntrin::_InterlockedCompareExchange_nf;
1936 case clang::AArch64::BI_InterlockedCompareExchange128:
1937 return MSVCIntrin::_InterlockedCompareExchange128;
1938 case clang::AArch64::BI_InterlockedCompareExchange128_acq:
1939 return MSVCIntrin::_InterlockedCompareExchange128_acq;
1940 case clang::AArch64::BI_InterlockedCompareExchange128_nf:
1941 return MSVCIntrin::_InterlockedCompareExchange128_nf;
1942 case clang::AArch64::BI_InterlockedCompareExchange128_rel:
1943 return MSVCIntrin::_InterlockedCompareExchange128_rel;
1944 case clang::AArch64::BI_InterlockedOr8_acq:
1945 case clang::AArch64::BI_InterlockedOr16_acq:
1946 case clang::AArch64::BI_InterlockedOr_acq:
1947 case clang::AArch64::BI_InterlockedOr64_acq:
1948 return MSVCIntrin::_InterlockedOr_acq;
1949 case clang::AArch64::BI_InterlockedOr8_rel:
1950 case clang::AArch64::BI_InterlockedOr16_rel:
1951 case clang::AArch64::BI_InterlockedOr_rel:
1952 case clang::AArch64::BI_InterlockedOr64_rel:
1953 return MSVCIntrin::_InterlockedOr_rel;
1954 case clang::AArch64::BI_InterlockedOr8_nf:
1955 case clang::AArch64::BI_InterlockedOr16_nf:
1956 case clang::AArch64::BI_InterlockedOr_nf:
1957 case clang::AArch64::BI_InterlockedOr64_nf:
1958 return MSVCIntrin::_InterlockedOr_nf;
1959 case clang::AArch64::BI_InterlockedXor8_acq:
1960 case clang::AArch64::BI_InterlockedXor16_acq:
1961 case clang::AArch64::BI_InterlockedXor_acq:
1962 case clang::AArch64::BI_InterlockedXor64_acq:
1963 return MSVCIntrin::_InterlockedXor_acq;
1964 case clang::AArch64::BI_InterlockedXor8_rel:
1965 case clang::AArch64::BI_InterlockedXor16_rel:
1966 case clang::AArch64::BI_InterlockedXor_rel:
1967 case clang::AArch64::BI_InterlockedXor64_rel:
1968 return MSVCIntrin::_InterlockedXor_rel;
1969 case clang::AArch64::BI_InterlockedXor8_nf:
1970 case clang::AArch64::BI_InterlockedXor16_nf:
1971 case clang::AArch64::BI_InterlockedXor_nf:
1972 case clang::AArch64::BI_InterlockedXor64_nf:
1973 return MSVCIntrin::_InterlockedXor_nf;
1974 case clang::AArch64::BI_InterlockedAnd8_acq:
1975 case clang::AArch64::BI_InterlockedAnd16_acq:
1976 case clang::AArch64::BI_InterlockedAnd_acq:
1977 case clang::AArch64::BI_InterlockedAnd64_acq:
1978 return MSVCIntrin::_InterlockedAnd_acq;
1979 case clang::AArch64::BI_InterlockedAnd8_rel:
1980 case clang::AArch64::BI_InterlockedAnd16_rel:
1981 case clang::AArch64::BI_InterlockedAnd_rel:
1982 case clang::AArch64::BI_InterlockedAnd64_rel:
1983 return MSVCIntrin::_InterlockedAnd_rel;
1984 case clang::AArch64::BI_InterlockedAnd8_nf:
1985 case clang::AArch64::BI_InterlockedAnd16_nf:
1986 case clang::AArch64::BI_InterlockedAnd_nf:
1987 case clang::AArch64::BI_InterlockedAnd64_nf:
1988 return MSVCIntrin::_InterlockedAnd_nf;
1989 case clang::AArch64::BI_InterlockedIncrement16_acq:
1990 case clang::AArch64::BI_InterlockedIncrement_acq:
1991 case clang::AArch64::BI_InterlockedIncrement64_acq:
1992 return MSVCIntrin::_InterlockedIncrement_acq;
1993 case clang::AArch64::BI_InterlockedIncrement16_rel:
1994 case clang::AArch64::BI_InterlockedIncrement_rel:
1995 case clang::AArch64::BI_InterlockedIncrement64_rel:
1996 return MSVCIntrin::_InterlockedIncrement_rel;
1997 case clang::AArch64::BI_InterlockedIncrement16_nf:
1998 case clang::AArch64::BI_InterlockedIncrement_nf:
1999 case clang::AArch64::BI_InterlockedIncrement64_nf:
2000 return MSVCIntrin::_InterlockedIncrement_nf;
2001 case clang::AArch64::BI_InterlockedDecrement16_acq:
2002 case clang::AArch64::BI_InterlockedDecrement_acq:
2003 case clang::AArch64::BI_InterlockedDecrement64_acq:
2004 return MSVCIntrin::_InterlockedDecrement_acq;
2005 case clang::AArch64::BI_InterlockedDecrement16_rel:
2006 case clang::AArch64::BI_InterlockedDecrement_rel:
2007 case clang::AArch64::BI_InterlockedDecrement64_rel:
2008 return MSVCIntrin::_InterlockedDecrement_rel;
2009 case clang::AArch64::BI_InterlockedDecrement16_nf:
2010 case clang::AArch64::BI_InterlockedDecrement_nf:
2011 case clang::AArch64::BI_InterlockedDecrement64_nf:
2012 return MSVCIntrin::_InterlockedDecrement_nf;
2014 llvm_unreachable(
"must return from switch");
2017static std::optional<CodeGenFunction::MSVCIntrin>
2020 switch (BuiltinID) {
2022 return std::nullopt;
2023 case clang::X86::BI_BitScanForward:
2024 case clang::X86::BI_BitScanForward64:
2025 return MSVCIntrin::_BitScanForward;
2026 case clang::X86::BI_BitScanReverse:
2027 case clang::X86::BI_BitScanReverse64:
2028 return MSVCIntrin::_BitScanReverse;
2029 case clang::X86::BI_InterlockedAnd64:
2030 return MSVCIntrin::_InterlockedAnd;
2031 case clang::X86::BI_InterlockedCompareExchange128:
2032 return MSVCIntrin::_InterlockedCompareExchange128;
2033 case clang::X86::BI_InterlockedExchange64:
2034 return MSVCIntrin::_InterlockedExchange;
2035 case clang::X86::BI_InterlockedExchangeAdd64:
2036 return MSVCIntrin::_InterlockedExchangeAdd;
2037 case clang::X86::BI_InterlockedExchangeSub64:
2038 return MSVCIntrin::_InterlockedExchangeSub;
2039 case clang::X86::BI_InterlockedOr64:
2040 return MSVCIntrin::_InterlockedOr;
2041 case clang::X86::BI_InterlockedXor64:
2042 return MSVCIntrin::_InterlockedXor;
2043 case clang::X86::BI_InterlockedDecrement64:
2044 return MSVCIntrin::_InterlockedDecrement;
2045 case clang::X86::BI_InterlockedIncrement64:
2046 return MSVCIntrin::_InterlockedIncrement;
2048 llvm_unreachable(
"must return from switch");
2054 switch (BuiltinID) {
2055 case MSVCIntrin::_BitScanForward:
2056 case MSVCIntrin::_BitScanReverse: {
2060 llvm::Type *ArgType = ArgValue->
getType();
2061 llvm::Type *IndexType = IndexAddress.getElementType();
2064 Value *ArgZero = llvm::Constant::getNullValue(ArgType);
2065 Value *ResZero = llvm::Constant::getNullValue(ResultType);
2066 Value *ResOne = llvm::ConstantInt::get(ResultType, 1);
2071 PHINode *
Result =
Builder.CreatePHI(ResultType, 2,
"bitscan_result");
2074 Value *IsZero =
Builder.CreateICmpEQ(ArgValue, ArgZero);
2076 Builder.CreateCondBr(IsZero, End, NotZero);
2079 Builder.SetInsertPoint(NotZero);
2081 if (BuiltinID == MSVCIntrin::_BitScanForward) {
2084 ZeroCount =
Builder.CreateIntCast(ZeroCount, IndexType,
false);
2087 unsigned ArgWidth = cast<llvm::IntegerType>(ArgType)->getBitWidth();
2088 Value *ArgTypeLastIndex = llvm::ConstantInt::get(IndexType, ArgWidth - 1);
2092 ZeroCount =
Builder.CreateIntCast(ZeroCount, IndexType,
false);
2093 Value *Index =
Builder.CreateNSWSub(ArgTypeLastIndex, ZeroCount);
2097 Result->addIncoming(ResOne, NotZero);
2102 case MSVCIntrin::_InterlockedAnd:
2104 case MSVCIntrin::_InterlockedExchange:
2106 case MSVCIntrin::_InterlockedExchangeAdd:
2108 case MSVCIntrin::_InterlockedExchangeSub:
2110 case MSVCIntrin::_InterlockedOr:
2112 case MSVCIntrin::_InterlockedXor:
2114 case MSVCIntrin::_InterlockedExchangeAdd_acq:
2116 AtomicOrdering::Acquire);
2117 case MSVCIntrin::_InterlockedExchangeAdd_rel:
2119 AtomicOrdering::Release);
2120 case MSVCIntrin::_InterlockedExchangeAdd_nf:
2122 AtomicOrdering::Monotonic);
2123 case MSVCIntrin::_InterlockedExchange_acq:
2125 AtomicOrdering::Acquire);
2126 case MSVCIntrin::_InterlockedExchange_rel:
2128 AtomicOrdering::Release);
2129 case MSVCIntrin::_InterlockedExchange_nf:
2131 AtomicOrdering::Monotonic);
2132 case MSVCIntrin::_InterlockedCompareExchange:
2134 case MSVCIntrin::_InterlockedCompareExchange_acq:
2136 case MSVCIntrin::_InterlockedCompareExchange_rel:
2138 case MSVCIntrin::_InterlockedCompareExchange_nf:
2140 case MSVCIntrin::_InterlockedCompareExchange128:
2142 *
this,
E, AtomicOrdering::SequentiallyConsistent);
2143 case MSVCIntrin::_InterlockedCompareExchange128_acq:
2145 case MSVCIntrin::_InterlockedCompareExchange128_rel:
2147 case MSVCIntrin::_InterlockedCompareExchange128_nf:
2149 case MSVCIntrin::_InterlockedOr_acq:
2151 AtomicOrdering::Acquire);
2152 case MSVCIntrin::_InterlockedOr_rel:
2154 AtomicOrdering::Release);
2155 case MSVCIntrin::_InterlockedOr_nf:
2157 AtomicOrdering::Monotonic);
2158 case MSVCIntrin::_InterlockedXor_acq:
2160 AtomicOrdering::Acquire);
2161 case MSVCIntrin::_InterlockedXor_rel:
2163 AtomicOrdering::Release);
2164 case MSVCIntrin::_InterlockedXor_nf:
2166 AtomicOrdering::Monotonic);
2167 case MSVCIntrin::_InterlockedAnd_acq:
2169 AtomicOrdering::Acquire);
2170 case MSVCIntrin::_InterlockedAnd_rel:
2172 AtomicOrdering::Release);
2173 case MSVCIntrin::_InterlockedAnd_nf:
2175 AtomicOrdering::Monotonic);
2176 case MSVCIntrin::_InterlockedIncrement_acq:
2178 case MSVCIntrin::_InterlockedIncrement_rel:
2180 case MSVCIntrin::_InterlockedIncrement_nf:
2182 case MSVCIntrin::_InterlockedDecrement_acq:
2184 case MSVCIntrin::_InterlockedDecrement_rel:
2186 case MSVCIntrin::_InterlockedDecrement_nf:
2189 case MSVCIntrin::_InterlockedDecrement:
2191 case MSVCIntrin::_InterlockedIncrement:
2194 case MSVCIntrin::__fastfail: {
2199 StringRef
Asm, Constraints;
2204 case llvm::Triple::x86:
2205 case llvm::Triple::x86_64:
2207 Constraints =
"{cx}";
2209 case llvm::Triple::thumb:
2211 Constraints =
"{r0}";
2213 case llvm::Triple::aarch64:
2214 Asm =
"brk #0xF003";
2215 Constraints =
"{w0}";
2217 llvm::FunctionType *FTy = llvm::FunctionType::get(
VoidTy, {
Int32Ty},
false);
2218 llvm::InlineAsm *IA =
2219 llvm::InlineAsm::get(FTy,
Asm, Constraints,
true);
2220 llvm::AttributeList NoReturnAttr = llvm::AttributeList::get(
2222 llvm::Attribute::NoReturn);
2224 CI->setAttributes(NoReturnAttr);
2228 llvm_unreachable(
"Incorrect MSVC intrinsic!");
2234 CallObjCArcUse(llvm::Value *
object) : object(object) {}
2235 llvm::Value *object;
2244 BuiltinCheckKind Kind) {
2246 "Unsupported builtin check kind");
2252 SanitizerScope SanScope(
this);
2254 ArgValue, llvm::Constant::getNullValue(ArgValue->
getType()));
2255 EmitCheck(std::make_pair(Cond, SanitizerKind::Builtin),
2256 SanitizerHandler::InvalidBuiltin,
2258 llvm::ConstantInt::get(
Builder.getInt8Ty(), Kind)},
2268 SanitizerScope SanScope(
this);
2270 std::make_pair(ArgValue, SanitizerKind::Builtin),
2271 SanitizerHandler::InvalidBuiltin,
2279 return CGF.
Builder.CreateBinaryIntrinsic(
2280 Intrinsic::abs, ArgValue,
2281 ConstantInt::get(CGF.
Builder.getInt1Ty(), HasNSW));
2285 bool SanitizeOverflow) {
2289 if (
const auto *VCI = dyn_cast<llvm::ConstantInt>(ArgValue)) {
2290 if (!VCI->isMinSignedValue())
2291 return EmitAbs(CGF, ArgValue,
true);
2294 CodeGenFunction::SanitizerScope SanScope(&CGF);
2296 Constant *Zero = Constant::getNullValue(ArgValue->
getType());
2297 Value *ResultAndOverflow = CGF.
Builder.CreateBinaryIntrinsic(
2298 Intrinsic::ssub_with_overflow, Zero, ArgValue);
2301 CGF.
Builder.CreateExtractValue(ResultAndOverflow, 1));
2304 if (SanitizeOverflow) {
2305 CGF.
EmitCheck({{NotOverflow, SanitizerKind::SignedIntegerOverflow}},
2306 SanitizerHandler::NegateOverflow,
2311 CGF.
EmitTrapCheck(NotOverflow, SanitizerHandler::SubOverflow);
2313 Value *CmpResult = CGF.
Builder.CreateICmpSLT(ArgValue, Zero,
"abscond");
2314 return CGF.
Builder.CreateSelect(CmpResult,
Result, ArgValue,
"abs");
2319 QualType UnsignedTy =
C.getIntTypeForBitwidth(Size * 8,
false);
2320 return C.getCanonicalType(UnsignedTy);
2330 raw_svector_ostream OS(Name);
2331 OS <<
"__os_log_helper";
2335 for (
const auto &Item : Layout.
Items)
2336 OS <<
"_" <<
int(Item.getSizeByte()) <<
"_"
2337 <<
int(Item.getDescriptorByte());
2340 if (llvm::Function *F =
CGM.
getModule().getFunction(Name))
2350 for (
unsigned int I = 0,
E = Layout.
Items.size(); I <
E; ++I) {
2351 char Size = Layout.
Items[I].getSizeByte();
2358 &Ctx.
Idents.
get(std::string(
"arg") + llvm::to_string(I)), ArgTy,
2360 ArgTys.emplace_back(ArgTy);
2371 llvm::Function *
Fn = llvm::Function::Create(
2372 FuncTy, llvm::GlobalValue::LinkOnceODRLinkage, Name, &
CGM.
getModule());
2373 Fn->setVisibility(llvm::GlobalValue::HiddenVisibility);
2376 Fn->setDoesNotThrow();
2380 Fn->addFnAttr(llvm::Attribute::NoInline);
2398 for (
const auto &Item : Layout.
Items) {
2400 Builder.getInt8(Item.getDescriptorByte()),
2403 Builder.getInt8(Item.getSizeByte()),
2407 if (!
Size.getQuantity())
2424 assert(
E.getNumArgs() >= 2 &&
2425 "__builtin_os_log_format takes at least 2 arguments");
2436 for (
const auto &Item : Layout.
Items) {
2437 int Size = Item.getSizeByte();
2441 llvm::Value *ArgVal;
2445 for (
unsigned I = 0,
E = Item.getMaskType().size(); I <
E; ++I)
2446 Val |= ((
uint64_t)Item.getMaskType()[I]) << I * 8;
2447 ArgVal = llvm::Constant::getIntegerValue(
Int64Ty, llvm::APInt(64, Val));
2448 }
else if (
const Expr *TheExpr = Item.getExpr()) {
2454 auto LifetimeExtendObject = [&](
const Expr *
E) {
2462 if (isa<CallExpr>(
E) || isa<ObjCMessageExpr>(
E))
2467 if (TheExpr->getType()->isObjCRetainableType() &&
2468 getLangOpts().ObjCAutoRefCount && LifetimeExtendObject(TheExpr)) {
2470 "Only scalar can be a ObjC retainable type");
2471 if (!isa<Constant>(ArgVal)) {
2485 pushCleanupAfterFullExpr<CallObjCArcUse>(Cleanup, ArgVal);
2489 ArgVal =
Builder.getInt32(Item.getConstValue().getQuantity());
2492 unsigned ArgValSize =
2496 ArgVal =
Builder.CreateBitOrPointerCast(ArgVal,
IntTy);
2512 unsigned BuiltinID, WidthAndSignedness Op1Info, WidthAndSignedness Op2Info,
2513 WidthAndSignedness ResultInfo) {
2514 return BuiltinID == Builtin::BI__builtin_mul_overflow &&
2515 Op1Info.Width == Op2Info.Width && Op2Info.Width == ResultInfo.Width &&
2516 !Op1Info.Signed && !Op2Info.Signed && ResultInfo.Signed;
2521 const clang::Expr *Op2, WidthAndSignedness Op2Info,
2523 WidthAndSignedness ResultInfo) {
2525 Builtin::BI__builtin_mul_overflow, Op1Info, Op2Info, ResultInfo) &&
2526 "Cannot specialize this multiply");
2531 llvm::Value *HasOverflow;
2533 CGF, llvm::Intrinsic::umul_with_overflow, V1, V2, HasOverflow);
2538 auto IntMax = llvm::APInt::getSignedMaxValue(ResultInfo.Width);
2539 llvm::Value *IntMaxValue = llvm::ConstantInt::get(
Result->getType(), IntMax);
2541 llvm::Value *IntMaxOverflow = CGF.
Builder.CreateICmpUGT(
Result, IntMaxValue);
2542 HasOverflow = CGF.
Builder.CreateOr(HasOverflow, IntMaxOverflow);
2554 WidthAndSignedness Op1Info,
2555 WidthAndSignedness Op2Info,
2556 WidthAndSignedness ResultInfo) {
2557 return BuiltinID == Builtin::BI__builtin_mul_overflow &&
2558 std::max(Op1Info.Width, Op2Info.Width) >= ResultInfo.Width &&
2559 Op1Info.Signed != Op2Info.Signed;
2566 WidthAndSignedness Op1Info,
const clang::Expr *Op2,
2567 WidthAndSignedness Op2Info,
2569 WidthAndSignedness ResultInfo) {
2571 Op2Info, ResultInfo) &&
2572 "Not a mixed-sign multipliction we can specialize");
2575 const clang::Expr *SignedOp = Op1Info.Signed ? Op1 : Op2;
2576 const clang::Expr *UnsignedOp = Op1Info.Signed ? Op2 : Op1;
2579 unsigned SignedOpWidth = Op1Info.Signed ? Op1Info.Width : Op2Info.Width;
2580 unsigned UnsignedOpWidth = Op1Info.Signed ? Op2Info.Width : Op1Info.Width;
2583 if (SignedOpWidth < UnsignedOpWidth)
2585 if (UnsignedOpWidth < SignedOpWidth)
2588 llvm::Type *OpTy =
Signed->getType();
2589 llvm::Value *Zero = llvm::Constant::getNullValue(OpTy);
2592 unsigned OpWidth = std::max(Op1Info.Width, Op2Info.Width);
2595 llvm::Value *IsNegative = CGF.
Builder.CreateICmpSLT(
Signed, Zero);
2596 llvm::Value *AbsOfNegative = CGF.
Builder.CreateSub(Zero,
Signed);
2597 llvm::Value *AbsSigned =
2598 CGF.
Builder.CreateSelect(IsNegative, AbsOfNegative,
Signed);
2601 llvm::Value *UnsignedOverflow;
2602 llvm::Value *UnsignedResult =
2606 llvm::Value *Overflow, *
Result;
2607 if (ResultInfo.Signed) {
2611 llvm::APInt::getSignedMaxValue(ResultInfo.Width).zext(OpWidth);
2612 llvm::Value *MaxResult =
2613 CGF.
Builder.CreateAdd(llvm::ConstantInt::get(OpTy, IntMax),
2614 CGF.
Builder.CreateZExt(IsNegative, OpTy));
2615 llvm::Value *SignedOverflow =
2616 CGF.
Builder.CreateICmpUGT(UnsignedResult, MaxResult);
2617 Overflow = CGF.
Builder.CreateOr(UnsignedOverflow, SignedOverflow);
2620 llvm::Value *NegativeResult = CGF.
Builder.CreateNeg(UnsignedResult);
2621 llvm::Value *SignedResult =
2622 CGF.
Builder.CreateSelect(IsNegative, NegativeResult, UnsignedResult);
2626 llvm::Value *Underflow = CGF.
Builder.CreateAnd(
2627 IsNegative, CGF.
Builder.CreateIsNotNull(UnsignedResult));
2628 Overflow = CGF.
Builder.CreateOr(UnsignedOverflow, Underflow);
2629 if (ResultInfo.Width < OpWidth) {
2631 llvm::APInt::getMaxValue(ResultInfo.Width).zext(OpWidth);
2632 llvm::Value *TruncOverflow = CGF.
Builder.CreateICmpUGT(
2633 UnsignedResult, llvm::ConstantInt::get(OpTy, IntMax));
2634 Overflow = CGF.
Builder.CreateOr(Overflow, TruncOverflow);
2639 IsNegative, CGF.
Builder.CreateNeg(UnsignedResult), UnsignedResult);
2643 assert(Overflow &&
Result &&
"Missing overflow or result");
2654 llvm::SmallPtrSetImpl<const Decl *> &Seen) {
2663 if (!Seen.insert(
Record).second)
2666 assert(
Record->hasDefinition() &&
2667 "Incomplete types should already be diagnosed");
2669 if (
Record->isDynamicClass())
2694 llvm::Type *Ty = Src->getType();
2695 ShiftAmt =
Builder.CreateIntCast(ShiftAmt, Ty,
false);
2698 unsigned IID = IsRotateRight ? Intrinsic::fshr : Intrinsic::fshl;
2705 switch (BuiltinID) {
2706#define MUTATE_LDBL(func) \
2707 case Builtin::BI__builtin_##func##l: \
2708 return Builtin::BI__builtin_##func##f128;
2777 if (CGF.
Builder.getIsFPConstrained() &&
2778 CGF.
Builder.getDefaultConstrainedExcept() != fp::ebIgnore) {
2790 auto UBF = CGF->
CGM.
getModule().getOrInsertFunction(Name, FnTy);
2793 for (
auto &&FormalTy : FnTy->params())
2794 Args.push_back(llvm::PoisonValue::get(FormalTy));
2803 "Should not codegen for consteval builtins");
2810 !
Result.hasSideEffects()) {
2814 if (
Result.Val.isFloat())
2823 if (
getTarget().getTriple().isPPC64() &&
2824 &
getTarget().getLongDoubleFormat() == &llvm::APFloat::IEEEquad())
2831 const unsigned BuiltinIDIfNoAsmLabel =
2832 FD->
hasAttr<AsmLabelAttr>() ? 0 : BuiltinID;
2834 std::optional<bool> ErrnoOverriden;
2838 if (
E->hasStoredFPFeatures()) {
2840 if (OP.hasMathErrnoOverride())
2841 ErrnoOverriden = OP.getMathErrnoOverride();
2850 bool ErrnoOverridenToFalseWithOpt =
2851 ErrnoOverriden.has_value() && !ErrnoOverriden.value() && !OptNone &&
2869 switch (BuiltinID) {
2870 case Builtin::BI__builtin_fma:
2871 case Builtin::BI__builtin_fmaf:
2872 case Builtin::BI__builtin_fmal:
2873 case Builtin::BI__builtin_fmaf16:
2874 case Builtin::BIfma:
2875 case Builtin::BIfmaf:
2876 case Builtin::BIfmal: {
2878 if (Trip.isGNUEnvironment() || Trip.isOSMSVCRT())
2886 bool ConstWithoutErrnoAndExceptions =
2888 bool ConstWithoutExceptions =
2906 bool ConstWithoutErrnoOrExceptions =
2907 ConstWithoutErrnoAndExceptions || ConstWithoutExceptions;
2908 bool GenerateIntrinsics =
2909 (ConstAlways && !OptNone) ||
2911 !(ErrnoOverriden.has_value() && ErrnoOverriden.value()) && !OptNone);
2912 if (!GenerateIntrinsics) {
2913 GenerateIntrinsics =
2914 ConstWithoutErrnoOrExceptions && !ConstWithoutErrnoAndExceptions;
2915 if (!GenerateIntrinsics)
2916 GenerateIntrinsics =
2917 ConstWithoutErrnoOrExceptions &&
2919 !(ErrnoOverriden.has_value() && ErrnoOverriden.value()) && !OptNone);
2920 if (!GenerateIntrinsics)
2921 GenerateIntrinsics =
2922 ConstWithoutErrnoOrExceptions && ErrnoOverridenToFalseWithOpt;
2924 if (GenerateIntrinsics) {
2925 switch (BuiltinIDIfNoAsmLabel) {
2926 case Builtin::BIacos:
2927 case Builtin::BIacosf:
2928 case Builtin::BIacosl:
2929 case Builtin::BI__builtin_acos:
2930 case Builtin::BI__builtin_acosf:
2931 case Builtin::BI__builtin_acosf16:
2932 case Builtin::BI__builtin_acosl:
2933 case Builtin::BI__builtin_acosf128:
2935 *
this,
E, Intrinsic::acos, Intrinsic::experimental_constrained_acos));
2937 case Builtin::BIasin:
2938 case Builtin::BIasinf:
2939 case Builtin::BIasinl:
2940 case Builtin::BI__builtin_asin:
2941 case Builtin::BI__builtin_asinf:
2942 case Builtin::BI__builtin_asinf16:
2943 case Builtin::BI__builtin_asinl:
2944 case Builtin::BI__builtin_asinf128:
2946 *
this,
E, Intrinsic::asin, Intrinsic::experimental_constrained_asin));
2948 case Builtin::BIatan:
2949 case Builtin::BIatanf:
2950 case Builtin::BIatanl:
2951 case Builtin::BI__builtin_atan:
2952 case Builtin::BI__builtin_atanf:
2953 case Builtin::BI__builtin_atanf16:
2954 case Builtin::BI__builtin_atanl:
2955 case Builtin::BI__builtin_atanf128:
2957 *
this,
E, Intrinsic::atan, Intrinsic::experimental_constrained_atan));
2959 case Builtin::BIatan2:
2960 case Builtin::BIatan2f:
2961 case Builtin::BIatan2l:
2962 case Builtin::BI__builtin_atan2:
2963 case Builtin::BI__builtin_atan2f:
2964 case Builtin::BI__builtin_atan2f16:
2965 case Builtin::BI__builtin_atan2l:
2966 case Builtin::BI__builtin_atan2f128:
2968 *
this,
E, Intrinsic::atan2,
2969 Intrinsic::experimental_constrained_atan2));
2971 case Builtin::BIceil:
2972 case Builtin::BIceilf:
2973 case Builtin::BIceill:
2974 case Builtin::BI__builtin_ceil:
2975 case Builtin::BI__builtin_ceilf:
2976 case Builtin::BI__builtin_ceilf16:
2977 case Builtin::BI__builtin_ceill:
2978 case Builtin::BI__builtin_ceilf128:
2981 Intrinsic::experimental_constrained_ceil));
2983 case Builtin::BIcopysign:
2984 case Builtin::BIcopysignf:
2985 case Builtin::BIcopysignl:
2986 case Builtin::BI__builtin_copysign:
2987 case Builtin::BI__builtin_copysignf:
2988 case Builtin::BI__builtin_copysignf16:
2989 case Builtin::BI__builtin_copysignl:
2990 case Builtin::BI__builtin_copysignf128:
2992 emitBuiltinWithOneOverloadedType<2>(*
this,
E, Intrinsic::copysign));
2994 case Builtin::BIcos:
2995 case Builtin::BIcosf:
2996 case Builtin::BIcosl:
2997 case Builtin::BI__builtin_cos:
2998 case Builtin::BI__builtin_cosf:
2999 case Builtin::BI__builtin_cosf16:
3000 case Builtin::BI__builtin_cosl:
3001 case Builtin::BI__builtin_cosf128:
3004 Intrinsic::experimental_constrained_cos));
3006 case Builtin::BIcosh:
3007 case Builtin::BIcoshf:
3008 case Builtin::BIcoshl:
3009 case Builtin::BI__builtin_cosh:
3010 case Builtin::BI__builtin_coshf:
3011 case Builtin::BI__builtin_coshf16:
3012 case Builtin::BI__builtin_coshl:
3013 case Builtin::BI__builtin_coshf128:
3015 *
this,
E, Intrinsic::cosh, Intrinsic::experimental_constrained_cosh));
3017 case Builtin::BIexp:
3018 case Builtin::BIexpf:
3019 case Builtin::BIexpl:
3020 case Builtin::BI__builtin_exp:
3021 case Builtin::BI__builtin_expf:
3022 case Builtin::BI__builtin_expf16:
3023 case Builtin::BI__builtin_expl:
3024 case Builtin::BI__builtin_expf128:
3027 Intrinsic::experimental_constrained_exp));
3029 case Builtin::BIexp2:
3030 case Builtin::BIexp2f:
3031 case Builtin::BIexp2l:
3032 case Builtin::BI__builtin_exp2:
3033 case Builtin::BI__builtin_exp2f:
3034 case Builtin::BI__builtin_exp2f16:
3035 case Builtin::BI__builtin_exp2l:
3036 case Builtin::BI__builtin_exp2f128:
3039 Intrinsic::experimental_constrained_exp2));
3040 case Builtin::BI__builtin_exp10:
3041 case Builtin::BI__builtin_exp10f:
3042 case Builtin::BI__builtin_exp10f16:
3043 case Builtin::BI__builtin_exp10l:
3044 case Builtin::BI__builtin_exp10f128: {
3046 if (
Builder.getIsFPConstrained())
3049 emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::exp10));
3051 case Builtin::BIfabs:
3052 case Builtin::BIfabsf:
3053 case Builtin::BIfabsl:
3054 case Builtin::BI__builtin_fabs:
3055 case Builtin::BI__builtin_fabsf:
3056 case Builtin::BI__builtin_fabsf16:
3057 case Builtin::BI__builtin_fabsl:
3058 case Builtin::BI__builtin_fabsf128:
3060 emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::fabs));
3062 case Builtin::BIfloor:
3063 case Builtin::BIfloorf:
3064 case Builtin::BIfloorl:
3065 case Builtin::BI__builtin_floor:
3066 case Builtin::BI__builtin_floorf:
3067 case Builtin::BI__builtin_floorf16:
3068 case Builtin::BI__builtin_floorl:
3069 case Builtin::BI__builtin_floorf128:
3072 Intrinsic::experimental_constrained_floor));
3074 case Builtin::BIfma:
3075 case Builtin::BIfmaf:
3076 case Builtin::BIfmal:
3077 case Builtin::BI__builtin_fma:
3078 case Builtin::BI__builtin_fmaf:
3079 case Builtin::BI__builtin_fmaf16:
3080 case Builtin::BI__builtin_fmal:
3081 case Builtin::BI__builtin_fmaf128:
3084 Intrinsic::experimental_constrained_fma));
3086 case Builtin::BIfmax:
3087 case Builtin::BIfmaxf:
3088 case Builtin::BIfmaxl:
3089 case Builtin::BI__builtin_fmax:
3090 case Builtin::BI__builtin_fmaxf:
3091 case Builtin::BI__builtin_fmaxf16:
3092 case Builtin::BI__builtin_fmaxl:
3093 case Builtin::BI__builtin_fmaxf128:
3096 Intrinsic::experimental_constrained_maxnum));
3098 case Builtin::BIfmin:
3099 case Builtin::BIfminf:
3100 case Builtin::BIfminl:
3101 case Builtin::BI__builtin_fmin:
3102 case Builtin::BI__builtin_fminf:
3103 case Builtin::BI__builtin_fminf16:
3104 case Builtin::BI__builtin_fminl:
3105 case Builtin::BI__builtin_fminf128:
3108 Intrinsic::experimental_constrained_minnum));
3110 case Builtin::BIfmaximum_num:
3111 case Builtin::BIfmaximum_numf:
3112 case Builtin::BIfmaximum_numl:
3113 case Builtin::BI__builtin_fmaximum_num:
3114 case Builtin::BI__builtin_fmaximum_numf:
3115 case Builtin::BI__builtin_fmaximum_numf16:
3116 case Builtin::BI__builtin_fmaximum_numl:
3117 case Builtin::BI__builtin_fmaximum_numf128:
3119 emitBuiltinWithOneOverloadedType<2>(*
this,
E, Intrinsic::maximumnum));
3121 case Builtin::BIfminimum_num:
3122 case Builtin::BIfminimum_numf:
3123 case Builtin::BIfminimum_numl:
3124 case Builtin::BI__builtin_fminimum_num:
3125 case Builtin::BI__builtin_fminimum_numf:
3126 case Builtin::BI__builtin_fminimum_numf16:
3127 case Builtin::BI__builtin_fminimum_numl:
3128 case Builtin::BI__builtin_fminimum_numf128:
3130 emitBuiltinWithOneOverloadedType<2>(*
this,
E, Intrinsic::minimumnum));
3134 case Builtin::BIfmod:
3135 case Builtin::BIfmodf:
3136 case Builtin::BIfmodl:
3137 case Builtin::BI__builtin_fmod:
3138 case Builtin::BI__builtin_fmodf:
3139 case Builtin::BI__builtin_fmodf16:
3140 case Builtin::BI__builtin_fmodl:
3141 case Builtin::BI__builtin_fmodf128:
3142 case Builtin::BI__builtin_elementwise_fmod: {
3143 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
3149 case Builtin::BIlog:
3150 case Builtin::BIlogf:
3151 case Builtin::BIlogl:
3152 case Builtin::BI__builtin_log:
3153 case Builtin::BI__builtin_logf:
3154 case Builtin::BI__builtin_logf16:
3155 case Builtin::BI__builtin_logl:
3156 case Builtin::BI__builtin_logf128:
3159 Intrinsic::experimental_constrained_log));
3161 case Builtin::BIlog10:
3162 case Builtin::BIlog10f:
3163 case Builtin::BIlog10l:
3164 case Builtin::BI__builtin_log10:
3165 case Builtin::BI__builtin_log10f:
3166 case Builtin::BI__builtin_log10f16:
3167 case Builtin::BI__builtin_log10l:
3168 case Builtin::BI__builtin_log10f128:
3171 Intrinsic::experimental_constrained_log10));
3173 case Builtin::BIlog2:
3174 case Builtin::BIlog2f:
3175 case Builtin::BIlog2l:
3176 case Builtin::BI__builtin_log2:
3177 case Builtin::BI__builtin_log2f:
3178 case Builtin::BI__builtin_log2f16:
3179 case Builtin::BI__builtin_log2l:
3180 case Builtin::BI__builtin_log2f128:
3183 Intrinsic::experimental_constrained_log2));
3185 case Builtin::BInearbyint:
3186 case Builtin::BInearbyintf:
3187 case Builtin::BInearbyintl:
3188 case Builtin::BI__builtin_nearbyint:
3189 case Builtin::BI__builtin_nearbyintf:
3190 case Builtin::BI__builtin_nearbyintl:
3191 case Builtin::BI__builtin_nearbyintf128:
3193 Intrinsic::nearbyint,
3194 Intrinsic::experimental_constrained_nearbyint));
3196 case Builtin::BIpow:
3197 case Builtin::BIpowf:
3198 case Builtin::BIpowl:
3199 case Builtin::BI__builtin_pow:
3200 case Builtin::BI__builtin_powf:
3201 case Builtin::BI__builtin_powf16:
3202 case Builtin::BI__builtin_powl:
3203 case Builtin::BI__builtin_powf128:
3206 Intrinsic::experimental_constrained_pow));
3208 case Builtin::BIrint:
3209 case Builtin::BIrintf:
3210 case Builtin::BIrintl:
3211 case Builtin::BI__builtin_rint:
3212 case Builtin::BI__builtin_rintf:
3213 case Builtin::BI__builtin_rintf16:
3214 case Builtin::BI__builtin_rintl:
3215 case Builtin::BI__builtin_rintf128:
3218 Intrinsic::experimental_constrained_rint));
3220 case Builtin::BIround:
3221 case Builtin::BIroundf:
3222 case Builtin::BIroundl:
3223 case Builtin::BI__builtin_round:
3224 case Builtin::BI__builtin_roundf:
3225 case Builtin::BI__builtin_roundf16:
3226 case Builtin::BI__builtin_roundl:
3227 case Builtin::BI__builtin_roundf128:
3230 Intrinsic::experimental_constrained_round));
3232 case Builtin::BIroundeven:
3233 case Builtin::BIroundevenf:
3234 case Builtin::BIroundevenl:
3235 case Builtin::BI__builtin_roundeven:
3236 case Builtin::BI__builtin_roundevenf:
3237 case Builtin::BI__builtin_roundevenf16:
3238 case Builtin::BI__builtin_roundevenl:
3239 case Builtin::BI__builtin_roundevenf128:
3241 Intrinsic::roundeven,
3242 Intrinsic::experimental_constrained_roundeven));
3244 case Builtin::BIsin:
3245 case Builtin::BIsinf:
3246 case Builtin::BIsinl:
3247 case Builtin::BI__builtin_sin:
3248 case Builtin::BI__builtin_sinf:
3249 case Builtin::BI__builtin_sinf16:
3250 case Builtin::BI__builtin_sinl:
3251 case Builtin::BI__builtin_sinf128:
3254 Intrinsic::experimental_constrained_sin));
3256 case Builtin::BIsinh:
3257 case Builtin::BIsinhf:
3258 case Builtin::BIsinhl:
3259 case Builtin::BI__builtin_sinh:
3260 case Builtin::BI__builtin_sinhf:
3261 case Builtin::BI__builtin_sinhf16:
3262 case Builtin::BI__builtin_sinhl:
3263 case Builtin::BI__builtin_sinhf128:
3265 *
this,
E, Intrinsic::sinh, Intrinsic::experimental_constrained_sinh));
3267 case Builtin::BI__builtin_sincos:
3268 case Builtin::BI__builtin_sincosf:
3269 case Builtin::BI__builtin_sincosf16:
3270 case Builtin::BI__builtin_sincosl:
3271 case Builtin::BI__builtin_sincosf128:
3275 case Builtin::BIsqrt:
3276 case Builtin::BIsqrtf:
3277 case Builtin::BIsqrtl:
3278 case Builtin::BI__builtin_sqrt:
3279 case Builtin::BI__builtin_sqrtf:
3280 case Builtin::BI__builtin_sqrtf16:
3281 case Builtin::BI__builtin_sqrtl:
3282 case Builtin::BI__builtin_sqrtf128:
3283 case Builtin::BI__builtin_elementwise_sqrt: {
3285 *
this,
E, Intrinsic::sqrt, Intrinsic::experimental_constrained_sqrt);
3290 case Builtin::BItan:
3291 case Builtin::BItanf:
3292 case Builtin::BItanl:
3293 case Builtin::BI__builtin_tan:
3294 case Builtin::BI__builtin_tanf:
3295 case Builtin::BI__builtin_tanf16:
3296 case Builtin::BI__builtin_tanl:
3297 case Builtin::BI__builtin_tanf128:
3299 *
this,
E, Intrinsic::tan, Intrinsic::experimental_constrained_tan));
3301 case Builtin::BItanh:
3302 case Builtin::BItanhf:
3303 case Builtin::BItanhl:
3304 case Builtin::BI__builtin_tanh:
3305 case Builtin::BI__builtin_tanhf:
3306 case Builtin::BI__builtin_tanhf16:
3307 case Builtin::BI__builtin_tanhl:
3308 case Builtin::BI__builtin_tanhf128:
3310 *
this,
E, Intrinsic::tanh, Intrinsic::experimental_constrained_tanh));
3312 case Builtin::BItrunc:
3313 case Builtin::BItruncf:
3314 case Builtin::BItruncl:
3315 case Builtin::BI__builtin_trunc:
3316 case Builtin::BI__builtin_truncf:
3317 case Builtin::BI__builtin_truncf16:
3318 case Builtin::BI__builtin_truncl:
3319 case Builtin::BI__builtin_truncf128:
3322 Intrinsic::experimental_constrained_trunc));
3324 case Builtin::BIlround:
3325 case Builtin::BIlroundf:
3326 case Builtin::BIlroundl:
3327 case Builtin::BI__builtin_lround:
3328 case Builtin::BI__builtin_lroundf:
3329 case Builtin::BI__builtin_lroundl:
3330 case Builtin::BI__builtin_lroundf128:
3332 *
this,
E, Intrinsic::lround,
3333 Intrinsic::experimental_constrained_lround));
3335 case Builtin::BIllround:
3336 case Builtin::BIllroundf:
3337 case Builtin::BIllroundl:
3338 case Builtin::BI__builtin_llround:
3339 case Builtin::BI__builtin_llroundf:
3340 case Builtin::BI__builtin_llroundl:
3341 case Builtin::BI__builtin_llroundf128:
3343 *
this,
E, Intrinsic::llround,
3344 Intrinsic::experimental_constrained_llround));
3346 case Builtin::BIlrint:
3347 case Builtin::BIlrintf:
3348 case Builtin::BIlrintl:
3349 case Builtin::BI__builtin_lrint:
3350 case Builtin::BI__builtin_lrintf:
3351 case Builtin::BI__builtin_lrintl:
3352 case Builtin::BI__builtin_lrintf128:
3354 *
this,
E, Intrinsic::lrint,
3355 Intrinsic::experimental_constrained_lrint));
3357 case Builtin::BIllrint:
3358 case Builtin::BIllrintf:
3359 case Builtin::BIllrintl:
3360 case Builtin::BI__builtin_llrint:
3361 case Builtin::BI__builtin_llrintf:
3362 case Builtin::BI__builtin_llrintl:
3363 case Builtin::BI__builtin_llrintf128:
3365 *
this,
E, Intrinsic::llrint,
3366 Intrinsic::experimental_constrained_llrint));
3367 case Builtin::BI__builtin_ldexp:
3368 case Builtin::BI__builtin_ldexpf:
3369 case Builtin::BI__builtin_ldexpl:
3370 case Builtin::BI__builtin_ldexpf16:
3371 case Builtin::BI__builtin_ldexpf128: {
3373 *
this,
E, Intrinsic::ldexp,
3374 Intrinsic::experimental_constrained_ldexp));
3384 Value *Val = A.emitRawPointer(*
this);
3390 SkippedChecks.
set(SanitizerKind::All);
3391 SkippedChecks.
clear(SanitizerKind::Alignment);
3394 if (
auto *CE = dyn_cast<ImplicitCastExpr>(Arg))
3395 if (CE->getCastKind() == CK_BitCast)
3396 Arg = CE->getSubExpr();
3402 switch (BuiltinIDIfNoAsmLabel) {
3404 case Builtin::BI__builtin___CFStringMakeConstantString:
3405 case Builtin::BI__builtin___NSStringMakeConstantString:
3407 case Builtin::BI__builtin_stdarg_start:
3408 case Builtin::BI__builtin_va_start:
3409 case Builtin::BI__va_start:
3410 case Builtin::BI__builtin_va_end:
3414 BuiltinID != Builtin::BI__builtin_va_end);
3416 case Builtin::BI__builtin_va_copy: {
3423 case Builtin::BIabs:
3424 case Builtin::BIlabs:
3425 case Builtin::BIllabs:
3426 case Builtin::BI__builtin_abs:
3427 case Builtin::BI__builtin_labs:
3428 case Builtin::BI__builtin_llabs: {
3429 bool SanitizeOverflow =
SanOpts.
has(SanitizerKind::SignedIntegerOverflow);
3432 switch (
getLangOpts().getSignedOverflowBehavior()) {
3437 if (!SanitizeOverflow) {
3449 case Builtin::BI__builtin_complex: {
3454 case Builtin::BI__builtin_conj:
3455 case Builtin::BI__builtin_conjf:
3456 case Builtin::BI__builtin_conjl:
3457 case Builtin::BIconj:
3458 case Builtin::BIconjf:
3459 case Builtin::BIconjl: {
3461 Value *Real = ComplexVal.first;
3462 Value *Imag = ComplexVal.second;
3463 Imag =
Builder.CreateFNeg(Imag,
"neg");
3466 case Builtin::BI__builtin_creal:
3467 case Builtin::BI__builtin_crealf:
3468 case Builtin::BI__builtin_creall:
3469 case Builtin::BIcreal:
3470 case Builtin::BIcrealf:
3471 case Builtin::BIcreall: {
3476 case Builtin::BI__builtin_preserve_access_index: {
3497 case Builtin::BI__builtin_cimag:
3498 case Builtin::BI__builtin_cimagf:
3499 case Builtin::BI__builtin_cimagl:
3500 case Builtin::BIcimag:
3501 case Builtin::BIcimagf:
3502 case Builtin::BIcimagl: {
3507 case Builtin::BI__builtin_clrsb:
3508 case Builtin::BI__builtin_clrsbl:
3509 case Builtin::BI__builtin_clrsbll: {
3513 llvm::Type *ArgType = ArgValue->
getType();
3517 Value *
Zero = llvm::Constant::getNullValue(ArgType);
3518 Value *IsNeg =
Builder.CreateICmpSLT(ArgValue, Zero,
"isneg");
3520 Value *Tmp =
Builder.CreateSelect(IsNeg, Inverse, ArgValue);
3527 case Builtin::BI__builtin_ctzs:
3528 case Builtin::BI__builtin_ctz:
3529 case Builtin::BI__builtin_ctzl:
3530 case Builtin::BI__builtin_ctzll:
3531 case Builtin::BI__builtin_ctzg: {
3532 bool HasFallback = BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_ctzg &&
3533 E->getNumArgs() > 1;
3539 llvm::Type *ArgType = ArgValue->
getType();
3546 if (
Result->getType() != ResultType)
3552 Value *
Zero = Constant::getNullValue(ArgType);
3553 Value *IsZero =
Builder.CreateICmpEQ(ArgValue, Zero,
"iszero");
3555 Value *ResultOrFallback =
3556 Builder.CreateSelect(IsZero, FallbackValue,
Result,
"ctzg");
3559 case Builtin::BI__builtin_clzs:
3560 case Builtin::BI__builtin_clz:
3561 case Builtin::BI__builtin_clzl:
3562 case Builtin::BI__builtin_clzll:
3563 case Builtin::BI__builtin_clzg: {
3564 bool HasFallback = BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_clzg &&
3565 E->getNumArgs() > 1;
3571 llvm::Type *ArgType = ArgValue->
getType();
3578 if (
Result->getType() != ResultType)
3584 Value *
Zero = Constant::getNullValue(ArgType);
3585 Value *IsZero =
Builder.CreateICmpEQ(ArgValue, Zero,
"iszero");
3587 Value *ResultOrFallback =
3588 Builder.CreateSelect(IsZero, FallbackValue,
Result,
"clzg");
3591 case Builtin::BI__builtin_ffs:
3592 case Builtin::BI__builtin_ffsl:
3593 case Builtin::BI__builtin_ffsll: {
3597 llvm::Type *ArgType = ArgValue->
getType();
3602 Builder.CreateAdd(
Builder.CreateCall(F, {ArgValue, Builder.getTrue()}),
3603 llvm::ConstantInt::get(ArgType, 1));
3604 Value *
Zero = llvm::Constant::getNullValue(ArgType);
3605 Value *IsZero =
Builder.CreateICmpEQ(ArgValue, Zero,
"iszero");
3607 if (
Result->getType() != ResultType)
3612 case Builtin::BI__builtin_parity:
3613 case Builtin::BI__builtin_parityl:
3614 case Builtin::BI__builtin_parityll: {
3618 llvm::Type *ArgType = ArgValue->
getType();
3624 if (
Result->getType() != ResultType)
3629 case Builtin::BI__lzcnt16:
3630 case Builtin::BI__lzcnt:
3631 case Builtin::BI__lzcnt64: {
3634 llvm::Type *ArgType = ArgValue->
getType();
3639 if (
Result->getType() != ResultType)
3644 case Builtin::BI__popcnt16:
3645 case Builtin::BI__popcnt:
3646 case Builtin::BI__popcnt64:
3647 case Builtin::BI__builtin_popcount:
3648 case Builtin::BI__builtin_popcountl:
3649 case Builtin::BI__builtin_popcountll:
3650 case Builtin::BI__builtin_popcountg: {
3653 llvm::Type *ArgType = ArgValue->
getType();
3658 if (
Result->getType() != ResultType)
3663 case Builtin::BI__builtin_unpredictable: {
3669 case Builtin::BI__builtin_expect: {
3671 llvm::Type *ArgType = ArgValue->
getType();
3682 Builder.CreateCall(FnExpect, {ArgValue, ExpectedValue},
"expval");
3685 case Builtin::BI__builtin_expect_with_probability: {
3687 llvm::Type *ArgType = ArgValue->
getType();
3690 llvm::APFloat Probability(0.0);
3691 const Expr *ProbArg =
E->getArg(2);
3693 assert(EvalSucceed &&
"probability should be able to evaluate as float");
3695 bool LoseInfo =
false;
3696 Probability.convert(llvm::APFloat::IEEEdouble(),
3697 llvm::RoundingMode::Dynamic, &LoseInfo);
3699 Constant *Confidence = ConstantFP::get(Ty, Probability);
3709 FnExpect, {ArgValue, ExpectedValue, Confidence},
"expval");
3712 case Builtin::BI__builtin_assume_aligned: {
3713 const Expr *Ptr =
E->getArg(0);
3715 Value *OffsetValue =
3719 ConstantInt *AlignmentCI = cast<ConstantInt>(AlignmentValue);
3720 if (AlignmentCI->getValue().ugt(llvm::Value::MaximumAlignment))
3721 AlignmentCI = ConstantInt::get(AlignmentCI->getIntegerType(),
3722 llvm::Value::MaximumAlignment);
3726 AlignmentCI, OffsetValue);
3729 case Builtin::BI__assume:
3730 case Builtin::BI__builtin_assume: {
3736 Builder.CreateCall(FnAssume, ArgValue);
3739 case Builtin::BI__builtin_assume_separate_storage: {
3740 const Expr *Arg0 =
E->getArg(0);
3741 const Expr *Arg1 =
E->getArg(1);
3746 Value *Values[] = {Value0, Value1};
3747 OperandBundleDefT<Value *> OBD(
"separate_storage", Values);
3751 case Builtin::BI__builtin_allow_runtime_check: {
3755 llvm::Value *Allow =
Builder.CreateCall(
3757 llvm::MetadataAsValue::get(Ctx, llvm::MDString::get(Ctx, Kind)));
3760 case Builtin::BI__arithmetic_fence: {
3763 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
3764 llvm::FastMathFlags FMF =
Builder.getFastMathFlags();
3765 bool isArithmeticFenceEnabled =
3766 FMF.allowReassoc() &&
3770 if (isArithmeticFenceEnabled) {
3773 Value *Real =
Builder.CreateArithmeticFence(ComplexVal.first,
3775 Value *Imag =
Builder.CreateArithmeticFence(ComplexVal.second,
3780 Value *Real = ComplexVal.first;
3781 Value *Imag = ComplexVal.second;
3785 if (isArithmeticFenceEnabled)
3790 case Builtin::BI__builtin_bswap16:
3791 case Builtin::BI__builtin_bswap32:
3792 case Builtin::BI__builtin_bswap64:
3793 case Builtin::BI_byteswap_ushort:
3794 case Builtin::BI_byteswap_ulong:
3795 case Builtin::BI_byteswap_uint64: {
3797 emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::bswap));
3799 case Builtin::BI__builtin_bitreverse8:
3800 case Builtin::BI__builtin_bitreverse16:
3801 case Builtin::BI__builtin_bitreverse32:
3802 case Builtin::BI__builtin_bitreverse64: {
3804 emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::bitreverse));
3806 case Builtin::BI__builtin_rotateleft8:
3807 case Builtin::BI__builtin_rotateleft16:
3808 case Builtin::BI__builtin_rotateleft32:
3809 case Builtin::BI__builtin_rotateleft64:
3810 case Builtin::BI_rotl8:
3811 case Builtin::BI_rotl16:
3812 case Builtin::BI_rotl:
3813 case Builtin::BI_lrotl:
3814 case Builtin::BI_rotl64:
3817 case Builtin::BI__builtin_rotateright8:
3818 case Builtin::BI__builtin_rotateright16:
3819 case Builtin::BI__builtin_rotateright32:
3820 case Builtin::BI__builtin_rotateright64:
3821 case Builtin::BI_rotr8:
3822 case Builtin::BI_rotr16:
3823 case Builtin::BI_rotr:
3824 case Builtin::BI_lrotr:
3825 case Builtin::BI_rotr64:
3828 case Builtin::BI__builtin_constant_p: {
3831 const Expr *Arg =
E->getArg(0);
3839 return RValue::get(ConstantInt::get(ResultType, 0));
3844 return RValue::get(ConstantInt::get(ResultType, 0));
3856 if (
Result->getType() != ResultType)
3860 case Builtin::BI__builtin_dynamic_object_size:
3861 case Builtin::BI__builtin_object_size: {
3868 bool IsDynamic = BuiltinID == Builtin::BI__builtin_dynamic_object_size;
3870 nullptr, IsDynamic));
3872 case Builtin::BI__builtin_counted_by_ref: {
3874 llvm::Value *
Result = llvm::ConstantPointerNull::get(
3879 if (
auto *UO = dyn_cast<UnaryOperator>(Arg);
3880 UO && UO->getOpcode() == UO_AddrOf) {
3883 if (
auto *ASE = dyn_cast<ArraySubscriptExpr>(Arg))
3887 if (
const MemberExpr *ME = dyn_cast_if_present<MemberExpr>(Arg)) {
3891 const auto *FAMDecl = cast<FieldDecl>(ME->getMemberDecl());
3895 llvm::report_fatal_error(
"Cannot find the counted_by 'count' field");
3901 case Builtin::BI__builtin_prefetch: {
3905 llvm::ConstantInt::get(
Int32Ty, 0);
3907 llvm::ConstantInt::get(
Int32Ty, 3);
3913 case Builtin::BI__builtin_readcyclecounter: {
3917 case Builtin::BI__builtin_readsteadycounter: {
3921 case Builtin::BI__builtin___clear_cache: {
3927 case Builtin::BI__builtin_trap:
3930 case Builtin::BI__builtin_verbose_trap: {
3931 llvm::DILocation *TrapLocation =
Builder.getCurrentDebugLocation();
3942 case Builtin::BI__debugbreak:
3945 case Builtin::BI__builtin_unreachable: {
3954 case Builtin::BI__builtin_powi:
3955 case Builtin::BI__builtin_powif:
3956 case Builtin::BI__builtin_powil: {
3960 if (
Builder.getIsFPConstrained()) {
3963 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
3970 { Src0->getType(), Src1->getType() });
3973 case Builtin::BI__builtin_frexpl: {
3977 if (&
getTarget().getLongDoubleFormat() == &llvm::APFloat::PPCDoubleDouble())
3981 case Builtin::BI__builtin_frexp:
3982 case Builtin::BI__builtin_frexpf:
3983 case Builtin::BI__builtin_frexpf128:
3984 case Builtin::BI__builtin_frexpf16:
3986 case Builtin::BI__builtin_isgreater:
3987 case Builtin::BI__builtin_isgreaterequal:
3988 case Builtin::BI__builtin_isless:
3989 case Builtin::BI__builtin_islessequal:
3990 case Builtin::BI__builtin_islessgreater:
3991 case Builtin::BI__builtin_isunordered: {
3994 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
3998 switch (BuiltinID) {
3999 default: llvm_unreachable(
"Unknown ordered comparison");
4000 case Builtin::BI__builtin_isgreater:
4001 LHS =
Builder.CreateFCmpOGT(LHS, RHS,
"cmp");
4003 case Builtin::BI__builtin_isgreaterequal:
4004 LHS =
Builder.CreateFCmpOGE(LHS, RHS,
"cmp");
4006 case Builtin::BI__builtin_isless:
4007 LHS =
Builder.CreateFCmpOLT(LHS, RHS,
"cmp");
4009 case Builtin::BI__builtin_islessequal:
4010 LHS =
Builder.CreateFCmpOLE(LHS, RHS,
"cmp");
4012 case Builtin::BI__builtin_islessgreater:
4013 LHS =
Builder.CreateFCmpONE(LHS, RHS,
"cmp");
4015 case Builtin::BI__builtin_isunordered:
4016 LHS =
Builder.CreateFCmpUNO(LHS, RHS,
"cmp");
4023 case Builtin::BI__builtin_isnan: {
4024 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4033 case Builtin::BI__builtin_issignaling: {
4034 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4041 case Builtin::BI__builtin_isinf: {
4042 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4051 case Builtin::BIfinite:
4052 case Builtin::BI__finite:
4053 case Builtin::BIfinitef:
4054 case Builtin::BI__finitef:
4055 case Builtin::BIfinitel:
4056 case Builtin::BI__finitel:
4057 case Builtin::BI__builtin_isfinite: {
4058 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4067 case Builtin::BI__builtin_isnormal: {
4068 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4075 case Builtin::BI__builtin_issubnormal: {
4076 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4079 Builder.CreateZExt(
Builder.createIsFPClass(
V, FPClassTest::fcSubnormal),
4083 case Builtin::BI__builtin_iszero: {
4084 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4091 case Builtin::BI__builtin_isfpclass: {
4096 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4102 case Builtin::BI__builtin_nondeterministic_value: {
4111 case Builtin::BI__builtin_elementwise_abs: {
4116 QT = VecTy->getElementType();
4120 Builder.getFalse(),
nullptr,
"elt.abs");
4122 Result = emitBuiltinWithOneOverloadedType<1>(
4123 *
this,
E, llvm::Intrinsic::fabs,
"elt.abs");
4127 case Builtin::BI__builtin_elementwise_acos:
4128 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4129 *
this,
E, llvm::Intrinsic::acos,
"elt.acos"));
4130 case Builtin::BI__builtin_elementwise_asin:
4131 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4132 *
this,
E, llvm::Intrinsic::asin,
"elt.asin"));
4133 case Builtin::BI__builtin_elementwise_atan:
4134 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4135 *
this,
E, llvm::Intrinsic::atan,
"elt.atan"));
4136 case Builtin::BI__builtin_elementwise_atan2:
4137 return RValue::get(emitBuiltinWithOneOverloadedType<2>(
4138 *
this,
E, llvm::Intrinsic::atan2,
"elt.atan2"));
4139 case Builtin::BI__builtin_elementwise_ceil:
4140 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4141 *
this,
E, llvm::Intrinsic::ceil,
"elt.ceil"));
4142 case Builtin::BI__builtin_elementwise_exp:
4143 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4144 *
this,
E, llvm::Intrinsic::exp,
"elt.exp"));
4145 case Builtin::BI__builtin_elementwise_exp2:
4146 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4147 *
this,
E, llvm::Intrinsic::exp2,
"elt.exp2"));
4148 case Builtin::BI__builtin_elementwise_log:
4149 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4150 *
this,
E, llvm::Intrinsic::log,
"elt.log"));
4151 case Builtin::BI__builtin_elementwise_log2:
4152 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4153 *
this,
E, llvm::Intrinsic::log2,
"elt.log2"));
4154 case Builtin::BI__builtin_elementwise_log10:
4155 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4156 *
this,
E, llvm::Intrinsic::log10,
"elt.log10"));
4157 case Builtin::BI__builtin_elementwise_pow: {
4159 emitBuiltinWithOneOverloadedType<2>(*
this,
E, llvm::Intrinsic::pow));
4161 case Builtin::BI__builtin_elementwise_bitreverse:
4162 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4163 *
this,
E, llvm::Intrinsic::bitreverse,
"elt.bitreverse"));
4164 case Builtin::BI__builtin_elementwise_cos:
4165 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4166 *
this,
E, llvm::Intrinsic::cos,
"elt.cos"));
4167 case Builtin::BI__builtin_elementwise_cosh:
4168 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4169 *
this,
E, llvm::Intrinsic::cosh,
"elt.cosh"));
4170 case Builtin::BI__builtin_elementwise_floor:
4171 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4172 *
this,
E, llvm::Intrinsic::floor,
"elt.floor"));
4173 case Builtin::BI__builtin_elementwise_popcount:
4174 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4175 *
this,
E, llvm::Intrinsic::ctpop,
"elt.ctpop"));
4176 case Builtin::BI__builtin_elementwise_roundeven:
4177 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4178 *
this,
E, llvm::Intrinsic::roundeven,
"elt.roundeven"));
4179 case Builtin::BI__builtin_elementwise_round:
4180 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4181 *
this,
E, llvm::Intrinsic::round,
"elt.round"));
4182 case Builtin::BI__builtin_elementwise_rint:
4183 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4184 *
this,
E, llvm::Intrinsic::rint,
"elt.rint"));
4185 case Builtin::BI__builtin_elementwise_nearbyint:
4186 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4187 *
this,
E, llvm::Intrinsic::nearbyint,
"elt.nearbyint"));
4188 case Builtin::BI__builtin_elementwise_sin:
4189 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4190 *
this,
E, llvm::Intrinsic::sin,
"elt.sin"));
4191 case Builtin::BI__builtin_elementwise_sinh:
4192 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4193 *
this,
E, llvm::Intrinsic::sinh,
"elt.sinh"));
4194 case Builtin::BI__builtin_elementwise_tan:
4195 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4196 *
this,
E, llvm::Intrinsic::tan,
"elt.tan"));
4197 case Builtin::BI__builtin_elementwise_tanh:
4198 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4199 *
this,
E, llvm::Intrinsic::tanh,
"elt.tanh"));
4200 case Builtin::BI__builtin_elementwise_trunc:
4201 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4202 *
this,
E, llvm::Intrinsic::trunc,
"elt.trunc"));
4203 case Builtin::BI__builtin_elementwise_canonicalize:
4204 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4205 *
this,
E, llvm::Intrinsic::canonicalize,
"elt.canonicalize"));
4206 case Builtin::BI__builtin_elementwise_copysign:
4207 return RValue::get(emitBuiltinWithOneOverloadedType<2>(
4208 *
this,
E, llvm::Intrinsic::copysign));
4209 case Builtin::BI__builtin_elementwise_fma:
4211 emitBuiltinWithOneOverloadedType<3>(*
this,
E, llvm::Intrinsic::fma));
4212 case Builtin::BI__builtin_elementwise_add_sat:
4213 case Builtin::BI__builtin_elementwise_sub_sat: {
4217 assert(Op0->
getType()->isIntOrIntVectorTy() &&
"integer type expected");
4220 Ty = VecTy->getElementType();
4223 if (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_add_sat)
4224 Opc = IsSigned ? llvm::Intrinsic::sadd_sat : llvm::Intrinsic::uadd_sat;
4226 Opc = IsSigned ? llvm::Intrinsic::ssub_sat : llvm::Intrinsic::usub_sat;
4227 Result =
Builder.CreateBinaryIntrinsic(Opc, Op0, Op1,
nullptr,
"elt.sat");
4231 case Builtin::BI__builtin_elementwise_max: {
4235 if (Op0->
getType()->isIntOrIntVectorTy()) {
4238 Ty = VecTy->getElementType();
4240 ? llvm::Intrinsic::smax
4241 : llvm::Intrinsic::umax,
4242 Op0, Op1,
nullptr,
"elt.max");
4247 case Builtin::BI__builtin_elementwise_min: {
4251 if (Op0->
getType()->isIntOrIntVectorTy()) {
4254 Ty = VecTy->getElementType();
4256 ? llvm::Intrinsic::smin
4257 : llvm::Intrinsic::umin,
4258 Op0, Op1,
nullptr,
"elt.min");
4264 case Builtin::BI__builtin_elementwise_maximum: {
4268 Op1,
nullptr,
"elt.maximum");
4272 case Builtin::BI__builtin_elementwise_minimum: {
4276 Op1,
nullptr,
"elt.minimum");
4280 case Builtin::BI__builtin_reduce_max: {
4281 auto GetIntrinsicID = [
this](
QualType QT) {
4283 QT = VecTy->getElementType();
4288 return llvm::Intrinsic::vector_reduce_smax;
4290 return llvm::Intrinsic::vector_reduce_umax;
4292 return llvm::Intrinsic::vector_reduce_fmax;
4294 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4295 *
this,
E, GetIntrinsicID(
E->getArg(0)->
getType()),
"rdx.min"));
4298 case Builtin::BI__builtin_reduce_min: {
4299 auto GetIntrinsicID = [
this](
QualType QT) {
4301 QT = VecTy->getElementType();
4306 return llvm::Intrinsic::vector_reduce_smin;
4308 return llvm::Intrinsic::vector_reduce_umin;
4310 return llvm::Intrinsic::vector_reduce_fmin;
4313 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4314 *
this,
E, GetIntrinsicID(
E->getArg(0)->
getType()),
"rdx.min"));
4317 case Builtin::BI__builtin_reduce_add:
4318 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4319 *
this,
E, llvm::Intrinsic::vector_reduce_add,
"rdx.add"));
4320 case Builtin::BI__builtin_reduce_mul:
4321 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4322 *
this,
E, llvm::Intrinsic::vector_reduce_mul,
"rdx.mul"));
4323 case Builtin::BI__builtin_reduce_xor:
4324 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4325 *
this,
E, llvm::Intrinsic::vector_reduce_xor,
"rdx.xor"));
4326 case Builtin::BI__builtin_reduce_or:
4327 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4328 *
this,
E, llvm::Intrinsic::vector_reduce_or,
"rdx.or"));
4329 case Builtin::BI__builtin_reduce_and:
4330 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4331 *
this,
E, llvm::Intrinsic::vector_reduce_and,
"rdx.and"));
4332 case Builtin::BI__builtin_reduce_maximum:
4333 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4334 *
this,
E, llvm::Intrinsic::vector_reduce_fmaximum,
"rdx.maximum"));
4335 case Builtin::BI__builtin_reduce_minimum:
4336 return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4337 *
this,
E, llvm::Intrinsic::vector_reduce_fminimum,
"rdx.minimum"));
4339 case Builtin::BI__builtin_matrix_transpose: {
4343 Value *
Result = MB.CreateMatrixTranspose(MatValue, MatrixTy->getNumRows(),
4344 MatrixTy->getNumColumns());
4348 case Builtin::BI__builtin_matrix_column_major_load: {
4354 assert(PtrTy &&
"arg0 must be of pointer type");
4364 ResultTy->getNumRows(), ResultTy->getNumColumns(),
"matrix");
4368 case Builtin::BI__builtin_matrix_column_major_store: {
4376 assert(PtrTy &&
"arg1 must be of pointer type");
4385 MatrixTy->getNumRows(), MatrixTy->getNumColumns());
4389 case Builtin::BI__builtin_isinf_sign: {
4391 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4396 AbsArg, ConstantFP::getInfinity(Arg->
getType()),
"isinf");
4402 Value *NegativeOne = ConstantInt::get(
IntTy, -1);
4403 Value *SignResult =
Builder.CreateSelect(IsNeg, NegativeOne, One);
4408 case Builtin::BI__builtin_flt_rounds: {
4413 if (
Result->getType() != ResultType)
4419 case Builtin::BI__builtin_set_flt_rounds: {
4427 case Builtin::BI__builtin_fpclassify: {
4428 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
4439 "fpclassify_result");
4443 Value *IsZero =
Builder.CreateFCmpOEQ(
V, Constant::getNullValue(Ty),
4447 Builder.CreateCondBr(IsZero, End, NotZero);
4451 Builder.SetInsertPoint(NotZero);
4455 Builder.CreateCondBr(IsNan, End, NotNan);
4456 Result->addIncoming(NanLiteral, NotZero);
4459 Builder.SetInsertPoint(NotNan);
4462 Builder.CreateFCmpOEQ(VAbs, ConstantFP::getInfinity(
V->getType()),
4466 Builder.CreateCondBr(IsInf, End, NotInf);
4467 Result->addIncoming(InfLiteral, NotNan);
4470 Builder.SetInsertPoint(NotInf);
4471 APFloat Smallest = APFloat::getSmallestNormalized(
4474 Builder.CreateFCmpUGE(VAbs, ConstantFP::get(
V->getContext(), Smallest),
4476 Value *NormalResult =
4480 Result->addIncoming(NormalResult, NotInf);
4493 case Builtin::BIalloca:
4494 case Builtin::BI_alloca:
4495 case Builtin::BI__builtin_alloca_uninitialized:
4496 case Builtin::BI__builtin_alloca: {
4500 const Align SuitableAlignmentInBytes =
4504 AllocaInst *AI =
Builder.CreateAlloca(
Builder.getInt8Ty(), Size);
4505 AI->setAlignment(SuitableAlignmentInBytes);
4506 if (BuiltinID != Builtin::BI__builtin_alloca_uninitialized)
4518 case Builtin::BI__builtin_alloca_with_align_uninitialized:
4519 case Builtin::BI__builtin_alloca_with_align: {
4522 auto *AlignmentInBitsCI = cast<ConstantInt>(AlignmentInBitsValue);
4523 unsigned AlignmentInBits = AlignmentInBitsCI->getZExtValue();
4524 const Align AlignmentInBytes =
4526 AllocaInst *AI =
Builder.CreateAlloca(
Builder.getInt8Ty(), Size);
4527 AI->setAlignment(AlignmentInBytes);
4528 if (BuiltinID != Builtin::BI__builtin_alloca_with_align_uninitialized)
4540 case Builtin::BIbzero:
4541 case Builtin::BI__builtin_bzero: {
4550 case Builtin::BIbcopy:
4551 case Builtin::BI__builtin_bcopy: {
4565 case Builtin::BImemcpy:
4566 case Builtin::BI__builtin_memcpy:
4567 case Builtin::BImempcpy:
4568 case Builtin::BI__builtin_mempcpy: {
4572 EmitArgCheck(
TCK_Store, Dest,
E->getArg(0), 0);
4573 EmitArgCheck(
TCK_Load, Src,
E->getArg(1), 1);
4575 if (BuiltinID == Builtin::BImempcpy ||
4576 BuiltinID == Builtin::BI__builtin_mempcpy)
4583 case Builtin::BI__builtin_memcpy_inline: {
4588 EmitArgCheck(
TCK_Store, Dest,
E->getArg(0), 0);
4589 EmitArgCheck(
TCK_Load, Src,
E->getArg(1), 1);
4594 case Builtin::BI__builtin_char_memchr:
4595 BuiltinID = Builtin::BI__builtin_memchr;
4598 case Builtin::BI__builtin___memcpy_chk: {
4605 llvm::APSInt DstSize = DstSizeResult.
Val.
getInt();
4606 if (
Size.ugt(DstSize))
4610 Value *SizeVal = llvm::ConstantInt::get(
Builder.getContext(), Size);
4615 case Builtin::BI__builtin_objc_memmove_collectable: {
4620 DestAddr, SrcAddr, SizeVal);
4624 case Builtin::BI__builtin___memmove_chk: {
4631 llvm::APSInt DstSize = DstSizeResult.
Val.
getInt();
4632 if (
Size.ugt(DstSize))
4636 Value *SizeVal = llvm::ConstantInt::get(
Builder.getContext(), Size);
4641 case Builtin::BImemmove:
4642 case Builtin::BI__builtin_memmove: {
4646 EmitArgCheck(
TCK_Store, Dest,
E->getArg(0), 0);
4647 EmitArgCheck(
TCK_Load, Src,
E->getArg(1), 1);
4651 case Builtin::BImemset:
4652 case Builtin::BI__builtin_memset: {
4662 case Builtin::BI__builtin_memset_inline: {
4674 case Builtin::BI__builtin___memset_chk: {
4681 llvm::APSInt DstSize = DstSizeResult.
Val.
getInt();
4682 if (
Size.ugt(DstSize))
4687 Value *SizeVal = llvm::ConstantInt::get(
Builder.getContext(), Size);
4691 case Builtin::BI__builtin_wmemchr: {
4694 if (!
getTarget().getTriple().isOSMSVCRT())
4702 BasicBlock *Entry =
Builder.GetInsertBlock();
4707 Builder.CreateCondBr(SizeEq0, Exit, CmpEq);
4711 StrPhi->addIncoming(Str, Entry);
4713 SizePhi->addIncoming(Size, Entry);
4717 Value *FoundChr =
Builder.CreateConstInBoundsGEP1_32(WCharTy, StrPhi, 0);
4719 Builder.CreateCondBr(StrEqChr, Exit, Next);
4722 Value *NextStr =
Builder.CreateConstInBoundsGEP1_32(WCharTy, StrPhi, 1);
4724 Value *NextSizeEq0 =
4725 Builder.CreateICmpEQ(NextSize, ConstantInt::get(
SizeTy, 0));
4726 Builder.CreateCondBr(NextSizeEq0, Exit, CmpEq);
4727 StrPhi->addIncoming(NextStr, Next);
4728 SizePhi->addIncoming(NextSize, Next);
4732 Ret->addIncoming(llvm::Constant::getNullValue(Str->
getType()), Entry);
4733 Ret->addIncoming(llvm::Constant::getNullValue(Str->
getType()), Next);
4734 Ret->addIncoming(FoundChr, CmpEq);
4737 case Builtin::BI__builtin_wmemcmp: {
4740 if (!
getTarget().getTriple().isOSMSVCRT())
4749 BasicBlock *Entry =
Builder.GetInsertBlock();
4755 Builder.CreateCondBr(SizeEq0, Exit, CmpGT);
4759 DstPhi->addIncoming(Dst, Entry);
4761 SrcPhi->addIncoming(Src, Entry);
4763 SizePhi->addIncoming(Size, Entry);
4769 Builder.CreateCondBr(DstGtSrc, Exit, CmpLT);
4773 Builder.CreateCondBr(DstLtSrc, Exit, Next);
4776 Value *NextDst =
Builder.CreateConstInBoundsGEP1_32(WCharTy, DstPhi, 1);
4777 Value *NextSrc =
Builder.CreateConstInBoundsGEP1_32(WCharTy, SrcPhi, 1);
4779 Value *NextSizeEq0 =
4780 Builder.CreateICmpEQ(NextSize, ConstantInt::get(
SizeTy, 0));
4781 Builder.CreateCondBr(NextSizeEq0, Exit, CmpGT);
4782 DstPhi->addIncoming(NextDst, Next);
4783 SrcPhi->addIncoming(NextSrc, Next);
4784 SizePhi->addIncoming(NextSize, Next);
4788 Ret->addIncoming(ConstantInt::get(
IntTy, 0), Entry);
4789 Ret->addIncoming(ConstantInt::get(
IntTy, 1), CmpGT);
4790 Ret->addIncoming(ConstantInt::get(
IntTy, -1), CmpLT);
4791 Ret->addIncoming(ConstantInt::get(
IntTy, 0), Next);
4794 case Builtin::BI__builtin_dwarf_cfa: {
4807 llvm::ConstantInt::get(
Int32Ty, Offset)));
4809 case Builtin::BI__builtin_return_address: {
4815 case Builtin::BI_ReturnAddress: {
4819 case Builtin::BI__builtin_frame_address: {
4825 case Builtin::BI__builtin_extract_return_addr: {
4830 case Builtin::BI__builtin_frob_return_addr: {
4835 case Builtin::BI__builtin_dwarf_sp_column: {
4836 llvm::IntegerType *Ty
4845 case Builtin::BI__builtin_init_dwarf_reg_size_table: {
4851 case Builtin::BI__builtin_eh_return: {
4855 llvm::IntegerType *
IntTy = cast<llvm::IntegerType>(
Int->getType());
4856 assert((
IntTy->getBitWidth() == 32 ||
IntTy->getBitWidth() == 64) &&
4857 "LLVM's __builtin_eh_return only supports 32- and 64-bit variants");
4860 : Intrinsic::eh_return_i64);
4869 case Builtin::BI__builtin_unwind_init: {
4874 case Builtin::BI__builtin_extend_pointer: {
4899 case Builtin::BI__builtin_setjmp: {
4903 if (
getTarget().getTriple().getArch() == llvm::Triple::systemz) {
4914 ConstantInt::get(
Int32Ty, 0));
4928 case Builtin::BI__builtin_longjmp: {
4942 case Builtin::BI__builtin_launder: {
4943 const Expr *Arg =
E->getArg(0);
4951 case Builtin::BI__sync_fetch_and_add:
4952 case Builtin::BI__sync_fetch_and_sub:
4953 case Builtin::BI__sync_fetch_and_or:
4954 case Builtin::BI__sync_fetch_and_and:
4955 case Builtin::BI__sync_fetch_and_xor:
4956 case Builtin::BI__sync_fetch_and_nand:
4957 case Builtin::BI__sync_add_and_fetch:
4958 case Builtin::BI__sync_sub_and_fetch:
4959 case Builtin::BI__sync_and_and_fetch:
4960 case Builtin::BI__sync_or_and_fetch:
4961 case Builtin::BI__sync_xor_and_fetch:
4962 case Builtin::BI__sync_nand_and_fetch:
4963 case Builtin::BI__sync_val_compare_and_swap:
4964 case Builtin::BI__sync_bool_compare_and_swap:
4965 case Builtin::BI__sync_lock_test_and_set:
4966 case Builtin::BI__sync_lock_release:
4967 case Builtin::BI__sync_swap:
4968 llvm_unreachable(
"Shouldn't make it through sema");
4969 case Builtin::BI__sync_fetch_and_add_1:
4970 case Builtin::BI__sync_fetch_and_add_2:
4971 case Builtin::BI__sync_fetch_and_add_4:
4972 case Builtin::BI__sync_fetch_and_add_8:
4973 case Builtin::BI__sync_fetch_and_add_16:
4975 case Builtin::BI__sync_fetch_and_sub_1:
4976 case Builtin::BI__sync_fetch_and_sub_2:
4977 case Builtin::BI__sync_fetch_and_sub_4:
4978 case Builtin::BI__sync_fetch_and_sub_8:
4979 case Builtin::BI__sync_fetch_and_sub_16:
4981 case Builtin::BI__sync_fetch_and_or_1:
4982 case Builtin::BI__sync_fetch_and_or_2:
4983 case Builtin::BI__sync_fetch_and_or_4:
4984 case Builtin::BI__sync_fetch_and_or_8:
4985 case Builtin::BI__sync_fetch_and_or_16:
4987 case Builtin::BI__sync_fetch_and_and_1:
4988 case Builtin::BI__sync_fetch_and_and_2:
4989 case Builtin::BI__sync_fetch_and_and_4:
4990 case Builtin::BI__sync_fetch_and_and_8:
4991 case Builtin::BI__sync_fetch_and_and_16:
4993 case Builtin::BI__sync_fetch_and_xor_1:
4994 case Builtin::BI__sync_fetch_and_xor_2:
4995 case Builtin::BI__sync_fetch_and_xor_4:
4996 case Builtin::BI__sync_fetch_and_xor_8:
4997 case Builtin::BI__sync_fetch_and_xor_16:
4999 case Builtin::BI__sync_fetch_and_nand_1:
5000 case Builtin::BI__sync_fetch_and_nand_2:
5001 case Builtin::BI__sync_fetch_and_nand_4:
5002 case Builtin::BI__sync_fetch_and_nand_8:
5003 case Builtin::BI__sync_fetch_and_nand_16:
5007 case Builtin::BI__sync_fetch_and_min:
5009 case Builtin::BI__sync_fetch_and_max:
5011 case Builtin::BI__sync_fetch_and_umin:
5013 case Builtin::BI__sync_fetch_and_umax:
5016 case Builtin::BI__sync_add_and_fetch_1:
5017 case Builtin::BI__sync_add_and_fetch_2:
5018 case Builtin::BI__sync_add_and_fetch_4:
5019 case Builtin::BI__sync_add_and_fetch_8:
5020 case Builtin::BI__sync_add_and_fetch_16:
5022 llvm::Instruction::Add);
5023 case Builtin::BI__sync_sub_and_fetch_1:
5024 case Builtin::BI__sync_sub_and_fetch_2:
5025 case Builtin::BI__sync_sub_and_fetch_4:
5026 case Builtin::BI__sync_sub_and_fetch_8:
5027 case Builtin::BI__sync_sub_and_fetch_16:
5029 llvm::Instruction::Sub);
5030 case Builtin::BI__sync_and_and_fetch_1:
5031 case Builtin::BI__sync_and_and_fetch_2:
5032 case Builtin::BI__sync_and_and_fetch_4:
5033 case Builtin::BI__sync_and_and_fetch_8:
5034 case Builtin::BI__sync_and_and_fetch_16:
5036 llvm::Instruction::And);
5037 case Builtin::BI__sync_or_and_fetch_1:
5038 case Builtin::BI__sync_or_and_fetch_2:
5039 case Builtin::BI__sync_or_and_fetch_4:
5040 case Builtin::BI__sync_or_and_fetch_8:
5041 case Builtin::BI__sync_or_and_fetch_16:
5043 llvm::Instruction::Or);
5044 case Builtin::BI__sync_xor_and_fetch_1:
5045 case Builtin::BI__sync_xor_and_fetch_2:
5046 case Builtin::BI__sync_xor_and_fetch_4:
5047 case Builtin::BI__sync_xor_and_fetch_8:
5048 case Builtin::BI__sync_xor_and_fetch_16:
5050 llvm::Instruction::Xor);
5051 case Builtin::BI__sync_nand_and_fetch_1:
5052 case Builtin::BI__sync_nand_and_fetch_2:
5053 case Builtin::BI__sync_nand_and_fetch_4:
5054 case Builtin::BI__sync_nand_and_fetch_8:
5055 case Builtin::BI__sync_nand_and_fetch_16:
5057 llvm::Instruction::And,
true);
5059 case Builtin::BI__sync_val_compare_and_swap_1:
5060 case Builtin::BI__sync_val_compare_and_swap_2:
5061 case Builtin::BI__sync_val_compare_and_swap_4:
5062 case Builtin::BI__sync_val_compare_and_swap_8:
5063 case Builtin::BI__sync_val_compare_and_swap_16:
5066 case Builtin::BI__sync_bool_compare_and_swap_1:
5067 case Builtin::BI__sync_bool_compare_and_swap_2:
5068 case Builtin::BI__sync_bool_compare_and_swap_4:
5069 case Builtin::BI__sync_bool_compare_and_swap_8:
5070 case Builtin::BI__sync_bool_compare_and_swap_16:
5073 case Builtin::BI__sync_swap_1:
5074 case Builtin::BI__sync_swap_2:
5075 case Builtin::BI__sync_swap_4:
5076 case Builtin::BI__sync_swap_8:
5077 case Builtin::BI__sync_swap_16:
5080 case Builtin::BI__sync_lock_test_and_set_1:
5081 case Builtin::BI__sync_lock_test_and_set_2:
5082 case Builtin::BI__sync_lock_test_and_set_4:
5083 case Builtin::BI__sync_lock_test_and_set_8:
5084 case Builtin::BI__sync_lock_test_and_set_16:
5087 case Builtin::BI__sync_lock_release_1:
5088 case Builtin::BI__sync_lock_release_2:
5089 case Builtin::BI__sync_lock_release_4:
5090 case Builtin::BI__sync_lock_release_8:
5091 case Builtin::BI__sync_lock_release_16: {
5097 llvm::StoreInst *
Store =
5099 Store->setAtomic(llvm::AtomicOrdering::Release);
5103 case Builtin::BI__sync_synchronize: {
5111 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent);
5115 case Builtin::BI__builtin_nontemporal_load:
5117 case Builtin::BI__builtin_nontemporal_store:
5119 case Builtin::BI__c11_atomic_is_lock_free:
5120 case Builtin::BI__atomic_is_lock_free: {
5124 const char *LibCallName =
"__atomic_is_lock_free";
5128 if (BuiltinID == Builtin::BI__atomic_is_lock_free)
5142 case Builtin::BI__atomic_test_and_set: {
5154 if (isa<llvm::ConstantInt>(Order)) {
5155 int ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
5156 AtomicRMWInst *
Result =
nullptr;
5161 llvm::AtomicOrdering::Monotonic);
5166 llvm::AtomicOrdering::Acquire);
5170 llvm::AtomicOrdering::Release);
5175 llvm::AtomicOrdering::AcquireRelease);
5179 llvm::AtomicRMWInst::Xchg, Ptr, NewVal,
5180 llvm::AtomicOrdering::SequentiallyConsistent);
5183 Result->setVolatile(Volatile);
5189 llvm::BasicBlock *BBs[5] = {
5196 llvm::AtomicOrdering Orders[5] = {
5197 llvm::AtomicOrdering::Monotonic, llvm::AtomicOrdering::Acquire,
5198 llvm::AtomicOrdering::Release, llvm::AtomicOrdering::AcquireRelease,
5199 llvm::AtomicOrdering::SequentiallyConsistent};
5201 Order =
Builder.CreateIntCast(Order,
Builder.getInt32Ty(),
false);
5202 llvm::SwitchInst *SI =
Builder.CreateSwitch(Order, BBs[0]);
5204 Builder.SetInsertPoint(ContBB);
5207 for (
unsigned i = 0; i < 5; ++i) {
5208 Builder.SetInsertPoint(BBs[i]);
5210 Ptr, NewVal, Orders[i]);
5211 RMW->setVolatile(Volatile);
5212 Result->addIncoming(RMW, BBs[i]);
5216 SI->addCase(
Builder.getInt32(0), BBs[0]);
5217 SI->addCase(
Builder.getInt32(1), BBs[1]);
5218 SI->addCase(
Builder.getInt32(2), BBs[1]);
5219 SI->addCase(
Builder.getInt32(3), BBs[2]);
5220 SI->addCase(
Builder.getInt32(4), BBs[3]);
5221 SI->addCase(
Builder.getInt32(5), BBs[4]);
5223 Builder.SetInsertPoint(ContBB);
5227 case Builtin::BI__atomic_clear: {
5236 if (isa<llvm::ConstantInt>(Order)) {
5237 int ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
5242 Store->setOrdering(llvm::AtomicOrdering::Monotonic);
5245 Store->setOrdering(llvm::AtomicOrdering::Release);
5248 Store->setOrdering(llvm::AtomicOrdering::SequentiallyConsistent);
5256 llvm::BasicBlock *BBs[3] = {
5261 llvm::AtomicOrdering Orders[3] = {
5262 llvm::AtomicOrdering::Monotonic, llvm::AtomicOrdering::Release,
5263 llvm::AtomicOrdering::SequentiallyConsistent};
5265 Order =
Builder.CreateIntCast(Order,
Builder.getInt32Ty(),
false);
5266 llvm::SwitchInst *SI =
Builder.CreateSwitch(Order, BBs[0]);
5268 for (
unsigned i = 0; i < 3; ++i) {
5269 Builder.SetInsertPoint(BBs[i]);
5271 Store->setOrdering(Orders[i]);
5275 SI->addCase(
Builder.getInt32(0), BBs[0]);
5276 SI->addCase(
Builder.getInt32(3), BBs[1]);
5277 SI->addCase(
Builder.getInt32(5), BBs[2]);
5279 Builder.SetInsertPoint(ContBB);
5283 case Builtin::BI__atomic_thread_fence:
5284 case Builtin::BI__atomic_signal_fence:
5285 case Builtin::BI__c11_atomic_thread_fence:
5286 case Builtin::BI__c11_atomic_signal_fence: {
5287 llvm::SyncScope::ID SSID;
5288 if (BuiltinID == Builtin::BI__atomic_signal_fence ||
5289 BuiltinID == Builtin::BI__c11_atomic_signal_fence)
5290 SSID = llvm::SyncScope::SingleThread;
5292 SSID = llvm::SyncScope::System;
5294 if (isa<llvm::ConstantInt>(Order)) {
5295 int ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
5302 Builder.CreateFence(llvm::AtomicOrdering::Acquire, SSID);
5305 Builder.CreateFence(llvm::AtomicOrdering::Release, SSID);
5308 Builder.CreateFence(llvm::AtomicOrdering::AcquireRelease, SSID);
5311 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent, SSID);
5317 llvm::BasicBlock *AcquireBB, *ReleaseBB, *AcqRelBB, *SeqCstBB;
5324 Order =
Builder.CreateIntCast(Order,
Builder.getInt32Ty(),
false);
5325 llvm::SwitchInst *SI =
Builder.CreateSwitch(Order, ContBB);
5327 Builder.SetInsertPoint(AcquireBB);
5328 Builder.CreateFence(llvm::AtomicOrdering::Acquire, SSID);
5330 SI->addCase(
Builder.getInt32(1), AcquireBB);
5331 SI->addCase(
Builder.getInt32(2), AcquireBB);
5333 Builder.SetInsertPoint(ReleaseBB);
5334 Builder.CreateFence(llvm::AtomicOrdering::Release, SSID);
5336 SI->addCase(
Builder.getInt32(3), ReleaseBB);
5338 Builder.SetInsertPoint(AcqRelBB);
5339 Builder.CreateFence(llvm::AtomicOrdering::AcquireRelease, SSID);
5341 SI->addCase(
Builder.getInt32(4), AcqRelBB);
5343 Builder.SetInsertPoint(SeqCstBB);
5344 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent, SSID);
5346 SI->addCase(
Builder.getInt32(5), SeqCstBB);
5348 Builder.SetInsertPoint(ContBB);
5351 case Builtin::BI__scoped_atomic_thread_fence: {
5356 auto Ord = dyn_cast<llvm::ConstantInt>(Order);
5357 auto Scp = dyn_cast<llvm::ConstantInt>(
Scope);
5359 SyncScope SS = ScopeModel->isValid(Scp->getZExtValue())
5360 ? ScopeModel->map(Scp->getZExtValue())
5361 : ScopeModel->map(ScopeModel->getFallBackValue());
5362 switch (Ord->getZExtValue()) {
5369 llvm::AtomicOrdering::Acquire,
5371 llvm::AtomicOrdering::Acquire,
5376 llvm::AtomicOrdering::Release,
5378 llvm::AtomicOrdering::Release,
5382 Builder.CreateFence(llvm::AtomicOrdering::AcquireRelease,
5385 llvm::AtomicOrdering::AcquireRelease,
5389 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent,
5392 llvm::AtomicOrdering::SequentiallyConsistent,
5404 switch (Ord->getZExtValue()) {
5407 ContBB->eraseFromParent();
5411 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5412 llvm::AtomicOrdering::Acquire);
5415 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5416 llvm::AtomicOrdering::Release);
5419 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5420 llvm::AtomicOrdering::AcquireRelease);
5423 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5424 llvm::AtomicOrdering::SequentiallyConsistent);
5433 Order =
Builder.CreateIntCast(Order,
Builder.getInt32Ty(),
false);
5434 llvm::SwitchInst *SI =
Builder.CreateSwitch(Order, ContBB);
5435 SI->addCase(
Builder.getInt32(1), AcquireBB);
5436 SI->addCase(
Builder.getInt32(2), AcquireBB);
5437 SI->addCase(
Builder.getInt32(3), ReleaseBB);
5438 SI->addCase(
Builder.getInt32(4), AcqRelBB);
5439 SI->addCase(
Builder.getInt32(5), SeqCstBB);
5441 OrderBBs.emplace_back(AcquireBB, llvm::AtomicOrdering::Acquire);
5442 OrderBBs.emplace_back(ReleaseBB, llvm::AtomicOrdering::Release);
5443 OrderBBs.emplace_back(AcqRelBB, llvm::AtomicOrdering::AcquireRelease);
5444 OrderBBs.emplace_back(SeqCstBB,
5445 llvm::AtomicOrdering::SequentiallyConsistent);
5448 for (
auto &[OrderBB, Ordering] : OrderBBs) {
5449 Builder.SetInsertPoint(OrderBB);
5451 SyncScope SS = ScopeModel->isValid(Scp->getZExtValue())
5452 ? ScopeModel->map(Scp->getZExtValue())
5453 : ScopeModel->map(ScopeModel->getFallBackValue());
5459 llvm::DenseMap<unsigned, llvm::BasicBlock *> BBs;
5460 for (
unsigned Scp : ScopeModel->getRuntimeValues())
5464 llvm::SwitchInst *SI =
Builder.CreateSwitch(SC, ContBB);
5465 for (
unsigned Scp : ScopeModel->getRuntimeValues()) {
5467 SI->addCase(
Builder.getInt32(Scp), B);
5478 Builder.SetInsertPoint(ContBB);
5482 case Builtin::BI__builtin_signbit:
5483 case Builtin::BI__builtin_signbitf:
5484 case Builtin::BI__builtin_signbitl: {
5489 case Builtin::BI__warn_memset_zero_len:
5491 case Builtin::BI__annotation: {
5494 for (
const Expr *Arg :
E->arguments()) {
5496 assert(Str->getCharByteWidth() == 2);
5497 StringRef WideBytes = Str->getBytes();
5498 std::string StrUtf8;
5499 if (!convertUTF16ToUTF8String(
5500 ArrayRef(WideBytes.data(), WideBytes.size()), StrUtf8)) {
5504 Strings.push_back(llvm::MDString::get(
getLLVMContext(), StrUtf8));
5514 case Builtin::BI__builtin_annotation: {
5523 StringRef Str = cast<StringLiteral>(AnnotationStrExpr)->getString();
5527 case Builtin::BI__builtin_addcb:
5528 case Builtin::BI__builtin_addcs:
5529 case Builtin::BI__builtin_addc:
5530 case Builtin::BI__builtin_addcl:
5531 case Builtin::BI__builtin_addcll:
5532 case Builtin::BI__builtin_subcb:
5533 case Builtin::BI__builtin_subcs:
5534 case Builtin::BI__builtin_subc:
5535 case Builtin::BI__builtin_subcl:
5536 case Builtin::BI__builtin_subcll: {
5562 llvm::Intrinsic::ID IntrinsicId;
5563 switch (BuiltinID) {
5564 default: llvm_unreachable(
"Unknown multiprecision builtin id.");
5565 case Builtin::BI__builtin_addcb:
5566 case Builtin::BI__builtin_addcs:
5567 case Builtin::BI__builtin_addc:
5568 case Builtin::BI__builtin_addcl:
5569 case Builtin::BI__builtin_addcll:
5570 IntrinsicId = llvm::Intrinsic::uadd_with_overflow;
5572 case Builtin::BI__builtin_subcb:
5573 case Builtin::BI__builtin_subcs:
5574 case Builtin::BI__builtin_subc:
5575 case Builtin::BI__builtin_subcl:
5576 case Builtin::BI__builtin_subcll:
5577 IntrinsicId = llvm::Intrinsic::usub_with_overflow;
5582 llvm::Value *Carry1;
5585 llvm::Value *Carry2;
5587 Sum1, Carryin, Carry2);
5588 llvm::Value *CarryOut =
Builder.CreateZExt(
Builder.CreateOr(Carry1, Carry2),
5594 case Builtin::BI__builtin_add_overflow:
5595 case Builtin::BI__builtin_sub_overflow:
5596 case Builtin::BI__builtin_mul_overflow: {
5604 WidthAndSignedness LeftInfo =
5606 WidthAndSignedness RightInfo =
5608 WidthAndSignedness ResultInfo =
5615 RightInfo, ResultArg, ResultQTy,
5621 *
this, LeftArg, LeftInfo, RightArg, RightInfo, ResultArg, ResultQTy,
5624 WidthAndSignedness EncompassingInfo =
5627 llvm::Type *EncompassingLLVMTy =
5632 llvm::Intrinsic::ID IntrinsicId;
5633 switch (BuiltinID) {
5635 llvm_unreachable(
"Unknown overflow builtin id.");
5636 case Builtin::BI__builtin_add_overflow:
5637 IntrinsicId = EncompassingInfo.Signed
5638 ? llvm::Intrinsic::sadd_with_overflow
5639 : llvm::Intrinsic::uadd_with_overflow;
5641 case Builtin::BI__builtin_sub_overflow:
5642 IntrinsicId = EncompassingInfo.Signed
5643 ? llvm::Intrinsic::ssub_with_overflow
5644 : llvm::Intrinsic::usub_with_overflow;
5646 case Builtin::BI__builtin_mul_overflow:
5647 IntrinsicId = EncompassingInfo.Signed
5648 ? llvm::Intrinsic::smul_with_overflow
5649 : llvm::Intrinsic::umul_with_overflow;
5658 Left =
Builder.CreateIntCast(Left, EncompassingLLVMTy, LeftInfo.Signed);
5659 Right =
Builder.CreateIntCast(Right, EncompassingLLVMTy, RightInfo.Signed);
5662 llvm::Value *Overflow, *
Result;
5665 if (EncompassingInfo.Width > ResultInfo.Width) {
5668 llvm::Value *ResultTrunc =
Builder.CreateTrunc(
Result, ResultLLVMTy);
5672 llvm::Value *ResultTruncExt =
Builder.CreateIntCast(
5673 ResultTrunc, EncompassingLLVMTy, ResultInfo.Signed);
5674 llvm::Value *TruncationOverflow =
5677 Overflow =
Builder.CreateOr(Overflow, TruncationOverflow);
5689 case Builtin::BI__builtin_uadd_overflow:
5690 case Builtin::BI__builtin_uaddl_overflow:
5691 case Builtin::BI__builtin_uaddll_overflow:
5692 case Builtin::BI__builtin_usub_overflow:
5693 case Builtin::BI__builtin_usubl_overflow:
5694 case Builtin::BI__builtin_usubll_overflow:
5695 case Builtin::BI__builtin_umul_overflow:
5696 case Builtin::BI__builtin_umull_overflow:
5697 case Builtin::BI__builtin_umulll_overflow:
5698 case Builtin::BI__builtin_sadd_overflow:
5699 case Builtin::BI__builtin_saddl_overflow:
5700 case Builtin::BI__builtin_saddll_overflow:
5701 case Builtin::BI__builtin_ssub_overflow:
5702 case Builtin::BI__builtin_ssubl_overflow:
5703 case Builtin::BI__builtin_ssubll_overflow:
5704 case Builtin::BI__builtin_smul_overflow:
5705 case Builtin::BI__builtin_smull_overflow:
5706 case Builtin::BI__builtin_smulll_overflow: {
5716 llvm::Intrinsic::ID IntrinsicId;
5717 switch (BuiltinID) {
5718 default: llvm_unreachable(
"Unknown overflow builtin id.");
5719 case Builtin::BI__builtin_uadd_overflow:
5720 case Builtin::BI__builtin_uaddl_overflow:
5721 case Builtin::BI__builtin_uaddll_overflow:
5722 IntrinsicId = llvm::Intrinsic::uadd_with_overflow;
5724 case Builtin::BI__builtin_usub_overflow:
5725 case Builtin::BI__builtin_usubl_overflow:
5726 case Builtin::BI__builtin_usubll_overflow:
5727 IntrinsicId = llvm::Intrinsic::usub_with_overflow;
5729 case Builtin::BI__builtin_umul_overflow:
5730 case Builtin::BI__builtin_umull_overflow:
5731 case Builtin::BI__builtin_umulll_overflow:
5732 IntrinsicId = llvm::Intrinsic::umul_with_overflow;
5734 case Builtin::BI__builtin_sadd_overflow:
5735 case Builtin::BI__builtin_saddl_overflow:
5736 case Builtin::BI__builtin_saddll_overflow:
5737 IntrinsicId = llvm::Intrinsic::sadd_with_overflow;
5739 case Builtin::BI__builtin_ssub_overflow:
5740 case Builtin::BI__builtin_ssubl_overflow:
5741 case Builtin::BI__builtin_ssubll_overflow:
5742 IntrinsicId = llvm::Intrinsic::ssub_with_overflow;
5744 case Builtin::BI__builtin_smul_overflow:
5745 case Builtin::BI__builtin_smull_overflow:
5746 case Builtin::BI__builtin_smulll_overflow:
5747 IntrinsicId = llvm::Intrinsic::smul_with_overflow;
5758 case Builtin::BIaddressof:
5759 case Builtin::BI__addressof:
5760 case Builtin::BI__builtin_addressof:
5762 case Builtin::BI__builtin_function_start:
5765 case Builtin::BI__builtin_operator_new:
5768 case Builtin::BI__builtin_operator_delete:
5773 case Builtin::BI__builtin_is_aligned:
5775 case Builtin::BI__builtin_align_up:
5777 case Builtin::BI__builtin_align_down:
5780 case Builtin::BI__noop:
5783 case Builtin::BI__builtin_call_with_static_chain: {
5785 const Expr *Chain =
E->getArg(1);
5790 case Builtin::BI_InterlockedExchange8:
5791 case Builtin::BI_InterlockedExchange16:
5792 case Builtin::BI_InterlockedExchange:
5793 case Builtin::BI_InterlockedExchangePointer:
5796 case Builtin::BI_InterlockedCompareExchangePointer:
5799 case Builtin::BI_InterlockedCompareExchangePointer_nf:
5802 case Builtin::BI_InterlockedCompareExchange8:
5803 case Builtin::BI_InterlockedCompareExchange16:
5804 case Builtin::BI_InterlockedCompareExchange:
5805 case Builtin::BI_InterlockedCompareExchange64:
5807 case Builtin::BI_InterlockedIncrement16:
5808 case Builtin::BI_InterlockedIncrement:
5811 case Builtin::BI_InterlockedDecrement16:
5812 case Builtin::BI_InterlockedDecrement:
5815 case Builtin::BI_InterlockedAnd8:
5816 case Builtin::BI_InterlockedAnd16:
5817 case Builtin::BI_InterlockedAnd:
5819 case Builtin::BI_InterlockedExchangeAdd8:
5820 case Builtin::BI_InterlockedExchangeAdd16:
5821 case Builtin::BI_InterlockedExchangeAdd:
5824 case Builtin::BI_InterlockedExchangeSub8:
5825 case Builtin::BI_InterlockedExchangeSub16:
5826 case Builtin::BI_InterlockedExchangeSub:
5829 case Builtin::BI_InterlockedOr8:
5830 case Builtin::BI_InterlockedOr16:
5831 case Builtin::BI_InterlockedOr:
5833 case Builtin::BI_InterlockedXor8:
5834 case Builtin::BI_InterlockedXor16:
5835 case Builtin::BI_InterlockedXor:
5838 case Builtin::BI_bittest64:
5839 case Builtin::BI_bittest:
5840 case Builtin::BI_bittestandcomplement64:
5841 case Builtin::BI_bittestandcomplement:
5842 case Builtin::BI_bittestandreset64:
5843 case Builtin::BI_bittestandreset:
5844 case Builtin::BI_bittestandset64:
5845 case Builtin::BI_bittestandset:
5846 case Builtin::BI_interlockedbittestandreset:
5847 case Builtin::BI_interlockedbittestandreset64:
5848 case Builtin::BI_interlockedbittestandset64:
5849 case Builtin::BI_interlockedbittestandset:
5850 case Builtin::BI_interlockedbittestandset_acq:
5851 case Builtin::BI_interlockedbittestandset_rel:
5852 case Builtin::BI_interlockedbittestandset_nf:
5853 case Builtin::BI_interlockedbittestandreset_acq:
5854 case Builtin::BI_interlockedbittestandreset_rel:
5855 case Builtin::BI_interlockedbittestandreset_nf:
5860 case Builtin::BI__iso_volatile_load8:
5861 case Builtin::BI__iso_volatile_load16:
5862 case Builtin::BI__iso_volatile_load32:
5863 case Builtin::BI__iso_volatile_load64:
5865 case Builtin::BI__iso_volatile_store8:
5866 case Builtin::BI__iso_volatile_store16:
5867 case Builtin::BI__iso_volatile_store32:
5868 case Builtin::BI__iso_volatile_store64:
5871 case Builtin::BI__builtin_ptrauth_sign_constant:
5874 case Builtin::BI__builtin_ptrauth_auth:
5875 case Builtin::BI__builtin_ptrauth_auth_and_resign:
5876 case Builtin::BI__builtin_ptrauth_blend_discriminator:
5877 case Builtin::BI__builtin_ptrauth_sign_generic_data:
5878 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
5879 case Builtin::BI__builtin_ptrauth_strip: {
5882 for (
auto argExpr :
E->arguments())
5886 llvm::Type *OrigValueType = Args[0]->getType();
5887 if (OrigValueType->isPointerTy())
5890 switch (BuiltinID) {
5891 case Builtin::BI__builtin_ptrauth_auth_and_resign:
5892 if (Args[4]->getType()->isPointerTy())
5896 case Builtin::BI__builtin_ptrauth_auth:
5897 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
5898 if (Args[2]->getType()->isPointerTy())
5902 case Builtin::BI__builtin_ptrauth_sign_generic_data:
5903 if (Args[1]->getType()->isPointerTy())
5907 case Builtin::BI__builtin_ptrauth_blend_discriminator:
5908 case Builtin::BI__builtin_ptrauth_strip:
5913 auto IntrinsicID = [&]() ->
unsigned {
5914 switch (BuiltinID) {
5915 case Builtin::BI__builtin_ptrauth_auth:
5916 return llvm::Intrinsic::ptrauth_auth;
5917 case Builtin::BI__builtin_ptrauth_auth_and_resign:
5918 return llvm::Intrinsic::ptrauth_resign;
5919 case Builtin::BI__builtin_ptrauth_blend_discriminator:
5920 return llvm::Intrinsic::ptrauth_blend;
5921 case Builtin::BI__builtin_ptrauth_sign_generic_data:
5922 return llvm::Intrinsic::ptrauth_sign_generic;
5923 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
5924 return llvm::Intrinsic::ptrauth_sign;
5925 case Builtin::BI__builtin_ptrauth_strip:
5926 return llvm::Intrinsic::ptrauth_strip;
5928 llvm_unreachable(
"bad ptrauth intrinsic");
5933 if (BuiltinID != Builtin::BI__builtin_ptrauth_sign_generic_data &&
5934 BuiltinID != Builtin::BI__builtin_ptrauth_blend_discriminator &&
5935 OrigValueType->isPointerTy()) {
5941 case Builtin::BI__exception_code:
5942 case Builtin::BI_exception_code:
5944 case Builtin::BI__exception_info:
5945 case Builtin::BI_exception_info:
5947 case Builtin::BI__abnormal_termination:
5948 case Builtin::BI_abnormal_termination:
5950 case Builtin::BI_setjmpex:
5951 if (
getTarget().getTriple().isOSMSVCRT() &&
E->getNumArgs() == 1 &&
5955 case Builtin::BI_setjmp:
5956 if (
getTarget().getTriple().isOSMSVCRT() &&
E->getNumArgs() == 1 &&
5958 if (
getTarget().getTriple().getArch() == llvm::Triple::x86)
5960 else if (
getTarget().getTriple().getArch() == llvm::Triple::aarch64)
5967 case Builtin::BImove:
5968 case Builtin::BImove_if_noexcept:
5969 case Builtin::BIforward:
5970 case Builtin::BIforward_like:
5971 case Builtin::BIas_const:
5973 case Builtin::BI__GetExceptionInfo: {
5974 if (llvm::GlobalVariable *GV =
5980 case Builtin::BI__fastfail:
5983 case Builtin::BI__builtin_coro_id:
5985 case Builtin::BI__builtin_coro_promise:
5987 case Builtin::BI__builtin_coro_resume:
5990 case Builtin::BI__builtin_coro_frame:
5992 case Builtin::BI__builtin_coro_noop:
5994 case Builtin::BI__builtin_coro_free:
5996 case Builtin::BI__builtin_coro_destroy:
5999 case Builtin::BI__builtin_coro_done:
6001 case Builtin::BI__builtin_coro_alloc:
6003 case Builtin::BI__builtin_coro_begin:
6005 case Builtin::BI__builtin_coro_end:
6007 case Builtin::BI__builtin_coro_suspend:
6009 case Builtin::BI__builtin_coro_size:
6011 case Builtin::BI__builtin_coro_align:
6015 case Builtin::BIread_pipe:
6016 case Builtin::BIwrite_pipe: {
6020 Value *PacketSize = OpenCLRT.getPipeElemSize(
E->getArg(0));
6021 Value *PacketAlign = OpenCLRT.getPipeElemAlign(
E->getArg(0));
6024 unsigned GenericAS =
6026 llvm::Type *I8PTy = llvm::PointerType::get(
getLLVMContext(), GenericAS);
6029 if (2U ==
E->getNumArgs()) {
6030 const char *Name = (BuiltinID == Builtin::BIread_pipe) ?
"__read_pipe_2"
6035 llvm::FunctionType *FTy = llvm::FunctionType::get(
6040 {Arg0, ACast, PacketSize, PacketAlign}));
6042 assert(4 ==
E->getNumArgs() &&
6043 "Illegal number of parameters to pipe function");
6044 const char *Name = (BuiltinID == Builtin::BIread_pipe) ?
"__read_pipe_4"
6051 llvm::FunctionType *FTy = llvm::FunctionType::get(
6060 {Arg0, Arg1, Arg2, ACast, PacketSize, PacketAlign}));
6065 case Builtin::BIreserve_read_pipe:
6066 case Builtin::BIreserve_write_pipe:
6067 case Builtin::BIwork_group_reserve_read_pipe:
6068 case Builtin::BIwork_group_reserve_write_pipe:
6069 case Builtin::BIsub_group_reserve_read_pipe:
6070 case Builtin::BIsub_group_reserve_write_pipe: {
6073 if (BuiltinID == Builtin::BIreserve_read_pipe)
6074 Name =
"__reserve_read_pipe";
6075 else if (BuiltinID == Builtin::BIreserve_write_pipe)
6076 Name =
"__reserve_write_pipe";
6077 else if (BuiltinID == Builtin::BIwork_group_reserve_read_pipe)
6078 Name =
"__work_group_reserve_read_pipe";
6079 else if (BuiltinID == Builtin::BIwork_group_reserve_write_pipe)
6080 Name =
"__work_group_reserve_write_pipe";
6081 else if (BuiltinID == Builtin::BIsub_group_reserve_read_pipe)
6082 Name =
"__sub_group_reserve_read_pipe";
6084 Name =
"__sub_group_reserve_write_pipe";
6090 Value *PacketSize = OpenCLRT.getPipeElemSize(
E->getArg(0));
6091 Value *PacketAlign = OpenCLRT.getPipeElemAlign(
E->getArg(0));
6095 llvm::FunctionType *FTy = llvm::FunctionType::get(
6102 {Arg0, Arg1, PacketSize, PacketAlign}));
6106 case Builtin::BIcommit_read_pipe:
6107 case Builtin::BIcommit_write_pipe:
6108 case Builtin::BIwork_group_commit_read_pipe:
6109 case Builtin::BIwork_group_commit_write_pipe:
6110 case Builtin::BIsub_group_commit_read_pipe:
6111 case Builtin::BIsub_group_commit_write_pipe: {
6113 if (BuiltinID == Builtin::BIcommit_read_pipe)
6114 Name =
"__commit_read_pipe";
6115 else if (BuiltinID == Builtin::BIcommit_write_pipe)
6116 Name =
"__commit_write_pipe";
6117 else if (BuiltinID == Builtin::BIwork_group_commit_read_pipe)
6118 Name =
"__work_group_commit_read_pipe";
6119 else if (BuiltinID == Builtin::BIwork_group_commit_write_pipe)
6120 Name =
"__work_group_commit_write_pipe";
6121 else if (BuiltinID == Builtin::BIsub_group_commit_read_pipe)
6122 Name =
"__sub_group_commit_read_pipe";
6124 Name =
"__sub_group_commit_write_pipe";
6129 Value *PacketSize = OpenCLRT.getPipeElemSize(
E->getArg(0));
6130 Value *PacketAlign = OpenCLRT.getPipeElemAlign(
E->getArg(0));
6134 llvm::FunctionType *FTy =
6139 {Arg0, Arg1, PacketSize, PacketAlign}));
6142 case Builtin::BIget_pipe_num_packets:
6143 case Builtin::BIget_pipe_max_packets: {
6144 const char *BaseName;
6146 if (BuiltinID == Builtin::BIget_pipe_num_packets)
6147 BaseName =
"__get_pipe_num_packets";
6149 BaseName =
"__get_pipe_max_packets";
6150 std::string Name = std::string(BaseName) +
6151 std::string(PipeTy->isReadOnly() ?
"_ro" :
"_wo");
6156 Value *PacketSize = OpenCLRT.getPipeElemSize(
E->getArg(0));
6157 Value *PacketAlign = OpenCLRT.getPipeElemAlign(
E->getArg(0));
6159 llvm::FunctionType *FTy = llvm::FunctionType::get(
6163 {Arg0, PacketSize, PacketAlign}));
6167 case Builtin::BIto_global:
6168 case Builtin::BIto_local:
6169 case Builtin::BIto_private: {
6171 auto NewArgT = llvm::PointerType::get(
6174 auto NewRetT = llvm::PointerType::get(
6178 auto FTy = llvm::FunctionType::get(NewRetT, {NewArgT},
false);
6179 llvm::Value *NewArg;
6180 if (Arg0->
getType()->getPointerAddressSpace() !=
6181 NewArgT->getPointerAddressSpace())
6184 NewArg =
Builder.CreateBitOrPointerCast(Arg0, NewArgT);
6185 auto NewName = std::string(
"__") +
E->getDirectCallee()->getName().str();
6200 case Builtin::BIenqueue_kernel: {
6202 unsigned NumArgs =
E->getNumArgs();
6205 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6217 Name =
"__enqueue_kernel_basic";
6218 llvm::Type *ArgTys[] = {QueueTy,
Int32Ty, RangeTy, GenericVoidPtrTy,
6220 llvm::FunctionType *FTy = llvm::FunctionType::get(
6226 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6227 llvm::Value *
Block =
6228 Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6231 {Queue, Flags, Range, Kernel, Block});
6234 assert(NumArgs >= 5 &&
"Invalid enqueue_kernel signature");
6238 auto CreateArrayForSizeVar = [=](
unsigned First)
6239 -> std::tuple<llvm::Value *, llvm::Value *, llvm::Value *> {
6240 llvm::APInt ArraySize(32, NumArgs -
First);
6242 getContext().getSizeType(), ArraySize,
nullptr,
6246 llvm::Value *TmpPtr = Tmp.getPointer();
6251 llvm::Value *Alloca = TmpPtr->stripPointerCasts();
6254 llvm::Value *ElemPtr;
6257 auto *
Zero = llvm::ConstantInt::get(
IntTy, 0);
6258 for (
unsigned I =
First; I < NumArgs; ++I) {
6259 auto *Index = llvm::ConstantInt::get(
IntTy, I -
First);
6271 return std::tie(ElemPtr, TmpSize, Alloca);
6277 Name =
"__enqueue_kernel_varargs";
6281 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6282 auto *
Block =
Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6283 llvm::Value *ElemPtr, *TmpSize, *TmpPtr;
6284 std::tie(ElemPtr, TmpSize, TmpPtr) = CreateArrayForSizeVar(4);
6288 llvm::Value *
const Args[] = {Queue, Flags,
6292 llvm::Type *
const ArgTys[] = {
6293 QueueTy,
IntTy, RangeTy, GenericVoidPtrTy,
6294 GenericVoidPtrTy,
IntTy, ElemPtr->getType()};
6296 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6305 llvm::PointerType *PtrTy = llvm::PointerType::get(
6309 llvm::Value *NumEvents =
6315 llvm::Value *EventWaitList =
nullptr;
6318 EventWaitList = llvm::ConstantPointerNull::get(PtrTy);
6325 EventWaitList =
Builder.CreatePointerCast(EventWaitList, PtrTy);
6327 llvm::Value *EventRet =
nullptr;
6330 EventRet = llvm::ConstantPointerNull::get(PtrTy);
6339 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6340 llvm::Value *
Block =
6341 Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6343 std::vector<llvm::Type *> ArgTys = {
6345 PtrTy, PtrTy, GenericVoidPtrTy, GenericVoidPtrTy};
6347 std::vector<llvm::Value *> Args = {Queue, Flags,
Range,
6348 NumEvents, EventWaitList, EventRet,
6353 Name =
"__enqueue_kernel_basic_events";
6354 llvm::FunctionType *FTy = llvm::FunctionType::get(
6362 Args.push_back(ConstantInt::get(
Int32Ty, NumArgs - 7));
6364 Name =
"__enqueue_kernel_events_varargs";
6366 llvm::Value *ElemPtr, *TmpSize, *TmpPtr;
6367 std::tie(ElemPtr, TmpSize, TmpPtr) = CreateArrayForSizeVar(7);
6368 Args.push_back(ElemPtr);
6369 ArgTys.push_back(ElemPtr->getType());
6371 llvm::FunctionType *FTy = llvm::FunctionType::get(
6380 llvm_unreachable(
"Unexpected enqueue_kernel signature");
6384 case Builtin::BIget_kernel_work_group_size: {
6385 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6390 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6391 Value *Arg =
Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6394 llvm::FunctionType::get(
IntTy, {GenericVoidPtrTy, GenericVoidPtrTy},
6396 "__get_kernel_work_group_size_impl"),
6399 case Builtin::BIget_kernel_preferred_work_group_size_multiple: {
6400 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6405 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6406 Value *Arg =
Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6409 llvm::FunctionType::get(
IntTy, {GenericVoidPtrTy, GenericVoidPtrTy},
6411 "__get_kernel_preferred_work_group_size_multiple_impl"),
6414 case Builtin::BIget_kernel_max_sub_group_size_for_ndrange:
6415 case Builtin::BIget_kernel_sub_group_count_for_ndrange: {
6416 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6423 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6426 BuiltinID == Builtin::BIget_kernel_max_sub_group_size_for_ndrange
6427 ?
"__get_kernel_max_sub_group_size_for_ndrange_impl"
6428 :
"__get_kernel_sub_group_count_for_ndrange_impl";
6431 llvm::FunctionType::get(
6432 IntTy, {NDRange->getType(), GenericVoidPtrTy, GenericVoidPtrTy},
6435 {NDRange, Kernel, Block}));
6437 case Builtin::BI__builtin_store_half:
6438 case Builtin::BI__builtin_store_halff: {
6445 case Builtin::BI__builtin_load_half: {
6450 case Builtin::BI__builtin_load_halff: {
6455 case Builtin::BI__builtin_printf:
6456 case Builtin::BIprintf:
6457 if (
getTarget().getTriple().isNVPTX() ||
6460 getTarget().getTriple().getVendor() == Triple::VendorType::AMD)) {
6463 if ((
getTarget().getTriple().isAMDGCN() ||
6470 case Builtin::BI__builtin_canonicalize:
6471 case Builtin::BI__builtin_canonicalizef:
6472 case Builtin::BI__builtin_canonicalizef16:
6473 case Builtin::BI__builtin_canonicalizel:
6475 emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::canonicalize));
6477 case Builtin::BI__builtin_thread_pointer: {
6478 if (!
getContext().getTargetInfo().isTLSSupported())
6483 case Builtin::BI__builtin_os_log_format:
6486 case Builtin::BI__xray_customevent: {
6499 auto FTy = F->getFunctionType();
6500 auto Arg0 =
E->getArg(0);
6502 auto Arg0Ty = Arg0->
getType();
6503 auto PTy0 = FTy->getParamType(0);
6504 if (PTy0 != Arg0Val->getType()) {
6505 if (Arg0Ty->isArrayType())
6508 Arg0Val =
Builder.CreatePointerCast(Arg0Val, PTy0);
6511 auto PTy1 = FTy->getParamType(1);
6513 Arg1 =
Builder.CreateTruncOrBitCast(Arg1, PTy1);
6517 case Builtin::BI__xray_typedevent: {
6533 auto FTy = F->getFunctionType();
6535 auto PTy0 = FTy->getParamType(0);
6537 Arg0 =
Builder.CreateTruncOrBitCast(Arg0, PTy0);
6538 auto Arg1 =
E->getArg(1);
6540 auto Arg1Ty = Arg1->
getType();
6541 auto PTy1 = FTy->getParamType(1);
6542 if (PTy1 != Arg1Val->getType()) {
6543 if (Arg1Ty->isArrayType())
6546 Arg1Val =
Builder.CreatePointerCast(Arg1Val, PTy1);
6549 auto PTy2 = FTy->getParamType(2);
6551 Arg2 =
Builder.CreateTruncOrBitCast(Arg2, PTy2);
6555 case Builtin::BI__builtin_ms_va_start:
6556 case Builtin::BI__builtin_ms_va_end:
6559 BuiltinID == Builtin::BI__builtin_ms_va_start));
6561 case Builtin::BI__builtin_ms_va_copy: {
6578 case Builtin::BI__builtin_get_device_side_mangled_name: {
6606 LargestVectorWidth = std::max(LargestVectorWidth, VectorWidth);
6610 Intrinsic::ID IntrinsicID = Intrinsic::not_intrinsic;
6612 llvm::Triple::getArchTypePrefix(
getTarget().getTriple().getArch());
6613 if (!Prefix.empty()) {
6614 IntrinsicID = Intrinsic::getIntrinsicForClangBuiltin(Prefix.data(), Name);
6615 if (IntrinsicID == Intrinsic::not_intrinsic && Prefix ==
"spv" &&
6616 getTarget().getTriple().getOS() == llvm::Triple::OSType::AMDHSA)
6617 IntrinsicID = Intrinsic::getIntrinsicForClangBuiltin(
"amdgcn", Name);
6621 if (IntrinsicID == Intrinsic::not_intrinsic)
6622 IntrinsicID = Intrinsic::getIntrinsicForMSBuiltin(Prefix.data(), Name);
6625 if (IntrinsicID != Intrinsic::not_intrinsic) {
6630 unsigned ICEArguments = 0;
6636 llvm::FunctionType *FTy = F->getFunctionType();
6638 for (
unsigned i = 0, e =
E->getNumArgs(); i != e; ++i) {
6642 llvm::Type *PTy = FTy->getParamType(i);
6643 if (PTy != ArgValue->
getType()) {
6645 if (
auto *PtrTy = dyn_cast<llvm::PointerType>(PTy)) {
6646 if (PtrTy->getAddressSpace() !=
6647 ArgValue->
getType()->getPointerAddressSpace()) {
6650 PtrTy->getAddressSpace()));
6656 if (PTy->isX86_AMXTy())
6657 ArgValue =
Builder.CreateIntrinsic(Intrinsic::x86_cast_vector_to_tile,
6658 {ArgValue->
getType()}, {ArgValue});
6660 ArgValue =
Builder.CreateBitCast(ArgValue, PTy);
6663 Args.push_back(ArgValue);
6669 llvm::Type *RetTy =
VoidTy;
6673 if (RetTy !=
V->getType()) {
6675 if (
auto *PtrTy = dyn_cast<llvm::PointerType>(RetTy)) {
6676 if (PtrTy->getAddressSpace() !=
V->getType()->getPointerAddressSpace()) {
6679 PtrTy->getAddressSpace()));
6685 if (
V->getType()->isX86_AMXTy())
6686 V =
Builder.CreateIntrinsic(Intrinsic::x86_cast_tile_to_vector, {RetTy},
6692 if (RetTy->isVoidTy())
6712 if (
V->getType()->isVoidTy())
6719 llvm_unreachable(
"No current target builtin returns complex");
6721 llvm_unreachable(
"Bad evaluation kind in EmitBuiltinExpr");
6728 if (
V->getType()->isVoidTy())
6735 llvm_unreachable(
"No current hlsl builtin returns complex");
6737 llvm_unreachable(
"Bad evaluation kind in EmitBuiltinExpr");
6752 llvm::Triple::ArchType Arch) {
6764 case llvm::Triple::arm:
6765 case llvm::Triple::armeb:
6766 case llvm::Triple::thumb:
6767 case llvm::Triple::thumbeb:
6769 case llvm::Triple::aarch64:
6770 case llvm::Triple::aarch64_32:
6771 case llvm::Triple::aarch64_be:
6773 case llvm::Triple::bpfeb:
6774 case llvm::Triple::bpfel:
6776 case llvm::Triple::x86:
6777 case llvm::Triple::x86_64:
6779 case llvm::Triple::ppc:
6780 case llvm::Triple::ppcle:
6781 case llvm::Triple::ppc64:
6782 case llvm::Triple::ppc64le:
6784 case llvm::Triple::r600:
6785 case llvm::Triple::amdgcn:
6787 case llvm::Triple::systemz:
6789 case llvm::Triple::nvptx:
6790 case llvm::Triple::nvptx64:
6792 case llvm::Triple::wasm32:
6793 case llvm::Triple::wasm64:
6795 case llvm::Triple::hexagon:
6797 case llvm::Triple::riscv32:
6798 case llvm::Triple::riscv64:
6800 case llvm::Triple::spirv:
6802 case llvm::Triple::spirv64:
6815 assert(
getContext().getAuxTargetInfo() &&
"Missing aux target info");
6827 bool HasLegalHalfType =
true,
6829 bool AllowBFloatArgsAndRet =
true) {
6830 int IsQuad = TypeFlags.
isQuad();
6834 return llvm::FixedVectorType::get(CGF->
Int8Ty, V1Ty ? 1 : (8 << IsQuad));
6837 return llvm::FixedVectorType::get(CGF->
Int16Ty, V1Ty ? 1 : (4 << IsQuad));
6839 if (AllowBFloatArgsAndRet)
6840 return llvm::FixedVectorType::get(CGF->
BFloatTy, V1Ty ? 1 : (4 << IsQuad));
6842 return llvm::FixedVectorType::get(CGF->
Int16Ty, V1Ty ? 1 : (4 << IsQuad));
6844 if (HasLegalHalfType)
6845 return llvm::FixedVectorType::get(CGF->
HalfTy, V1Ty ? 1 : (4 << IsQuad));
6847 return llvm::FixedVectorType::get(CGF->
Int16Ty, V1Ty ? 1 : (4 << IsQuad));
6849 return llvm::FixedVectorType::get(CGF->
Int32Ty, V1Ty ? 1 : (2 << IsQuad));
6852 return llvm::FixedVectorType::get(CGF->
Int64Ty, V1Ty ? 1 : (1 << IsQuad));
6857 return llvm::FixedVectorType::get(CGF->
Int8Ty, 16);
6859 return llvm::FixedVectorType::get(CGF->
FloatTy, V1Ty ? 1 : (2 << IsQuad));
6861 return llvm::FixedVectorType::get(CGF->
DoubleTy, V1Ty ? 1 : (1 << IsQuad));
6863 llvm_unreachable(
"Unknown vector element type!");
6868 int IsQuad = IntTypeFlags.
isQuad();
6871 return llvm::FixedVectorType::get(CGF->
HalfTy, (4 << IsQuad));
6873 return llvm::FixedVectorType::get(CGF->
FloatTy, (2 << IsQuad));
6875 return llvm::FixedVectorType::get(CGF->
DoubleTy, (1 << IsQuad));
6877 llvm_unreachable(
"Type can't be converted to floating-point!");
6882 const ElementCount &Count) {
6883 Value *SV = llvm::ConstantVector::getSplat(Count,
C);
6884 return Builder.CreateShuffleVector(
V,
V, SV,
"lane");
6888 ElementCount EC = cast<llvm::VectorType>(
V->getType())->getElementCount();
6894 unsigned shift,
bool rightshift) {
6896 for (Function::const_arg_iterator ai = F->arg_begin(), ae = F->arg_end();
6897 ai != ae; ++ai, ++j) {
6898 if (F->isConstrainedFPIntrinsic())
6899 if (ai->getType()->isMetadataTy())
6901 if (shift > 0 && shift == j)
6904 Ops[j] =
Builder.CreateBitCast(Ops[j], ai->getType(), name);
6907 if (F->isConstrainedFPIntrinsic())
6908 return Builder.CreateConstrainedFPCall(F, Ops, name);
6910 return Builder.CreateCall(F, Ops, name);
6915 int SV = cast<ConstantInt>(
V)->getSExtValue();
6916 return ConstantInt::get(Ty, neg ? -SV : SV);
6921 llvm::Type *Ty,
bool usgn,
6923 llvm::VectorType *VTy = cast<llvm::VectorType>(Ty);
6925 int ShiftAmt = cast<ConstantInt>(Shift)->getSExtValue();
6926 int EltSize = VTy->getScalarSizeInBits();
6928 Vec =
Builder.CreateBitCast(Vec, Ty);
6932 if (ShiftAmt == EltSize) {
6935 return llvm::ConstantAggregateZero::get(VTy);
6940 Shift = ConstantInt::get(VTy->getElementType(), ShiftAmt);
6946 return Builder.CreateLShr(Vec, Shift, name);
6948 return Builder.CreateAShr(Vec, Shift, name);
6974struct ARMVectorIntrinsicInfo {
6975 const char *NameHint;
6977 unsigned LLVMIntrinsic;
6978 unsigned AltLLVMIntrinsic;
6981 bool operator<(
unsigned RHSBuiltinID)
const {
6982 return BuiltinID < RHSBuiltinID;
6984 bool operator<(
const ARMVectorIntrinsicInfo &TE)
const {
6985 return BuiltinID < TE.BuiltinID;
6990#define NEONMAP0(NameBase) \
6991 { #NameBase, NEON::BI__builtin_neon_ ## NameBase, 0, 0, 0 }
6993#define NEONMAP1(NameBase, LLVMIntrinsic, TypeModifier) \
6994 { #NameBase, NEON:: BI__builtin_neon_ ## NameBase, \
6995 Intrinsic::LLVMIntrinsic, 0, TypeModifier }
6997#define NEONMAP2(NameBase, LLVMIntrinsic, AltLLVMIntrinsic, TypeModifier) \
6998 { #NameBase, NEON:: BI__builtin_neon_ ## NameBase, \
6999 Intrinsic::LLVMIntrinsic, Intrinsic::AltLLVMIntrinsic, \
7003 NEONMAP1(__a32_vcvt_bf16_f32, arm_neon_vcvtfp2bf, 0),
7010 NEONMAP1(vabs_v, arm_neon_vabs, 0),
7011 NEONMAP1(vabsq_v, arm_neon_vabs, 0),
7015 NEONMAP1(vaesdq_u8, arm_neon_aesd, 0),
7016 NEONMAP1(vaeseq_u8, arm_neon_aese, 0),
7017 NEONMAP1(vaesimcq_u8, arm_neon_aesimc, 0),
7018 NEONMAP1(vaesmcq_u8, arm_neon_aesmc, 0),
7019 NEONMAP1(vbfdot_f32, arm_neon_bfdot, 0),
7020 NEONMAP1(vbfdotq_f32, arm_neon_bfdot, 0),
7021 NEONMAP1(vbfmlalbq_f32, arm_neon_bfmlalb, 0),
7022 NEONMAP1(vbfmlaltq_f32, arm_neon_bfmlalt, 0),
7023 NEONMAP1(vbfmmlaq_f32, arm_neon_bfmmla, 0),
7036 NEONMAP1(vcage_v, arm_neon_vacge, 0),
7037 NEONMAP1(vcageq_v, arm_neon_vacge, 0),
7038 NEONMAP1(vcagt_v, arm_neon_vacgt, 0),
7039 NEONMAP1(vcagtq_v, arm_neon_vacgt, 0),
7040 NEONMAP1(vcale_v, arm_neon_vacge, 0),
7041 NEONMAP1(vcaleq_v, arm_neon_vacge, 0),
7042 NEONMAP1(vcalt_v, arm_neon_vacgt, 0),
7043 NEONMAP1(vcaltq_v, arm_neon_vacgt, 0),
7060 NEONMAP1(vcvt_f16_f32, arm_neon_vcvtfp2hf, 0),
7063 NEONMAP1(vcvt_f32_f16, arm_neon_vcvthf2fp, 0),
7065 NEONMAP1(vcvt_n_f16_s16, arm_neon_vcvtfxs2fp, 0),
7066 NEONMAP1(vcvt_n_f16_u16, arm_neon_vcvtfxu2fp, 0),
7067 NEONMAP2(vcvt_n_f32_v, arm_neon_vcvtfxu2fp, arm_neon_vcvtfxs2fp, 0),
7068 NEONMAP1(vcvt_n_s16_f16, arm_neon_vcvtfp2fxs, 0),
7069 NEONMAP1(vcvt_n_s32_v, arm_neon_vcvtfp2fxs, 0),
7070 NEONMAP1(vcvt_n_s64_v, arm_neon_vcvtfp2fxs, 0),
7071 NEONMAP1(vcvt_n_u16_f16, arm_neon_vcvtfp2fxu, 0),
7072 NEONMAP1(vcvt_n_u32_v, arm_neon_vcvtfp2fxu, 0),
7073 NEONMAP1(vcvt_n_u64_v, arm_neon_vcvtfp2fxu, 0),
7080 NEONMAP1(vcvta_s16_f16, arm_neon_vcvtas, 0),
7081 NEONMAP1(vcvta_s32_v, arm_neon_vcvtas, 0),
7082 NEONMAP1(vcvta_s64_v, arm_neon_vcvtas, 0),
7083 NEONMAP1(vcvta_u16_f16, arm_neon_vcvtau, 0),
7084 NEONMAP1(vcvta_u32_v, arm_neon_vcvtau, 0),
7085 NEONMAP1(vcvta_u64_v, arm_neon_vcvtau, 0),
7086 NEONMAP1(vcvtaq_s16_f16, arm_neon_vcvtas, 0),
7087 NEONMAP1(vcvtaq_s32_v, arm_neon_vcvtas, 0),
7088 NEONMAP1(vcvtaq_s64_v, arm_neon_vcvtas, 0),
7089 NEONMAP1(vcvtaq_u16_f16, arm_neon_vcvtau, 0),
7090 NEONMAP1(vcvtaq_u32_v, arm_neon_vcvtau, 0),
7091 NEONMAP1(vcvtaq_u64_v, arm_neon_vcvtau, 0),
7092 NEONMAP1(vcvth_bf16_f32, arm_neon_vcvtbfp2bf, 0),
7093 NEONMAP1(vcvtm_s16_f16, arm_neon_vcvtms, 0),
7094 NEONMAP1(vcvtm_s32_v, arm_neon_vcvtms, 0),
7095 NEONMAP1(vcvtm_s64_v, arm_neon_vcvtms, 0),
7096 NEONMAP1(vcvtm_u16_f16, arm_neon_vcvtmu, 0),
7097 NEONMAP1(vcvtm_u32_v, arm_neon_vcvtmu, 0),
7098 NEONMAP1(vcvtm_u64_v, arm_neon_vcvtmu, 0),
7099 NEONMAP1(vcvtmq_s16_f16, arm_neon_vcvtms, 0),
7100 NEONMAP1(vcvtmq_s32_v, arm_neon_vcvtms, 0),
7101 NEONMAP1(vcvtmq_s64_v, arm_neon_vcvtms, 0),
7102 NEONMAP1(vcvtmq_u16_f16, arm_neon_vcvtmu, 0),
7103 NEONMAP1(vcvtmq_u32_v, arm_neon_vcvtmu, 0),
7104 NEONMAP1(vcvtmq_u64_v, arm_neon_vcvtmu, 0),
7105 NEONMAP1(vcvtn_s16_f16, arm_neon_vcvtns, 0),
7106 NEONMAP1(vcvtn_s32_v, arm_neon_vcvtns, 0),
7107 NEONMAP1(vcvtn_s64_v, arm_neon_vcvtns, 0),
7108 NEONMAP1(vcvtn_u16_f16, arm_neon_vcvtnu, 0),
7109 NEONMAP1(vcvtn_u32_v, arm_neon_vcvtnu, 0),
7110 NEONMAP1(vcvtn_u64_v, arm_neon_vcvtnu, 0),
7111 NEONMAP1(vcvtnq_s16_f16, arm_neon_vcvtns, 0),
7112 NEONMAP1(vcvtnq_s32_v, arm_neon_vcvtns, 0),
7113 NEONMAP1(vcvtnq_s64_v, arm_neon_vcvtns, 0),
7114 NEONMAP1(vcvtnq_u16_f16, arm_neon_vcvtnu, 0),
7115 NEONMAP1(vcvtnq_u32_v, arm_neon_vcvtnu, 0),
7116 NEONMAP1(vcvtnq_u64_v, arm_neon_vcvtnu, 0),
7117 NEONMAP1(vcvtp_s16_f16, arm_neon_vcvtps, 0),
7118 NEONMAP1(vcvtp_s32_v, arm_neon_vcvtps, 0),
7119 NEONMAP1(vcvtp_s64_v, arm_neon_vcvtps, 0),
7120 NEONMAP1(vcvtp_u16_f16, arm_neon_vcvtpu, 0),
7121 NEONMAP1(vcvtp_u32_v, arm_neon_vcvtpu, 0),
7122 NEONMAP1(vcvtp_u64_v, arm_neon_vcvtpu, 0),
7123 NEONMAP1(vcvtpq_s16_f16, arm_neon_vcvtps, 0),
7124 NEONMAP1(vcvtpq_s32_v, arm_neon_vcvtps, 0),
7125 NEONMAP1(vcvtpq_s64_v, arm_neon_vcvtps, 0),
7126 NEONMAP1(vcvtpq_u16_f16, arm_neon_vcvtpu, 0),
7127 NEONMAP1(vcvtpq_u32_v, arm_neon_vcvtpu, 0),
7128 NEONMAP1(vcvtpq_u64_v, arm_neon_vcvtpu, 0),
7132 NEONMAP1(vcvtq_n_f16_s16, arm_neon_vcvtfxs2fp, 0),
7133 NEONMAP1(vcvtq_n_f16_u16, arm_neon_vcvtfxu2fp, 0),
7134 NEONMAP2(vcvtq_n_f32_v, arm_neon_vcvtfxu2fp, arm_neon_vcvtfxs2fp, 0),
7135 NEONMAP1(vcvtq_n_s16_f16, arm_neon_vcvtfp2fxs, 0),
7136 NEONMAP1(vcvtq_n_s32_v, arm_neon_vcvtfp2fxs, 0),
7137 NEONMAP1(vcvtq_n_s64_v, arm_neon_vcvtfp2fxs, 0),
7138 NEONMAP1(vcvtq_n_u16_f16, arm_neon_vcvtfp2fxu, 0),
7139 NEONMAP1(vcvtq_n_u32_v, arm_neon_vcvtfp2fxu, 0),
7140 NEONMAP1(vcvtq_n_u64_v, arm_neon_vcvtfp2fxu, 0),
7147 NEONMAP1(vdot_s32, arm_neon_sdot, 0),
7148 NEONMAP1(vdot_u32, arm_neon_udot, 0),
7149 NEONMAP1(vdotq_s32, arm_neon_sdot, 0),
7150 NEONMAP1(vdotq_u32, arm_neon_udot, 0),
7160 NEONMAP1(vld1_v, arm_neon_vld1, 0),
7161 NEONMAP1(vld1_x2_v, arm_neon_vld1x2, 0),
7162 NEONMAP1(vld1_x3_v, arm_neon_vld1x3, 0),
7163 NEONMAP1(vld1_x4_v, arm_neon_vld1x4, 0),
7165 NEONMAP1(vld1q_v, arm_neon_vld1, 0),
7166 NEONMAP1(vld1q_x2_v, arm_neon_vld1x2, 0),
7167 NEONMAP1(vld1q_x3_v, arm_neon_vld1x3, 0),
7168 NEONMAP1(vld1q_x4_v, arm_neon_vld1x4, 0),
7169 NEONMAP1(vld2_dup_v, arm_neon_vld2dup, 0),
7170 NEONMAP1(vld2_lane_v, arm_neon_vld2lane, 0),
7171 NEONMAP1(vld2_v, arm_neon_vld2, 0),
7172 NEONMAP1(vld2q_dup_v, arm_neon_vld2dup, 0),
7173 NEONMAP1(vld2q_lane_v, arm_neon_vld2lane, 0),
7174 NEONMAP1(vld2q_v, arm_neon_vld2, 0),
7175 NEONMAP1(vld3_dup_v, arm_neon_vld3dup, 0),
7176 NEONMAP1(vld3_lane_v, arm_neon_vld3lane, 0),
7177 NEONMAP1(vld3_v, arm_neon_vld3, 0),
7178 NEONMAP1(vld3q_dup_v, arm_neon_vld3dup, 0),
7179 NEONMAP1(vld3q_lane_v, arm_neon_vld3lane, 0),
7180 NEONMAP1(vld3q_v, arm_neon_vld3, 0),
7181 NEONMAP1(vld4_dup_v, arm_neon_vld4dup, 0),
7182 NEONMAP1(vld4_lane_v, arm_neon_vld4lane, 0),
7183 NEONMAP1(vld4_v, arm_neon_vld4, 0),
7184 NEONMAP1(vld4q_dup_v, arm_neon_vld4dup, 0),
7185 NEONMAP1(vld4q_lane_v, arm_neon_vld4lane, 0),
7186 NEONMAP1(vld4q_v, arm_neon_vld4, 0),
7195 NEONMAP1(vmmlaq_s32, arm_neon_smmla, 0),
7196 NEONMAP1(vmmlaq_u32, arm_neon_ummla, 0),
7214 NEONMAP2(vqdmlal_v, arm_neon_vqdmull, sadd_sat, 0),
7215 NEONMAP2(vqdmlsl_v, arm_neon_vqdmull, ssub_sat, 0),
7239 NEONMAP1(vqshlu_n_v, arm_neon_vqshiftsu, 0),
7240 NEONMAP1(vqshluq_n_v, arm_neon_vqshiftsu, 0),
7244 NEONMAP2(vrecpe_v, arm_neon_vrecpe, arm_neon_vrecpe, 0),
7245 NEONMAP2(vrecpeq_v, arm_neon_vrecpe, arm_neon_vrecpe, 0),
7268 NEONMAP2(vrsqrte_v, arm_neon_vrsqrte, arm_neon_vrsqrte, 0),
7269 NEONMAP2(vrsqrteq_v, arm_neon_vrsqrte, arm_neon_vrsqrte, 0),
7273 NEONMAP1(vsha1su0q_u32, arm_neon_sha1su0, 0),
7274 NEONMAP1(vsha1su1q_u32, arm_neon_sha1su1, 0),
7275 NEONMAP1(vsha256h2q_u32, arm_neon_sha256h2, 0),
7276 NEONMAP1(vsha256hq_u32, arm_neon_sha256h, 0),
7277 NEONMAP1(vsha256su0q_u32, arm_neon_sha256su0, 0),
7278 NEONMAP1(vsha256su1q_u32, arm_neon_sha256su1, 0),
7287 NEONMAP1(vst1_v, arm_neon_vst1, 0),
7288 NEONMAP1(vst1_x2_v, arm_neon_vst1x2, 0),
7289 NEONMAP1(vst1_x3_v, arm_neon_vst1x3, 0),
7290 NEONMAP1(vst1_x4_v, arm_neon_vst1x4, 0),
7291 NEONMAP1(vst1q_v, arm_neon_vst1, 0),
7292 NEONMAP1(vst1q_x2_v, arm_neon_vst1x2, 0),
7293 NEONMAP1(vst1q_x3_v, arm_neon_vst1x3, 0),
7294 NEONMAP1(vst1q_x4_v, arm_neon_vst1x4, 0),
7295 NEONMAP1(vst2_lane_v, arm_neon_vst2lane, 0),
7296 NEONMAP1(vst2_v, arm_neon_vst2, 0),
7297 NEONMAP1(vst2q_lane_v, arm_neon_vst2lane, 0),
7298 NEONMAP1(vst2q_v, arm_neon_vst2, 0),
7299 NEONMAP1(vst3_lane_v, arm_neon_vst3lane, 0),
7300 NEONMAP1(vst3_v, arm_neon_vst3, 0),
7301 NEONMAP1(vst3q_lane_v, arm_neon_vst3lane, 0),
7302 NEONMAP1(vst3q_v, arm_neon_vst3, 0),
7303 NEONMAP1(vst4_lane_v, arm_neon_vst4lane, 0),
7304 NEONMAP1(vst4_v, arm_neon_vst4, 0),
7305 NEONMAP1(vst4q_lane_v, arm_neon_vst4lane, 0),
7306 NEONMAP1(vst4q_v, arm_neon_vst4, 0),
7312 NEONMAP1(vusdot_s32, arm_neon_usdot, 0),
7313 NEONMAP1(vusdotq_s32, arm_neon_usdot, 0),
7314 NEONMAP1(vusmmlaq_s32, arm_neon_usmmla, 0),
7322 NEONMAP1(__a64_vcvtq_low_bf16_f32, aarch64_neon_bfcvtn, 0),
7327 NEONMAP1(vabs_v, aarch64_neon_abs, 0),
7328 NEONMAP1(vabsq_v, aarch64_neon_abs, 0),
7333 NEONMAP1(vaesdq_u8, aarch64_crypto_aesd, 0),
7334 NEONMAP1(vaeseq_u8, aarch64_crypto_aese, 0),
7335 NEONMAP1(vaesimcq_u8, aarch64_crypto_aesimc, 0),
7336 NEONMAP1(vaesmcq_u8, aarch64_crypto_aesmc, 0),
7345 NEONMAP1(vbfdot_f32, aarch64_neon_bfdot, 0),
7346 NEONMAP1(vbfdotq_f32, aarch64_neon_bfdot, 0),
7347 NEONMAP1(vbfmlalbq_f32, aarch64_neon_bfmlalb, 0),
7348 NEONMAP1(vbfmlaltq_f32, aarch64_neon_bfmlalt, 0),
7349 NEONMAP1(vbfmmlaq_f32, aarch64_neon_bfmmla, 0),
7360 NEONMAP1(vcage_v, aarch64_neon_facge, 0),
7361 NEONMAP1(vcageq_v, aarch64_neon_facge, 0),
7362 NEONMAP1(vcagt_v, aarch64_neon_facgt, 0),
7363 NEONMAP1(vcagtq_v, aarch64_neon_facgt, 0),
7364 NEONMAP1(vcale_v, aarch64_neon_facge, 0),
7365 NEONMAP1(vcaleq_v, aarch64_neon_facge, 0),
7366 NEONMAP1(vcalt_v, aarch64_neon_facgt, 0),
7367 NEONMAP1(vcaltq_v, aarch64_neon_facgt, 0),
7404 NEONMAP1(vcvt_f16_f32, aarch64_neon_vcvtfp2hf, 0),
7407 NEONMAP1(vcvt_f32_f16, aarch64_neon_vcvthf2fp, 0),
7409 NEONMAP1(vcvt_n_f16_s16, aarch64_neon_vcvtfxs2fp, 0),
7410 NEONMAP1(vcvt_n_f16_u16, aarch64_neon_vcvtfxu2fp, 0),
7411 NEONMAP2(vcvt_n_f32_v, aarch64_neon_vcvtfxu2fp, aarch64_neon_vcvtfxs2fp, 0),
7412 NEONMAP2(vcvt_n_f64_v, aarch64_neon_vcvtfxu2fp, aarch64_neon_vcvtfxs2fp, 0),
7413 NEONMAP1(vcvt_n_s16_f16, aarch64_neon_vcvtfp2fxs, 0),
7414 NEONMAP1(vcvt_n_s32_v, aarch64_neon_vcvtfp2fxs, 0),
7415 NEONMAP1(vcvt_n_s64_v, aarch64_neon_vcvtfp2fxs, 0),
7416 NEONMAP1(vcvt_n_u16_f16, aarch64_neon_vcvtfp2fxu, 0),
7417 NEONMAP1(vcvt_n_u32_v, aarch64_neon_vcvtfp2fxu, 0),
7418 NEONMAP1(vcvt_n_u64_v, aarch64_neon_vcvtfp2fxu, 0),
7422 NEONMAP1(vcvtq_high_bf16_f32, aarch64_neon_bfcvtn2, 0),
7423 NEONMAP1(vcvtq_n_f16_s16, aarch64_neon_vcvtfxs2fp, 0),
7424 NEONMAP1(vcvtq_n_f16_u16, aarch64_neon_vcvtfxu2fp, 0),
7425 NEONMAP2(vcvtq_n_f32_v, aarch64_neon_vcvtfxu2fp, aarch64_neon_vcvtfxs2fp, 0),
7426 NEONMAP2(vcvtq_n_f64_v, aarch64_neon_vcvtfxu2fp, aarch64_neon_vcvtfxs2fp, 0),
7427 NEONMAP1(vcvtq_n_s16_f16, aarch64_neon_vcvtfp2fxs, 0),
7428 NEONMAP1(vcvtq_n_s32_v, aarch64_neon_vcvtfp2fxs, 0),
7429 NEONMAP1(vcvtq_n_s64_v, aarch64_neon_vcvtfp2fxs, 0),
7430 NEONMAP1(vcvtq_n_u16_f16, aarch64_neon_vcvtfp2fxu, 0),
7431 NEONMAP1(vcvtq_n_u32_v, aarch64_neon_vcvtfp2fxu, 0),
7432 NEONMAP1(vcvtq_n_u64_v, aarch64_neon_vcvtfp2fxu, 0),
7434 NEONMAP1(vdot_s32, aarch64_neon_sdot, 0),
7435 NEONMAP1(vdot_u32, aarch64_neon_udot, 0),
7436 NEONMAP1(vdotq_s32, aarch64_neon_sdot, 0),
7437 NEONMAP1(vdotq_u32, aarch64_neon_udot, 0),
7450 NEONMAP1(vfmlal_high_f16, aarch64_neon_fmlal2, 0),
7451 NEONMAP1(vfmlal_low_f16, aarch64_neon_fmlal, 0),
7452 NEONMAP1(vfmlalq_high_f16, aarch64_neon_fmlal2, 0),
7453 NEONMAP1(vfmlalq_low_f16, aarch64_neon_fmlal, 0),
7454 NEONMAP1(vfmlsl_high_f16, aarch64_neon_fmlsl2, 0),
7455 NEONMAP1(vfmlsl_low_f16, aarch64_neon_fmlsl, 0),
7456 NEONMAP1(vfmlslq_high_f16, aarch64_neon_fmlsl2, 0),
7457 NEONMAP1(vfmlslq_low_f16, aarch64_neon_fmlsl, 0),
7462 NEONMAP1(vld1_x2_v, aarch64_neon_ld1x2, 0),
7463 NEONMAP1(vld1_x3_v, aarch64_neon_ld1x3, 0),
7464 NEONMAP1(vld1_x4_v, aarch64_neon_ld1x4, 0),
7465 NEONMAP1(vld1q_x2_v, aarch64_neon_ld1x2, 0),
7466 NEONMAP1(vld1q_x3_v, aarch64_neon_ld1x3, 0),
7467 NEONMAP1(vld1q_x4_v, aarch64_neon_ld1x4, 0),
7468 NEONMAP1(vmmlaq_s32, aarch64_neon_smmla, 0),
7469 NEONMAP1(vmmlaq_u32, aarch64_neon_ummla, 0),
7482 NEONMAP2(vqdmlal_v, aarch64_neon_sqdmull, aarch64_neon_sqadd, 0),
7483 NEONMAP2(vqdmlsl_v, aarch64_neon_sqdmull, aarch64_neon_sqsub, 0),
7484 NEONMAP1(vqdmulh_lane_v, aarch64_neon_sqdmulh_lane, 0),
7485 NEONMAP1(vqdmulh_laneq_v, aarch64_neon_sqdmulh_laneq, 0),
7487 NEONMAP1(vqdmulhq_lane_v, aarch64_neon_sqdmulh_lane, 0),
7488 NEONMAP1(vqdmulhq_laneq_v, aarch64_neon_sqdmulh_laneq, 0),
7503 NEONMAP1(vqrdmulh_lane_v, aarch64_neon_sqrdmulh_lane, 0),
7504 NEONMAP1(vqrdmulh_laneq_v, aarch64_neon_sqrdmulh_laneq, 0),
7506 NEONMAP1(vqrdmulhq_lane_v, aarch64_neon_sqrdmulh_lane, 0),
7507 NEONMAP1(vqrdmulhq_laneq_v, aarch64_neon_sqrdmulh_laneq, 0),
7515 NEONMAP1(vqshlu_n_v, aarch64_neon_sqshlu, 0),
7516 NEONMAP1(vqshluq_n_v, aarch64_neon_sqshlu, 0),
7520 NEONMAP1(vrax1q_u64, aarch64_crypto_rax1, 0),
7521 NEONMAP2(vrecpe_v, aarch64_neon_frecpe, aarch64_neon_urecpe, 0),
7522 NEONMAP2(vrecpeq_v, aarch64_neon_frecpe, aarch64_neon_urecpe, 0),
7549 NEONMAP2(vrsqrte_v, aarch64_neon_frsqrte, aarch64_neon_ursqrte, 0),
7550 NEONMAP2(vrsqrteq_v, aarch64_neon_frsqrte, aarch64_neon_ursqrte, 0),
7554 NEONMAP1(vsha1su0q_u32, aarch64_crypto_sha1su0, 0),
7555 NEONMAP1(vsha1su1q_u32, aarch64_crypto_sha1su1, 0),
7556 NEONMAP1(vsha256h2q_u32, aarch64_crypto_sha256h2, 0),
7557 NEONMAP1(vsha256hq_u32, aarch64_crypto_sha256h, 0),
7558 NEONMAP1(vsha256su0q_u32, aarch64_crypto_sha256su0, 0),
7559 NEONMAP1(vsha256su1q_u32, aarch64_crypto_sha256su1, 0),
7560 NEONMAP1(vsha512h2q_u64, aarch64_crypto_sha512h2, 0),
7561 NEONMAP1(vsha512hq_u64, aarch64_crypto_sha512h, 0),
7562 NEONMAP1(vsha512su0q_u64, aarch64_crypto_sha512su0, 0),
7563 NEONMAP1(vsha512su1q_u64, aarch64_crypto_sha512su1, 0),
7572 NEONMAP1(vsm3partw1q_u32, aarch64_crypto_sm3partw1, 0),
7573 NEONMAP1(vsm3partw2q_u32, aarch64_crypto_sm3partw2, 0),
7574 NEONMAP1(vsm3ss1q_u32, aarch64_crypto_sm3ss1, 0),
7575 NEONMAP1(vsm3tt1aq_u32, aarch64_crypto_sm3tt1a, 0),
7576 NEONMAP1(vsm3tt1bq_u32, aarch64_crypto_sm3tt1b, 0),
7577 NEONMAP1(vsm3tt2aq_u32, aarch64_crypto_sm3tt2a, 0),
7578 NEONMAP1(vsm3tt2bq_u32, aarch64_crypto_sm3tt2b, 0),
7579 NEONMAP1(vsm4ekeyq_u32, aarch64_crypto_sm4ekey, 0),
7580 NEONMAP1(vsm4eq_u32, aarch64_crypto_sm4e, 0),
7581 NEONMAP1(vst1_x2_v, aarch64_neon_st1x2, 0),
7582 NEONMAP1(vst1_x3_v, aarch64_neon_st1x3, 0),
7583 NEONMAP1(vst1_x4_v, aarch64_neon_st1x4, 0),
7584 NEONMAP1(vst1q_x2_v, aarch64_neon_st1x2, 0),
7585 NEONMAP1(vst1q_x3_v, aarch64_neon_st1x3, 0),
7586 NEONMAP1(vst1q_x4_v, aarch64_neon_st1x4, 0),
7590 NEONMAP1(vusdot_s32, aarch64_neon_usdot, 0),
7591 NEONMAP1(vusdotq_s32, aarch64_neon_usdot, 0),
7592 NEONMAP1(vusmmlaq_s32, aarch64_neon_usmmla, 0),
7593 NEONMAP1(vxarq_u64, aarch64_crypto_xar, 0),
7631 NEONMAP1(vcvth_bf16_f32, aarch64_neon_bfcvt, 0),
7650 NEONMAP1(vcvtxd_f32_f64, aarch64_sisd_fcvtxn, 0),
7671 NEONMAP1(vmull_p64, aarch64_neon_pmull64, 0),
7699 NEONMAP1(vqdmulls_s32, aarch64_neon_sqdmulls_scalar, 0),
7780 NEONMAP1(vsha1cq_u32, aarch64_crypto_sha1c, 0),
7781 NEONMAP1(vsha1h_u32, aarch64_crypto_sha1h, 0),
7782 NEONMAP1(vsha1mq_u32, aarch64_crypto_sha1m, 0),
7783 NEONMAP1(vsha1pq_u32, aarch64_crypto_sha1p, 0),
7837 { NEON::BI__builtin_neon_splat_lane_bf16, NEON::BI__builtin_neon_splat_lane_v, },
7838 { NEON::BI__builtin_neon_splat_laneq_bf16, NEON::BI__builtin_neon_splat_laneq_v, },
7839 { NEON::BI__builtin_neon_splatq_lane_bf16, NEON::BI__builtin_neon_splatq_lane_v, },
7840 { NEON::BI__builtin_neon_splatq_laneq_bf16, NEON::BI__builtin_neon_splatq_laneq_v, },
7841 { NEON::BI__builtin_neon_vabd_f16, NEON::BI__builtin_neon_vabd_v, },
7842 { NEON::BI__builtin_neon_vabdq_f16, NEON::BI__builtin_neon_vabdq_v, },
7843 { NEON::BI__builtin_neon_vabs_f16, NEON::BI__builtin_neon_vabs_v, },
7844 { NEON::BI__builtin_neon_vabsq_f16, NEON::BI__builtin_neon_vabsq_v, },
7845 { NEON::BI__builtin_neon_vcage_f16, NEON::BI__builtin_neon_vcage_v, },
7846 { NEON::BI__builtin_neon_vcageq_f16, NEON::BI__builtin_neon_vcageq_v, },
7847 { NEON::BI__builtin_neon_vcagt_f16, NEON::BI__builtin_neon_vcagt_v, },
7848 { NEON::BI__builtin_neon_vcagtq_f16, NEON::BI__builtin_neon_vcagtq_v, },
7849 { NEON::BI__builtin_neon_vcale_f16, NEON::BI__builtin_neon_vcale_v, },
7850 { NEON::BI__builtin_neon_vcaleq_f16, NEON::BI__builtin_neon_vcaleq_v, },
7851 { NEON::BI__builtin_neon_vcalt_f16, NEON::BI__builtin_neon_vcalt_v, },
7852 { NEON::BI__builtin_neon_vcaltq_f16, NEON::BI__builtin_neon_vcaltq_v, },
7853 { NEON::BI__builtin_neon_vceqz_f16, NEON::BI__builtin_neon_vceqz_v, },
7854 { NEON::BI__builtin_neon_vceqzq_f16, NEON::BI__builtin_neon_vceqzq_v, },
7855 { NEON::BI__builtin_neon_vcgez_f16, NEON::BI__builtin_neon_vcgez_v, },
7856 { NEON::BI__builtin_neon_vcgezq_f16, NEON::BI__builtin_neon_vcgezq_v, },
7857 { NEON::BI__builtin_neon_vcgtz_f16, NEON::BI__builtin_neon_vcgtz_v, },
7858 { NEON::BI__builtin_neon_vcgtzq_f16, NEON::BI__builtin_neon_vcgtzq_v, },
7859 { NEON::BI__builtin_neon_vclez_f16, NEON::BI__builtin_neon_vclez_v, },
7860 { NEON::BI__builtin_neon_vclezq_f16, NEON::BI__builtin_neon_vclezq_v, },
7861 { NEON::BI__builtin_neon_vcltz_f16, NEON::BI__builtin_neon_vcltz_v, },
7862 { NEON::BI__builtin_neon_vcltzq_f16, NEON::BI__builtin_neon_vcltzq_v, },
7863 { NEON::BI__builtin_neon_vfma_f16, NEON::BI__builtin_neon_vfma_v, },
7864 { NEON::BI__builtin_neon_vfma_lane_f16, NEON::BI__builtin_neon_vfma_lane_v, },
7865 { NEON::BI__builtin_neon_vfma_laneq_f16, NEON::BI__builtin_neon_vfma_laneq_v, },
7866 { NEON::BI__builtin_neon_vfmaq_f16, NEON::BI__builtin_neon_vfmaq_v, },
7867 { NEON::BI__builtin_neon_vfmaq_lane_f16, NEON::BI__builtin_neon_vfmaq_lane_v, },
7868 { NEON::BI__builtin_neon_vfmaq_laneq_f16, NEON::BI__builtin_neon_vfmaq_laneq_v, },
7869 { NEON::BI__builtin_neon_vld1_bf16_x2, NEON::BI__builtin_neon_vld1_x2_v },
7870 { NEON::BI__builtin_neon_vld1_bf16_x3, NEON::BI__builtin_neon_vld1_x3_v },
7871 { NEON::BI__builtin_neon_vld1_bf16_x4, NEON::BI__builtin_neon_vld1_x4_v },
7872 { NEON::BI__builtin_neon_vld1_bf16, NEON::BI__builtin_neon_vld1_v },
7873 { NEON::BI__builtin_neon_vld1_dup_bf16, NEON::BI__builtin_neon_vld1_dup_v },
7874 { NEON::BI__builtin_neon_vld1_lane_bf16, NEON::BI__builtin_neon_vld1_lane_v },
7875 { NEON::BI__builtin_neon_vld1q_bf16_x2, NEON::BI__builtin_neon_vld1q_x2_v },
7876 { NEON::BI__builtin_neon_vld1q_bf16_x3, NEON::BI__builtin_neon_vld1q_x3_v },
7877 { NEON::BI__builtin_neon_vld1q_bf16_x4, NEON::BI__builtin_neon_vld1q_x4_v },
7878 { NEON::BI__builtin_neon_vld1q_bf16, NEON::BI__builtin_neon_vld1q_v },
7879 { NEON::BI__builtin_neon_vld1q_dup_bf16, NEON::BI__builtin_neon_vld1q_dup_v },
7880 { NEON::BI__builtin_neon_vld1q_lane_bf16, NEON::BI__builtin_neon_vld1q_lane_v },
7881 { NEON::BI__builtin_neon_vld2_bf16, NEON::BI__builtin_neon_vld2_v },
7882 { NEON::BI__builtin_neon_vld2_dup_bf16, NEON::BI__builtin_neon_vld2_dup_v },
7883 { NEON::BI__builtin_neon_vld2_lane_bf16, NEON::BI__builtin_neon_vld2_lane_v },
7884 { NEON::BI__builtin_neon_vld2q_bf16, NEON::BI__builtin_neon_vld2q_v },
7885 { NEON::BI__builtin_neon_vld2q_dup_bf16, NEON::BI__builtin_neon_vld2q_dup_v },
7886 { NEON::BI__builtin_neon_vld2q_lane_bf16, NEON::BI__builtin_neon_vld2q_lane_v },
7887 { NEON::BI__builtin_neon_vld3_bf16, NEON::BI__builtin_neon_vld3_v },
7888 { NEON::BI__builtin_neon_vld3_dup_bf16, NEON::BI__builtin_neon_vld3_dup_v },
7889 { NEON::BI__builtin_neon_vld3_lane_bf16, NEON::BI__builtin_neon_vld3_lane_v },
7890 { NEON::BI__builtin_neon_vld3q_bf16, NEON::BI__builtin_neon_vld3q_v },
7891 { NEON::BI__builtin_neon_vld3q_dup_bf16, NEON::BI__builtin_neon_vld3q_dup_v },
7892 { NEON::BI__builtin_neon_vld3q_lane_bf16, NEON::BI__builtin_neon_vld3q_lane_v },
7893 { NEON::BI__builtin_neon_vld4_bf16, NEON::BI__builtin_neon_vld4_v },
7894 { NEON::BI__builtin_neon_vld4_dup_bf16, NEON::BI__builtin_neon_vld4_dup_v },
7895 { NEON::BI__builtin_neon_vld4_lane_bf16, NEON::BI__builtin_neon_vld4_lane_v },
7896 { NEON::BI__builtin_neon_vld4q_bf16, NEON::BI__builtin_neon_vld4q_v },
7897 { NEON::BI__builtin_neon_vld4q_dup_bf16, NEON::BI__builtin_neon_vld4q_dup_v },
7898 { NEON::BI__builtin_neon_vld4q_lane_bf16, NEON::BI__builtin_neon_vld4q_lane_v },
7899 { NEON::BI__builtin_neon_vmax_f16, NEON::BI__builtin_neon_vmax_v, },
7900 { NEON::BI__builtin_neon_vmaxnm_f16, NEON::BI__builtin_neon_vmaxnm_v, },
7901 { NEON::BI__builtin_neon_vmaxnmq_f16, NEON::BI__builtin_neon_vmaxnmq_v, },
7902 { NEON::BI__builtin_neon_vmaxq_f16, NEON::BI__builtin_neon_vmaxq_v, },
7903 { NEON::BI__builtin_neon_vmin_f16, NEON::BI__builtin_neon_vmin_v, },
7904 { NEON::BI__builtin_neon_vminnm_f16, NEON::BI__builtin_neon_vminnm_v, },
7905 { NEON::BI__builtin_neon_vminnmq_f16, NEON::BI__builtin_neon_vminnmq_v, },
7906 { NEON::BI__builtin_neon_vminq_f16, NEON::BI__builtin_neon_vminq_v, },
7907 { NEON::BI__builtin_neon_vmulx_f16, NEON::BI__builtin_neon_vmulx_v, },
7908 { NEON::BI__builtin_neon_vmulxq_f16, NEON::BI__builtin_neon_vmulxq_v, },
7909 { NEON::BI__builtin_neon_vpadd_f16, NEON::BI__builtin_neon_vpadd_v, },
7910 { NEON::BI__builtin_neon_vpaddq_f16, NEON::BI__builtin_neon_vpaddq_v, },
7911 { NEON::BI__builtin_neon_vpmax_f16, NEON::BI__builtin_neon_vpmax_v, },
7912 { NEON::BI__builtin_neon_vpmaxnm_f16, NEON::BI__builtin_neon_vpmaxnm_v, },
7913 { NEON::BI__builtin_neon_vpmaxnmq_f16, NEON::BI__builtin_neon_vpmaxnmq_v, },
7914 { NEON::BI__builtin_neon_vpmaxq_f16, NEON::BI__builtin_neon_vpmaxq_v, },
7915 { NEON::BI__builtin_neon_vpmin_f16, NEON::BI__builtin_neon_vpmin_v, },
7916 { NEON::BI__builtin_neon_vpminnm_f16, NEON::BI__builtin_neon_vpminnm_v, },
7917 { NEON::BI__builtin_neon_vpminnmq_f16, NEON::BI__builtin_neon_vpminnmq_v, },
7918 { NEON::BI__builtin_neon_vpminq_f16, NEON::BI__builtin_neon_vpminq_v, },
7919 { NEON::BI__builtin_neon_vrecpe_f16, NEON::BI__builtin_neon_vrecpe_v, },
7920 { NEON::BI__builtin_neon_vrecpeq_f16, NEON::BI__builtin_neon_vrecpeq_v, },
7921 { NEON::BI__builtin_neon_vrecps_f16, NEON::BI__builtin_neon_vrecps_v, },
7922 { NEON::BI__builtin_neon_vrecpsq_f16, NEON::BI__builtin_neon_vrecpsq_v, },
7923 { NEON::BI__builtin_neon_vrnd_f16, NEON::BI__builtin_neon_vrnd_v, },
7924 { NEON::BI__builtin_neon_vrnda_f16, NEON::BI__builtin_neon_vrnda_v, },
7925 { NEON::BI__builtin_neon_vrndaq_f16, NEON::BI__builtin_neon_vrndaq_v, },
7926 { NEON::BI__builtin_neon_vrndi_f16, NEON::BI__builtin_neon_vrndi_v, },
7927 { NEON::BI__builtin_neon_vrndiq_f16, NEON::BI__builtin_neon_vrndiq_v, },
7928 { NEON::BI__builtin_neon_vrndm_f16, NEON::BI__builtin_neon_vrndm_v, },
7929 { NEON::BI__builtin_neon_vrndmq_f16, NEON::BI__builtin_neon_vrndmq_v, },
7930 { NEON::BI__builtin_neon_vrndn_f16, NEON::BI__builtin_neon_vrndn_v, },
7931 { NEON::BI__builtin_neon_vrndnq_f16, NEON::BI__builtin_neon_vrndnq_v, },
7932 { NEON::BI__builtin_neon_vrndp_f16, NEON::BI__builtin_neon_vrndp_v, },
7933 { NEON::BI__builtin_neon_vrndpq_f16, NEON::BI__builtin_neon_vrndpq_v, },
7934 { NEON::BI__builtin_neon_vrndq_f16, NEON::BI__builtin_neon_vrndq_v, },
7935 { NEON::BI__builtin_neon_vrndx_f16, NEON::BI__builtin_neon_vrndx_v, },
7936 { NEON::BI__builtin_neon_vrndxq_f16, NEON::BI__builtin_neon_vrndxq_v, },
7937 { NEON::BI__builtin_neon_vrsqrte_f16, NEON::BI__builtin_neon_vrsqrte_v, },
7938 { NEON::BI__builtin_neon_vrsqrteq_f16, NEON::BI__builtin_neon_vrsqrteq_v, },
7939 { NEON::BI__builtin_neon_vrsqrts_f16, NEON::BI__builtin_neon_vrsqrts_v, },
7940 { NEON::BI__builtin_neon_vrsqrtsq_f16, NEON::BI__builtin_neon_vrsqrtsq_v, },
7941 { NEON::BI__builtin_neon_vsqrt_f16, NEON::BI__builtin_neon_vsqrt_v, },
7942 { NEON::BI__builtin_neon_vsqrtq_f16, NEON::BI__builtin_neon_vsqrtq_v, },
7943 { NEON::BI__builtin_neon_vst1_bf16_x2, NEON::BI__builtin_neon_vst1_x2_v },
7944 { NEON::BI__builtin_neon_vst1_bf16_x3, NEON::BI__builtin_neon_vst1_x3_v },
7945 { NEON::BI__builtin_neon_vst1_bf16_x4, NEON::BI__builtin_neon_vst1_x4_v },
7946 { NEON::BI__builtin_neon_vst1_bf16, NEON::BI__builtin_neon_vst1_v },
7947 { NEON::BI__builtin_neon_vst1_lane_bf16, NEON::BI__builtin_neon_vst1_lane_v },
7948 { NEON::BI__builtin_neon_vst1q_bf16_x2, NEON::BI__builtin_neon_vst1q_x2_v },
7949 { NEON::BI__builtin_neon_vst1q_bf16_x3, NEON::BI__builtin_neon_vst1q_x3_v },
7950 { NEON::BI__builtin_neon_vst1q_bf16_x4, NEON::BI__builtin_neon_vst1q_x4_v },
7951 { NEON::BI__builtin_neon_vst1q_bf16, NEON::BI__builtin_neon_vst1q_v },
7952 { NEON::BI__builtin_neon_vst1q_lane_bf16, NEON::BI__builtin_neon_vst1q_lane_v },
7953 { NEON::BI__builtin_neon_vst2_bf16, NEON::BI__builtin_neon_vst2_v },
7954 { NEON::BI__builtin_neon_vst2_lane_bf16, NEON::BI__builtin_neon_vst2_lane_v },
7955 { NEON::BI__builtin_neon_vst2q_bf16, NEON::BI__builtin_neon_vst2q_v },
7956 { NEON::BI__builtin_neon_vst2q_lane_bf16, NEON::BI__builtin_neon_vst2q_lane_v },
7957 { NEON::BI__builtin_neon_vst3_bf16, NEON::BI__builtin_neon_vst3_v },
7958 { NEON::BI__builtin_neon_vst3_lane_bf16, NEON::BI__builtin_neon_vst3_lane_v },
7959 { NEON::BI__builtin_neon_vst3q_bf16, NEON::BI__builtin_neon_vst3q_v },
7960 { NEON::BI__builtin_neon_vst3q_lane_bf16, NEON::BI__builtin_neon_vst3q_lane_v },
7961 { NEON::BI__builtin_neon_vst4_bf16, NEON::BI__builtin_neon_vst4_v },
7962 { NEON::BI__builtin_neon_vst4_lane_bf16, NEON::BI__builtin_neon_vst4_lane_v },
7963 { NEON::BI__builtin_neon_vst4q_bf16, NEON::BI__builtin_neon_vst4q_v },
7964 { NEON::BI__builtin_neon_vst4q_lane_bf16, NEON::BI__builtin_neon_vst4q_lane_v },
7968 { NEON::BI__builtin_neon_vldap1_lane_u64, NEON::BI__builtin_neon_vldap1_lane_s64 },
7969 { NEON::BI__builtin_neon_vldap1_lane_f64, NEON::BI__builtin_neon_vldap1_lane_s64 },
7970 { NEON::BI__builtin_neon_vldap1_lane_p64, NEON::BI__builtin_neon_vldap1_lane_s64 },
7971 { NEON::BI__builtin_neon_vldap1q_lane_u64, NEON::BI__builtin_neon_vldap1q_lane_s64 },
7972 { NEON::BI__builtin_neon_vldap1q_lane_f64, NEON::BI__builtin_neon_vldap1q_lane_s64 },
7973 { NEON::BI__builtin_neon_vldap1q_lane_p64, NEON::BI__builtin_neon_vldap1q_lane_s64 },
7974 { NEON::BI__builtin_neon_vstl1_lane_u64, NEON::BI__builtin_neon_vstl1_lane_s64 },
7975 { NEON::BI__builtin_neon_vstl1_lane_f64, NEON::BI__builtin_neon_vstl1_lane_s64 },
7976 { NEON::BI__builtin_neon_vstl1_lane_p64, NEON::BI__builtin_neon_vstl1_lane_s64 },
7977 { NEON::BI__builtin_neon_vstl1q_lane_u64, NEON::BI__builtin_neon_vstl1q_lane_s64 },
7978 { NEON::BI__builtin_neon_vstl1q_lane_f64, NEON::BI__builtin_neon_vstl1q_lane_s64 },
7979 { NEON::BI__builtin_neon_vstl1q_lane_p64, NEON::BI__builtin_neon_vstl1q_lane_s64 },
7986#define SVEMAP1(NameBase, LLVMIntrinsic, TypeModifier) \
7988 #NameBase, SVE::BI__builtin_sve_##NameBase, Intrinsic::LLVMIntrinsic, 0, \
7992#define SVEMAP2(NameBase, TypeModifier) \
7993 { #NameBase, SVE::BI__builtin_sve_##NameBase, 0, 0, TypeModifier }
7995#define GET_SVE_LLVM_INTRINSIC_MAP
7996#include "clang/Basic/arm_sve_builtin_cg.inc"
7997#include "clang/Basic/BuiltinsAArch64NeonSVEBridge_cg.def"
7998#undef GET_SVE_LLVM_INTRINSIC_MAP
8004#define SMEMAP1(NameBase, LLVMIntrinsic, TypeModifier) \
8006 #NameBase, SME::BI__builtin_sme_##NameBase, Intrinsic::LLVMIntrinsic, 0, \
8010#define SMEMAP2(NameBase, TypeModifier) \
8011 { #NameBase, SME::BI__builtin_sme_##NameBase, 0, 0, TypeModifier }
8013#define GET_SME_LLVM_INTRINSIC_MAP
8014#include "clang/Basic/arm_sme_builtin_cg.inc"
8015#undef GET_SME_LLVM_INTRINSIC_MAP
8028static const ARMVectorIntrinsicInfo *
8030 unsigned BuiltinID,
bool &MapProvenSorted) {
8033 if (!MapProvenSorted) {
8034 assert(llvm::is_sorted(IntrinsicMap));
8035 MapProvenSorted =
true;
8039 const ARMVectorIntrinsicInfo *Builtin =
8040 llvm::lower_bound(IntrinsicMap, BuiltinID);
8042 if (Builtin != IntrinsicMap.end() && Builtin->BuiltinID == BuiltinID)
8050 llvm::Type *ArgType,
8063 Ty = llvm::FixedVectorType::get(
8064 Ty, VectorSize ? VectorSize / Ty->getPrimitiveSizeInBits() : 1);
8071 int Elts = VectorSize ? VectorSize / ArgType->getPrimitiveSizeInBits() : 1;
8072 ArgType = llvm::FixedVectorType::get(ArgType, Elts);
8076 Tys.push_back(ArgType);
8079 Tys.push_back(ArgType);
8090 unsigned BuiltinID = SISDInfo.BuiltinID;
8091 unsigned int Int = SISDInfo.LLVMIntrinsic;
8092 unsigned Modifier = SISDInfo.TypeModifier;
8093 const char *
s = SISDInfo.NameHint;
8095 switch (BuiltinID) {
8096 case NEON::BI__builtin_neon_vcled_s64:
8097 case NEON::BI__builtin_neon_vcled_u64:
8098 case NEON::BI__builtin_neon_vcles_f32:
8099 case NEON::BI__builtin_neon_vcled_f64:
8100 case NEON::BI__builtin_neon_vcltd_s64:
8101 case NEON::BI__builtin_neon_vcltd_u64:
8102 case NEON::BI__builtin_neon_vclts_f32:
8103 case NEON::BI__builtin_neon_vcltd_f64:
8104 case NEON::BI__builtin_neon_vcales_f32:
8105 case NEON::BI__builtin_neon_vcaled_f64:
8106 case NEON::BI__builtin_neon_vcalts_f32:
8107 case NEON::BI__builtin_neon_vcaltd_f64:
8111 std::swap(Ops[0], Ops[1]);
8115 assert(Int &&
"Generic code assumes a valid intrinsic");
8118 const Expr *Arg =
E->getArg(0);
8123 ConstantInt *C0 = ConstantInt::get(CGF.
SizeTy, 0);
8124 for (Function::const_arg_iterator ai = F->arg_begin(), ae = F->arg_end();
8125 ai != ae; ++ai, ++j) {
8126 llvm::Type *ArgTy = ai->getType();
8127 if (Ops[j]->getType()->getPrimitiveSizeInBits() ==
8128 ArgTy->getPrimitiveSizeInBits())
8131 assert(ArgTy->isVectorTy() && !Ops[j]->getType()->isVectorTy());
8134 Ops[j] = CGF.
Builder.CreateTruncOrBitCast(
8135 Ops[j], cast<llvm::VectorType>(ArgTy)->getElementType());
8137 CGF.
Builder.CreateInsertElement(PoisonValue::get(ArgTy), Ops[j], C0);
8142 if (ResultType->getPrimitiveSizeInBits().getFixedValue() <
8143 Result->getType()->getPrimitiveSizeInBits().getFixedValue())
8150 unsigned BuiltinID,
unsigned LLVMIntrinsic,
unsigned AltLLVMIntrinsic,
8151 const char *NameHint,
unsigned Modifier,
const CallExpr *
E,
8153 llvm::Triple::ArchType Arch) {
8155 const Expr *Arg =
E->getArg(
E->getNumArgs() - 1);
8156 std::optional<llvm::APSInt> NeonTypeConst =
8163 bool Usgn =
Type.isUnsigned();
8164 bool Quad =
Type.isQuad();
8166 const bool AllowBFloatArgsAndRet =
8169 llvm::FixedVectorType *VTy =
8170 GetNeonType(
this,
Type, HasLegalHalfType,
false, AllowBFloatArgsAndRet);
8171 llvm::Type *Ty = VTy;
8175 auto getAlignmentValue32 = [&](
Address addr) ->
Value* {
8176 return Builder.getInt32(addr.getAlignment().getQuantity());
8179 unsigned Int = LLVMIntrinsic;
8181 Int = AltLLVMIntrinsic;
8183 switch (BuiltinID) {
8185 case NEON::BI__builtin_neon_splat_lane_v:
8186 case NEON::BI__builtin_neon_splat_laneq_v:
8187 case NEON::BI__builtin_neon_splatq_lane_v:
8188 case NEON::BI__builtin_neon_splatq_laneq_v: {
8189 auto NumElements = VTy->getElementCount();
8190 if (BuiltinID == NEON::BI__builtin_neon_splatq_lane_v)
8191 NumElements = NumElements * 2;
8192 if (BuiltinID == NEON::BI__builtin_neon_splat_laneq_v)
8193 NumElements = NumElements.divideCoefficientBy(2);
8195 Ops[0] =
Builder.CreateBitCast(Ops[0], VTy);
8196 return EmitNeonSplat(Ops[0], cast<ConstantInt>(Ops[1]), NumElements);
8198 case NEON::BI__builtin_neon_vpadd_v:
8199 case NEON::BI__builtin_neon_vpaddq_v:
8201 if (VTy->getElementType()->isFloatingPointTy() &&
8202 Int == Intrinsic::aarch64_neon_addp)
8203 Int = Intrinsic::aarch64_neon_faddp;
8205 case NEON::BI__builtin_neon_vabs_v:
8206 case NEON::BI__builtin_neon_vabsq_v:
8207 if (VTy->getElementType()->isFloatingPointTy())
8210 case NEON::BI__builtin_neon_vadd_v:
8211 case NEON::BI__builtin_neon_vaddq_v: {
8212 llvm::Type *VTy = llvm::FixedVectorType::get(
Int8Ty, Quad ? 16 : 8);
8213 Ops[0] =
Builder.CreateBitCast(Ops[0], VTy);
8214 Ops[1] =
Builder.CreateBitCast(Ops[1], VTy);
8215 Ops[0] =
Builder.CreateXor(Ops[0], Ops[1]);
8216 return Builder.CreateBitCast(Ops[0], Ty);
8218 case NEON::BI__builtin_neon_vaddhn_v: {
8219 llvm::FixedVectorType *SrcTy =
8220 llvm::FixedVectorType::getExtendedElementVectorType(VTy);
8223 Ops[0] =
Builder.CreateBitCast(Ops[0], SrcTy);
8224 Ops[1] =
Builder.CreateBitCast(Ops[1], SrcTy);
8225 Ops[0] =
Builder.CreateAdd(Ops[0], Ops[1],
"vaddhn");
8228 Constant *ShiftAmt =
8229 ConstantInt::get(SrcTy, SrcTy->getScalarSizeInBits() / 2);
8230 Ops[0] =
Builder.CreateLShr(Ops[0], ShiftAmt,
"vaddhn");
8233 return Builder.CreateTrunc(Ops[0], VTy,
"vaddhn");
8235 case NEON::BI__builtin_neon_vcale_v:
8236 case NEON::BI__builtin_neon_vcaleq_v:
8237 case NEON::BI__builtin_neon_vcalt_v:
8238 case NEON::BI__builtin_neon_vcaltq_v:
8239 std::swap(Ops[0], Ops[1]);
8241 case NEON::BI__builtin_neon_vcage_v:
8242 case NEON::BI__builtin_neon_vcageq_v:
8243 case NEON::BI__builtin_neon_vcagt_v:
8244 case NEON::BI__builtin_neon_vcagtq_v: {
8246 switch (VTy->getScalarSizeInBits()) {
8247 default: llvm_unreachable(
"unexpected type");
8258 auto *VecFlt = llvm::FixedVectorType::get(Ty, VTy->getNumElements());
8259 llvm::Type *Tys[] = { VTy, VecFlt };
8263 case NEON::BI__builtin_neon_vceqz_v:
8264 case NEON::BI__builtin_neon_vceqzq_v:
8266 ICmpInst::ICMP_EQ,
"vceqz");
8267 case NEON::BI__builtin_neon_vcgez_v:
8268 case NEON::BI__builtin_neon_vcgezq_v:
8270 ICmpInst::ICMP_SGE,
"vcgez");
8271 case NEON::BI__builtin_neon_vclez_v:
8272 case NEON::BI__builtin_neon_vclezq_v:
8274 ICmpInst::ICMP_SLE,
"vclez");
8275 case NEON::BI__builtin_neon_vcgtz_v:
8276 case NEON::BI__builtin_neon_vcgtzq_v:
8278 ICmpInst::ICMP_SGT,
"vcgtz");
8279 case NEON::BI__builtin_neon_vcltz_v:
8280 case NEON::BI__builtin_neon_vcltzq_v:
8282 ICmpInst::ICMP_SLT,
"vcltz");
8283 case NEON::BI__builtin_neon_vclz_v:
8284 case NEON::BI__builtin_neon_vclzq_v:
8289 case NEON::BI__builtin_neon_vcvt_f32_v:
8290 case NEON::BI__builtin_neon_vcvtq_f32_v:
8291 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
8294 return Usgn ?
Builder.CreateUIToFP(Ops[0], Ty,
"vcvt")
8295 :
Builder.CreateSIToFP(Ops[0], Ty,
"vcvt");
8296 case NEON::BI__builtin_neon_vcvt_f16_s16:
8297 case NEON::BI__builtin_neon_vcvt_f16_u16:
8298 case NEON::BI__builtin_neon_vcvtq_f16_s16:
8299 case NEON::BI__builtin_neon_vcvtq_f16_u16:
8300 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
8303 return Usgn ?
Builder.CreateUIToFP(Ops[0], Ty,
"vcvt")
8304 :
Builder.CreateSIToFP(Ops[0], Ty,
"vcvt");
8305 case NEON::BI__builtin_neon_vcvt_n_f16_s16:
8306 case NEON::BI__builtin_neon_vcvt_n_f16_u16:
8307 case NEON::BI__builtin_neon_vcvtq_n_f16_s16:
8308 case NEON::BI__builtin_neon_vcvtq_n_f16_u16: {
8313 case NEON::BI__builtin_neon_vcvt_n_f32_v:
8314 case NEON::BI__builtin_neon_vcvt_n_f64_v:
8315 case NEON::BI__builtin_neon_vcvtq_n_f32_v:
8316 case NEON::BI__builtin_neon_vcvtq_n_f64_v: {
8318 Int = Usgn ? LLVMIntrinsic : AltLLVMIntrinsic;
8322 case NEON::BI__builtin_neon_vcvt_n_s16_f16:
8323 case NEON::BI__builtin_neon_vcvt_n_s32_v:
8324 case NEON::BI__builtin_neon_vcvt_n_u16_f16:
8325 case NEON::BI__builtin_neon_vcvt_n_u32_v:
8326 case NEON::BI__builtin_neon_vcvt_n_s64_v:
8327 case NEON::BI__builtin_neon_vcvt_n_u64_v:
8328 case NEON::BI__builtin_neon_vcvtq_n_s16_f16:
8329 case NEON::BI__builtin_neon_vcvtq_n_s32_v:
8330 case NEON::BI__builtin_neon_vcvtq_n_u16_f16:
8331 case NEON::BI__builtin_neon_vcvtq_n_u32_v:
8332 case NEON::BI__builtin_neon_vcvtq_n_s64_v:
8333 case NEON::BI__builtin_neon_vcvtq_n_u64_v: {
8338 case NEON::BI__builtin_neon_vcvt_s32_v:
8339 case NEON::BI__builtin_neon_vcvt_u32_v:
8340 case NEON::BI__builtin_neon_vcvt_s64_v:
8341 case NEON::BI__builtin_neon_vcvt_u64_v:
8342 case NEON::BI__builtin_neon_vcvt_s16_f16:
8343 case NEON::BI__builtin_neon_vcvt_u16_f16:
8344 case NEON::BI__builtin_neon_vcvtq_s32_v:
8345 case NEON::BI__builtin_neon_vcvtq_u32_v:
8346 case NEON::BI__builtin_neon_vcvtq_s64_v:
8347 case NEON::BI__builtin_neon_vcvtq_u64_v:
8348 case NEON::BI__builtin_neon_vcvtq_s16_f16:
8349 case NEON::BI__builtin_neon_vcvtq_u16_f16: {
8351 return Usgn ?
Builder.CreateFPToUI(Ops[0], Ty,
"vcvt")
8352 :
Builder.CreateFPToSI(Ops[0], Ty,
"vcvt");
8354 case NEON::BI__builtin_neon_vcvta_s16_f16:
8355 case NEON::BI__builtin_neon_vcvta_s32_v:
8356 case NEON::BI__builtin_neon_vcvta_s64_v:
8357 case NEON::BI__builtin_neon_vcvta_u16_f16:
8358 case NEON::BI__builtin_neon_vcvta_u32_v:
8359 case NEON::BI__builtin_neon_vcvta_u64_v:
8360 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
8361 case NEON::BI__builtin_neon_vcvtaq_s32_v:
8362 case NEON::BI__builtin_neon_vcvtaq_s64_v:
8363 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
8364 case NEON::BI__builtin_neon_vcvtaq_u32_v:
8365 case NEON::BI__builtin_neon_vcvtaq_u64_v:
8366 case NEON::BI__builtin_neon_vcvtn_s16_f16:
8367 case NEON::BI__builtin_neon_vcvtn_s32_v:
8368 case NEON::BI__builtin_neon_vcvtn_s64_v:
8369 case NEON::BI__builtin_neon_vcvtn_u16_f16:
8370 case NEON::BI__builtin_neon_vcvtn_u32_v:
8371 case NEON::BI__builtin_neon_vcvtn_u64_v:
8372 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
8373 case NEON::BI__builtin_neon_vcvtnq_s32_v:
8374 case NEON::BI__builtin_neon_vcvtnq_s64_v:
8375 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
8376 case NEON::BI__builtin_neon_vcvtnq_u32_v:
8377 case NEON::BI__builtin_neon_vcvtnq_u64_v:
8378 case NEON::BI__builtin_neon_vcvtp_s16_f16:
8379 case NEON::BI__builtin_neon_vcvtp_s32_v:
8380 case NEON::BI__builtin_neon_vcvtp_s64_v:
8381 case NEON::BI__builtin_neon_vcvtp_u16_f16:
8382 case NEON::BI__builtin_neon_vcvtp_u32_v:
8383 case NEON::BI__builtin_neon_vcvtp_u64_v:
8384 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
8385 case NEON::BI__builtin_neon_vcvtpq_s32_v:
8386 case NEON::BI__builtin_neon_vcvtpq_s64_v:
8387 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
8388 case NEON::BI__builtin_neon_vcvtpq_u32_v:
8389 case NEON::BI__builtin_neon_vcvtpq_u64_v:
8390 case NEON::BI__builtin_neon_vcvtm_s16_f16:
8391 case NEON::BI__builtin_neon_vcvtm_s32_v:
8392 case NEON::BI__builtin_neon_vcvtm_s64_v:
8393 case NEON::BI__builtin_neon_vcvtm_u16_f16:
8394 case NEON::BI__builtin_neon_vcvtm_u32_v:
8395 case NEON::BI__builtin_neon_vcvtm_u64_v:
8396 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
8397 case NEON::BI__builtin_neon_vcvtmq_s32_v:
8398 case NEON::BI__builtin_neon_vcvtmq_s64_v:
8399 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
8400 case NEON::BI__builtin_neon_vcvtmq_u32_v:
8401 case NEON::BI__builtin_neon_vcvtmq_u64_v: {
8405 case NEON::BI__builtin_neon_vcvtx_f32_v: {
8406 llvm::Type *Tys[2] = { VTy->getTruncatedElementVectorType(VTy), Ty};
8410 case NEON::BI__builtin_neon_vext_v:
8411 case NEON::BI__builtin_neon_vextq_v: {
8412 int CV = cast<ConstantInt>(Ops[2])->getSExtValue();
8414 for (
unsigned i = 0, e = VTy->getNumElements(); i != e; ++i)
8415 Indices.push_back(i+CV);
8417 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
8418 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
8419 return Builder.CreateShuffleVector(Ops[0], Ops[1], Indices,
"vext");
8421 case NEON::BI__builtin_neon_vfma_v:
8422 case NEON::BI__builtin_neon_vfmaq_v: {
8423 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
8424 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
8425 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
8429 *
this, Intrinsic::fma, Intrinsic::experimental_constrained_fma, Ty,
8430 {Ops[1], Ops[2], Ops[0]});
8432 case NEON::BI__builtin_neon_vld1_v:
8433 case NEON::BI__builtin_neon_vld1q_v: {
8435 Ops.push_back(getAlignmentValue32(PtrOp0));
8438 case NEON::BI__builtin_neon_vld1_x2_v:
8439 case NEON::BI__builtin_neon_vld1q_x2_v:
8440 case NEON::BI__builtin_neon_vld1_x3_v:
8441 case NEON::BI__builtin_neon_vld1q_x3_v:
8442 case NEON::BI__builtin_neon_vld1_x4_v:
8443 case NEON::BI__builtin_neon_vld1q_x4_v: {
8446 Ops[1] =
Builder.CreateCall(F, Ops[1],
"vld1xN");
8449 case NEON::BI__builtin_neon_vld2_v:
8450 case NEON::BI__builtin_neon_vld2q_v:
8451 case NEON::BI__builtin_neon_vld3_v:
8452 case NEON::BI__builtin_neon_vld3q_v:
8453 case NEON::BI__builtin_neon_vld4_v:
8454 case NEON::BI__builtin_neon_vld4q_v:
8455 case NEON::BI__builtin_neon_vld2_dup_v:
8456 case NEON::BI__builtin_neon_vld2q_dup_v:
8457 case NEON::BI__builtin_neon_vld3_dup_v:
8458 case NEON::BI__builtin_neon_vld3q_dup_v:
8459 case NEON::BI__builtin_neon_vld4_dup_v:
8460 case NEON::BI__builtin_neon_vld4q_dup_v: {
8463 Value *Align = getAlignmentValue32(PtrOp1);
8464 Ops[1] =
Builder.CreateCall(F, {Ops[1], Align}, NameHint);
8467 case NEON::BI__builtin_neon_vld1_dup_v:
8468 case NEON::BI__builtin_neon_vld1q_dup_v: {
8469 Value *
V = PoisonValue::get(Ty);
8472 llvm::Constant *CI = ConstantInt::get(
SizeTy, 0);
8473 Ops[0] =
Builder.CreateInsertElement(
V, Ld, CI);
8476 case NEON::BI__builtin_neon_vld2_lane_v:
8477 case NEON::BI__builtin_neon_vld2q_lane_v:
8478 case NEON::BI__builtin_neon_vld3_lane_v:
8479 case NEON::BI__builtin_neon_vld3q_lane_v:
8480 case NEON::BI__builtin_neon_vld4_lane_v:
8481 case NEON::BI__builtin_neon_vld4q_lane_v: {
8484 for (
unsigned I = 2; I < Ops.size() - 1; ++I)
8485 Ops[I] =
Builder.CreateBitCast(Ops[I], Ty);
8486 Ops.push_back(getAlignmentValue32(PtrOp1));
8490 case NEON::BI__builtin_neon_vmovl_v: {
8491 llvm::FixedVectorType *DTy =
8492 llvm::FixedVectorType::getTruncatedElementVectorType(VTy);
8493 Ops[0] =
Builder.CreateBitCast(Ops[0], DTy);
8495 return Builder.CreateZExt(Ops[0], Ty,
"vmovl");
8496 return Builder.CreateSExt(Ops[0], Ty,
"vmovl");
8498 case NEON::BI__builtin_neon_vmovn_v: {
8499 llvm::FixedVectorType *QTy =
8500 llvm::FixedVectorType::getExtendedElementVectorType(VTy);
8501 Ops[0] =
Builder.CreateBitCast(Ops[0], QTy);
8502 return Builder.CreateTrunc(Ops[0], Ty,
"vmovn");
8504 case NEON::BI__builtin_neon_vmull_v:
8510 Int = Usgn ? Intrinsic::arm_neon_vmullu : Intrinsic::arm_neon_vmulls;
8513 case NEON::BI__builtin_neon_vpadal_v:
8514 case NEON::BI__builtin_neon_vpadalq_v: {
8516 unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits();
8520 llvm::FixedVectorType::get(EltTy, VTy->getNumElements() * 2);
8521 llvm::Type *Tys[2] = { Ty, NarrowTy };
8524 case NEON::BI__builtin_neon_vpaddl_v:
8525 case NEON::BI__builtin_neon_vpaddlq_v: {
8527 unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits();
8528 llvm::Type *EltTy = llvm::IntegerType::get(
getLLVMContext(), EltBits / 2);
8530 llvm::FixedVectorType::get(EltTy, VTy->getNumElements() * 2);
8531 llvm::Type *Tys[2] = { Ty, NarrowTy };
8534 case NEON::BI__builtin_neon_vqdmlal_v:
8535 case NEON::BI__builtin_neon_vqdmlsl_v: {
8542 case NEON::BI__builtin_neon_vqdmulhq_lane_v:
8543 case NEON::BI__builtin_neon_vqdmulh_lane_v:
8544 case NEON::BI__builtin_neon_vqrdmulhq_lane_v:
8545 case NEON::BI__builtin_neon_vqrdmulh_lane_v: {
8546 auto *RTy = cast<llvm::FixedVectorType>(Ty);
8547 if (BuiltinID == NEON::BI__builtin_neon_vqdmulhq_lane_v ||
8548 BuiltinID == NEON::BI__builtin_neon_vqrdmulhq_lane_v)
8549 RTy = llvm::FixedVectorType::get(RTy->getElementType(),
8550 RTy->getNumElements() * 2);
8551 llvm::Type *Tys[2] = {
8556 case NEON::BI__builtin_neon_vqdmulhq_laneq_v:
8557 case NEON::BI__builtin_neon_vqdmulh_laneq_v:
8558 case NEON::BI__builtin_neon_vqrdmulhq_laneq_v:
8559 case NEON::BI__builtin_neon_vqrdmulh_laneq_v: {
8560 llvm::Type *Tys[2] = {
8565 case NEON::BI__builtin_neon_vqshl_n_v:
8566 case NEON::BI__builtin_neon_vqshlq_n_v:
8569 case NEON::BI__builtin_neon_vqshlu_n_v:
8570 case NEON::BI__builtin_neon_vqshluq_n_v:
8573 case NEON::BI__builtin_neon_vrecpe_v:
8574 case NEON::BI__builtin_neon_vrecpeq_v:
8575 case NEON::BI__builtin_neon_vrsqrte_v:
8576 case NEON::BI__builtin_neon_vrsqrteq_v:
8577 Int = Ty->isFPOrFPVectorTy() ? LLVMIntrinsic : AltLLVMIntrinsic;
8579 case NEON::BI__builtin_neon_vrndi_v:
8580 case NEON::BI__builtin_neon_vrndiq_v:
8582 ? Intrinsic::experimental_constrained_nearbyint
8583 : Intrinsic::nearbyint;
8585 case NEON::BI__builtin_neon_vrshr_n_v:
8586 case NEON::BI__builtin_neon_vrshrq_n_v:
8589 case NEON::BI__builtin_neon_vsha512hq_u64:
8590 case NEON::BI__builtin_neon_vsha512h2q_u64:
8591 case NEON::BI__builtin_neon_vsha512su0q_u64:
8592 case NEON::BI__builtin_neon_vsha512su1q_u64: {
8596 case NEON::BI__builtin_neon_vshl_n_v:
8597 case NEON::BI__builtin_neon_vshlq_n_v:
8599 return Builder.CreateShl(
Builder.CreateBitCast(Ops[0],Ty), Ops[1],
8601 case NEON::BI__builtin_neon_vshll_n_v: {
8602 llvm::FixedVectorType *SrcTy =
8603 llvm::FixedVectorType::getTruncatedElementVectorType(VTy);
8604 Ops[0] =
Builder.CreateBitCast(Ops[0], SrcTy);
8606 Ops[0] =
Builder.CreateZExt(Ops[0], VTy);
8608 Ops[0] =
Builder.CreateSExt(Ops[0], VTy);
8610 return Builder.CreateShl(Ops[0], Ops[1],
"vshll_n");
8612 case NEON::BI__builtin_neon_vshrn_n_v: {
8613 llvm::FixedVectorType *SrcTy =
8614 llvm::FixedVectorType::getExtendedElementVectorType(VTy);
8615 Ops[0] =
Builder.CreateBitCast(Ops[0], SrcTy);
8618 Ops[0] =
Builder.CreateLShr(Ops[0], Ops[1]);
8620 Ops[0] =
Builder.CreateAShr(Ops[0], Ops[1]);
8621 return Builder.CreateTrunc(Ops[0], Ty,
"vshrn_n");
8623 case NEON::BI__builtin_neon_vshr_n_v:
8624 case NEON::BI__builtin_neon_vshrq_n_v:
8626 case NEON::BI__builtin_neon_vst1_v:
8627 case NEON::BI__builtin_neon_vst1q_v:
8628 case NEON::BI__builtin_neon_vst2_v:
8629 case NEON::BI__builtin_neon_vst2q_v:
8630 case NEON::BI__builtin_neon_vst3_v:
8631 case NEON::BI__builtin_neon_vst3q_v:
8632 case NEON::BI__builtin_neon_vst4_v:
8633 case NEON::BI__builtin_neon_vst4q_v:
8634 case NEON::BI__builtin_neon_vst2_lane_v:
8635 case NEON::BI__builtin_neon_vst2q_lane_v:
8636 case NEON::BI__builtin_neon_vst3_lane_v:
8637 case NEON::BI__builtin_neon_vst3q_lane_v:
8638 case NEON::BI__builtin_neon_vst4_lane_v:
8639 case NEON::BI__builtin_neon_vst4q_lane_v: {
8641 Ops.push_back(getAlignmentValue32(PtrOp0));
8644 case NEON::BI__builtin_neon_vsm3partw1q_u32:
8645 case NEON::BI__builtin_neon_vsm3partw2q_u32:
8646 case NEON::BI__builtin_neon_vsm3ss1q_u32:
8647 case NEON::BI__builtin_neon_vsm4ekeyq_u32:
8648 case NEON::BI__builtin_neon_vsm4eq_u32: {
8652 case NEON::BI__builtin_neon_vsm3tt1aq_u32:
8653 case NEON::BI__builtin_neon_vsm3tt1bq_u32:
8654 case NEON::BI__builtin_neon_vsm3tt2aq_u32:
8655 case NEON::BI__builtin_neon_vsm3tt2bq_u32: {
8660 case NEON::BI__builtin_neon_vst1_x2_v:
8661 case NEON::BI__builtin_neon_vst1q_x2_v:
8662 case NEON::BI__builtin_neon_vst1_x3_v:
8663 case NEON::BI__builtin_neon_vst1q_x3_v:
8664 case NEON::BI__builtin_neon_vst1_x4_v:
8665 case NEON::BI__builtin_neon_vst1q_x4_v: {
8668 if (Arch == llvm::Triple::aarch64 || Arch == llvm::Triple::aarch64_be ||
8669 Arch == llvm::Triple::aarch64_32) {
8671 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end());
8677 case NEON::BI__builtin_neon_vsubhn_v: {
8678 llvm::FixedVectorType *SrcTy =
8679 llvm::FixedVectorType::getExtendedElementVectorType(VTy);
8682 Ops[0] =
Builder.CreateBitCast(Ops[0], SrcTy);
8683 Ops[1] =
Builder.CreateBitCast(Ops[1], SrcTy);
8684 Ops[0] =
Builder.CreateSub(Ops[0], Ops[1],
"vsubhn");
8687 Constant *ShiftAmt =
8688 ConstantInt::get(SrcTy, SrcTy->getScalarSizeInBits() / 2);
8689 Ops[0] =
Builder.CreateLShr(Ops[0], ShiftAmt,
"vsubhn");
8692 return Builder.CreateTrunc(Ops[0], VTy,
"vsubhn");
8694 case NEON::BI__builtin_neon_vtrn_v:
8695 case NEON::BI__builtin_neon_vtrnq_v: {
8696 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
8697 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
8698 Value *SV =
nullptr;
8700 for (
unsigned vi = 0; vi != 2; ++vi) {
8702 for (
unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) {
8703 Indices.push_back(i+vi);
8704 Indices.push_back(i+e+vi);
8706 Value *Addr =
Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi);
8707 SV =
Builder.CreateShuffleVector(Ops[1], Ops[2], Indices,
"vtrn");
8712 case NEON::BI__builtin_neon_vtst_v:
8713 case NEON::BI__builtin_neon_vtstq_v: {
8714 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
8715 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
8716 Ops[0] =
Builder.CreateAnd(Ops[0], Ops[1]);
8717 Ops[0] =
Builder.CreateICmp(ICmpInst::ICMP_NE, Ops[0],
8718 ConstantAggregateZero::get(Ty));
8719 return Builder.CreateSExt(Ops[0], Ty,
"vtst");
8721 case NEON::BI__builtin_neon_vuzp_v:
8722 case NEON::BI__builtin_neon_vuzpq_v: {
8723 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
8724 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
8725 Value *SV =
nullptr;
8727 for (
unsigned vi = 0; vi != 2; ++vi) {
8729 for (
unsigned i = 0, e = VTy->getNumElements(); i != e; ++i)
8730 Indices.push_back(2*i+vi);
8732 Value *Addr =
Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi);
8733 SV =
Builder.CreateShuffleVector(Ops[1], Ops[2], Indices,
"vuzp");
8738 case NEON::BI__builtin_neon_vxarq_u64: {
8743 case NEON::BI__builtin_neon_vzip_v:
8744 case NEON::BI__builtin_neon_vzipq_v: {
8745 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
8746 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
8747 Value *SV =
nullptr;
8749 for (
unsigned vi = 0; vi != 2; ++vi) {
8751 for (
unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) {
8752 Indices.push_back((i + vi*e) >> 1);
8753 Indices.push_back(((i + vi*e) >> 1)+e);
8755 Value *Addr =
Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi);
8756 SV =
Builder.CreateShuffleVector(Ops[1], Ops[2], Indices,
"vzip");
8761 case NEON::BI__builtin_neon_vdot_s32:
8762 case NEON::BI__builtin_neon_vdot_u32:
8763 case NEON::BI__builtin_neon_vdotq_s32:
8764 case NEON::BI__builtin_neon_vdotq_u32: {
8766 llvm::FixedVectorType::get(
Int8Ty, Ty->getPrimitiveSizeInBits() / 8);
8767 llvm::Type *Tys[2] = { Ty, InputTy };
8770 case NEON::BI__builtin_neon_vfmlal_low_f16:
8771 case NEON::BI__builtin_neon_vfmlalq_low_f16: {
8773 llvm::FixedVectorType::get(
HalfTy, Ty->getPrimitiveSizeInBits() / 16);
8774 llvm::Type *Tys[2] = { Ty, InputTy };
8777 case NEON::BI__builtin_neon_vfmlsl_low_f16:
8778 case NEON::BI__builtin_neon_vfmlslq_low_f16: {
8780 llvm::FixedVectorType::get(
HalfTy, Ty->getPrimitiveSizeInBits() / 16);
8781 llvm::Type *Tys[2] = { Ty, InputTy };
8784 case NEON::BI__builtin_neon_vfmlal_high_f16:
8785 case NEON::BI__builtin_neon_vfmlalq_high_f16: {
8787 llvm::FixedVectorType::get(
HalfTy, Ty->getPrimitiveSizeInBits() / 16);
8788 llvm::Type *Tys[2] = { Ty, InputTy };
8791 case NEON::BI__builtin_neon_vfmlsl_high_f16:
8792 case NEON::BI__builtin_neon_vfmlslq_high_f16: {
8794 llvm::FixedVectorType::get(
HalfTy, Ty->getPrimitiveSizeInBits() / 16);
8795 llvm::Type *Tys[2] = { Ty, InputTy };
8798 case NEON::BI__builtin_neon_vmmlaq_s32:
8799 case NEON::BI__builtin_neon_vmmlaq_u32: {
8801 llvm::FixedVectorType::get(
Int8Ty, Ty->getPrimitiveSizeInBits() / 8);
8802 llvm::Type *Tys[2] = { Ty, InputTy };
8805 case NEON::BI__builtin_neon_vusmmlaq_s32: {
8807 llvm::FixedVectorType::get(
Int8Ty, Ty->getPrimitiveSizeInBits() / 8);
8808 llvm::Type *Tys[2] = { Ty, InputTy };
8811 case NEON::BI__builtin_neon_vusdot_s32:
8812 case NEON::BI__builtin_neon_vusdotq_s32: {
8814 llvm::FixedVectorType::get(
Int8Ty, Ty->getPrimitiveSizeInBits() / 8);
8815 llvm::Type *Tys[2] = { Ty, InputTy };
8818 case NEON::BI__builtin_neon_vbfdot_f32:
8819 case NEON::BI__builtin_neon_vbfdotq_f32: {
8820 llvm::Type *InputTy =
8821 llvm::FixedVectorType::get(
BFloatTy, Ty->getPrimitiveSizeInBits() / 16);
8822 llvm::Type *Tys[2] = { Ty, InputTy };
8825 case NEON::BI__builtin_neon___a32_vcvt_bf16_f32: {
8826 llvm::Type *Tys[1] = { Ty };
8833 assert(Int &&
"Expected valid intrinsic number");
8846 Value *Op, llvm::Type *Ty,
const CmpInst::Predicate Fp,
8847 const CmpInst::Predicate Ip,
const Twine &Name) {
8848 llvm::Type *OTy = Op->
getType();
8854 if (BitCastInst *BI = dyn_cast<BitCastInst>(Op))
8855 OTy = BI->getOperand(0)->getType();
8857 Op =
Builder.CreateBitCast(Op, OTy);
8858 if (OTy->getScalarType()->isFloatingPointTy()) {
8859 if (Fp == CmpInst::FCMP_OEQ)
8860 Op =
Builder.CreateFCmp(Fp, Op, Constant::getNullValue(OTy));
8862 Op =
Builder.CreateFCmpS(Fp, Op, Constant::getNullValue(OTy));
8864 Op =
Builder.CreateICmp(Ip, Op, Constant::getNullValue(OTy));
8866 return Builder.CreateSExt(Op, Ty, Name);
8871 llvm::Type *ResTy,
unsigned IntID,
8875 TblOps.push_back(ExtOp);
8879 auto *TblTy = cast<llvm::FixedVectorType>(Ops[0]->getType());
8880 for (
unsigned i = 0, e = TblTy->getNumElements(); i != e; ++i) {
8881 Indices.push_back(2*i);
8882 Indices.push_back(2*i+1);
8885 int PairPos = 0, End = Ops.size() - 1;
8886 while (PairPos < End) {
8887 TblOps.push_back(CGF.
Builder.CreateShuffleVector(Ops[PairPos],
8888 Ops[PairPos+1], Indices,
8895 if (PairPos == End) {
8896 Value *ZeroTbl = ConstantAggregateZero::get(TblTy);
8897 TblOps.push_back(CGF.
Builder.CreateShuffleVector(Ops[PairPos],
8898 ZeroTbl, Indices, Name));
8902 TblOps.push_back(IndexOp);
8908Value *CodeGenFunction::GetValueForARMHint(
unsigned BuiltinID) {
8910 switch (BuiltinID) {
8913 case clang::ARM::BI__builtin_arm_nop:
8916 case clang::ARM::BI__builtin_arm_yield:
8917 case clang::ARM::BI__yield:
8920 case clang::ARM::BI__builtin_arm_wfe:
8921 case clang::ARM::BI__wfe:
8924 case clang::ARM::BI__builtin_arm_wfi:
8925 case clang::ARM::BI__wfi:
8928 case clang::ARM::BI__builtin_arm_sev:
8929 case clang::ARM::BI__sev:
8932 case clang::ARM::BI__builtin_arm_sevl:
8933 case clang::ARM::BI__sevl:
8952 llvm::Type *ValueType,
bool isExecHi) {
8957 llvm::Value *
Call = Builder.CreateCall(F, {Builder.getInt1(
true)});
8960 Value *Rt2 = Builder.CreateLShr(
Call, 32);
8961 Rt2 = Builder.CreateTrunc(Rt2, CGF.
Int32Ty);
8974 llvm::Type *ValueType,
8976 StringRef SysReg =
"") {
8980 "Unsupported size for register.");
8986 if (SysReg.empty()) {
8988 SysReg = cast<clang::StringLiteral>(SysRegStrExpr)->getString();
8991 llvm::Metadata *Ops[] = { llvm::MDString::get(Context, SysReg) };
8992 llvm::MDNode *RegName = llvm::MDNode::get(Context, Ops);
8993 llvm::Value *Metadata = llvm::MetadataAsValue::get(Context, RegName);
8997 bool MixedTypes =
RegisterType->isIntegerTy(64) && ValueType->isIntegerTy(32);
8998 assert(!(
RegisterType->isIntegerTy(32) && ValueType->isIntegerTy(64))
8999 &&
"Can't fit 64-bit value in 32-bit register");
9001 if (AccessKind !=
Write) {
9004 AccessKind ==
VolatileRead ? llvm::Intrinsic::read_volatile_register
9005 : llvm::Intrinsic::read_register,
9007 llvm::Value *
Call = Builder.CreateCall(F, Metadata);
9011 return Builder.CreateTrunc(
Call, ValueType);
9013 if (ValueType->isPointerTy())
9015 return Builder.CreateIntToPtr(
Call, ValueType);
9020 llvm::Function *F = CGM.
getIntrinsic(llvm::Intrinsic::write_register, Types);
9025 return Builder.CreateCall(F, { Metadata, ArgValue });
9028 if (ValueType->isPointerTy()) {
9030 ArgValue = Builder.CreatePtrToInt(ArgValue,
RegisterType);
9031 return Builder.CreateCall(F, { Metadata, ArgValue });
9034 return Builder.CreateCall(F, { Metadata, ArgValue });
9040 switch (BuiltinID) {
9042 case NEON::BI__builtin_neon_vget_lane_i8:
9043 case NEON::BI__builtin_neon_vget_lane_i16:
9044 case NEON::BI__builtin_neon_vget_lane_bf16:
9045 case NEON::BI__builtin_neon_vget_lane_i32:
9046 case NEON::BI__builtin_neon_vget_lane_i64:
9047 case NEON::BI__builtin_neon_vget_lane_f32:
9048 case NEON::BI__builtin_neon_vgetq_lane_i8:
9049 case NEON::BI__builtin_neon_vgetq_lane_i16:
9050 case NEON::BI__builtin_neon_vgetq_lane_bf16:
9051 case NEON::BI__builtin_neon_vgetq_lane_i32:
9052 case NEON::BI__builtin_neon_vgetq_lane_i64:
9053 case NEON::BI__builtin_neon_vgetq_lane_f32:
9054 case NEON::BI__builtin_neon_vduph_lane_bf16:
9055 case NEON::BI__builtin_neon_vduph_laneq_bf16:
9056 case NEON::BI__builtin_neon_vset_lane_i8:
9057 case NEON::BI__builtin_neon_vset_lane_i16:
9058 case NEON::BI__builtin_neon_vset_lane_bf16:
9059 case NEON::BI__builtin_neon_vset_lane_i32:
9060 case NEON::BI__builtin_neon_vset_lane_i64:
9061 case NEON::BI__builtin_neon_vset_lane_f32:
9062 case NEON::BI__builtin_neon_vsetq_lane_i8:
9063 case NEON::BI__builtin_neon_vsetq_lane_i16:
9064 case NEON::BI__builtin_neon_vsetq_lane_bf16:
9065 case NEON::BI__builtin_neon_vsetq_lane_i32:
9066 case NEON::BI__builtin_neon_vsetq_lane_i64:
9067 case NEON::BI__builtin_neon_vsetq_lane_f32:
9068 case NEON::BI__builtin_neon_vsha1h_u32:
9069 case NEON::BI__builtin_neon_vsha1cq_u32:
9070 case NEON::BI__builtin_neon_vsha1pq_u32:
9071 case NEON::BI__builtin_neon_vsha1mq_u32:
9072 case NEON::BI__builtin_neon_vcvth_bf16_f32:
9073 case clang::ARM::BI_MoveToCoprocessor:
9074 case clang::ARM::BI_MoveToCoprocessor2:
9083 llvm::Triple::ArchType Arch) {
9084 if (
auto Hint = GetValueForARMHint(BuiltinID))
9087 if (BuiltinID == clang::ARM::BI__emit) {
9089 llvm::FunctionType *FTy =
9090 llvm::FunctionType::get(
VoidTy,
false);
9094 llvm_unreachable(
"Sema will ensure that the parameter is constant");
9097 uint64_t ZExtValue =
Value.zextOrTrunc(IsThumb ? 16 : 32).getZExtValue();
9099 llvm::InlineAsm *Emit =
9100 IsThumb ? InlineAsm::get(FTy,
".inst.n 0x" + utohexstr(ZExtValue),
"",
9102 : InlineAsm::get(FTy,
".inst 0x" + utohexstr(ZExtValue),
"",
9105 return Builder.CreateCall(Emit);
9108 if (BuiltinID == clang::ARM::BI__builtin_arm_dbg) {
9113 if (BuiltinID == clang::ARM::BI__builtin_arm_prefetch) {
9125 if (BuiltinID == clang::ARM::BI__builtin_arm_rbit) {
9128 CGM.
getIntrinsic(Intrinsic::bitreverse, Arg->getType()), Arg,
"rbit");
9131 if (BuiltinID == clang::ARM::BI__builtin_arm_clz ||
9132 BuiltinID == clang::ARM::BI__builtin_arm_clz64) {
9136 if (BuiltinID == clang::ARM::BI__builtin_arm_clz64)
9142 if (BuiltinID == clang::ARM::BI__builtin_arm_cls) {
9146 if (BuiltinID == clang::ARM::BI__builtin_arm_cls64) {
9152 if (BuiltinID == clang::ARM::BI__clear_cache) {
9153 assert(
E->getNumArgs() == 2 &&
"__clear_cache takes 2 arguments");
9156 for (
unsigned i = 0; i < 2; i++)
9159 llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty);
9160 StringRef Name = FD->
getName();
9164 if (BuiltinID == clang::ARM::BI__builtin_arm_mcrr ||
9165 BuiltinID == clang::ARM::BI__builtin_arm_mcrr2) {
9168 switch (BuiltinID) {
9169 default: llvm_unreachable(
"unexpected builtin");
9170 case clang::ARM::BI__builtin_arm_mcrr:
9173 case clang::ARM::BI__builtin_arm_mcrr2:
9195 return Builder.CreateCall(F, {Coproc, Opc1, Rt, Rt2, CRm});
9198 if (BuiltinID == clang::ARM::BI__builtin_arm_mrrc ||
9199 BuiltinID == clang::ARM::BI__builtin_arm_mrrc2) {
9202 switch (BuiltinID) {
9203 default: llvm_unreachable(
"unexpected builtin");
9204 case clang::ARM::BI__builtin_arm_mrrc:
9207 case clang::ARM::BI__builtin_arm_mrrc2:
9215 Value *RtAndRt2 =
Builder.CreateCall(F, {Coproc, Opc1, CRm});
9225 Value *ShiftCast = llvm::ConstantInt::get(
Int64Ty, 32);
9226 RtAndRt2 =
Builder.CreateShl(Rt, ShiftCast,
"shl",
true);
9227 RtAndRt2 =
Builder.CreateOr(RtAndRt2, Rt1);
9232 if (BuiltinID == clang::ARM::BI__builtin_arm_ldrexd ||
9233 ((BuiltinID == clang::ARM::BI__builtin_arm_ldrex ||
9234 BuiltinID == clang::ARM::BI__builtin_arm_ldaex) &&
9236 BuiltinID == clang::ARM::BI__ldrexd) {
9239 switch (BuiltinID) {
9240 default: llvm_unreachable(
"unexpected builtin");
9241 case clang::ARM::BI__builtin_arm_ldaex:
9244 case clang::ARM::BI__builtin_arm_ldrexd:
9245 case clang::ARM::BI__builtin_arm_ldrex:
9246 case clang::ARM::BI__ldrexd:
9260 Val =
Builder.CreateShl(Val0, ShiftCst,
"shl",
true );
9261 Val =
Builder.CreateOr(Val, Val1);
9265 if (BuiltinID == clang::ARM::BI__builtin_arm_ldrex ||
9266 BuiltinID == clang::ARM::BI__builtin_arm_ldaex) {
9275 BuiltinID == clang::ARM::BI__builtin_arm_ldaex ? Intrinsic::arm_ldaex
9276 : Intrinsic::arm_ldrex,
9278 CallInst *Val =
Builder.CreateCall(F, LoadAddr,
"ldrex");
9282 if (RealResTy->isPointerTy())
9283 return Builder.CreateIntToPtr(Val, RealResTy);
9285 llvm::Type *IntResTy = llvm::IntegerType::get(
9287 return Builder.CreateBitCast(
Builder.CreateTruncOrBitCast(Val, IntResTy),
9292 if (BuiltinID == clang::ARM::BI__builtin_arm_strexd ||
9293 ((BuiltinID == clang::ARM::BI__builtin_arm_stlex ||
9294 BuiltinID == clang::ARM::BI__builtin_arm_strex) &&
9297 BuiltinID == clang::ARM::BI__builtin_arm_stlex ? Intrinsic::arm_stlexd
9298 : Intrinsic::arm_strexd);
9311 return Builder.CreateCall(F, {Arg0, Arg1, StPtr},
"strexd");
9314 if (BuiltinID == clang::ARM::BI__builtin_arm_strex ||
9315 BuiltinID == clang::ARM::BI__builtin_arm_stlex) {
9320 llvm::Type *StoreTy =
9323 if (StoreVal->
getType()->isPointerTy())
9326 llvm::Type *
IntTy = llvm::IntegerType::get(
9334 BuiltinID == clang::ARM::BI__builtin_arm_stlex ? Intrinsic::arm_stlex
9335 : Intrinsic::arm_strex,
9338 CallInst *CI =
Builder.CreateCall(F, {StoreVal, StoreAddr},
"strex");
9340 1, Attribute::get(
getLLVMContext(), Attribute::ElementType, StoreTy));
9344 if (BuiltinID == clang::ARM::BI__builtin_arm_clrex) {
9350 Intrinsic::ID CRCIntrinsicID = Intrinsic::not_intrinsic;
9351 switch (BuiltinID) {
9352 case clang::ARM::BI__builtin_arm_crc32b:
9353 CRCIntrinsicID = Intrinsic::arm_crc32b;
break;
9354 case clang::ARM::BI__builtin_arm_crc32cb:
9355 CRCIntrinsicID = Intrinsic::arm_crc32cb;
break;
9356 case clang::ARM::BI__builtin_arm_crc32h:
9357 CRCIntrinsicID = Intrinsic::arm_crc32h;
break;
9358 case clang::ARM::BI__builtin_arm_crc32ch:
9359 CRCIntrinsicID = Intrinsic::arm_crc32ch;
break;
9360 case clang::ARM::BI__builtin_arm_crc32w:
9361 case clang::ARM::BI__builtin_arm_crc32d:
9362 CRCIntrinsicID = Intrinsic::arm_crc32w;
break;
9363 case clang::ARM::BI__builtin_arm_crc32cw:
9364 case clang::ARM::BI__builtin_arm_crc32cd:
9365 CRCIntrinsicID = Intrinsic::arm_crc32cw;
break;
9368 if (CRCIntrinsicID != Intrinsic::not_intrinsic) {
9374 if (BuiltinID == clang::ARM::BI__builtin_arm_crc32d ||
9375 BuiltinID == clang::ARM::BI__builtin_arm_crc32cd) {
9383 return Builder.CreateCall(F, {Res, Arg1b});
9388 return Builder.CreateCall(F, {Arg0, Arg1});
9392 if (BuiltinID == clang::ARM::BI__builtin_arm_rsr ||
9393 BuiltinID == clang::ARM::BI__builtin_arm_rsr64 ||
9394 BuiltinID == clang::ARM::BI__builtin_arm_rsrp ||
9395 BuiltinID == clang::ARM::BI__builtin_arm_wsr ||
9396 BuiltinID == clang::ARM::BI__builtin_arm_wsr64 ||
9397 BuiltinID == clang::ARM::BI__builtin_arm_wsrp) {
9400 if (BuiltinID == clang::ARM::BI__builtin_arm_rsr ||
9401 BuiltinID == clang::ARM::BI__builtin_arm_rsr64 ||
9402 BuiltinID == clang::ARM::BI__builtin_arm_rsrp)
9405 bool IsPointerBuiltin = BuiltinID == clang::ARM::BI__builtin_arm_rsrp ||
9406 BuiltinID == clang::ARM::BI__builtin_arm_wsrp;
9408 bool Is64Bit = BuiltinID == clang::ARM::BI__builtin_arm_rsr64 ||
9409 BuiltinID == clang::ARM::BI__builtin_arm_wsr64;
9411 llvm::Type *ValueType;
9413 if (IsPointerBuiltin) {
9416 }
else if (Is64Bit) {
9426 if (BuiltinID == ARM::BI__builtin_sponentry) {
9445 return P.first == BuiltinID;
9448 BuiltinID = It->second;
9452 unsigned ICEArguments = 0;
9457 auto getAlignmentValue32 = [&](
Address addr) ->
Value* {
9458 return Builder.getInt32(addr.getAlignment().getQuantity());
9465 unsigned NumArgs =
E->getNumArgs() - (HasExtraArg ? 1 : 0);
9466 for (
unsigned i = 0, e = NumArgs; i != e; i++) {
9468 switch (BuiltinID) {
9469 case NEON::BI__builtin_neon_vld1_v:
9470 case NEON::BI__builtin_neon_vld1q_v:
9471 case NEON::BI__builtin_neon_vld1q_lane_v:
9472 case NEON::BI__builtin_neon_vld1_lane_v:
9473 case NEON::BI__builtin_neon_vld1_dup_v:
9474 case NEON::BI__builtin_neon_vld1q_dup_v:
9475 case NEON::BI__builtin_neon_vst1_v:
9476 case NEON::BI__builtin_neon_vst1q_v:
9477 case NEON::BI__builtin_neon_vst1q_lane_v:
9478 case NEON::BI__builtin_neon_vst1_lane_v:
9479 case NEON::BI__builtin_neon_vst2_v:
9480 case NEON::BI__builtin_neon_vst2q_v:
9481 case NEON::BI__builtin_neon_vst2_lane_v:
9482 case NEON::BI__builtin_neon_vst2q_lane_v:
9483 case NEON::BI__builtin_neon_vst3_v:
9484 case NEON::BI__builtin_neon_vst3q_v:
9485 case NEON::BI__builtin_neon_vst3_lane_v:
9486 case NEON::BI__builtin_neon_vst3q_lane_v:
9487 case NEON::BI__builtin_neon_vst4_v:
9488 case NEON::BI__builtin_neon_vst4q_v:
9489 case NEON::BI__builtin_neon_vst4_lane_v:
9490 case NEON::BI__builtin_neon_vst4q_lane_v:
9499 switch (BuiltinID) {
9500 case NEON::BI__builtin_neon_vld2_v:
9501 case NEON::BI__builtin_neon_vld2q_v:
9502 case NEON::BI__builtin_neon_vld3_v:
9503 case NEON::BI__builtin_neon_vld3q_v:
9504 case NEON::BI__builtin_neon_vld4_v:
9505 case NEON::BI__builtin_neon_vld4q_v:
9506 case NEON::BI__builtin_neon_vld2_lane_v:
9507 case NEON::BI__builtin_neon_vld2q_lane_v:
9508 case NEON::BI__builtin_neon_vld3_lane_v:
9509 case NEON::BI__builtin_neon_vld3q_lane_v:
9510 case NEON::BI__builtin_neon_vld4_lane_v:
9511 case NEON::BI__builtin_neon_vld4q_lane_v:
9512 case NEON::BI__builtin_neon_vld2_dup_v:
9513 case NEON::BI__builtin_neon_vld2q_dup_v:
9514 case NEON::BI__builtin_neon_vld3_dup_v:
9515 case NEON::BI__builtin_neon_vld3q_dup_v:
9516 case NEON::BI__builtin_neon_vld4_dup_v:
9517 case NEON::BI__builtin_neon_vld4q_dup_v:
9529 switch (BuiltinID) {
9532 case NEON::BI__builtin_neon_vget_lane_i8:
9533 case NEON::BI__builtin_neon_vget_lane_i16:
9534 case NEON::BI__builtin_neon_vget_lane_i32:
9535 case NEON::BI__builtin_neon_vget_lane_i64:
9536 case NEON::BI__builtin_neon_vget_lane_bf16:
9537 case NEON::BI__builtin_neon_vget_lane_f32:
9538 case NEON::BI__builtin_neon_vgetq_lane_i8:
9539 case NEON::BI__builtin_neon_vgetq_lane_i16:
9540 case NEON::BI__builtin_neon_vgetq_lane_i32:
9541 case NEON::BI__builtin_neon_vgetq_lane_i64:
9542 case NEON::BI__builtin_neon_vgetq_lane_bf16:
9543 case NEON::BI__builtin_neon_vgetq_lane_f32:
9544 case NEON::BI__builtin_neon_vduph_lane_bf16:
9545 case NEON::BI__builtin_neon_vduph_laneq_bf16:
9546 return Builder.CreateExtractElement(Ops[0], Ops[1],
"vget_lane");
9548 case NEON::BI__builtin_neon_vrndns_f32: {
9550 llvm::Type *Tys[] = {Arg->
getType()};
9552 return Builder.CreateCall(F, {Arg},
"vrndn"); }
9554 case NEON::BI__builtin_neon_vset_lane_i8:
9555 case NEON::BI__builtin_neon_vset_lane_i16:
9556 case NEON::BI__builtin_neon_vset_lane_i32:
9557 case NEON::BI__builtin_neon_vset_lane_i64:
9558 case NEON::BI__builtin_neon_vset_lane_bf16:
9559 case NEON::BI__builtin_neon_vset_lane_f32:
9560 case NEON::BI__builtin_neon_vsetq_lane_i8:
9561 case NEON::BI__builtin_neon_vsetq_lane_i16:
9562 case NEON::BI__builtin_neon_vsetq_lane_i32:
9563 case NEON::BI__builtin_neon_vsetq_lane_i64:
9564 case NEON::BI__builtin_neon_vsetq_lane_bf16:
9565 case NEON::BI__builtin_neon_vsetq_lane_f32:
9566 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2],
"vset_lane");
9568 case NEON::BI__builtin_neon_vsha1h_u32:
9571 case NEON::BI__builtin_neon_vsha1cq_u32:
9574 case NEON::BI__builtin_neon_vsha1pq_u32:
9577 case NEON::BI__builtin_neon_vsha1mq_u32:
9581 case NEON::BI__builtin_neon_vcvth_bf16_f32: {
9588 case clang::ARM::BI_MoveToCoprocessor:
9589 case clang::ARM::BI_MoveToCoprocessor2: {
9591 ? Intrinsic::arm_mcr
9592 : Intrinsic::arm_mcr2);
9593 return Builder.CreateCall(F, {Ops[1], Ops[2], Ops[0],
9594 Ops[3], Ops[4], Ops[5]});
9599 assert(HasExtraArg);
9600 const Expr *Arg =
E->getArg(
E->getNumArgs()-1);
9601 std::optional<llvm::APSInt>
Result =
9606 if (BuiltinID == clang::ARM::BI__builtin_arm_vcvtr_f ||
9607 BuiltinID == clang::ARM::BI__builtin_arm_vcvtr_d) {
9610 if (BuiltinID == clang::ARM::BI__builtin_arm_vcvtr_f)
9616 bool usgn =
Result->getZExtValue() == 1;
9617 unsigned Int = usgn ? Intrinsic::arm_vcvtru : Intrinsic::arm_vcvtr;
9621 return Builder.CreateCall(F, Ops,
"vcvtr");
9626 bool usgn =
Type.isUnsigned();
9627 bool rightShift =
false;
9629 llvm::FixedVectorType *VTy =
9632 llvm::Type *Ty = VTy;
9643 Builtin->BuiltinID, Builtin->LLVMIntrinsic, Builtin->AltLLVMIntrinsic,
9644 Builtin->NameHint, Builtin->TypeModifier,
E, Ops, PtrOp0, PtrOp1, Arch);
9647 switch (BuiltinID) {
9648 default:
return nullptr;
9649 case NEON::BI__builtin_neon_vld1q_lane_v:
9652 if (VTy->getElementType()->isIntegerTy(64)) {
9654 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
9655 int Lane = cast<ConstantInt>(Ops[2])->getZExtValue();
9656 Value *SV = llvm::ConstantVector::get(ConstantInt::get(
Int32Ty, 1-Lane));
9657 Ops[1] =
Builder.CreateShuffleVector(Ops[1], Ops[1], SV);
9659 Ty = llvm::FixedVectorType::get(VTy->getElementType(), 1);
9662 Value *Align = getAlignmentValue32(PtrOp0);
9665 int Indices[] = {1 - Lane, Lane};
9666 return Builder.CreateShuffleVector(Ops[1], Ld, Indices,
"vld1q_lane");
9669 case NEON::BI__builtin_neon_vld1_lane_v: {
9670 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
9673 return Builder.CreateInsertElement(Ops[1], Ld, Ops[2],
"vld1_lane");
9675 case NEON::BI__builtin_neon_vqrshrn_n_v:
9677 usgn ? Intrinsic::arm_neon_vqrshiftnu : Intrinsic::arm_neon_vqrshiftns;
9680 case NEON::BI__builtin_neon_vqrshrun_n_v:
9682 Ops,
"vqrshrun_n", 1,
true);
9683 case NEON::BI__builtin_neon_vqshrn_n_v:
9684 Int = usgn ? Intrinsic::arm_neon_vqshiftnu : Intrinsic::arm_neon_vqshiftns;
9687 case NEON::BI__builtin_neon_vqshrun_n_v:
9689 Ops,
"vqshrun_n", 1,
true);
9690 case NEON::BI__builtin_neon_vrecpe_v:
9691 case NEON::BI__builtin_neon_vrecpeq_v:
9694 case NEON::BI__builtin_neon_vrshrn_n_v:
9696 Ops,
"vrshrn_n", 1,
true);
9697 case NEON::BI__builtin_neon_vrsra_n_v:
9698 case NEON::BI__builtin_neon_vrsraq_n_v:
9699 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
9700 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
9702 Int = usgn ? Intrinsic::arm_neon_vrshiftu : Intrinsic::arm_neon_vrshifts;
9704 return Builder.CreateAdd(Ops[0], Ops[1],
"vrsra_n");
9705 case NEON::BI__builtin_neon_vsri_n_v:
9706 case NEON::BI__builtin_neon_vsriq_n_v:
9709 case NEON::BI__builtin_neon_vsli_n_v:
9710 case NEON::BI__builtin_neon_vsliq_n_v:
9714 case NEON::BI__builtin_neon_vsra_n_v:
9715 case NEON::BI__builtin_neon_vsraq_n_v:
9716 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
9718 return Builder.CreateAdd(Ops[0], Ops[1]);
9719 case NEON::BI__builtin_neon_vst1q_lane_v:
9722 if (VTy->getElementType()->isIntegerTy(64)) {
9723 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
9724 Value *SV = llvm::ConstantVector::get(cast<llvm::Constant>(Ops[2]));
9725 Ops[1] =
Builder.CreateShuffleVector(Ops[1], Ops[1], SV);
9726 Ops[2] = getAlignmentValue32(PtrOp0);
9727 llvm::Type *Tys[] = {
Int8PtrTy, Ops[1]->getType()};
9732 case NEON::BI__builtin_neon_vst1_lane_v: {
9733 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
9734 Ops[1] =
Builder.CreateExtractElement(Ops[1], Ops[2]);
9738 case NEON::BI__builtin_neon_vtbl1_v:
9741 case NEON::BI__builtin_neon_vtbl2_v:
9744 case NEON::BI__builtin_neon_vtbl3_v:
9747 case NEON::BI__builtin_neon_vtbl4_v:
9750 case NEON::BI__builtin_neon_vtbx1_v:
9753 case NEON::BI__builtin_neon_vtbx2_v:
9756 case NEON::BI__builtin_neon_vtbx3_v:
9759 case NEON::BI__builtin_neon_vtbx4_v:
9765template<
typename Integer>
9774 return Unsigned ? Builder.CreateZExt(
V,
T) : Builder.CreateSExt(
V,
T);
9784 unsigned LaneBits = cast<llvm::VectorType>(
V->getType())
9786 ->getPrimitiveSizeInBits();
9787 if (Shift == LaneBits) {
9792 return llvm::Constant::getNullValue(
V->getType());
9796 return Unsigned ? Builder.CreateLShr(
V, Shift) : Builder.CreateAShr(
V, Shift);
9803 unsigned Elements = 128 /
V->getType()->getPrimitiveSizeInBits();
9804 return Builder.CreateVectorSplat(Elements,
V);
9810 llvm::Type *DestType) {
9823 V->getType()->getScalarSizeInBits() != DestType->getScalarSizeInBits()) {
9824 return Builder.CreateCall(
9826 {DestType, V->getType()}),
9829 return Builder.CreateBitCast(
V, DestType);
9837 unsigned InputElements =
9838 cast<llvm::FixedVectorType>(
V->getType())->getNumElements();
9839 for (
unsigned i = 0; i < InputElements; i += 2)
9840 Indices.push_back(i + Odd);
9841 return Builder.CreateShuffleVector(
V, Indices);
9847 assert(V0->getType() == V1->getType() &&
"Can't zip different vector types");
9849 unsigned InputElements =
9850 cast<llvm::FixedVectorType>(V0->getType())->getNumElements();
9851 for (
unsigned i = 0; i < InputElements; i++) {
9852 Indices.push_back(i);
9853 Indices.push_back(i + InputElements);
9855 return Builder.CreateShuffleVector(V0, V1, Indices);
9858template<
unsigned HighBit,
unsigned OtherBits>
9862 llvm::Type *
T = cast<llvm::VectorType>(VT)->getElementType();
9863 unsigned LaneBits =
T->getPrimitiveSizeInBits();
9864 uint32_t
Value = HighBit << (LaneBits - 1);
9866 Value |= (1UL << (LaneBits - 1)) - 1;
9867 llvm::Value *Lane = llvm::ConstantInt::get(
T,
Value);
9873 unsigned ReverseWidth) {
9877 unsigned LaneSize =
V->getType()->getScalarSizeInBits();
9878 unsigned Elements = 128 / LaneSize;
9879 unsigned Mask = ReverseWidth / LaneSize - 1;
9880 for (
unsigned i = 0; i < Elements; i++)
9881 Indices.push_back(i ^ Mask);
9882 return Builder.CreateShuffleVector(
V, Indices);
9888 llvm::Triple::ArchType Arch) {
9889 enum class CustomCodeGen { VLD24, VST24 } CustomCodeGenType;
9890 Intrinsic::ID IRIntr;
9891 unsigned NumVectors;
9894 switch (BuiltinID) {
9895 #include "clang/Basic/arm_mve_builtin_cg.inc"
9906 switch (CustomCodeGenType) {
9908 case CustomCodeGen::VLD24: {
9914 assert(MvecLType->isStructTy() &&
9915 "Return type for vld[24]q should be a struct");
9916 assert(MvecLType->getStructNumElements() == 1 &&
9917 "Return-type struct for vld[24]q should have one element");
9918 auto MvecLTypeInner = MvecLType->getStructElementType(0);
9919 assert(MvecLTypeInner->isArrayTy() &&
9920 "Return-type struct for vld[24]q should contain an array");
9921 assert(MvecLTypeInner->getArrayNumElements() == NumVectors &&
9922 "Array member of return-type struct vld[24]q has wrong length");
9923 auto VecLType = MvecLTypeInner->getArrayElementType();
9925 Tys.push_back(VecLType);
9927 auto Addr =
E->getArg(0);
9933 Value *MvecOut = PoisonValue::get(MvecLType);
9934 for (
unsigned i = 0; i < NumVectors; ++i) {
9935 Value *Vec =
Builder.CreateExtractValue(LoadResult, i);
9936 MvecOut =
Builder.CreateInsertValue(MvecOut, Vec, {0, i});
9945 case CustomCodeGen::VST24: {
9949 auto Addr =
E->getArg(0);
9953 auto MvecCType =
E->getArg(1)->
getType();
9955 assert(MvecLType->isStructTy() &&
"Data type for vst2q should be a struct");
9956 assert(MvecLType->getStructNumElements() == 1 &&
9957 "Data-type struct for vst2q should have one element");
9958 auto MvecLTypeInner = MvecLType->getStructElementType(0);
9959 assert(MvecLTypeInner->isArrayTy() &&
9960 "Data-type struct for vst2q should contain an array");
9961 assert(MvecLTypeInner->getArrayNumElements() == NumVectors &&
9962 "Array member of return-type struct vld[24]q has wrong length");
9963 auto VecLType = MvecLTypeInner->getArrayElementType();
9965 Tys.push_back(VecLType);
9970 for (
unsigned i = 0; i < NumVectors; i++)
9971 Ops.push_back(
Builder.CreateExtractValue(Mvec, {0, i}));
9974 Value *ToReturn =
nullptr;
9975 for (
unsigned i = 0; i < NumVectors; i++) {
9976 Ops.push_back(llvm::ConstantInt::get(
Int32Ty, i));
9977 ToReturn =
Builder.CreateCall(F, Ops);
9983 llvm_unreachable(
"unknown custom codegen type.");
9989 llvm::Triple::ArchType Arch) {
9990 switch (BuiltinID) {
9993#include "clang/Basic/arm_cde_builtin_cg.inc"
10000 llvm::Triple::ArchType Arch) {
10001 unsigned int Int = 0;
10002 const char *
s =
nullptr;
10004 switch (BuiltinID) {
10007 case NEON::BI__builtin_neon_vtbl1_v:
10008 case NEON::BI__builtin_neon_vqtbl1_v:
10009 case NEON::BI__builtin_neon_vqtbl1q_v:
10010 case NEON::BI__builtin_neon_vtbl2_v:
10011 case NEON::BI__builtin_neon_vqtbl2_v:
10012 case NEON::BI__builtin_neon_vqtbl2q_v:
10013 case NEON::BI__builtin_neon_vtbl3_v:
10014 case NEON::BI__builtin_neon_vqtbl3_v:
10015 case NEON::BI__builtin_neon_vqtbl3q_v:
10016 case NEON::BI__builtin_neon_vtbl4_v:
10017 case NEON::BI__builtin_neon_vqtbl4_v:
10018 case NEON::BI__builtin_neon_vqtbl4q_v:
10020 case NEON::BI__builtin_neon_vtbx1_v:
10021 case NEON::BI__builtin_neon_vqtbx1_v:
10022 case NEON::BI__builtin_neon_vqtbx1q_v:
10023 case NEON::BI__builtin_neon_vtbx2_v:
10024 case NEON::BI__builtin_neon_vqtbx2_v:
10025 case NEON::BI__builtin_neon_vqtbx2q_v:
10026 case NEON::BI__builtin_neon_vtbx3_v:
10027 case NEON::BI__builtin_neon_vqtbx3_v:
10028 case NEON::BI__builtin_neon_vqtbx3q_v:
10029 case NEON::BI__builtin_neon_vtbx4_v:
10030 case NEON::BI__builtin_neon_vqtbx4_v:
10031 case NEON::BI__builtin_neon_vqtbx4q_v:
10035 assert(
E->getNumArgs() >= 3);
10038 const Expr *Arg =
E->getArg(
E->getNumArgs() - 1);
10039 std::optional<llvm::APSInt>
Result =
10054 switch (BuiltinID) {
10055 case NEON::BI__builtin_neon_vtbl1_v: {
10057 Ty, Intrinsic::aarch64_neon_tbl1,
"vtbl1");
10059 case NEON::BI__builtin_neon_vtbl2_v: {
10061 Ty, Intrinsic::aarch64_neon_tbl1,
"vtbl1");
10063 case NEON::BI__builtin_neon_vtbl3_v: {
10065 Ty, Intrinsic::aarch64_neon_tbl2,
"vtbl2");
10067 case NEON::BI__builtin_neon_vtbl4_v: {
10069 Ty, Intrinsic::aarch64_neon_tbl2,
"vtbl2");
10071 case NEON::BI__builtin_neon_vtbx1_v: {
10074 Intrinsic::aarch64_neon_tbl1,
"vtbl1");
10076 llvm::Constant *EightV = ConstantInt::get(Ty, 8);
10077 Value *CmpRes = Builder.CreateICmp(ICmpInst::ICMP_UGE, Ops[2], EightV);
10078 CmpRes = Builder.CreateSExt(CmpRes, Ty);
10080 Value *EltsFromInput = Builder.CreateAnd(CmpRes, Ops[0]);
10081 Value *EltsFromTbl = Builder.CreateAnd(Builder.CreateNot(CmpRes), TblRes);
10082 return Builder.CreateOr(EltsFromInput, EltsFromTbl,
"vtbx");
10084 case NEON::BI__builtin_neon_vtbx2_v: {
10086 Ty, Intrinsic::aarch64_neon_tbx1,
"vtbx1");
10088 case NEON::BI__builtin_neon_vtbx3_v: {
10091 Intrinsic::aarch64_neon_tbl2,
"vtbl2");
10093 llvm::Constant *TwentyFourV = ConstantInt::get(Ty, 24);
10094 Value *CmpRes = Builder.CreateICmp(ICmpInst::ICMP_UGE, Ops[4],
10096 CmpRes = Builder.CreateSExt(CmpRes, Ty);
10098 Value *EltsFromInput = Builder.CreateAnd(CmpRes, Ops[0]);
10099 Value *EltsFromTbl = Builder.CreateAnd(Builder.CreateNot(CmpRes), TblRes);
10100 return Builder.CreateOr(EltsFromInput, EltsFromTbl,
"vtbx");
10102 case NEON::BI__builtin_neon_vtbx4_v: {
10104 Ty, Intrinsic::aarch64_neon_tbx2,
"vtbx2");
10106 case NEON::BI__builtin_neon_vqtbl1_v:
10107 case NEON::BI__builtin_neon_vqtbl1q_v:
10108 Int = Intrinsic::aarch64_neon_tbl1;
s =
"vtbl1";
break;
10109 case NEON::BI__builtin_neon_vqtbl2_v:
10110 case NEON::BI__builtin_neon_vqtbl2q_v: {
10111 Int = Intrinsic::aarch64_neon_tbl2;
s =
"vtbl2";
break;
10112 case NEON::BI__builtin_neon_vqtbl3_v:
10113 case NEON::BI__builtin_neon_vqtbl3q_v:
10114 Int = Intrinsic::aarch64_neon_tbl3;
s =
"vtbl3";
break;
10115 case NEON::BI__builtin_neon_vqtbl4_v:
10116 case NEON::BI__builtin_neon_vqtbl4q_v:
10117 Int = Intrinsic::aarch64_neon_tbl4;
s =
"vtbl4";
break;
10118 case NEON::BI__builtin_neon_vqtbx1_v:
10119 case NEON::BI__builtin_neon_vqtbx1q_v:
10120 Int = Intrinsic::aarch64_neon_tbx1;
s =
"vtbx1";
break;
10121 case NEON::BI__builtin_neon_vqtbx2_v:
10122 case NEON::BI__builtin_neon_vqtbx2q_v:
10123 Int = Intrinsic::aarch64_neon_tbx2;
s =
"vtbx2";
break;
10124 case NEON::BI__builtin_neon_vqtbx3_v:
10125 case NEON::BI__builtin_neon_vqtbx3q_v:
10126 Int = Intrinsic::aarch64_neon_tbx3;
s =
"vtbx3";
break;
10127 case NEON::BI__builtin_neon_vqtbx4_v:
10128 case NEON::BI__builtin_neon_vqtbx4q_v:
10129 Int = Intrinsic::aarch64_neon_tbx4;
s =
"vtbx4";
break;
10141 auto *VTy = llvm::FixedVectorType::get(
Int16Ty, 4);
10143 Value *
V = PoisonValue::get(VTy);
10144 llvm::Constant *CI = ConstantInt::get(
SizeTy, 0);
10145 Op =
Builder.CreateInsertElement(
V, Op, CI);
10154 case SVETypeFlags::MemEltTyDefault:
10156 case SVETypeFlags::MemEltTyInt8:
10158 case SVETypeFlags::MemEltTyInt16:
10160 case SVETypeFlags::MemEltTyInt32:
10162 case SVETypeFlags::MemEltTyInt64:
10165 llvm_unreachable(
"Unknown MemEltType");
10171 llvm_unreachable(
"Invalid SVETypeFlag!");
10173 case SVETypeFlags::EltTyInt8:
10175 case SVETypeFlags::EltTyInt16:
10177 case SVETypeFlags::EltTyInt32:
10179 case SVETypeFlags::EltTyInt64:
10181 case SVETypeFlags::EltTyInt128:
10182 return Builder.getInt128Ty();
10184 case SVETypeFlags::EltTyFloat16:
10186 case SVETypeFlags::EltTyFloat32:
10188 case SVETypeFlags::EltTyFloat64:
10189 return Builder.getDoubleTy();
10191 case SVETypeFlags::EltTyBFloat16:
10192 return Builder.getBFloatTy();
10194 case SVETypeFlags::EltTyBool8:
10195 case SVETypeFlags::EltTyBool16:
10196 case SVETypeFlags::EltTyBool32:
10197 case SVETypeFlags::EltTyBool64:
10204llvm::ScalableVectorType *
10207 default: llvm_unreachable(
"Unhandled SVETypeFlag!");
10209 case SVETypeFlags::EltTyInt8:
10210 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 16);
10211 case SVETypeFlags::EltTyInt16:
10212 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 8);
10213 case SVETypeFlags::EltTyInt32:
10214 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 4);
10215 case SVETypeFlags::EltTyInt64:
10216 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 2);
10218 case SVETypeFlags::EltTyBFloat16:
10219 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 8);
10220 case SVETypeFlags::EltTyFloat16:
10221 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 8);
10222 case SVETypeFlags::EltTyFloat32:
10223 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 4);
10224 case SVETypeFlags::EltTyFloat64:
10225 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 2);
10227 case SVETypeFlags::EltTyBool8:
10228 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 16);
10229 case SVETypeFlags::EltTyBool16:
10230 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 8);
10231 case SVETypeFlags::EltTyBool32:
10232 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 4);
10233 case SVETypeFlags::EltTyBool64:
10234 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 2);
10239llvm::ScalableVectorType *
10243 llvm_unreachable(
"Invalid SVETypeFlag!");
10245 case SVETypeFlags::EltTyInt8:
10246 return llvm::ScalableVectorType::get(
Builder.getInt8Ty(), 16);
10247 case SVETypeFlags::EltTyInt16:
10248 return llvm::ScalableVectorType::get(
Builder.getInt16Ty(), 8);
10249 case SVETypeFlags::EltTyInt32:
10250 return llvm::ScalableVectorType::get(
Builder.getInt32Ty(), 4);
10251 case SVETypeFlags::EltTyInt64:
10252 return llvm::ScalableVectorType::get(
Builder.getInt64Ty(), 2);
10254 case SVETypeFlags::EltTyMFloat8:
10255 return llvm::ScalableVectorType::get(
Builder.getInt8Ty(), 16);
10256 case SVETypeFlags::EltTyFloat16:
10257 return llvm::ScalableVectorType::get(
Builder.getHalfTy(), 8);
10258 case SVETypeFlags::EltTyBFloat16:
10259 return llvm::ScalableVectorType::get(
Builder.getBFloatTy(), 8);
10260 case SVETypeFlags::EltTyFloat32:
10261 return llvm::ScalableVectorType::get(
Builder.getFloatTy(), 4);
10262 case SVETypeFlags::EltTyFloat64:
10263 return llvm::ScalableVectorType::get(
Builder.getDoubleTy(), 2);
10265 case SVETypeFlags::EltTyBool8:
10266 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 16);
10267 case SVETypeFlags::EltTyBool16:
10268 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 8);
10269 case SVETypeFlags::EltTyBool32:
10270 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 4);
10271 case SVETypeFlags::EltTyBool64:
10272 return llvm::ScalableVectorType::get(
Builder.getInt1Ty(), 2);
10287 return llvm::ScalableVectorType::get(EltTy, NumElts);
10293 llvm::ScalableVectorType *VTy) {
10295 if (isa<TargetExtType>(Pred->
getType()) &&
10296 cast<TargetExtType>(Pred->
getType())->getName() ==
"aarch64.svcount")
10299 auto *RTy = llvm::VectorType::get(IntegerType::get(
getLLVMContext(), 1), VTy);
10304 llvm::Type *IntrinsicTy;
10305 switch (VTy->getMinNumElements()) {
10307 llvm_unreachable(
"unsupported element count!");
10312 IntID = Intrinsic::aarch64_sve_convert_from_svbool;
10316 IntID = Intrinsic::aarch64_sve_convert_to_svbool;
10317 IntrinsicTy = Pred->
getType();
10323 assert(
C->getType() == RTy &&
"Unexpected return type!");
10328 llvm::StructType *Ty) {
10329 if (PredTuple->
getType() == Ty)
10332 Value *
Ret = llvm::PoisonValue::get(Ty);
10333 for (
unsigned I = 0; I < Ty->getNumElements(); ++I) {
10334 Value *Pred =
Builder.CreateExtractValue(PredTuple, I);
10336 Pred, cast<llvm::ScalableVectorType>(Ty->getTypeAtIndex(I)));
10337 Ret =
Builder.CreateInsertValue(Ret, Pred, I);
10347 auto *OverloadedTy =
10351 if (Ops[1]->getType()->isVectorTy())
10371 Ops[0], cast<llvm::ScalableVectorType>(F->getArg(0)->getType()));
10376 if (Ops.size() == 2) {
10377 assert(Ops[1]->getType()->isVectorTy() &&
"Scalar base requires an offset");
10378 Ops.push_back(ConstantInt::get(
Int64Ty, 0));
10383 if (!TypeFlags.
isByteIndexed() && Ops[1]->getType()->isVectorTy()) {
10384 unsigned BytesPerElt =
10385 OverloadedTy->getElementType()->getScalarSizeInBits() / 8;
10386 Ops[2] =
Builder.CreateShl(Ops[2], Log2_32(BytesPerElt));
10401 auto *OverloadedTy =
10406 Ops.insert(Ops.begin(), Ops.pop_back_val());
10409 if (Ops[2]->getType()->isVectorTy())
10424 if (Ops.size() == 3) {
10425 assert(Ops[1]->getType()->isVectorTy() &&
"Scalar base requires an offset");
10426 Ops.push_back(ConstantInt::get(
Int64Ty, 0));
10431 Ops[0] =
Builder.CreateTrunc(Ops[0], OverloadedTy);
10441 Ops[1], cast<llvm::ScalableVectorType>(F->getArg(1)->getType()));
10445 if (!TypeFlags.
isByteIndexed() && Ops[2]->getType()->isVectorTy()) {
10446 unsigned BytesPerElt =
10447 OverloadedTy->getElementType()->getScalarSizeInBits() / 8;
10448 Ops[3] =
Builder.CreateShl(Ops[3], Log2_32(BytesPerElt));
10451 return Builder.CreateCall(F, Ops);
10459 auto *OverloadedTy = dyn_cast<llvm::ScalableVectorType>(Ops[1]->getType());
10461 OverloadedTy = cast<llvm::ScalableVectorType>(Ops[2]->getType());
10467 if (Ops[1]->getType()->isVectorTy()) {
10468 if (Ops.size() == 3) {
10470 Ops.push_back(ConstantInt::get(
Int64Ty, 0));
10473 std::swap(Ops[2], Ops[3]);
10477 unsigned BytesPerElt = MemEltTy->getPrimitiveSizeInBits() / 8;
10478 if (BytesPerElt > 1)
10479 Ops[2] =
Builder.CreateShl(Ops[2], Log2_32(BytesPerElt));
10484 return Builder.CreateCall(F, Ops);
10490 llvm::ScalableVectorType *VTy =
getSVEType(TypeFlags);
10492 Value *BasePtr = Ops[1];
10495 if (Ops.size() > 2)
10499 return Builder.CreateCall(F, {Predicate, BasePtr});
10505 llvm::ScalableVectorType *VTy =
getSVEType(TypeFlags);
10509 case Intrinsic::aarch64_sve_st2:
10510 case Intrinsic::aarch64_sve_st1_pn_x2:
10511 case Intrinsic::aarch64_sve_stnt1_pn_x2:
10512 case Intrinsic::aarch64_sve_st2q:
10515 case Intrinsic::aarch64_sve_st3:
10516 case Intrinsic::aarch64_sve_st3q:
10519 case Intrinsic::aarch64_sve_st4:
10520 case Intrinsic::aarch64_sve_st1_pn_x4:
10521 case Intrinsic::aarch64_sve_stnt1_pn_x4:
10522 case Intrinsic::aarch64_sve_st4q:
10526 llvm_unreachable(
"unknown intrinsic!");
10530 Value *BasePtr = Ops[1];
10533 if (Ops.size() > (2 + N))
10539 for (
unsigned I = Ops.size() - N; I < Ops.size(); ++I)
10540 Operands.push_back(Ops[I]);
10541 Operands.append({Predicate, BasePtr});
10544 return Builder.CreateCall(F, Operands);
10552 unsigned BuiltinID) {
10564 llvm::ScalableVectorType *Ty =
getSVEType(TypeFlags);
10570 llvm::Type *OverloadedTy =
getSVEType(TypeFlags);
10577 unsigned BuiltinID) {
10580 auto *MemoryTy = llvm::ScalableVectorType::get(MemEltTy, VectorTy);
10583 Value *BasePtr = Ops[1];
10586 if (Ops.size() > 3)
10589 Value *PrfOp = Ops.back();
10592 return Builder.CreateCall(F, {Predicate, BasePtr, PrfOp});
10596 llvm::Type *ReturnTy,
10598 unsigned IntrinsicID,
10599 bool IsZExtReturn) {
10606 auto VectorTy = cast<llvm::ScalableVectorType>(ReturnTy);
10607 llvm::ScalableVectorType *MemoryTy =
nullptr;
10608 llvm::ScalableVectorType *PredTy =
nullptr;
10609 bool IsQuadLoad =
false;
10610 switch (IntrinsicID) {
10611 case Intrinsic::aarch64_sve_ld1uwq:
10612 case Intrinsic::aarch64_sve_ld1udq:
10613 MemoryTy = llvm::ScalableVectorType::get(MemEltTy, 1);
10614 PredTy = llvm::ScalableVectorType::get(
10619 MemoryTy = llvm::ScalableVectorType::get(MemEltTy, VectorTy);
10625 Value *BasePtr = Ops[1];
10628 if (Ops.size() > 2)
10633 cast<llvm::Instruction>(
Builder.CreateCall(F, {Predicate, BasePtr}));
10640 return IsZExtReturn ?
Builder.CreateZExt(Load, VectorTy)
10641 :
Builder.CreateSExt(Load, VectorTy);
10646 unsigned IntrinsicID) {
10653 auto VectorTy = cast<llvm::ScalableVectorType>(Ops.back()->getType());
10654 auto MemoryTy = llvm::ScalableVectorType::get(MemEltTy, VectorTy);
10656 auto PredTy = MemoryTy;
10657 auto AddrMemoryTy = MemoryTy;
10658 bool IsQuadStore =
false;
10660 switch (IntrinsicID) {
10661 case Intrinsic::aarch64_sve_st1wq:
10662 case Intrinsic::aarch64_sve_st1dq:
10663 AddrMemoryTy = llvm::ScalableVectorType::get(MemEltTy, 1);
10665 llvm::ScalableVectorType::get(IntegerType::get(
getLLVMContext(), 1), 1);
10666 IsQuadStore =
true;
10672 Value *BasePtr = Ops[1];
10675 if (Ops.size() == 4)
10680 IsQuadStore ? Ops.back() :
Builder.CreateTrunc(Ops.back(), MemoryTy);
10685 cast<llvm::Instruction>(
Builder.CreateCall(F, {Val, Predicate, BasePtr}));
10698 NewOps.push_back(Ops[2]);
10700 llvm::Value *BasePtr = Ops[3];
10701 llvm::Value *RealSlice = Ops[1];
10704 if (Ops.size() == 5) {
10707 llvm::Value *StreamingVectorLengthCall =
10708 Builder.CreateCall(StreamingVectorLength);
10709 llvm::Value *Mulvl =
10710 Builder.CreateMul(StreamingVectorLengthCall, Ops[4],
"mulvl");
10714 RealSlice =
Builder.CreateAdd(RealSlice, Ops[4]);
10717 NewOps.push_back(BasePtr);
10718 NewOps.push_back(Ops[0]);
10719 NewOps.push_back(RealSlice);
10721 return Builder.CreateCall(F, NewOps);
10733 return Builder.CreateCall(F, Ops);
10740 if (Ops.size() == 0)
10741 Ops.push_back(llvm::ConstantInt::get(
Int32Ty, 255));
10743 return Builder.CreateCall(F, Ops);
10749 if (Ops.size() == 2)
10750 Ops.push_back(
Builder.getInt32(0));
10754 return Builder.CreateCall(F, Ops);
10760 return Builder.CreateVectorSplat(
10761 cast<llvm::VectorType>(Ty)->getElementCount(), Scalar);
10765 if (
auto *Ty =
Scalar->getType(); Ty->isVectorTy()) {
10767 auto *VecTy = cast<llvm::VectorType>(Ty);
10768 ElementCount EC = VecTy->getElementCount();
10769 assert(EC.isScalar() && VecTy->getElementType() ==
Int8Ty &&
10770 "Only <1 x i8> expected");
10785 if (
auto *StructTy = dyn_cast<StructType>(Ty)) {
10786 Value *Tuple = llvm::PoisonValue::get(Ty);
10788 for (
unsigned I = 0; I < StructTy->getNumElements(); ++I) {
10790 Value *Out =
Builder.CreateBitCast(In, StructTy->getTypeAtIndex(I));
10791 Tuple =
Builder.CreateInsertValue(Tuple, Out, I);
10797 return Builder.CreateBitCast(Val, Ty);
10802 auto *SplatZero = Constant::getNullValue(Ty);
10803 Ops.insert(Ops.begin(), SplatZero);
10808 auto *SplatUndef = UndefValue::get(Ty);
10809 Ops.insert(Ops.begin(), SplatUndef);
10814 llvm::Type *ResultType,
10819 llvm::Type *DefaultType =
getSVEType(TypeFlags);
10822 return {DefaultType, Ops[1]->getType()};
10828 return {Ops[0]->getType(), Ops.back()->getType()};
10830 if (TypeFlags.
isReductionQV() && !ResultType->isScalableTy() &&
10831 ResultType->isVectorTy())
10832 return {ResultType, Ops[1]->getType()};
10835 return {DefaultType};
10841 "Expects TypleFlags.isTupleSet() or TypeFlags.isTupleGet()");
10842 unsigned Idx = cast<ConstantInt>(Ops[1])->getZExtValue();
10845 return Builder.CreateInsertValue(Ops[0], Ops[2], Idx);
10846 return Builder.CreateExtractValue(Ops[0], Idx);
10852 assert(TypeFlags.
isTupleCreate() &&
"Expects TypleFlag isTupleCreate");
10854 Value *Tuple = llvm::PoisonValue::get(Ty);
10855 for (
unsigned Idx = 0; Idx < Ops.size(); Idx++)
10856 Tuple =
Builder.CreateInsertValue(Tuple, Ops[Idx], Idx);
10865 unsigned ICEArguments = 0;
10874 for (
unsigned i = 0, e =
E->getNumArgs(); i != e; i++) {
10875 bool IsICE = ICEArguments & (1 << i);
10881 std::optional<llvm::APSInt>
Result =
10883 assert(
Result &&
"Expected argument to be a constant");
10893 if (isa<StructType>(Arg->getType()) && !IsTupleGetOrSet) {
10894 for (
unsigned I = 0; I < Arg->getType()->getStructNumElements(); ++I)
10895 Ops.push_back(
Builder.CreateExtractValue(Arg, I));
10900 Ops.push_back(Arg);
10907 if (BuiltinID >= SVE::BI__builtin_sve_reinterpret_s8_s8 &&
10908 BuiltinID <= SVE::BI__builtin_sve_reinterpret_f64_f64_x4) {
10923 else if (TypeFlags.
isStore())
10941 else if (TypeFlags.
isUndef())
10942 return UndefValue::get(Ty);
10943 else if (Builtin->LLVMIntrinsic != 0) {
10947 Ops.pop_back_val());
10948 if (TypeFlags.
getMergeType() == SVETypeFlags::MergeZeroExp)
10951 if (TypeFlags.
getMergeType() == SVETypeFlags::MergeAnyExp)
10957 Ops.push_back(
Builder.getInt32( 31));
10959 Ops.insert(&Ops[1],
Builder.getInt32( 31));
10962 for (
unsigned i = 0, e = Ops.size(); i != e; ++i)
10963 if (
auto PredTy = dyn_cast<llvm::VectorType>(Ops[i]->getType()))
10964 if (PredTy->getElementType()->isIntegerTy(1))
10974 std::swap(Ops[1], Ops[2]);
10976 std::swap(Ops[1], Ops[2]);
10979 std::swap(Ops[1], Ops[2]);
10982 std::swap(Ops[1], Ops[3]);
10985 if (TypeFlags.
getMergeType() == SVETypeFlags::MergeZero) {
10986 llvm::Type *OpndTy = Ops[1]->getType();
10987 auto *SplatZero = Constant::getNullValue(OpndTy);
10988 Ops[1] =
Builder.CreateSelect(Ops[0], Ops[1], SplatZero);
10995 if (
Call->getType() == Ty)
10999 if (
auto PredTy = dyn_cast<llvm::ScalableVectorType>(Ty))
11001 if (
auto PredTupleTy = dyn_cast<llvm::StructType>(Ty))
11004 llvm_unreachable(
"unsupported element count!");
11007 switch (BuiltinID) {
11011 case SVE::BI__builtin_sve_svreinterpret_b: {
11015 CGM.
getIntrinsic(Intrinsic::aarch64_sve_convert_to_svbool, SVCountTy);
11016 return Builder.CreateCall(CastFromSVCountF, Ops[0]);
11018 case SVE::BI__builtin_sve_svreinterpret_c: {
11022 CGM.
getIntrinsic(Intrinsic::aarch64_sve_convert_from_svbool, SVCountTy);
11023 return Builder.CreateCall(CastToSVCountF, Ops[0]);
11026 case SVE::BI__builtin_sve_svpsel_lane_b8:
11027 case SVE::BI__builtin_sve_svpsel_lane_b16:
11028 case SVE::BI__builtin_sve_svpsel_lane_b32:
11029 case SVE::BI__builtin_sve_svpsel_lane_b64:
11030 case SVE::BI__builtin_sve_svpsel_lane_c8:
11031 case SVE::BI__builtin_sve_svpsel_lane_c16:
11032 case SVE::BI__builtin_sve_svpsel_lane_c32:
11033 case SVE::BI__builtin_sve_svpsel_lane_c64: {
11034 bool IsSVCount = isa<TargetExtType>(Ops[0]->getType());
11035 assert(((!IsSVCount || cast<TargetExtType>(Ops[0]->getType())->
getName() ==
11036 "aarch64.svcount")) &&
11037 "Unexpected TargetExtType");
11041 CGM.
getIntrinsic(Intrinsic::aarch64_sve_convert_to_svbool, SVCountTy);
11043 CGM.
getIntrinsic(Intrinsic::aarch64_sve_convert_from_svbool, SVCountTy);
11047 llvm::Value *Ops0 =
11048 IsSVCount ?
Builder.CreateCall(CastFromSVCountF, Ops[0]) : Ops[0];
11050 llvm::Value *PSel =
Builder.CreateCall(F, {Ops0, Ops1, Ops[2]});
11051 return IsSVCount ?
Builder.CreateCall(CastToSVCountF, PSel) : PSel;
11053 case SVE::BI__builtin_sve_svmov_b_z: {
11056 llvm::Type* OverloadedTy =
getSVEType(TypeFlags);
11058 return Builder.CreateCall(F, {Ops[0], Ops[1], Ops[1]});
11061 case SVE::BI__builtin_sve_svnot_b_z: {
11064 llvm::Type* OverloadedTy =
getSVEType(TypeFlags);
11066 return Builder.CreateCall(F, {Ops[0], Ops[1], Ops[0]});
11069 case SVE::BI__builtin_sve_svmovlb_u16:
11070 case SVE::BI__builtin_sve_svmovlb_u32:
11071 case SVE::BI__builtin_sve_svmovlb_u64:
11072 return EmitSVEMovl(TypeFlags, Ops, Intrinsic::aarch64_sve_ushllb);
11074 case SVE::BI__builtin_sve_svmovlb_s16:
11075 case SVE::BI__builtin_sve_svmovlb_s32:
11076 case SVE::BI__builtin_sve_svmovlb_s64:
11077 return EmitSVEMovl(TypeFlags, Ops, Intrinsic::aarch64_sve_sshllb);
11079 case SVE::BI__builtin_sve_svmovlt_u16:
11080 case SVE::BI__builtin_sve_svmovlt_u32:
11081 case SVE::BI__builtin_sve_svmovlt_u64:
11082 return EmitSVEMovl(TypeFlags, Ops, Intrinsic::aarch64_sve_ushllt);
11084 case SVE::BI__builtin_sve_svmovlt_s16:
11085 case SVE::BI__builtin_sve_svmovlt_s32:
11086 case SVE::BI__builtin_sve_svmovlt_s64:
11087 return EmitSVEMovl(TypeFlags, Ops, Intrinsic::aarch64_sve_sshllt);
11089 case SVE::BI__builtin_sve_svpmullt_u16:
11090 case SVE::BI__builtin_sve_svpmullt_u64:
11091 case SVE::BI__builtin_sve_svpmullt_n_u16:
11092 case SVE::BI__builtin_sve_svpmullt_n_u64:
11093 return EmitSVEPMull(TypeFlags, Ops, Intrinsic::aarch64_sve_pmullt_pair);
11095 case SVE::BI__builtin_sve_svpmullb_u16:
11096 case SVE::BI__builtin_sve_svpmullb_u64:
11097 case SVE::BI__builtin_sve_svpmullb_n_u16:
11098 case SVE::BI__builtin_sve_svpmullb_n_u64:
11099 return EmitSVEPMull(TypeFlags, Ops, Intrinsic::aarch64_sve_pmullb_pair);
11101 case SVE::BI__builtin_sve_svdup_n_b8:
11102 case SVE::BI__builtin_sve_svdup_n_b16:
11103 case SVE::BI__builtin_sve_svdup_n_b32:
11104 case SVE::BI__builtin_sve_svdup_n_b64: {
11106 Builder.CreateICmpNE(Ops[0], Constant::getNullValue(Ops[0]->getType()));
11107 llvm::ScalableVectorType *OverloadedTy =
getSVEType(TypeFlags);
11112 case SVE::BI__builtin_sve_svdupq_n_b8:
11113 case SVE::BI__builtin_sve_svdupq_n_b16:
11114 case SVE::BI__builtin_sve_svdupq_n_b32:
11115 case SVE::BI__builtin_sve_svdupq_n_b64:
11116 case SVE::BI__builtin_sve_svdupq_n_u8:
11117 case SVE::BI__builtin_sve_svdupq_n_s8:
11118 case SVE::BI__builtin_sve_svdupq_n_u64:
11119 case SVE::BI__builtin_sve_svdupq_n_f64:
11120 case SVE::BI__builtin_sve_svdupq_n_s64:
11121 case SVE::BI__builtin_sve_svdupq_n_u16:
11122 case SVE::BI__builtin_sve_svdupq_n_f16:
11123 case SVE::BI__builtin_sve_svdupq_n_bf16:
11124 case SVE::BI__builtin_sve_svdupq_n_s16:
11125 case SVE::BI__builtin_sve_svdupq_n_u32:
11126 case SVE::BI__builtin_sve_svdupq_n_f32:
11127 case SVE::BI__builtin_sve_svdupq_n_s32: {
11130 unsigned NumOpnds = Ops.size();
11133 cast<llvm::VectorType>(Ty)->getElementType()->isIntegerTy(1);
11138 llvm::Type *EltTy = Ops[0]->getType();
11143 for (
unsigned I = 0; I < NumOpnds; ++I)
11144 VecOps.push_back(
Builder.CreateZExt(Ops[I], EltTy));
11149 OverloadedTy, PoisonValue::get(OverloadedTy), Vec,
Builder.getInt64(0));
11164 : Intrinsic::aarch64_sve_cmpne_wide,
11171 case SVE::BI__builtin_sve_svpfalse_b:
11172 return ConstantInt::getFalse(Ty);
11174 case SVE::BI__builtin_sve_svpfalse_c: {
11175 auto SVBoolTy = ScalableVectorType::get(
Builder.getInt1Ty(), 16);
11178 return Builder.CreateCall(CastToSVCountF, ConstantInt::getFalse(SVBoolTy));
11181 case SVE::BI__builtin_sve_svlen_bf16:
11182 case SVE::BI__builtin_sve_svlen_f16:
11183 case SVE::BI__builtin_sve_svlen_f32:
11184 case SVE::BI__builtin_sve_svlen_f64:
11185 case SVE::BI__builtin_sve_svlen_s8:
11186 case SVE::BI__builtin_sve_svlen_s16:
11187 case SVE::BI__builtin_sve_svlen_s32:
11188 case SVE::BI__builtin_sve_svlen_s64:
11189 case SVE::BI__builtin_sve_svlen_u8:
11190 case SVE::BI__builtin_sve_svlen_u16:
11191 case SVE::BI__builtin_sve_svlen_u32:
11192 case SVE::BI__builtin_sve_svlen_u64: {
11194 auto VTy = cast<llvm::VectorType>(
getSVEType(TF));
11196 llvm::ConstantInt::get(Ty, VTy->getElementCount().getKnownMinValue());
11202 case SVE::BI__builtin_sve_svtbl2_u8:
11203 case SVE::BI__builtin_sve_svtbl2_s8:
11204 case SVE::BI__builtin_sve_svtbl2_u16:
11205 case SVE::BI__builtin_sve_svtbl2_s16:
11206 case SVE::BI__builtin_sve_svtbl2_u32:
11207 case SVE::BI__builtin_sve_svtbl2_s32:
11208 case SVE::BI__builtin_sve_svtbl2_u64:
11209 case SVE::BI__builtin_sve_svtbl2_s64:
11210 case SVE::BI__builtin_sve_svtbl2_f16:
11211 case SVE::BI__builtin_sve_svtbl2_bf16:
11212 case SVE::BI__builtin_sve_svtbl2_f32:
11213 case SVE::BI__builtin_sve_svtbl2_f64: {
11215 auto VTy = cast<llvm::ScalableVectorType>(
getSVEType(TF));
11217 return Builder.CreateCall(F, Ops);
11220 case SVE::BI__builtin_sve_svset_neonq_s8:
11221 case SVE::BI__builtin_sve_svset_neonq_s16:
11222 case SVE::BI__builtin_sve_svset_neonq_s32:
11223 case SVE::BI__builtin_sve_svset_neonq_s64:
11224 case SVE::BI__builtin_sve_svset_neonq_u8:
11225 case SVE::BI__builtin_sve_svset_neonq_u16:
11226 case SVE::BI__builtin_sve_svset_neonq_u32:
11227 case SVE::BI__builtin_sve_svset_neonq_u64:
11228 case SVE::BI__builtin_sve_svset_neonq_f16:
11229 case SVE::BI__builtin_sve_svset_neonq_f32:
11230 case SVE::BI__builtin_sve_svset_neonq_f64:
11231 case SVE::BI__builtin_sve_svset_neonq_bf16: {
11232 return Builder.CreateInsertVector(Ty, Ops[0], Ops[1],
Builder.getInt64(0));
11235 case SVE::BI__builtin_sve_svget_neonq_s8:
11236 case SVE::BI__builtin_sve_svget_neonq_s16:
11237 case SVE::BI__builtin_sve_svget_neonq_s32:
11238 case SVE::BI__builtin_sve_svget_neonq_s64:
11239 case SVE::BI__builtin_sve_svget_neonq_u8:
11240 case SVE::BI__builtin_sve_svget_neonq_u16:
11241 case SVE::BI__builtin_sve_svget_neonq_u32:
11242 case SVE::BI__builtin_sve_svget_neonq_u64:
11243 case SVE::BI__builtin_sve_svget_neonq_f16:
11244 case SVE::BI__builtin_sve_svget_neonq_f32:
11245 case SVE::BI__builtin_sve_svget_neonq_f64:
11246 case SVE::BI__builtin_sve_svget_neonq_bf16: {
11247 return Builder.CreateExtractVector(Ty, Ops[0],
Builder.getInt64(0));
11250 case SVE::BI__builtin_sve_svdup_neonq_s8:
11251 case SVE::BI__builtin_sve_svdup_neonq_s16:
11252 case SVE::BI__builtin_sve_svdup_neonq_s32:
11253 case SVE::BI__builtin_sve_svdup_neonq_s64:
11254 case SVE::BI__builtin_sve_svdup_neonq_u8:
11255 case SVE::BI__builtin_sve_svdup_neonq_u16:
11256 case SVE::BI__builtin_sve_svdup_neonq_u32:
11257 case SVE::BI__builtin_sve_svdup_neonq_u64:
11258 case SVE::BI__builtin_sve_svdup_neonq_f16:
11259 case SVE::BI__builtin_sve_svdup_neonq_f32:
11260 case SVE::BI__builtin_sve_svdup_neonq_f64:
11261 case SVE::BI__builtin_sve_svdup_neonq_bf16: {
11264 return Builder.CreateIntrinsic(Intrinsic::aarch64_sve_dupq_lane, {Ty},
11276 switch (BuiltinID) {
11279 case SME::BI__builtin_sme_svsumla_za32_s8_vg4x1:
11282 case SME::BI__builtin_sme_svsumla_za32_s8_vg4x2:
11283 case SME::BI__builtin_sme_svsudot_za32_s8_vg1x2:
11286 case SME::BI__builtin_sme_svsudot_za32_s8_vg1x4:
11287 case SME::BI__builtin_sme_svsumla_za32_s8_vg4x4:
11293 for (
unsigned I = 0; I < MultiVec; ++I)
11294 std::swap(Ops[I + 1], Ops[I + 1 + MultiVec]);
11307 return EmitSMELd1St1(TypeFlags, Ops, Builtin->LLVMIntrinsic);
11310 else if (BuiltinID == SME::BI__builtin_sme_svzero_mask_za ||
11311 BuiltinID == SME::BI__builtin_sme_svzero_za)
11312 return EmitSMEZero(TypeFlags, Ops, Builtin->LLVMIntrinsic);
11313 else if (BuiltinID == SME::BI__builtin_sme_svldr_vnum_za ||
11314 BuiltinID == SME::BI__builtin_sme_svstr_vnum_za ||
11315 BuiltinID == SME::BI__builtin_sme_svldr_za ||
11316 BuiltinID == SME::BI__builtin_sme_svstr_za)
11317 return EmitSMELdrStr(TypeFlags, Ops, Builtin->LLVMIntrinsic);
11322 Ops.pop_back_val());
11327 if (Builtin->LLVMIntrinsic == 0)
11330 if (BuiltinID == SME::BI__builtin_sme___arm_in_streaming_mode) {
11333 const auto *FD = cast<FunctionDecl>(
CurFuncDecl);
11335 unsigned SMEAttrs = FPT->getAArch64SMEAttributes();
11338 return ConstantInt::getBool(
Builder.getContext(), IsStreaming);
11344 for (
unsigned i = 0, e = Ops.size(); i != e; ++i)
11345 if (
auto PredTy = dyn_cast<llvm::VectorType>(Ops[i]->getType()))
11346 if (PredTy->getElementType()->isIntegerTy(1))
11354 return Builder.CreateCall(F, Ops);
11359 llvm::Triple::ArchType Arch) {
11368 if (BuiltinID == Builtin::BI__builtin_cpu_supports)
11369 return EmitAArch64CpuSupports(
E);
11371 unsigned HintID =
static_cast<unsigned>(-1);
11372 switch (BuiltinID) {
11374 case clang::AArch64::BI__builtin_arm_nop:
11377 case clang::AArch64::BI__builtin_arm_yield:
11378 case clang::AArch64::BI__yield:
11381 case clang::AArch64::BI__builtin_arm_wfe:
11382 case clang::AArch64::BI__wfe:
11385 case clang::AArch64::BI__builtin_arm_wfi:
11386 case clang::AArch64::BI__wfi:
11389 case clang::AArch64::BI__builtin_arm_sev:
11390 case clang::AArch64::BI__sev:
11393 case clang::AArch64::BI__builtin_arm_sevl:
11394 case clang::AArch64::BI__sevl:
11399 if (HintID !=
static_cast<unsigned>(-1)) {
11401 return Builder.CreateCall(F, llvm::ConstantInt::get(
Int32Ty, HintID));
11404 if (BuiltinID == clang::AArch64::BI__builtin_arm_trap) {
11410 if (BuiltinID == clang::AArch64::BI__builtin_arm_get_sme_state) {
11415 "__arm_sme_state"));
11417 "aarch64_pstate_sm_compatible");
11418 CI->setAttributes(Attrs);
11419 CI->setCallingConv(
11420 llvm::CallingConv::
11421 AArch64_SME_ABI_Support_Routines_PreserveMost_From_X2);
11428 if (BuiltinID == clang::AArch64::BI__builtin_arm_rbit) {
11430 "rbit of unusual size!");
11433 CGM.
getIntrinsic(Intrinsic::bitreverse, Arg->getType()), Arg,
"rbit");
11435 if (BuiltinID == clang::AArch64::BI__builtin_arm_rbit64) {
11437 "rbit of unusual size!");
11440 CGM.
getIntrinsic(Intrinsic::bitreverse, Arg->getType()), Arg,
"rbit");
11443 if (BuiltinID == clang::AArch64::BI__builtin_arm_clz ||
11444 BuiltinID == clang::AArch64::BI__builtin_arm_clz64) {
11448 if (BuiltinID == clang::AArch64::BI__builtin_arm_clz64)
11453 if (BuiltinID == clang::AArch64::BI__builtin_arm_cls) {
11458 if (BuiltinID == clang::AArch64::BI__builtin_arm_cls64) {
11464 if (BuiltinID == clang::AArch64::BI__builtin_arm_rint32zf ||
11465 BuiltinID == clang::AArch64::BI__builtin_arm_rint32z) {
11467 llvm::Type *Ty = Arg->getType();
11472 if (BuiltinID == clang::AArch64::BI__builtin_arm_rint64zf ||
11473 BuiltinID == clang::AArch64::BI__builtin_arm_rint64z) {
11475 llvm::Type *Ty = Arg->getType();
11480 if (BuiltinID == clang::AArch64::BI__builtin_arm_rint32xf ||
11481 BuiltinID == clang::AArch64::BI__builtin_arm_rint32x) {
11483 llvm::Type *Ty = Arg->getType();
11488 if (BuiltinID == clang::AArch64::BI__builtin_arm_rint64xf ||
11489 BuiltinID == clang::AArch64::BI__builtin_arm_rint64x) {
11491 llvm::Type *Ty = Arg->getType();
11496 if (BuiltinID == clang::AArch64::BI__builtin_arm_jcvt) {
11498 "__jcvt of unusual size!");
11504 if (BuiltinID == clang::AArch64::BI__builtin_arm_ld64b ||
11505 BuiltinID == clang::AArch64::BI__builtin_arm_st64b ||
11506 BuiltinID == clang::AArch64::BI__builtin_arm_st64bv ||
11507 BuiltinID == clang::AArch64::BI__builtin_arm_st64bv0) {
11511 if (BuiltinID == clang::AArch64::BI__builtin_arm_ld64b) {
11515 llvm::Value *Val =
Builder.CreateCall(F, MemAddr);
11516 llvm::Value *ToRet;
11517 for (
size_t i = 0; i < 8; i++) {
11518 llvm::Value *ValOffsetPtr =
11529 Args.push_back(MemAddr);
11530 for (
size_t i = 0; i < 8; i++) {
11531 llvm::Value *ValOffsetPtr =
11538 auto Intr = (BuiltinID == clang::AArch64::BI__builtin_arm_st64b
11539 ? Intrinsic::aarch64_st64b
11540 : BuiltinID == clang::AArch64::BI__builtin_arm_st64bv
11541 ? Intrinsic::aarch64_st64bv
11542 : Intrinsic::aarch64_st64bv0);
11544 return Builder.CreateCall(F, Args);
11548 if (BuiltinID == clang::AArch64::BI__builtin_arm_rndr ||
11549 BuiltinID == clang::AArch64::BI__builtin_arm_rndrrs) {
11551 auto Intr = (BuiltinID == clang::AArch64::BI__builtin_arm_rndr
11552 ? Intrinsic::aarch64_rndr
11553 : Intrinsic::aarch64_rndrrs);
11555 llvm::Value *Val =
Builder.CreateCall(F);
11556 Value *RandomValue =
Builder.CreateExtractValue(Val, 0);
11565 if (BuiltinID == clang::AArch64::BI__clear_cache) {
11566 assert(
E->getNumArgs() == 2 &&
"__clear_cache takes 2 arguments");
11569 for (
unsigned i = 0; i < 2; i++)
11572 llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty);
11573 StringRef Name = FD->
getName();
11577 if ((BuiltinID == clang::AArch64::BI__builtin_arm_ldrex ||
11578 BuiltinID == clang::AArch64::BI__builtin_arm_ldaex) &&
11582 ? Intrinsic::aarch64_ldaxp
11583 : Intrinsic::aarch64_ldxp);
11590 llvm::Type *Int128Ty = llvm::IntegerType::get(
getLLVMContext(), 128);
11591 Val0 =
Builder.CreateZExt(Val0, Int128Ty);
11592 Val1 =
Builder.CreateZExt(Val1, Int128Ty);
11594 Value *ShiftCst = llvm::ConstantInt::get(Int128Ty, 64);
11595 Val =
Builder.CreateShl(Val0, ShiftCst,
"shl",
true );
11596 Val =
Builder.CreateOr(Val, Val1);
11598 }
else if (BuiltinID == clang::AArch64::BI__builtin_arm_ldrex ||
11599 BuiltinID == clang::AArch64::BI__builtin_arm_ldaex) {
11604 llvm::Type *
IntTy =
11609 ? Intrinsic::aarch64_ldaxr
11610 : Intrinsic::aarch64_ldxr,
11612 CallInst *Val =
Builder.CreateCall(F, LoadAddr,
"ldxr");
11616 if (RealResTy->isPointerTy())
11617 return Builder.CreateIntToPtr(Val, RealResTy);
11619 llvm::Type *IntResTy = llvm::IntegerType::get(
11621 return Builder.CreateBitCast(
Builder.CreateTruncOrBitCast(Val, IntResTy),
11625 if ((BuiltinID == clang::AArch64::BI__builtin_arm_strex ||
11626 BuiltinID == clang::AArch64::BI__builtin_arm_stlex) &&
11630 ? Intrinsic::aarch64_stlxp
11631 : Intrinsic::aarch64_stxp);
11643 return Builder.CreateCall(F, {Arg0, Arg1, StPtr},
"stxp");
11646 if (BuiltinID == clang::AArch64::BI__builtin_arm_strex ||
11647 BuiltinID == clang::AArch64::BI__builtin_arm_stlex) {
11652 llvm::Type *StoreTy =
11655 if (StoreVal->
getType()->isPointerTy())
11658 llvm::Type *
IntTy = llvm::IntegerType::get(
11667 ? Intrinsic::aarch64_stlxr
11668 : Intrinsic::aarch64_stxr,
11670 CallInst *CI =
Builder.CreateCall(F, {StoreVal, StoreAddr},
"stxr");
11672 1, Attribute::get(
getLLVMContext(), Attribute::ElementType, StoreTy));
11676 if (BuiltinID == clang::AArch64::BI__getReg) {
11679 llvm_unreachable(
"Sema will ensure that the parameter is constant");
11685 llvm::Metadata *Ops[] = {llvm::MDString::get(Context, Reg)};
11686 llvm::MDNode *RegName = llvm::MDNode::get(Context, Ops);
11687 llvm::Value *Metadata = llvm::MetadataAsValue::get(Context, RegName);
11689 llvm::Function *F =
11691 return Builder.CreateCall(F, Metadata);
11694 if (BuiltinID == clang::AArch64::BI__break) {
11697 llvm_unreachable(
"Sema will ensure that the parameter is constant");
11699 llvm::Function *F =
CGM.
getIntrinsic(llvm::Intrinsic::aarch64_break);
11703 if (BuiltinID == clang::AArch64::BI__builtin_arm_clrex) {
11705 return Builder.CreateCall(F);
11708 if (BuiltinID == clang::AArch64::BI_ReadWriteBarrier)
11709 return Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent,
11710 llvm::SyncScope::SingleThread);
11713 Intrinsic::ID CRCIntrinsicID = Intrinsic::not_intrinsic;
11714 switch (BuiltinID) {
11715 case clang::AArch64::BI__builtin_arm_crc32b:
11716 CRCIntrinsicID = Intrinsic::aarch64_crc32b;
break;
11717 case clang::AArch64::BI__builtin_arm_crc32cb:
11718 CRCIntrinsicID = Intrinsic::aarch64_crc32cb;
break;
11719 case clang::AArch64::BI__builtin_arm_crc32h:
11720 CRCIntrinsicID = Intrinsic::aarch64_crc32h;
break;
11721 case clang::AArch64::BI__builtin_arm_crc32ch:
11722 CRCIntrinsicID = Intrinsic::aarch64_crc32ch;
break;
11723 case clang::AArch64::BI__builtin_arm_crc32w:
11724 CRCIntrinsicID = Intrinsic::aarch64_crc32w;
break;
11725 case clang::AArch64::BI__builtin_arm_crc32cw:
11726 CRCIntrinsicID = Intrinsic::aarch64_crc32cw;
break;
11727 case clang::AArch64::BI__builtin_arm_crc32d:
11728 CRCIntrinsicID = Intrinsic::aarch64_crc32x;
break;
11729 case clang::AArch64::BI__builtin_arm_crc32cd:
11730 CRCIntrinsicID = Intrinsic::aarch64_crc32cx;
break;
11733 if (CRCIntrinsicID != Intrinsic::not_intrinsic) {
11738 llvm::Type *DataTy = F->getFunctionType()->getParamType(1);
11739 Arg1 =
Builder.CreateZExtOrBitCast(Arg1, DataTy);
11741 return Builder.CreateCall(F, {Arg0, Arg1});
11745 if (BuiltinID == AArch64::BI__builtin_arm_mops_memset_tag) {
11752 CGM.
getIntrinsic(Intrinsic::aarch64_mops_memset_tag), {Dst, Val, Size});
11756 Intrinsic::ID MTEIntrinsicID = Intrinsic::not_intrinsic;
11757 switch (BuiltinID) {
11758 case clang::AArch64::BI__builtin_arm_irg:
11759 MTEIntrinsicID = Intrinsic::aarch64_irg;
break;
11760 case clang::AArch64::BI__builtin_arm_addg:
11761 MTEIntrinsicID = Intrinsic::aarch64_addg;
break;
11762 case clang::AArch64::BI__builtin_arm_gmi:
11763 MTEIntrinsicID = Intrinsic::aarch64_gmi;
break;
11764 case clang::AArch64::BI__builtin_arm_ldg:
11765 MTEIntrinsicID = Intrinsic::aarch64_ldg;
break;
11766 case clang::AArch64::BI__builtin_arm_stg:
11767 MTEIntrinsicID = Intrinsic::aarch64_stg;
break;
11768 case clang::AArch64::BI__builtin_arm_subp:
11769 MTEIntrinsicID = Intrinsic::aarch64_subp;
break;
11772 if (MTEIntrinsicID != Intrinsic::not_intrinsic) {
11773 if (MTEIntrinsicID == Intrinsic::aarch64_irg) {
11781 if (MTEIntrinsicID == Intrinsic::aarch64_addg) {
11787 {Pointer, TagOffset});
11789 if (MTEIntrinsicID == Intrinsic::aarch64_gmi) {
11800 if (MTEIntrinsicID == Intrinsic::aarch64_ldg) {
11803 {TagAddress, TagAddress});
11808 if (MTEIntrinsicID == Intrinsic::aarch64_stg) {
11811 {TagAddress, TagAddress});
11813 if (MTEIntrinsicID == Intrinsic::aarch64_subp) {
11821 if (BuiltinID == clang::AArch64::BI__builtin_arm_rsr ||
11822 BuiltinID == clang::AArch64::BI__builtin_arm_rsr64 ||
11823 BuiltinID == clang::AArch64::BI__builtin_arm_rsr128 ||
11824 BuiltinID == clang::AArch64::BI__builtin_arm_rsrp ||
11825 BuiltinID == clang::AArch64::BI__builtin_arm_wsr ||
11826 BuiltinID == clang::AArch64::BI__builtin_arm_wsr64 ||
11827 BuiltinID == clang::AArch64::BI__builtin_arm_wsr128 ||
11828 BuiltinID == clang::AArch64::BI__builtin_arm_wsrp) {
11831 if (BuiltinID == clang::AArch64::BI__builtin_arm_rsr ||
11832 BuiltinID == clang::AArch64::BI__builtin_arm_rsr64 ||
11833 BuiltinID == clang::AArch64::BI__builtin_arm_rsr128 ||
11834 BuiltinID == clang::AArch64::BI__builtin_arm_rsrp)
11837 bool IsPointerBuiltin = BuiltinID == clang::AArch64::BI__builtin_arm_rsrp ||
11838 BuiltinID == clang::AArch64::BI__builtin_arm_wsrp;
11840 bool Is32Bit = BuiltinID == clang::AArch64::BI__builtin_arm_rsr ||
11841 BuiltinID == clang::AArch64::BI__builtin_arm_wsr;
11843 bool Is128Bit = BuiltinID == clang::AArch64::BI__builtin_arm_rsr128 ||
11844 BuiltinID == clang::AArch64::BI__builtin_arm_wsr128;
11846 llvm::Type *ValueType;
11850 }
else if (Is128Bit) {
11851 llvm::Type *Int128Ty =
11853 ValueType = Int128Ty;
11855 }
else if (IsPointerBuiltin) {
11865 if (BuiltinID == clang::AArch64::BI_ReadStatusReg ||
11866 BuiltinID == clang::AArch64::BI_WriteStatusReg) {
11872 std::string SysRegStr;
11873 llvm::raw_string_ostream(SysRegStr) <<
11874 ((1 << 1) | ((SysReg >> 14) & 1)) <<
":" <<
11875 ((SysReg >> 11) & 7) <<
":" <<
11876 ((SysReg >> 7) & 15) <<
":" <<
11877 ((SysReg >> 3) & 15) <<
":" <<
11880 llvm::Metadata *Ops[] = { llvm::MDString::get(Context, SysRegStr) };
11881 llvm::MDNode *RegName = llvm::MDNode::get(Context, Ops);
11882 llvm::Value *Metadata = llvm::MetadataAsValue::get(Context, RegName);
11887 if (BuiltinID == clang::AArch64::BI_ReadStatusReg) {
11888 llvm::Function *F =
CGM.
getIntrinsic(llvm::Intrinsic::read_register, Types);
11890 return Builder.CreateCall(F, Metadata);
11893 llvm::Function *F =
CGM.
getIntrinsic(llvm::Intrinsic::write_register, Types);
11896 return Builder.CreateCall(F, { Metadata, ArgValue });
11899 if (BuiltinID == clang::AArch64::BI_AddressOfReturnAddress) {
11900 llvm::Function *F =
11902 return Builder.CreateCall(F);
11905 if (BuiltinID == clang::AArch64::BI__builtin_sponentry) {
11907 return Builder.CreateCall(F);
11910 if (BuiltinID == clang::AArch64::BI__mulh ||
11911 BuiltinID == clang::AArch64::BI__umulh) {
11913 llvm::Type *Int128Ty = llvm::IntegerType::get(
getLLVMContext(), 128);
11915 bool IsSigned = BuiltinID == clang::AArch64::BI__mulh;
11921 Value *MulResult, *HigherBits;
11923 MulResult =
Builder.CreateNSWMul(LHS, RHS);
11924 HigherBits =
Builder.CreateAShr(MulResult, 64);
11926 MulResult =
Builder.CreateNUWMul(LHS, RHS);
11927 HigherBits =
Builder.CreateLShr(MulResult, 64);
11929 HigherBits =
Builder.CreateIntCast(HigherBits, ResType, IsSigned);
11934 if (BuiltinID == AArch64::BI__writex18byte ||
11935 BuiltinID == AArch64::BI__writex18word ||
11936 BuiltinID == AArch64::BI__writex18dword ||
11937 BuiltinID == AArch64::BI__writex18qword) {
11953 if (BuiltinID == AArch64::BI__readx18byte ||
11954 BuiltinID == AArch64::BI__readx18word ||
11955 BuiltinID == AArch64::BI__readx18dword ||
11956 BuiltinID == AArch64::BI__readx18qword) {
11971 if (BuiltinID == AArch64::BI__addx18byte ||
11972 BuiltinID == AArch64::BI__addx18word ||
11973 BuiltinID == AArch64::BI__addx18dword ||
11974 BuiltinID == AArch64::BI__addx18qword ||
11975 BuiltinID == AArch64::BI__incx18byte ||
11976 BuiltinID == AArch64::BI__incx18word ||
11977 BuiltinID == AArch64::BI__incx18dword ||
11978 BuiltinID == AArch64::BI__incx18qword) {
11981 switch (BuiltinID) {
11982 case AArch64::BI__incx18byte:
11984 isIncrement =
true;
11986 case AArch64::BI__incx18word:
11988 isIncrement =
true;
11990 case AArch64::BI__incx18dword:
11992 isIncrement =
true;
11994 case AArch64::BI__incx18qword:
11996 isIncrement =
true;
12000 isIncrement =
false;
12025 if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 ||
12026 BuiltinID == AArch64::BI_CopyFloatFromInt32 ||
12027 BuiltinID == AArch64::BI_CopyInt32FromFloat ||
12028 BuiltinID == AArch64::BI_CopyInt64FromDouble) {
12031 return Builder.CreateBitCast(Arg, RetTy);
12034 if (BuiltinID == AArch64::BI_CountLeadingOnes ||
12035 BuiltinID == AArch64::BI_CountLeadingOnes64 ||
12036 BuiltinID == AArch64::BI_CountLeadingZeros ||
12037 BuiltinID == AArch64::BI_CountLeadingZeros64) {
12039 llvm::Type *ArgType = Arg->
getType();
12041 if (BuiltinID == AArch64::BI_CountLeadingOnes ||
12042 BuiltinID == AArch64::BI_CountLeadingOnes64)
12043 Arg =
Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType));
12048 if (BuiltinID == AArch64::BI_CountLeadingOnes64 ||
12049 BuiltinID == AArch64::BI_CountLeadingZeros64)
12054 if (BuiltinID == AArch64::BI_CountLeadingSigns ||
12055 BuiltinID == AArch64::BI_CountLeadingSigns64) {
12058 Function *F = (BuiltinID == AArch64::BI_CountLeadingSigns)
12063 if (BuiltinID == AArch64::BI_CountLeadingSigns64)
12068 if (BuiltinID == AArch64::BI_CountOneBits ||
12069 BuiltinID == AArch64::BI_CountOneBits64) {
12071 llvm::Type *ArgType = ArgValue->
getType();
12075 if (BuiltinID == AArch64::BI_CountOneBits64)
12080 if (BuiltinID == AArch64::BI__prefetch) {
12089 if (BuiltinID == AArch64::BI__hlt) {
12095 return ConstantInt::get(
Builder.getInt32Ty(), 0);
12100 if (std::optional<MSVCIntrin> MsvcIntId =
12106 return P.first == BuiltinID;
12109 BuiltinID = It->second;
12113 unsigned ICEArguments = 0;
12120 for (
unsigned i = 0, e =
E->getNumArgs() - 1; i != e; i++) {
12122 switch (BuiltinID) {
12123 case NEON::BI__builtin_neon_vld1_v:
12124 case NEON::BI__builtin_neon_vld1q_v:
12125 case NEON::BI__builtin_neon_vld1_dup_v:
12126 case NEON::BI__builtin_neon_vld1q_dup_v:
12127 case NEON::BI__builtin_neon_vld1_lane_v:
12128 case NEON::BI__builtin_neon_vld1q_lane_v:
12129 case NEON::BI__builtin_neon_vst1_v:
12130 case NEON::BI__builtin_neon_vst1q_v:
12131 case NEON::BI__builtin_neon_vst1_lane_v:
12132 case NEON::BI__builtin_neon_vst1q_lane_v:
12133 case NEON::BI__builtin_neon_vldap1_lane_s64:
12134 case NEON::BI__builtin_neon_vldap1q_lane_s64:
12135 case NEON::BI__builtin_neon_vstl1_lane_s64:
12136 case NEON::BI__builtin_neon_vstl1q_lane_s64:
12154 assert(
Result &&
"SISD intrinsic should have been handled");
12158 const Expr *Arg =
E->getArg(
E->getNumArgs()-1);
12160 if (std::optional<llvm::APSInt>
Result =
12165 bool usgn =
Type.isUnsigned();
12166 bool quad =
Type.isQuad();
12169 switch (BuiltinID) {
12171 case NEON::BI__builtin_neon_vabsh_f16:
12174 case NEON::BI__builtin_neon_vaddq_p128: {
12177 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
12178 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
12179 Ops[0] =
Builder.CreateXor(Ops[0], Ops[1]);
12180 llvm::Type *Int128Ty = llvm::Type::getIntNTy(
getLLVMContext(), 128);
12181 return Builder.CreateBitCast(Ops[0], Int128Ty);
12183 case NEON::BI__builtin_neon_vldrq_p128: {
12184 llvm::Type *Int128Ty = llvm::Type::getIntNTy(
getLLVMContext(), 128);
12189 case NEON::BI__builtin_neon_vstrq_p128: {
12190 Value *Ptr = Ops[0];
12193 case NEON::BI__builtin_neon_vcvts_f32_u32:
12194 case NEON::BI__builtin_neon_vcvtd_f64_u64:
12197 case NEON::BI__builtin_neon_vcvts_f32_s32:
12198 case NEON::BI__builtin_neon_vcvtd_f64_s64: {
12200 bool Is64 = Ops[0]->getType()->getPrimitiveSizeInBits() == 64;
12203 Ops[0] =
Builder.CreateBitCast(Ops[0], InTy);
12205 return Builder.CreateUIToFP(Ops[0], FTy);
12206 return Builder.CreateSIToFP(Ops[0], FTy);
12208 case NEON::BI__builtin_neon_vcvth_f16_u16:
12209 case NEON::BI__builtin_neon_vcvth_f16_u32:
12210 case NEON::BI__builtin_neon_vcvth_f16_u64:
12213 case NEON::BI__builtin_neon_vcvth_f16_s16:
12214 case NEON::BI__builtin_neon_vcvth_f16_s32:
12215 case NEON::BI__builtin_neon_vcvth_f16_s64: {
12217 llvm::Type *FTy =
HalfTy;
12219 if (Ops[0]->getType()->getPrimitiveSizeInBits() == 64)
12221 else if (Ops[0]->getType()->getPrimitiveSizeInBits() == 32)
12225 Ops[0] =
Builder.CreateBitCast(Ops[0], InTy);
12227 return Builder.CreateUIToFP(Ops[0], FTy);
12228 return Builder.CreateSIToFP(Ops[0], FTy);
12230 case NEON::BI__builtin_neon_vcvtah_u16_f16:
12231 case NEON::BI__builtin_neon_vcvtmh_u16_f16:
12232 case NEON::BI__builtin_neon_vcvtnh_u16_f16:
12233 case NEON::BI__builtin_neon_vcvtph_u16_f16:
12234 case NEON::BI__builtin_neon_vcvth_u16_f16:
12235 case NEON::BI__builtin_neon_vcvtah_s16_f16:
12236 case NEON::BI__builtin_neon_vcvtmh_s16_f16:
12237 case NEON::BI__builtin_neon_vcvtnh_s16_f16:
12238 case NEON::BI__builtin_neon_vcvtph_s16_f16:
12239 case NEON::BI__builtin_neon_vcvth_s16_f16: {
12242 llvm::Type* FTy =
HalfTy;
12243 llvm::Type *Tys[2] = {InTy, FTy};
12245 switch (BuiltinID) {
12246 default: llvm_unreachable(
"missing builtin ID in switch!");
12247 case NEON::BI__builtin_neon_vcvtah_u16_f16:
12248 Int = Intrinsic::aarch64_neon_fcvtau;
break;
12249 case NEON::BI__builtin_neon_vcvtmh_u16_f16:
12250 Int = Intrinsic::aarch64_neon_fcvtmu;
break;
12251 case NEON::BI__builtin_neon_vcvtnh_u16_f16:
12252 Int = Intrinsic::aarch64_neon_fcvtnu;
break;
12253 case NEON::BI__builtin_neon_vcvtph_u16_f16:
12254 Int = Intrinsic::aarch64_neon_fcvtpu;
break;
12255 case NEON::BI__builtin_neon_vcvth_u16_f16:
12256 Int = Intrinsic::aarch64_neon_fcvtzu;
break;
12257 case NEON::BI__builtin_neon_vcvtah_s16_f16:
12258 Int = Intrinsic::aarch64_neon_fcvtas;
break;
12259 case NEON::BI__builtin_neon_vcvtmh_s16_f16:
12260 Int = Intrinsic::aarch64_neon_fcvtms;
break;
12261 case NEON::BI__builtin_neon_vcvtnh_s16_f16:
12262 Int = Intrinsic::aarch64_neon_fcvtns;
break;
12263 case NEON::BI__builtin_neon_vcvtph_s16_f16:
12264 Int = Intrinsic::aarch64_neon_fcvtps;
break;
12265 case NEON::BI__builtin_neon_vcvth_s16_f16:
12266 Int = Intrinsic::aarch64_neon_fcvtzs;
break;
12271 case NEON::BI__builtin_neon_vcaleh_f16:
12272 case NEON::BI__builtin_neon_vcalth_f16:
12273 case NEON::BI__builtin_neon_vcageh_f16:
12274 case NEON::BI__builtin_neon_vcagth_f16: {
12277 llvm::Type* FTy =
HalfTy;
12278 llvm::Type *Tys[2] = {InTy, FTy};
12280 switch (BuiltinID) {
12281 default: llvm_unreachable(
"missing builtin ID in switch!");
12282 case NEON::BI__builtin_neon_vcageh_f16:
12283 Int = Intrinsic::aarch64_neon_facge;
break;
12284 case NEON::BI__builtin_neon_vcagth_f16:
12285 Int = Intrinsic::aarch64_neon_facgt;
break;
12286 case NEON::BI__builtin_neon_vcaleh_f16:
12287 Int = Intrinsic::aarch64_neon_facge; std::swap(Ops[0], Ops[1]);
break;
12288 case NEON::BI__builtin_neon_vcalth_f16:
12289 Int = Intrinsic::aarch64_neon_facgt; std::swap(Ops[0], Ops[1]);
break;
12294 case NEON::BI__builtin_neon_vcvth_n_s16_f16:
12295 case NEON::BI__builtin_neon_vcvth_n_u16_f16: {
12298 llvm::Type* FTy =
HalfTy;
12299 llvm::Type *Tys[2] = {InTy, FTy};
12301 switch (BuiltinID) {
12302 default: llvm_unreachable(
"missing builtin ID in switch!");
12303 case NEON::BI__builtin_neon_vcvth_n_s16_f16:
12304 Int = Intrinsic::aarch64_neon_vcvtfp2fxs;
break;
12305 case NEON::BI__builtin_neon_vcvth_n_u16_f16:
12306 Int = Intrinsic::aarch64_neon_vcvtfp2fxu;
break;
12311 case NEON::BI__builtin_neon_vcvth_n_f16_s16:
12312 case NEON::BI__builtin_neon_vcvth_n_f16_u16: {
12314 llvm::Type* FTy =
HalfTy;
12316 llvm::Type *Tys[2] = {FTy, InTy};
12318 switch (BuiltinID) {
12319 default: llvm_unreachable(
"missing builtin ID in switch!");
12320 case NEON::BI__builtin_neon_vcvth_n_f16_s16:
12321 Int = Intrinsic::aarch64_neon_vcvtfxs2fp;
12322 Ops[0] =
Builder.CreateSExt(Ops[0], InTy,
"sext");
12324 case NEON::BI__builtin_neon_vcvth_n_f16_u16:
12325 Int = Intrinsic::aarch64_neon_vcvtfxu2fp;
12326 Ops[0] =
Builder.CreateZExt(Ops[0], InTy);
12331 case NEON::BI__builtin_neon_vpaddd_s64: {
12332 auto *Ty = llvm::FixedVectorType::get(
Int64Ty, 2);
12335 Vec =
Builder.CreateBitCast(Vec, Ty,
"v2i64");
12336 llvm::Value *Idx0 = llvm::ConstantInt::get(
SizeTy, 0);
12337 llvm::Value *Idx1 = llvm::ConstantInt::get(
SizeTy, 1);
12338 Value *Op0 =
Builder.CreateExtractElement(Vec, Idx0,
"lane0");
12339 Value *Op1 =
Builder.CreateExtractElement(Vec, Idx1,
"lane1");
12341 return Builder.CreateAdd(Op0, Op1,
"vpaddd");
12343 case NEON::BI__builtin_neon_vpaddd_f64: {
12344 auto *Ty = llvm::FixedVectorType::get(
DoubleTy, 2);
12347 Vec =
Builder.CreateBitCast(Vec, Ty,
"v2f64");
12348 llvm::Value *Idx0 = llvm::ConstantInt::get(
SizeTy, 0);
12349 llvm::Value *Idx1 = llvm::ConstantInt::get(
SizeTy, 1);
12350 Value *Op0 =
Builder.CreateExtractElement(Vec, Idx0,
"lane0");
12351 Value *Op1 =
Builder.CreateExtractElement(Vec, Idx1,
"lane1");
12353 return Builder.CreateFAdd(Op0, Op1,
"vpaddd");
12355 case NEON::BI__builtin_neon_vpadds_f32: {
12356 auto *Ty = llvm::FixedVectorType::get(
FloatTy, 2);
12359 Vec =
Builder.CreateBitCast(Vec, Ty,
"v2f32");
12360 llvm::Value *Idx0 = llvm::ConstantInt::get(
SizeTy, 0);
12361 llvm::Value *Idx1 = llvm::ConstantInt::get(
SizeTy, 1);
12362 Value *Op0 =
Builder.CreateExtractElement(Vec, Idx0,
"lane0");
12363 Value *Op1 =
Builder.CreateExtractElement(Vec, Idx1,
"lane1");
12365 return Builder.CreateFAdd(Op0, Op1,
"vpaddd");
12367 case NEON::BI__builtin_neon_vceqzd_s64:
12368 case NEON::BI__builtin_neon_vceqzd_f64:
12369 case NEON::BI__builtin_neon_vceqzs_f32:
12370 case NEON::BI__builtin_neon_vceqzh_f16:
12374 ICmpInst::FCMP_OEQ, ICmpInst::ICMP_EQ,
"vceqz");
12375 case NEON::BI__builtin_neon_vcgezd_s64:
12376 case NEON::BI__builtin_neon_vcgezd_f64:
12377 case NEON::BI__builtin_neon_vcgezs_f32:
12378 case NEON::BI__builtin_neon_vcgezh_f16:
12382 ICmpInst::FCMP_OGE, ICmpInst::ICMP_SGE,
"vcgez");
12383 case NEON::BI__builtin_neon_vclezd_s64:
12384 case NEON::BI__builtin_neon_vclezd_f64:
12385 case NEON::BI__builtin_neon_vclezs_f32:
12386 case NEON::BI__builtin_neon_vclezh_f16:
12390 ICmpInst::FCMP_OLE, ICmpInst::ICMP_SLE,
"vclez");
12391 case NEON::BI__builtin_neon_vcgtzd_s64:
12392 case NEON::BI__builtin_neon_vcgtzd_f64:
12393 case NEON::BI__builtin_neon_vcgtzs_f32:
12394 case NEON::BI__builtin_neon_vcgtzh_f16:
12398 ICmpInst::FCMP_OGT, ICmpInst::ICMP_SGT,
"vcgtz");
12399 case NEON::BI__builtin_neon_vcltzd_s64:
12400 case NEON::BI__builtin_neon_vcltzd_f64:
12401 case NEON::BI__builtin_neon_vcltzs_f32:
12402 case NEON::BI__builtin_neon_vcltzh_f16:
12406 ICmpInst::FCMP_OLT, ICmpInst::ICMP_SLT,
"vcltz");
12408 case NEON::BI__builtin_neon_vceqzd_u64: {
12412 Builder.CreateICmpEQ(Ops[0], llvm::Constant::getNullValue(
Int64Ty));
12415 case NEON::BI__builtin_neon_vceqd_f64:
12416 case NEON::BI__builtin_neon_vcled_f64:
12417 case NEON::BI__builtin_neon_vcltd_f64:
12418 case NEON::BI__builtin_neon_vcged_f64:
12419 case NEON::BI__builtin_neon_vcgtd_f64: {
12420 llvm::CmpInst::Predicate
P;
12421 switch (BuiltinID) {
12422 default: llvm_unreachable(
"missing builtin ID in switch!");
12423 case NEON::BI__builtin_neon_vceqd_f64:
P = llvm::FCmpInst::FCMP_OEQ;
break;
12424 case NEON::BI__builtin_neon_vcled_f64:
P = llvm::FCmpInst::FCMP_OLE;
break;
12425 case NEON::BI__builtin_neon_vcltd_f64:
P = llvm::FCmpInst::FCMP_OLT;
break;
12426 case NEON::BI__builtin_neon_vcged_f64:
P = llvm::FCmpInst::FCMP_OGE;
break;
12427 case NEON::BI__builtin_neon_vcgtd_f64:
P = llvm::FCmpInst::FCMP_OGT;
break;
12432 if (
P == llvm::FCmpInst::FCMP_OEQ)
12433 Ops[0] =
Builder.CreateFCmp(
P, Ops[0], Ops[1]);
12435 Ops[0] =
Builder.CreateFCmpS(
P, Ops[0], Ops[1]);
12438 case NEON::BI__builtin_neon_vceqs_f32:
12439 case NEON::BI__builtin_neon_vcles_f32:
12440 case NEON::BI__builtin_neon_vclts_f32:
12441 case NEON::BI__builtin_neon_vcges_f32:
12442 case NEON::BI__builtin_neon_vcgts_f32: {
12443 llvm::CmpInst::Predicate
P;
12444 switch (BuiltinID) {
12445 default: llvm_unreachable(
"missing builtin ID in switch!");
12446 case NEON::BI__builtin_neon_vceqs_f32:
P = llvm::FCmpInst::FCMP_OEQ;
break;
12447 case NEON::BI__builtin_neon_vcles_f32:
P = llvm::FCmpInst::FCMP_OLE;
break;
12448 case NEON::BI__builtin_neon_vclts_f32:
P = llvm::FCmpInst::FCMP_OLT;
break;
12449 case NEON::BI__builtin_neon_vcges_f32:
P = llvm::FCmpInst::FCMP_OGE;
break;
12450 case NEON::BI__builtin_neon_vcgts_f32:
P = llvm::FCmpInst::FCMP_OGT;
break;
12455 if (
P == llvm::FCmpInst::FCMP_OEQ)
12456 Ops[0] =
Builder.CreateFCmp(
P, Ops[0], Ops[1]);
12458 Ops[0] =
Builder.CreateFCmpS(
P, Ops[0], Ops[1]);
12461 case NEON::BI__builtin_neon_vceqh_f16:
12462 case NEON::BI__builtin_neon_vcleh_f16:
12463 case NEON::BI__builtin_neon_vclth_f16:
12464 case NEON::BI__builtin_neon_vcgeh_f16:
12465 case NEON::BI__builtin_neon_vcgth_f16: {
12466 llvm::CmpInst::Predicate
P;
12467 switch (BuiltinID) {
12468 default: llvm_unreachable(
"missing builtin ID in switch!");
12469 case NEON::BI__builtin_neon_vceqh_f16:
P = llvm::FCmpInst::FCMP_OEQ;
break;
12470 case NEON::BI__builtin_neon_vcleh_f16:
P = llvm::FCmpInst::FCMP_OLE;
break;
12471 case NEON::BI__builtin_neon_vclth_f16:
P = llvm::FCmpInst::FCMP_OLT;
break;
12472 case NEON::BI__builtin_neon_vcgeh_f16:
P = llvm::FCmpInst::FCMP_OGE;
break;
12473 case NEON::BI__builtin_neon_vcgth_f16:
P = llvm::FCmpInst::FCMP_OGT;
break;
12478 if (
P == llvm::FCmpInst::FCMP_OEQ)
12479 Ops[0] =
Builder.CreateFCmp(
P, Ops[0], Ops[1]);
12481 Ops[0] =
Builder.CreateFCmpS(
P, Ops[0], Ops[1]);
12484 case NEON::BI__builtin_neon_vceqd_s64:
12485 case NEON::BI__builtin_neon_vceqd_u64:
12486 case NEON::BI__builtin_neon_vcgtd_s64:
12487 case NEON::BI__builtin_neon_vcgtd_u64:
12488 case NEON::BI__builtin_neon_vcltd_s64:
12489 case NEON::BI__builtin_neon_vcltd_u64:
12490 case NEON::BI__builtin_neon_vcged_u64:
12491 case NEON::BI__builtin_neon_vcged_s64:
12492 case NEON::BI__builtin_neon_vcled_u64:
12493 case NEON::BI__builtin_neon_vcled_s64: {
12494 llvm::CmpInst::Predicate
P;
12495 switch (BuiltinID) {
12496 default: llvm_unreachable(
"missing builtin ID in switch!");
12497 case NEON::BI__builtin_neon_vceqd_s64:
12498 case NEON::BI__builtin_neon_vceqd_u64:
P = llvm::ICmpInst::ICMP_EQ;
break;
12499 case NEON::BI__builtin_neon_vcgtd_s64:
P = llvm::ICmpInst::ICMP_SGT;
break;
12500 case NEON::BI__builtin_neon_vcgtd_u64:
P = llvm::ICmpInst::ICMP_UGT;
break;
12501 case NEON::BI__builtin_neon_vcltd_s64:
P = llvm::ICmpInst::ICMP_SLT;
break;
12502 case NEON::BI__builtin_neon_vcltd_u64:
P = llvm::ICmpInst::ICMP_ULT;
break;
12503 case NEON::BI__builtin_neon_vcged_u64:
P = llvm::ICmpInst::ICMP_UGE;
break;
12504 case NEON::BI__builtin_neon_vcged_s64:
P = llvm::ICmpInst::ICMP_SGE;
break;
12505 case NEON::BI__builtin_neon_vcled_u64:
P = llvm::ICmpInst::ICMP_ULE;
break;
12506 case NEON::BI__builtin_neon_vcled_s64:
P = llvm::ICmpInst::ICMP_SLE;
break;
12511 Ops[0] =
Builder.CreateICmp(
P, Ops[0], Ops[1]);
12514 case NEON::BI__builtin_neon_vtstd_s64:
12515 case NEON::BI__builtin_neon_vtstd_u64: {
12519 Ops[0] =
Builder.CreateAnd(Ops[0], Ops[1]);
12520 Ops[0] =
Builder.CreateICmp(ICmpInst::ICMP_NE, Ops[0],
12521 llvm::Constant::getNullValue(
Int64Ty));
12524 case NEON::BI__builtin_neon_vset_lane_i8:
12525 case NEON::BI__builtin_neon_vset_lane_i16:
12526 case NEON::BI__builtin_neon_vset_lane_i32:
12527 case NEON::BI__builtin_neon_vset_lane_i64:
12528 case NEON::BI__builtin_neon_vset_lane_bf16:
12529 case NEON::BI__builtin_neon_vset_lane_f32:
12530 case NEON::BI__builtin_neon_vsetq_lane_i8:
12531 case NEON::BI__builtin_neon_vsetq_lane_i16:
12532 case NEON::BI__builtin_neon_vsetq_lane_i32:
12533 case NEON::BI__builtin_neon_vsetq_lane_i64:
12534 case NEON::BI__builtin_neon_vsetq_lane_bf16:
12535 case NEON::BI__builtin_neon_vsetq_lane_f32:
12537 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2],
"vset_lane");
12538 case NEON::BI__builtin_neon_vset_lane_f64:
12541 Builder.CreateBitCast(Ops[1], llvm::FixedVectorType::get(
DoubleTy, 1));
12543 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2],
"vset_lane");
12544 case NEON::BI__builtin_neon_vsetq_lane_f64:
12547 Builder.CreateBitCast(Ops[1], llvm::FixedVectorType::get(
DoubleTy, 2));
12549 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2],
"vset_lane");
12551 case NEON::BI__builtin_neon_vget_lane_i8:
12552 case NEON::BI__builtin_neon_vdupb_lane_i8:
12554 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
Int8Ty, 8));
12557 case NEON::BI__builtin_neon_vgetq_lane_i8:
12558 case NEON::BI__builtin_neon_vdupb_laneq_i8:
12560 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
Int8Ty, 16));
12563 case NEON::BI__builtin_neon_vget_lane_i16:
12564 case NEON::BI__builtin_neon_vduph_lane_i16:
12566 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
Int16Ty, 4));
12569 case NEON::BI__builtin_neon_vgetq_lane_i16:
12570 case NEON::BI__builtin_neon_vduph_laneq_i16:
12572 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
Int16Ty, 8));
12575 case NEON::BI__builtin_neon_vget_lane_i32:
12576 case NEON::BI__builtin_neon_vdups_lane_i32:
12578 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
Int32Ty, 2));
12581 case NEON::BI__builtin_neon_vdups_lane_f32:
12583 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
FloatTy, 2));
12586 case NEON::BI__builtin_neon_vgetq_lane_i32:
12587 case NEON::BI__builtin_neon_vdups_laneq_i32:
12589 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
Int32Ty, 4));
12592 case NEON::BI__builtin_neon_vget_lane_i64:
12593 case NEON::BI__builtin_neon_vdupd_lane_i64:
12595 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
Int64Ty, 1));
12598 case NEON::BI__builtin_neon_vdupd_lane_f64:
12600 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
DoubleTy, 1));
12603 case NEON::BI__builtin_neon_vgetq_lane_i64:
12604 case NEON::BI__builtin_neon_vdupd_laneq_i64:
12606 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
Int64Ty, 2));
12609 case NEON::BI__builtin_neon_vget_lane_f32:
12611 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
FloatTy, 2));
12614 case NEON::BI__builtin_neon_vget_lane_f64:
12616 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
DoubleTy, 1));
12619 case NEON::BI__builtin_neon_vgetq_lane_f32:
12620 case NEON::BI__builtin_neon_vdups_laneq_f32:
12622 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
FloatTy, 4));
12625 case NEON::BI__builtin_neon_vgetq_lane_f64:
12626 case NEON::BI__builtin_neon_vdupd_laneq_f64:
12628 Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(
DoubleTy, 2));
12631 case NEON::BI__builtin_neon_vaddh_f16:
12633 return Builder.CreateFAdd(Ops[0], Ops[1],
"vaddh");
12634 case NEON::BI__builtin_neon_vsubh_f16:
12636 return Builder.CreateFSub(Ops[0], Ops[1],
"vsubh");
12637 case NEON::BI__builtin_neon_vmulh_f16:
12639 return Builder.CreateFMul(Ops[0], Ops[1],
"vmulh");
12640 case NEON::BI__builtin_neon_vdivh_f16:
12642 return Builder.CreateFDiv(Ops[0], Ops[1],
"vdivh");
12643 case NEON::BI__builtin_neon_vfmah_f16:
12646 *
this, Intrinsic::fma, Intrinsic::experimental_constrained_fma,
HalfTy,
12648 case NEON::BI__builtin_neon_vfmsh_f16: {
12653 *
this, Intrinsic::fma, Intrinsic::experimental_constrained_fma,
HalfTy,
12656 case NEON::BI__builtin_neon_vaddd_s64:
12657 case NEON::BI__builtin_neon_vaddd_u64:
12659 case NEON::BI__builtin_neon_vsubd_s64:
12660 case NEON::BI__builtin_neon_vsubd_u64:
12662 case NEON::BI__builtin_neon_vqdmlalh_s16:
12663 case NEON::BI__builtin_neon_vqdmlslh_s16: {
12667 auto *VTy = llvm::FixedVectorType::get(
Int32Ty, 4);
12669 ProductOps,
"vqdmlXl");
12670 Constant *CI = ConstantInt::get(
SizeTy, 0);
12671 Ops[1] =
Builder.CreateExtractElement(Ops[1], CI,
"lane0");
12673 unsigned AccumInt = BuiltinID == NEON::BI__builtin_neon_vqdmlalh_s16
12674 ? Intrinsic::aarch64_neon_sqadd
12675 : Intrinsic::aarch64_neon_sqsub;
12678 case NEON::BI__builtin_neon_vqshlud_n_s64: {
12684 case NEON::BI__builtin_neon_vqshld_n_u64:
12685 case NEON::BI__builtin_neon_vqshld_n_s64: {
12686 unsigned Int = BuiltinID == NEON::BI__builtin_neon_vqshld_n_u64
12687 ? Intrinsic::aarch64_neon_uqshl
12688 : Intrinsic::aarch64_neon_sqshl;
12693 case NEON::BI__builtin_neon_vrshrd_n_u64:
12694 case NEON::BI__builtin_neon_vrshrd_n_s64: {
12695 unsigned Int = BuiltinID == NEON::BI__builtin_neon_vrshrd_n_u64
12696 ? Intrinsic::aarch64_neon_urshl
12697 : Intrinsic::aarch64_neon_srshl;
12699 int SV = cast<ConstantInt>(Ops[1])->getSExtValue();
12700 Ops[1] = ConstantInt::get(
Int64Ty, -SV);
12703 case NEON::BI__builtin_neon_vrsrad_n_u64:
12704 case NEON::BI__builtin_neon_vrsrad_n_s64: {
12705 unsigned Int = BuiltinID == NEON::BI__builtin_neon_vrsrad_n_u64
12706 ? Intrinsic::aarch64_neon_urshl
12707 : Intrinsic::aarch64_neon_srshl;
12711 {Ops[1], Builder.CreateSExt(Ops[2], Int64Ty)});
12714 case NEON::BI__builtin_neon_vshld_n_s64:
12715 case NEON::BI__builtin_neon_vshld_n_u64: {
12716 llvm::ConstantInt *Amt = cast<ConstantInt>(
EmitScalarExpr(
E->getArg(1)));
12718 Ops[0], ConstantInt::get(
Int64Ty, Amt->getZExtValue()),
"shld_n");
12720 case NEON::BI__builtin_neon_vshrd_n_s64: {
12721 llvm::ConstantInt *Amt = cast<ConstantInt>(
EmitScalarExpr(
E->getArg(1)));
12723 Ops[0], ConstantInt::get(
Int64Ty, std::min(
static_cast<uint64_t>(63),
12724 Amt->getZExtValue())),
12727 case NEON::BI__builtin_neon_vshrd_n_u64: {
12728 llvm::ConstantInt *Amt = cast<ConstantInt>(
EmitScalarExpr(
E->getArg(1)));
12729 uint64_t ShiftAmt = Amt->getZExtValue();
12731 if (ShiftAmt == 64)
12732 return ConstantInt::get(
Int64Ty, 0);
12733 return Builder.CreateLShr(Ops[0], ConstantInt::get(
Int64Ty, ShiftAmt),
12736 case NEON::BI__builtin_neon_vsrad_n_s64: {
12737 llvm::ConstantInt *Amt = cast<ConstantInt>(
EmitScalarExpr(
E->getArg(2)));
12739 Ops[1], ConstantInt::get(
Int64Ty, std::min(
static_cast<uint64_t>(63),
12740 Amt->getZExtValue())),
12742 return Builder.CreateAdd(Ops[0], Ops[1]);
12744 case NEON::BI__builtin_neon_vsrad_n_u64: {
12745 llvm::ConstantInt *Amt = cast<ConstantInt>(
EmitScalarExpr(
E->getArg(2)));
12746 uint64_t ShiftAmt = Amt->getZExtValue();
12749 if (ShiftAmt == 64)
12751 Ops[1] =
Builder.CreateLShr(Ops[1], ConstantInt::get(
Int64Ty, ShiftAmt),
12753 return Builder.CreateAdd(Ops[0], Ops[1]);
12755 case NEON::BI__builtin_neon_vqdmlalh_lane_s16:
12756 case NEON::BI__builtin_neon_vqdmlalh_laneq_s16:
12757 case NEON::BI__builtin_neon_vqdmlslh_lane_s16:
12758 case NEON::BI__builtin_neon_vqdmlslh_laneq_s16: {
12764 auto *VTy = llvm::FixedVectorType::get(
Int32Ty, 4);
12766 ProductOps,
"vqdmlXl");
12767 Constant *CI = ConstantInt::get(
SizeTy, 0);
12768 Ops[1] =
Builder.CreateExtractElement(Ops[1], CI,
"lane0");
12771 unsigned AccInt = (BuiltinID == NEON::BI__builtin_neon_vqdmlalh_lane_s16 ||
12772 BuiltinID == NEON::BI__builtin_neon_vqdmlalh_laneq_s16)
12773 ? Intrinsic::aarch64_neon_sqadd
12774 : Intrinsic::aarch64_neon_sqsub;
12777 case NEON::BI__builtin_neon_vqdmlals_s32:
12778 case NEON::BI__builtin_neon_vqdmlsls_s32: {
12780 ProductOps.push_back(Ops[1]);
12784 ProductOps,
"vqdmlXl");
12786 unsigned AccumInt = BuiltinID == NEON::BI__builtin_neon_vqdmlals_s32
12787 ? Intrinsic::aarch64_neon_sqadd
12788 : Intrinsic::aarch64_neon_sqsub;
12791 case NEON::BI__builtin_neon_vqdmlals_lane_s32:
12792 case NEON::BI__builtin_neon_vqdmlals_laneq_s32:
12793 case NEON::BI__builtin_neon_vqdmlsls_lane_s32:
12794 case NEON::BI__builtin_neon_vqdmlsls_laneq_s32: {
12798 ProductOps.push_back(Ops[1]);
12799 ProductOps.push_back(Ops[2]);
12802 ProductOps,
"vqdmlXl");
12805 unsigned AccInt = (BuiltinID == NEON::BI__builtin_neon_vqdmlals_lane_s32 ||
12806 BuiltinID == NEON::BI__builtin_neon_vqdmlals_laneq_s32)
12807 ? Intrinsic::aarch64_neon_sqadd
12808 : Intrinsic::aarch64_neon_sqsub;
12811 case NEON::BI__builtin_neon_vget_lane_bf16:
12812 case NEON::BI__builtin_neon_vduph_lane_bf16:
12813 case NEON::BI__builtin_neon_vduph_lane_f16: {
12817 case NEON::BI__builtin_neon_vgetq_lane_bf16:
12818 case NEON::BI__builtin_neon_vduph_laneq_bf16:
12819 case NEON::BI__builtin_neon_vduph_laneq_f16: {
12824 case clang::AArch64::BI_InterlockedAdd:
12825 case clang::AArch64::BI_InterlockedAdd64: {
12828 AtomicRMWInst *RMWI =
12830 llvm::AtomicOrdering::SequentiallyConsistent);
12831 return Builder.CreateAdd(RMWI, Val);
12836 llvm::Type *Ty = VTy;
12847 Builtin->BuiltinID, Builtin->LLVMIntrinsic, Builtin->AltLLVMIntrinsic,
12848 Builtin->NameHint, Builtin->TypeModifier,
E, Ops,
12855 switch (BuiltinID) {
12856 default:
return nullptr;
12857 case NEON::BI__builtin_neon_vbsl_v:
12858 case NEON::BI__builtin_neon_vbslq_v: {
12859 llvm::Type *BitTy = llvm::VectorType::getInteger(VTy);
12860 Ops[0] =
Builder.CreateBitCast(Ops[0], BitTy,
"vbsl");
12861 Ops[1] =
Builder.CreateBitCast(Ops[1], BitTy,
"vbsl");
12862 Ops[2] =
Builder.CreateBitCast(Ops[2], BitTy,
"vbsl");
12864 Ops[1] =
Builder.CreateAnd(Ops[0], Ops[1],
"vbsl");
12865 Ops[2] =
Builder.CreateAnd(
Builder.CreateNot(Ops[0]), Ops[2],
"vbsl");
12866 Ops[0] =
Builder.CreateOr(Ops[1], Ops[2],
"vbsl");
12867 return Builder.CreateBitCast(Ops[0], Ty);
12869 case NEON::BI__builtin_neon_vfma_lane_v:
12870 case NEON::BI__builtin_neon_vfmaq_lane_v: {
12873 Value *Addend = Ops[0];
12874 Value *Multiplicand = Ops[1];
12875 Value *LaneSource = Ops[2];
12876 Ops[0] = Multiplicand;
12877 Ops[1] = LaneSource;
12881 auto *SourceTy = BuiltinID == NEON::BI__builtin_neon_vfmaq_lane_v
12882 ? llvm::FixedVectorType::get(VTy->getElementType(),
12883 VTy->getNumElements() / 2)
12885 llvm::Constant *cst = cast<Constant>(Ops[3]);
12886 Value *SV = llvm::ConstantVector::getSplat(VTy->getElementCount(), cst);
12887 Ops[1] =
Builder.CreateBitCast(Ops[1], SourceTy);
12888 Ops[1] =
Builder.CreateShuffleVector(Ops[1], Ops[1], SV,
"lane");
12891 Int =
Builder.getIsFPConstrained() ? Intrinsic::experimental_constrained_fma
12895 case NEON::BI__builtin_neon_vfma_laneq_v: {
12896 auto *VTy = cast<llvm::FixedVectorType>(Ty);
12898 if (VTy && VTy->getElementType() ==
DoubleTy) {
12901 llvm::FixedVectorType *VTy =
12903 Ops[2] =
Builder.CreateBitCast(Ops[2], VTy);
12904 Ops[2] =
Builder.CreateExtractElement(Ops[2], Ops[3],
"extract");
12907 *
this, Intrinsic::fma, Intrinsic::experimental_constrained_fma,
12908 DoubleTy, {Ops[1], Ops[2], Ops[0]});
12911 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
12912 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
12914 auto *STy = llvm::FixedVectorType::get(VTy->getElementType(),
12915 VTy->getNumElements() * 2);
12916 Ops[2] =
Builder.CreateBitCast(Ops[2], STy);
12917 Value *SV = llvm::ConstantVector::getSplat(VTy->getElementCount(),
12918 cast<ConstantInt>(Ops[3]));
12919 Ops[2] =
Builder.CreateShuffleVector(Ops[2], Ops[2], SV,
"lane");
12922 *
this, Intrinsic::fma, Intrinsic::experimental_constrained_fma, Ty,
12923 {Ops[2], Ops[1], Ops[0]});
12925 case NEON::BI__builtin_neon_vfmaq_laneq_v: {
12926 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
12927 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
12929 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
12932 *
this, Intrinsic::fma, Intrinsic::experimental_constrained_fma, Ty,
12933 {Ops[2], Ops[1], Ops[0]});
12935 case NEON::BI__builtin_neon_vfmah_lane_f16:
12936 case NEON::BI__builtin_neon_vfmas_lane_f32:
12937 case NEON::BI__builtin_neon_vfmah_laneq_f16:
12938 case NEON::BI__builtin_neon_vfmas_laneq_f32:
12939 case NEON::BI__builtin_neon_vfmad_lane_f64:
12940 case NEON::BI__builtin_neon_vfmad_laneq_f64: {
12943 Ops[2] =
Builder.CreateExtractElement(Ops[2], Ops[3],
"extract");
12945 *
this, Intrinsic::fma, Intrinsic::experimental_constrained_fma, Ty,
12946 {Ops[1], Ops[2], Ops[0]});
12948 case NEON::BI__builtin_neon_vmull_v:
12950 Int = usgn ? Intrinsic::aarch64_neon_umull : Intrinsic::aarch64_neon_smull;
12951 if (
Type.isPoly())
Int = Intrinsic::aarch64_neon_pmull;
12953 case NEON::BI__builtin_neon_vmax_v:
12954 case NEON::BI__builtin_neon_vmaxq_v:
12956 Int = usgn ? Intrinsic::aarch64_neon_umax : Intrinsic::aarch64_neon_smax;
12957 if (Ty->isFPOrFPVectorTy())
Int = Intrinsic::aarch64_neon_fmax;
12959 case NEON::BI__builtin_neon_vmaxh_f16: {
12961 Int = Intrinsic::aarch64_neon_fmax;
12964 case NEON::BI__builtin_neon_vmin_v:
12965 case NEON::BI__builtin_neon_vminq_v:
12967 Int = usgn ? Intrinsic::aarch64_neon_umin : Intrinsic::aarch64_neon_smin;
12968 if (Ty->isFPOrFPVectorTy())
Int = Intrinsic::aarch64_neon_fmin;
12970 case NEON::BI__builtin_neon_vminh_f16: {
12972 Int = Intrinsic::aarch64_neon_fmin;
12975 case NEON::BI__builtin_neon_vabd_v:
12976 case NEON::BI__builtin_neon_vabdq_v:
12978 Int = usgn ? Intrinsic::aarch64_neon_uabd : Intrinsic::aarch64_neon_sabd;
12979 if (Ty->isFPOrFPVectorTy())
Int = Intrinsic::aarch64_neon_fabd;
12981 case NEON::BI__builtin_neon_vpadal_v:
12982 case NEON::BI__builtin_neon_vpadalq_v: {
12983 unsigned ArgElts = VTy->getNumElements();
12984 llvm::IntegerType *EltTy = cast<IntegerType>(VTy->getElementType());
12985 unsigned BitWidth = EltTy->getBitWidth();
12986 auto *ArgTy = llvm::FixedVectorType::get(
12987 llvm::IntegerType::get(
getLLVMContext(), BitWidth / 2), 2 * ArgElts);
12988 llvm::Type* Tys[2] = { VTy, ArgTy };
12989 Int = usgn ? Intrinsic::aarch64_neon_uaddlp : Intrinsic::aarch64_neon_saddlp;
12991 TmpOps.push_back(Ops[1]);
12994 llvm::Value *addend =
Builder.CreateBitCast(Ops[0], tmp->getType());
12995 return Builder.CreateAdd(tmp, addend);
12997 case NEON::BI__builtin_neon_vpmin_v:
12998 case NEON::BI__builtin_neon_vpminq_v:
13000 Int = usgn ? Intrinsic::aarch64_neon_uminp : Intrinsic::aarch64_neon_sminp;
13001 if (Ty->isFPOrFPVectorTy())
Int = Intrinsic::aarch64_neon_fminp;
13003 case NEON::BI__builtin_neon_vpmax_v:
13004 case NEON::BI__builtin_neon_vpmaxq_v:
13006 Int = usgn ? Intrinsic::aarch64_neon_umaxp : Intrinsic::aarch64_neon_smaxp;
13007 if (Ty->isFPOrFPVectorTy())
Int = Intrinsic::aarch64_neon_fmaxp;
13009 case NEON::BI__builtin_neon_vminnm_v:
13010 case NEON::BI__builtin_neon_vminnmq_v:
13011 Int = Intrinsic::aarch64_neon_fminnm;
13013 case NEON::BI__builtin_neon_vminnmh_f16:
13015 Int = Intrinsic::aarch64_neon_fminnm;
13017 case NEON::BI__builtin_neon_vmaxnm_v:
13018 case NEON::BI__builtin_neon_vmaxnmq_v:
13019 Int = Intrinsic::aarch64_neon_fmaxnm;
13021 case NEON::BI__builtin_neon_vmaxnmh_f16:
13023 Int = Intrinsic::aarch64_neon_fmaxnm;
13025 case NEON::BI__builtin_neon_vrecpss_f32: {
13030 case NEON::BI__builtin_neon_vrecpsd_f64:
13034 case NEON::BI__builtin_neon_vrecpsh_f16:
13038 case NEON::BI__builtin_neon_vqshrun_n_v:
13039 Int = Intrinsic::aarch64_neon_sqshrun;
13041 case NEON::BI__builtin_neon_vqrshrun_n_v:
13042 Int = Intrinsic::aarch64_neon_sqrshrun;
13044 case NEON::BI__builtin_neon_vqshrn_n_v:
13045 Int = usgn ? Intrinsic::aarch64_neon_uqshrn : Intrinsic::aarch64_neon_sqshrn;
13047 case NEON::BI__builtin_neon_vrshrn_n_v:
13048 Int = Intrinsic::aarch64_neon_rshrn;
13050 case NEON::BI__builtin_neon_vqrshrn_n_v:
13051 Int = usgn ? Intrinsic::aarch64_neon_uqrshrn : Intrinsic::aarch64_neon_sqrshrn;
13053 case NEON::BI__builtin_neon_vrndah_f16: {
13056 ? Intrinsic::experimental_constrained_round
13057 : Intrinsic::round;
13060 case NEON::BI__builtin_neon_vrnda_v:
13061 case NEON::BI__builtin_neon_vrndaq_v: {
13063 ? Intrinsic::experimental_constrained_round
13064 : Intrinsic::round;
13067 case NEON::BI__builtin_neon_vrndih_f16: {
13070 ? Intrinsic::experimental_constrained_nearbyint
13071 : Intrinsic::nearbyint;
13074 case NEON::BI__builtin_neon_vrndmh_f16: {
13077 ? Intrinsic::experimental_constrained_floor
13078 : Intrinsic::floor;
13081 case NEON::BI__builtin_neon_vrndm_v:
13082 case NEON::BI__builtin_neon_vrndmq_v: {
13084 ? Intrinsic::experimental_constrained_floor
13085 : Intrinsic::floor;
13088 case NEON::BI__builtin_neon_vrndnh_f16: {
13091 ? Intrinsic::experimental_constrained_roundeven
13092 : Intrinsic::roundeven;
13095 case NEON::BI__builtin_neon_vrndn_v:
13096 case NEON::BI__builtin_neon_vrndnq_v: {
13098 ? Intrinsic::experimental_constrained_roundeven
13099 : Intrinsic::roundeven;
13102 case NEON::BI__builtin_neon_vrndns_f32: {
13105 ? Intrinsic::experimental_constrained_roundeven
13106 : Intrinsic::roundeven;
13109 case NEON::BI__builtin_neon_vrndph_f16: {
13112 ? Intrinsic::experimental_constrained_ceil
13116 case NEON::BI__builtin_neon_vrndp_v:
13117 case NEON::BI__builtin_neon_vrndpq_v: {
13119 ? Intrinsic::experimental_constrained_ceil
13123 case NEON::BI__builtin_neon_vrndxh_f16: {
13126 ? Intrinsic::experimental_constrained_rint
13130 case NEON::BI__builtin_neon_vrndx_v:
13131 case NEON::BI__builtin_neon_vrndxq_v: {
13133 ? Intrinsic::experimental_constrained_rint
13137 case NEON::BI__builtin_neon_vrndh_f16: {
13140 ? Intrinsic::experimental_constrained_trunc
13141 : Intrinsic::trunc;
13144 case NEON::BI__builtin_neon_vrnd32x_f32:
13145 case NEON::BI__builtin_neon_vrnd32xq_f32:
13146 case NEON::BI__builtin_neon_vrnd32x_f64:
13147 case NEON::BI__builtin_neon_vrnd32xq_f64: {
13149 Int = Intrinsic::aarch64_neon_frint32x;
13152 case NEON::BI__builtin_neon_vrnd32z_f32:
13153 case NEON::BI__builtin_neon_vrnd32zq_f32:
13154 case NEON::BI__builtin_neon_vrnd32z_f64:
13155 case NEON::BI__builtin_neon_vrnd32zq_f64: {
13157 Int = Intrinsic::aarch64_neon_frint32z;
13160 case NEON::BI__builtin_neon_vrnd64x_f32:
13161 case NEON::BI__builtin_neon_vrnd64xq_f32:
13162 case NEON::BI__builtin_neon_vrnd64x_f64:
13163 case NEON::BI__builtin_neon_vrnd64xq_f64: {
13165 Int = Intrinsic::aarch64_neon_frint64x;
13168 case NEON::BI__builtin_neon_vrnd64z_f32:
13169 case NEON::BI__builtin_neon_vrnd64zq_f32:
13170 case NEON::BI__builtin_neon_vrnd64z_f64:
13171 case NEON::BI__builtin_neon_vrnd64zq_f64: {
13173 Int = Intrinsic::aarch64_neon_frint64z;
13176 case NEON::BI__builtin_neon_vrnd_v:
13177 case NEON::BI__builtin_neon_vrndq_v: {
13179 ? Intrinsic::experimental_constrained_trunc
13180 : Intrinsic::trunc;
13183 case NEON::BI__builtin_neon_vcvt_f64_v:
13184 case NEON::BI__builtin_neon_vcvtq_f64_v:
13185 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
13187 return usgn ?
Builder.CreateUIToFP(Ops[0], Ty,
"vcvt")
13188 :
Builder.CreateSIToFP(Ops[0], Ty,
"vcvt");
13189 case NEON::BI__builtin_neon_vcvt_f64_f32: {
13191 "unexpected vcvt_f64_f32 builtin");
13195 return Builder.CreateFPExt(Ops[0], Ty,
"vcvt");
13197 case NEON::BI__builtin_neon_vcvt_f32_f64: {
13199 "unexpected vcvt_f32_f64 builtin");
13203 return Builder.CreateFPTrunc(Ops[0], Ty,
"vcvt");
13205 case NEON::BI__builtin_neon_vcvt_s32_v:
13206 case NEON::BI__builtin_neon_vcvt_u32_v:
13207 case NEON::BI__builtin_neon_vcvt_s64_v:
13208 case NEON::BI__builtin_neon_vcvt_u64_v:
13209 case NEON::BI__builtin_neon_vcvt_s16_f16:
13210 case NEON::BI__builtin_neon_vcvt_u16_f16:
13211 case NEON::BI__builtin_neon_vcvtq_s32_v:
13212 case NEON::BI__builtin_neon_vcvtq_u32_v:
13213 case NEON::BI__builtin_neon_vcvtq_s64_v:
13214 case NEON::BI__builtin_neon_vcvtq_u64_v:
13215 case NEON::BI__builtin_neon_vcvtq_s16_f16:
13216 case NEON::BI__builtin_neon_vcvtq_u16_f16: {
13218 usgn ? Intrinsic::aarch64_neon_fcvtzu : Intrinsic::aarch64_neon_fcvtzs;
13222 case NEON::BI__builtin_neon_vcvta_s16_f16:
13223 case NEON::BI__builtin_neon_vcvta_u16_f16:
13224 case NEON::BI__builtin_neon_vcvta_s32_v:
13225 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
13226 case NEON::BI__builtin_neon_vcvtaq_s32_v:
13227 case NEON::BI__builtin_neon_vcvta_u32_v:
13228 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
13229 case NEON::BI__builtin_neon_vcvtaq_u32_v:
13230 case NEON::BI__builtin_neon_vcvta_s64_v:
13231 case NEON::BI__builtin_neon_vcvtaq_s64_v:
13232 case NEON::BI__builtin_neon_vcvta_u64_v:
13233 case NEON::BI__builtin_neon_vcvtaq_u64_v: {
13234 Int = usgn ? Intrinsic::aarch64_neon_fcvtau : Intrinsic::aarch64_neon_fcvtas;
13238 case NEON::BI__builtin_neon_vcvtm_s16_f16:
13239 case NEON::BI__builtin_neon_vcvtm_s32_v:
13240 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
13241 case NEON::BI__builtin_neon_vcvtmq_s32_v:
13242 case NEON::BI__builtin_neon_vcvtm_u16_f16:
13243 case NEON::BI__builtin_neon_vcvtm_u32_v:
13244 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
13245 case NEON::BI__builtin_neon_vcvtmq_u32_v:
13246 case NEON::BI__builtin_neon_vcvtm_s64_v:
13247 case NEON::BI__builtin_neon_vcvtmq_s64_v:
13248 case NEON::BI__builtin_neon_vcvtm_u64_v:
13249 case NEON::BI__builtin_neon_vcvtmq_u64_v: {
13250 Int = usgn ? Intrinsic::aarch64_neon_fcvtmu : Intrinsic::aarch64_neon_fcvtms;
13254 case NEON::BI__builtin_neon_vcvtn_s16_f16:
13255 case NEON::BI__builtin_neon_vcvtn_s32_v:
13256 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
13257 case NEON::BI__builtin_neon_vcvtnq_s32_v:
13258 case NEON::BI__builtin_neon_vcvtn_u16_f16:
13259 case NEON::BI__builtin_neon_vcvtn_u32_v:
13260 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
13261 case NEON::BI__builtin_neon_vcvtnq_u32_v:
13262 case NEON::BI__builtin_neon_vcvtn_s64_v:
13263 case NEON::BI__builtin_neon_vcvtnq_s64_v:
13264 case NEON::BI__builtin_neon_vcvtn_u64_v:
13265 case NEON::BI__builtin_neon_vcvtnq_u64_v: {
13266 Int = usgn ? Intrinsic::aarch64_neon_fcvtnu : Intrinsic::aarch64_neon_fcvtns;
13270 case NEON::BI__builtin_neon_vcvtp_s16_f16:
13271 case NEON::BI__builtin_neon_vcvtp_s32_v:
13272 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
13273 case NEON::BI__builtin_neon_vcvtpq_s32_v:
13274 case NEON::BI__builtin_neon_vcvtp_u16_f16:
13275 case NEON::BI__builtin_neon_vcvtp_u32_v:
13276 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
13277 case NEON::BI__builtin_neon_vcvtpq_u32_v:
13278 case NEON::BI__builtin_neon_vcvtp_s64_v:
13279 case NEON::BI__builtin_neon_vcvtpq_s64_v:
13280 case NEON::BI__builtin_neon_vcvtp_u64_v:
13281 case NEON::BI__builtin_neon_vcvtpq_u64_v: {
13282 Int = usgn ? Intrinsic::aarch64_neon_fcvtpu : Intrinsic::aarch64_neon_fcvtps;
13286 case NEON::BI__builtin_neon_vmulx_v:
13287 case NEON::BI__builtin_neon_vmulxq_v: {
13288 Int = Intrinsic::aarch64_neon_fmulx;
13291 case NEON::BI__builtin_neon_vmulxh_lane_f16:
13292 case NEON::BI__builtin_neon_vmulxh_laneq_f16: {
13296 Ops[1] =
Builder.CreateExtractElement(Ops[1], Ops[2],
"extract");
13298 Int = Intrinsic::aarch64_neon_fmulx;
13301 case NEON::BI__builtin_neon_vmul_lane_v:
13302 case NEON::BI__builtin_neon_vmul_laneq_v: {
13305 if (BuiltinID == NEON::BI__builtin_neon_vmul_laneq_v)
13308 llvm::FixedVectorType *VTy =
13310 Ops[1] =
Builder.CreateBitCast(Ops[1], VTy);
13311 Ops[1] =
Builder.CreateExtractElement(Ops[1], Ops[2],
"extract");
13315 case NEON::BI__builtin_neon_vnegd_s64:
13317 case NEON::BI__builtin_neon_vnegh_f16:
13319 case NEON::BI__builtin_neon_vpmaxnm_v:
13320 case NEON::BI__builtin_neon_vpmaxnmq_v: {
13321 Int = Intrinsic::aarch64_neon_fmaxnmp;
13324 case NEON::BI__builtin_neon_vpminnm_v:
13325 case NEON::BI__builtin_neon_vpminnmq_v: {
13326 Int = Intrinsic::aarch64_neon_fminnmp;
13329 case NEON::BI__builtin_neon_vsqrth_f16: {
13332 ? Intrinsic::experimental_constrained_sqrt
13336 case NEON::BI__builtin_neon_vsqrt_v:
13337 case NEON::BI__builtin_neon_vsqrtq_v: {
13339 ? Intrinsic::experimental_constrained_sqrt
13341 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
13344 case NEON::BI__builtin_neon_vrbit_v:
13345 case NEON::BI__builtin_neon_vrbitq_v: {
13346 Int = Intrinsic::bitreverse;
13349 case NEON::BI__builtin_neon_vaddv_u8:
13353 case NEON::BI__builtin_neon_vaddv_s8: {
13354 Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv;
13356 VTy = llvm::FixedVectorType::get(
Int8Ty, 8);
13357 llvm::Type *Tys[2] = { Ty, VTy };
13362 case NEON::BI__builtin_neon_vaddv_u16:
13365 case NEON::BI__builtin_neon_vaddv_s16: {
13366 Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv;
13368 VTy = llvm::FixedVectorType::get(
Int16Ty, 4);
13369 llvm::Type *Tys[2] = { Ty, VTy };
13374 case NEON::BI__builtin_neon_vaddvq_u8:
13377 case NEON::BI__builtin_neon_vaddvq_s8: {
13378 Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv;
13380 VTy = llvm::FixedVectorType::get(
Int8Ty, 16);
13381 llvm::Type *Tys[2] = { Ty, VTy };
13386 case NEON::BI__builtin_neon_vaddvq_u16:
13389 case NEON::BI__builtin_neon_vaddvq_s16: {
13390 Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv;
13392 VTy = llvm::FixedVectorType::get(
Int16Ty, 8);
13393 llvm::Type *Tys[2] = { Ty, VTy };
13398 case NEON::BI__builtin_neon_vmaxv_u8: {
13399 Int = Intrinsic::aarch64_neon_umaxv;
13401 VTy = llvm::FixedVectorType::get(
Int8Ty, 8);
13402 llvm::Type *Tys[2] = { Ty, VTy };
13407 case NEON::BI__builtin_neon_vmaxv_u16: {
13408 Int = Intrinsic::aarch64_neon_umaxv;
13410 VTy = llvm::FixedVectorType::get(
Int16Ty, 4);
13411 llvm::Type *Tys[2] = { Ty, VTy };
13416 case NEON::BI__builtin_neon_vmaxvq_u8: {
13417 Int = Intrinsic::aarch64_neon_umaxv;
13419 VTy = llvm::FixedVectorType::get(
Int8Ty, 16);
13420 llvm::Type *Tys[2] = { Ty, VTy };
13425 case NEON::BI__builtin_neon_vmaxvq_u16: {
13426 Int = Intrinsic::aarch64_neon_umaxv;
13428 VTy = llvm::FixedVectorType::get(
Int16Ty, 8);
13429 llvm::Type *Tys[2] = { Ty, VTy };
13434 case NEON::BI__builtin_neon_vmaxv_s8: {
13435 Int = Intrinsic::aarch64_neon_smaxv;
13437 VTy = llvm::FixedVectorType::get(
Int8Ty, 8);
13438 llvm::Type *Tys[2] = { Ty, VTy };
13443 case NEON::BI__builtin_neon_vmaxv_s16: {
13444 Int = Intrinsic::aarch64_neon_smaxv;
13446 VTy = llvm::FixedVectorType::get(
Int16Ty, 4);
13447 llvm::Type *Tys[2] = { Ty, VTy };
13452 case NEON::BI__builtin_neon_vmaxvq_s8: {
13453 Int = Intrinsic::aarch64_neon_smaxv;
13455 VTy = llvm::FixedVectorType::get(
Int8Ty, 16);
13456 llvm::Type *Tys[2] = { Ty, VTy };
13461 case NEON::BI__builtin_neon_vmaxvq_s16: {
13462 Int = Intrinsic::aarch64_neon_smaxv;
13464 VTy = llvm::FixedVectorType::get(
Int16Ty, 8);
13465 llvm::Type *Tys[2] = { Ty, VTy };
13470 case NEON::BI__builtin_neon_vmaxv_f16: {
13471 Int = Intrinsic::aarch64_neon_fmaxv;
13473 VTy = llvm::FixedVectorType::get(
HalfTy, 4);
13474 llvm::Type *Tys[2] = { Ty, VTy };
13479 case NEON::BI__builtin_neon_vmaxvq_f16: {
13480 Int = Intrinsic::aarch64_neon_fmaxv;
13482 VTy = llvm::FixedVectorType::get(
HalfTy, 8);
13483 llvm::Type *Tys[2] = { Ty, VTy };
13488 case NEON::BI__builtin_neon_vminv_u8: {
13489 Int = Intrinsic::aarch64_neon_uminv;
13491 VTy = llvm::FixedVectorType::get(
Int8Ty, 8);
13492 llvm::Type *Tys[2] = { Ty, VTy };
13497 case NEON::BI__builtin_neon_vminv_u16: {
13498 Int = Intrinsic::aarch64_neon_uminv;
13500 VTy = llvm::FixedVectorType::get(
Int16Ty, 4);
13501 llvm::Type *Tys[2] = { Ty, VTy };
13506 case NEON::BI__builtin_neon_vminvq_u8: {
13507 Int = Intrinsic::aarch64_neon_uminv;
13509 VTy = llvm::FixedVectorType::get(
Int8Ty, 16);
13510 llvm::Type *Tys[2] = { Ty, VTy };
13515 case NEON::BI__builtin_neon_vminvq_u16: {
13516 Int = Intrinsic::aarch64_neon_uminv;
13518 VTy = llvm::FixedVectorType::get(
Int16Ty, 8);
13519 llvm::Type *Tys[2] = { Ty, VTy };
13524 case NEON::BI__builtin_neon_vminv_s8: {
13525 Int = Intrinsic::aarch64_neon_sminv;
13527 VTy = llvm::FixedVectorType::get(
Int8Ty, 8);
13528 llvm::Type *Tys[2] = { Ty, VTy };
13533 case NEON::BI__builtin_neon_vminv_s16: {
13534 Int = Intrinsic::aarch64_neon_sminv;
13536 VTy = llvm::FixedVectorType::get(
Int16Ty, 4);
13537 llvm::Type *Tys[2] = { Ty, VTy };
13542 case NEON::BI__builtin_neon_vminvq_s8: {
13543 Int = Intrinsic::aarch64_neon_sminv;
13545 VTy = llvm::FixedVectorType::get(
Int8Ty, 16);
13546 llvm::Type *Tys[2] = { Ty, VTy };
13551 case NEON::BI__builtin_neon_vminvq_s16: {
13552 Int = Intrinsic::aarch64_neon_sminv;
13554 VTy = llvm::FixedVectorType::get(
Int16Ty, 8);
13555 llvm::Type *Tys[2] = { Ty, VTy };
13560 case NEON::BI__builtin_neon_vminv_f16: {
13561 Int = Intrinsic::aarch64_neon_fminv;
13563 VTy = llvm::FixedVectorType::get(
HalfTy, 4);
13564 llvm::Type *Tys[2] = { Ty, VTy };
13569 case NEON::BI__builtin_neon_vminvq_f16: {
13570 Int = Intrinsic::aarch64_neon_fminv;
13572 VTy = llvm::FixedVectorType::get(
HalfTy, 8);
13573 llvm::Type *Tys[2] = { Ty, VTy };
13578 case NEON::BI__builtin_neon_vmaxnmv_f16: {
13579 Int = Intrinsic::aarch64_neon_fmaxnmv;
13581 VTy = llvm::FixedVectorType::get(
HalfTy, 4);
13582 llvm::Type *Tys[2] = { Ty, VTy };
13587 case NEON::BI__builtin_neon_vmaxnmvq_f16: {
13588 Int = Intrinsic::aarch64_neon_fmaxnmv;
13590 VTy = llvm::FixedVectorType::get(
HalfTy, 8);
13591 llvm::Type *Tys[2] = { Ty, VTy };
13596 case NEON::BI__builtin_neon_vminnmv_f16: {
13597 Int = Intrinsic::aarch64_neon_fminnmv;
13599 VTy = llvm::FixedVectorType::get(
HalfTy, 4);
13600 llvm::Type *Tys[2] = { Ty, VTy };
13605 case NEON::BI__builtin_neon_vminnmvq_f16: {
13606 Int = Intrinsic::aarch64_neon_fminnmv;
13608 VTy = llvm::FixedVectorType::get(
HalfTy, 8);
13609 llvm::Type *Tys[2] = { Ty, VTy };
13614 case NEON::BI__builtin_neon_vmul_n_f64: {
13617 return Builder.CreateFMul(Ops[0], RHS);
13619 case NEON::BI__builtin_neon_vaddlv_u8: {
13620 Int = Intrinsic::aarch64_neon_uaddlv;
13622 VTy = llvm::FixedVectorType::get(
Int8Ty, 8);
13623 llvm::Type *Tys[2] = { Ty, VTy };
13628 case NEON::BI__builtin_neon_vaddlv_u16: {
13629 Int = Intrinsic::aarch64_neon_uaddlv;
13631 VTy = llvm::FixedVectorType::get(
Int16Ty, 4);
13632 llvm::Type *Tys[2] = { Ty, VTy };
13636 case NEON::BI__builtin_neon_vaddlvq_u8: {
13637 Int = Intrinsic::aarch64_neon_uaddlv;
13639 VTy = llvm::FixedVectorType::get(
Int8Ty, 16);
13640 llvm::Type *Tys[2] = { Ty, VTy };
13645 case NEON::BI__builtin_neon_vaddlvq_u16: {
13646 Int = Intrinsic::aarch64_neon_uaddlv;
13648 VTy = llvm::FixedVectorType::get(
Int16Ty, 8);
13649 llvm::Type *Tys[2] = { Ty, VTy };
13653 case NEON::BI__builtin_neon_vaddlv_s8: {
13654 Int = Intrinsic::aarch64_neon_saddlv;
13656 VTy = llvm::FixedVectorType::get(
Int8Ty, 8);
13657 llvm::Type *Tys[2] = { Ty, VTy };
13662 case NEON::BI__builtin_neon_vaddlv_s16: {
13663 Int = Intrinsic::aarch64_neon_saddlv;
13665 VTy = llvm::FixedVectorType::get(
Int16Ty, 4);
13666 llvm::Type *Tys[2] = { Ty, VTy };
13670 case NEON::BI__builtin_neon_vaddlvq_s8: {
13671 Int = Intrinsic::aarch64_neon_saddlv;
13673 VTy = llvm::FixedVectorType::get(
Int8Ty, 16);
13674 llvm::Type *Tys[2] = { Ty, VTy };
13679 case NEON::BI__builtin_neon_vaddlvq_s16: {
13680 Int = Intrinsic::aarch64_neon_saddlv;
13682 VTy = llvm::FixedVectorType::get(
Int16Ty, 8);
13683 llvm::Type *Tys[2] = { Ty, VTy };
13687 case NEON::BI__builtin_neon_vsri_n_v:
13688 case NEON::BI__builtin_neon_vsriq_n_v: {
13689 Int = Intrinsic::aarch64_neon_vsri;
13693 case NEON::BI__builtin_neon_vsli_n_v:
13694 case NEON::BI__builtin_neon_vsliq_n_v: {
13695 Int = Intrinsic::aarch64_neon_vsli;
13699 case NEON::BI__builtin_neon_vsra_n_v:
13700 case NEON::BI__builtin_neon_vsraq_n_v:
13701 Ops[0] =
Builder.CreateBitCast(Ops[0], Ty);
13703 return Builder.CreateAdd(Ops[0], Ops[1]);
13704 case NEON::BI__builtin_neon_vrsra_n_v:
13705 case NEON::BI__builtin_neon_vrsraq_n_v: {
13706 Int = usgn ? Intrinsic::aarch64_neon_urshl : Intrinsic::aarch64_neon_srshl;
13708 TmpOps.push_back(Ops[1]);
13709 TmpOps.push_back(Ops[2]);
13711 llvm::Value *tmp =
EmitNeonCall(F, TmpOps,
"vrshr_n", 1,
true);
13712 Ops[0] =
Builder.CreateBitCast(Ops[0], VTy);
13713 return Builder.CreateAdd(Ops[0], tmp);
13715 case NEON::BI__builtin_neon_vld1_v:
13716 case NEON::BI__builtin_neon_vld1q_v: {
13719 case NEON::BI__builtin_neon_vst1_v:
13720 case NEON::BI__builtin_neon_vst1q_v:
13721 Ops[1] =
Builder.CreateBitCast(Ops[1], VTy);
13723 case NEON::BI__builtin_neon_vld1_lane_v:
13724 case NEON::BI__builtin_neon_vld1q_lane_v: {
13725 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13728 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2],
"vld1_lane");
13730 case NEON::BI__builtin_neon_vldap1_lane_s64:
13731 case NEON::BI__builtin_neon_vldap1q_lane_s64: {
13732 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13734 VTy->getElementType(), Ops[0], PtrOp0.
getAlignment());
13735 LI->setAtomic(llvm::AtomicOrdering::Acquire);
13737 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2],
"vldap1_lane");
13739 case NEON::BI__builtin_neon_vld1_dup_v:
13740 case NEON::BI__builtin_neon_vld1q_dup_v: {
13741 Value *
V = PoisonValue::get(Ty);
13744 llvm::Constant *CI = ConstantInt::get(
Int32Ty, 0);
13745 Ops[0] =
Builder.CreateInsertElement(
V, Ops[0], CI);
13748 case NEON::BI__builtin_neon_vst1_lane_v:
13749 case NEON::BI__builtin_neon_vst1q_lane_v:
13750 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13751 Ops[1] =
Builder.CreateExtractElement(Ops[1], Ops[2]);
13753 case NEON::BI__builtin_neon_vstl1_lane_s64:
13754 case NEON::BI__builtin_neon_vstl1q_lane_s64: {
13755 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13756 Ops[1] =
Builder.CreateExtractElement(Ops[1], Ops[2]);
13757 llvm::StoreInst *SI =
13759 SI->setAtomic(llvm::AtomicOrdering::Release);
13762 case NEON::BI__builtin_neon_vld2_v:
13763 case NEON::BI__builtin_neon_vld2q_v: {
13766 Ops[1] =
Builder.CreateCall(F, Ops[1],
"vld2");
13769 case NEON::BI__builtin_neon_vld3_v:
13770 case NEON::BI__builtin_neon_vld3q_v: {
13773 Ops[1] =
Builder.CreateCall(F, Ops[1],
"vld3");
13776 case NEON::BI__builtin_neon_vld4_v:
13777 case NEON::BI__builtin_neon_vld4q_v: {
13780 Ops[1] =
Builder.CreateCall(F, Ops[1],
"vld4");
13783 case NEON::BI__builtin_neon_vld2_dup_v:
13784 case NEON::BI__builtin_neon_vld2q_dup_v: {
13787 Ops[1] =
Builder.CreateCall(F, Ops[1],
"vld2");
13790 case NEON::BI__builtin_neon_vld3_dup_v:
13791 case NEON::BI__builtin_neon_vld3q_dup_v: {
13794 Ops[1] =
Builder.CreateCall(F, Ops[1],
"vld3");
13797 case NEON::BI__builtin_neon_vld4_dup_v:
13798 case NEON::BI__builtin_neon_vld4q_dup_v: {
13801 Ops[1] =
Builder.CreateCall(F, Ops[1],
"vld4");
13804 case NEON::BI__builtin_neon_vld2_lane_v:
13805 case NEON::BI__builtin_neon_vld2q_lane_v: {
13806 llvm::Type *Tys[2] = { VTy, Ops[1]->getType() };
13808 std::rotate(Ops.begin() + 1, Ops.begin() + 2, Ops.end());
13809 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13810 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
13815 case NEON::BI__builtin_neon_vld3_lane_v:
13816 case NEON::BI__builtin_neon_vld3q_lane_v: {
13817 llvm::Type *Tys[2] = { VTy, Ops[1]->getType() };
13819 std::rotate(Ops.begin() + 1, Ops.begin() + 2, Ops.end());
13820 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13821 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
13822 Ops[3] =
Builder.CreateBitCast(Ops[3], Ty);
13827 case NEON::BI__builtin_neon_vld4_lane_v:
13828 case NEON::BI__builtin_neon_vld4q_lane_v: {
13829 llvm::Type *Tys[2] = { VTy, Ops[1]->getType() };
13831 std::rotate(Ops.begin() + 1, Ops.begin() + 2, Ops.end());
13832 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13833 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
13834 Ops[3] =
Builder.CreateBitCast(Ops[3], Ty);
13835 Ops[4] =
Builder.CreateBitCast(Ops[4], Ty);
13840 case NEON::BI__builtin_neon_vst2_v:
13841 case NEON::BI__builtin_neon_vst2q_v: {
13842 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end());
13843 llvm::Type *Tys[2] = { VTy, Ops[2]->getType() };
13847 case NEON::BI__builtin_neon_vst2_lane_v:
13848 case NEON::BI__builtin_neon_vst2q_lane_v: {
13849 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end());
13851 llvm::Type *Tys[2] = { VTy, Ops[3]->getType() };
13855 case NEON::BI__builtin_neon_vst3_v:
13856 case NEON::BI__builtin_neon_vst3q_v: {
13857 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end());
13858 llvm::Type *Tys[2] = { VTy, Ops[3]->getType() };
13862 case NEON::BI__builtin_neon_vst3_lane_v:
13863 case NEON::BI__builtin_neon_vst3q_lane_v: {
13864 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end());
13866 llvm::Type *Tys[2] = { VTy, Ops[4]->getType() };
13870 case NEON::BI__builtin_neon_vst4_v:
13871 case NEON::BI__builtin_neon_vst4q_v: {
13872 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end());
13873 llvm::Type *Tys[2] = { VTy, Ops[4]->getType() };
13877 case NEON::BI__builtin_neon_vst4_lane_v:
13878 case NEON::BI__builtin_neon_vst4q_lane_v: {
13879 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end());
13881 llvm::Type *Tys[2] = { VTy, Ops[5]->getType() };
13885 case NEON::BI__builtin_neon_vtrn_v:
13886 case NEON::BI__builtin_neon_vtrnq_v: {
13887 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13888 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
13889 Value *SV =
nullptr;
13891 for (
unsigned vi = 0; vi != 2; ++vi) {
13893 for (
unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) {
13894 Indices.push_back(i+vi);
13895 Indices.push_back(i+e+vi);
13897 Value *Addr =
Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi);
13898 SV =
Builder.CreateShuffleVector(Ops[1], Ops[2], Indices,
"vtrn");
13903 case NEON::BI__builtin_neon_vuzp_v:
13904 case NEON::BI__builtin_neon_vuzpq_v: {
13905 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13906 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
13907 Value *SV =
nullptr;
13909 for (
unsigned vi = 0; vi != 2; ++vi) {
13911 for (
unsigned i = 0, e = VTy->getNumElements(); i != e; ++i)
13912 Indices.push_back(2*i+vi);
13914 Value *Addr =
Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi);
13915 SV =
Builder.CreateShuffleVector(Ops[1], Ops[2], Indices,
"vuzp");
13920 case NEON::BI__builtin_neon_vzip_v:
13921 case NEON::BI__builtin_neon_vzipq_v: {
13922 Ops[1] =
Builder.CreateBitCast(Ops[1], Ty);
13923 Ops[2] =
Builder.CreateBitCast(Ops[2], Ty);
13924 Value *SV =
nullptr;
13926 for (
unsigned vi = 0; vi != 2; ++vi) {
13928 for (
unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) {
13929 Indices.push_back((i + vi*e) >> 1);
13930 Indices.push_back(((i + vi*e) >> 1)+e);
13932 Value *Addr =
Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi);
13933 SV =
Builder.CreateShuffleVector(Ops[1], Ops[2], Indices,
"vzip");
13938 case NEON::BI__builtin_neon_vqtbl1q_v: {
13942 case NEON::BI__builtin_neon_vqtbl2q_v: {
13946 case NEON::BI__builtin_neon_vqtbl3q_v: {
13950 case NEON::BI__builtin_neon_vqtbl4q_v: {
13954 case NEON::BI__builtin_neon_vqtbx1q_v: {
13958 case NEON::BI__builtin_neon_vqtbx2q_v: {
13962 case NEON::BI__builtin_neon_vqtbx3q_v: {
13966 case NEON::BI__builtin_neon_vqtbx4q_v: {
13970 case NEON::BI__builtin_neon_vsqadd_v:
13971 case NEON::BI__builtin_neon_vsqaddq_v: {
13972 Int = Intrinsic::aarch64_neon_usqadd;
13975 case NEON::BI__builtin_neon_vuqadd_v:
13976 case NEON::BI__builtin_neon_vuqaddq_v: {
13977 Int = Intrinsic::aarch64_neon_suqadd;
13981 case NEON::BI__builtin_neon_vluti2_laneq_bf16:
13982 case NEON::BI__builtin_neon_vluti2_laneq_f16:
13983 case NEON::BI__builtin_neon_vluti2_laneq_p16:
13984 case NEON::BI__builtin_neon_vluti2_laneq_p8:
13985 case NEON::BI__builtin_neon_vluti2_laneq_s16:
13986 case NEON::BI__builtin_neon_vluti2_laneq_s8:
13987 case NEON::BI__builtin_neon_vluti2_laneq_u16:
13988 case NEON::BI__builtin_neon_vluti2_laneq_u8: {
13989 Int = Intrinsic::aarch64_neon_vluti2_laneq;
13990 llvm::Type *Tys[2];
13996 case NEON::BI__builtin_neon_vluti2q_laneq_bf16:
13997 case NEON::BI__builtin_neon_vluti2q_laneq_f16:
13998 case NEON::BI__builtin_neon_vluti2q_laneq_p16:
13999 case NEON::BI__builtin_neon_vluti2q_laneq_p8:
14000 case NEON::BI__builtin_neon_vluti2q_laneq_s16:
14001 case NEON::BI__builtin_neon_vluti2q_laneq_s8:
14002 case NEON::BI__builtin_neon_vluti2q_laneq_u16:
14003 case NEON::BI__builtin_neon_vluti2q_laneq_u8: {
14004 Int = Intrinsic::aarch64_neon_vluti2_laneq;
14005 llvm::Type *Tys[2];
14011 case NEON::BI__builtin_neon_vluti2_lane_bf16:
14012 case NEON::BI__builtin_neon_vluti2_lane_f16:
14013 case NEON::BI__builtin_neon_vluti2_lane_p16:
14014 case NEON::BI__builtin_neon_vluti2_lane_p8:
14015 case NEON::BI__builtin_neon_vluti2_lane_s16:
14016 case NEON::BI__builtin_neon_vluti2_lane_s8:
14017 case NEON::BI__builtin_neon_vluti2_lane_u16:
14018 case NEON::BI__builtin_neon_vluti2_lane_u8: {
14019 Int = Intrinsic::aarch64_neon_vluti2_lane;
14020 llvm::Type *Tys[2];
14026 case NEON::BI__builtin_neon_vluti2q_lane_bf16:
14027 case NEON::BI__builtin_neon_vluti2q_lane_f16:
14028 case NEON::BI__builtin_neon_vluti2q_lane_p16:
14029 case NEON::BI__builtin_neon_vluti2q_lane_p8:
14030 case NEON::BI__builtin_neon_vluti2q_lane_s16:
14031 case NEON::BI__builtin_neon_vluti2q_lane_s8:
14032 case NEON::BI__builtin_neon_vluti2q_lane_u16:
14033 case NEON::BI__builtin_neon_vluti2q_lane_u8: {
14034 Int = Intrinsic::aarch64_neon_vluti2_lane;
14035 llvm::Type *Tys[2];
14041 case NEON::BI__builtin_neon_vluti4q_lane_p8:
14042 case NEON::BI__builtin_neon_vluti4q_lane_s8:
14043 case NEON::BI__builtin_neon_vluti4q_lane_u8: {
14044 Int = Intrinsic::aarch64_neon_vluti4q_lane;
14047 case NEON::BI__builtin_neon_vluti4q_laneq_p8:
14048 case NEON::BI__builtin_neon_vluti4q_laneq_s8:
14049 case NEON::BI__builtin_neon_vluti4q_laneq_u8: {
14050 Int = Intrinsic::aarch64_neon_vluti4q_laneq;
14053 case NEON::BI__builtin_neon_vluti4q_lane_bf16_x2:
14054 case NEON::BI__builtin_neon_vluti4q_lane_f16_x2:
14055 case NEON::BI__builtin_neon_vluti4q_lane_p16_x2:
14056 case NEON::BI__builtin_neon_vluti4q_lane_s16_x2:
14057 case NEON::BI__builtin_neon_vluti4q_lane_u16_x2: {
14058 Int = Intrinsic::aarch64_neon_vluti4q_lane_x2;
14061 case NEON::BI__builtin_neon_vluti4q_laneq_bf16_x2:
14062 case NEON::BI__builtin_neon_vluti4q_laneq_f16_x2:
14063 case NEON::BI__builtin_neon_vluti4q_laneq_p16_x2:
14064 case NEON::BI__builtin_neon_vluti4q_laneq_s16_x2:
14065 case NEON::BI__builtin_neon_vluti4q_laneq_u16_x2: {
14066 Int = Intrinsic::aarch64_neon_vluti4q_laneq_x2;
14070 case NEON::BI__builtin_neon_vamin_f16:
14071 case NEON::BI__builtin_neon_vaminq_f16:
14072 case NEON::BI__builtin_neon_vamin_f32:
14073 case NEON::BI__builtin_neon_vaminq_f32:
14074 case NEON::BI__builtin_neon_vaminq_f64: {
14075 Int = Intrinsic::aarch64_neon_famin;
14078 case NEON::BI__builtin_neon_vamax_f16:
14079 case NEON::BI__builtin_neon_vamaxq_f16:
14080 case NEON::BI__builtin_neon_vamax_f32:
14081 case NEON::BI__builtin_neon_vamaxq_f32:
14082 case NEON::BI__builtin_neon_vamaxq_f64: {
14083 Int = Intrinsic::aarch64_neon_famax;
14086 case NEON::BI__builtin_neon_vscale_f16:
14087 case NEON::BI__builtin_neon_vscaleq_f16:
14088 case NEON::BI__builtin_neon_vscale_f32:
14089 case NEON::BI__builtin_neon_vscaleq_f32:
14090 case NEON::BI__builtin_neon_vscaleq_f64: {
14091 Int = Intrinsic::aarch64_neon_fp8_fscale;
14099 assert((BuiltinID == BPF::BI__builtin_preserve_field_info ||
14100 BuiltinID == BPF::BI__builtin_btf_type_id ||
14101 BuiltinID == BPF::BI__builtin_preserve_type_info ||
14102 BuiltinID == BPF::BI__builtin_preserve_enum_value) &&
14103 "unexpected BPF builtin");
14110 switch (BuiltinID) {
14112 llvm_unreachable(
"Unexpected BPF builtin");
14113 case BPF::BI__builtin_preserve_field_info: {
14114 const Expr *Arg =
E->getArg(0);
14119 "using __builtin_preserve_field_info() without -g");
14132 Value *InfoKind = ConstantInt::get(
Int64Ty,
C->getSExtValue());
14135 llvm::Function *FnGetFieldInfo = llvm::Intrinsic::getOrInsertDeclaration(
14136 &
CGM.
getModule(), llvm::Intrinsic::bpf_preserve_field_info,
14137 {FieldAddr->getType()});
14138 return Builder.CreateCall(FnGetFieldInfo, {FieldAddr, InfoKind});
14140 case BPF::BI__builtin_btf_type_id:
14141 case BPF::BI__builtin_preserve_type_info: {
14147 const Expr *Arg0 =
E->getArg(0);
14152 Value *FlagValue = ConstantInt::get(
Int64Ty, Flag->getSExtValue());
14153 Value *SeqNumVal = ConstantInt::get(
Int32Ty, BuiltinSeqNum++);
14155 llvm::Function *FnDecl;
14156 if (BuiltinID == BPF::BI__builtin_btf_type_id)
14157 FnDecl = llvm::Intrinsic::getOrInsertDeclaration(
14158 &
CGM.
getModule(), llvm::Intrinsic::bpf_btf_type_id, {});
14160 FnDecl = llvm::Intrinsic::getOrInsertDeclaration(
14161 &
CGM.
getModule(), llvm::Intrinsic::bpf_preserve_type_info, {});
14162 CallInst *
Fn =
Builder.CreateCall(FnDecl, {SeqNumVal, FlagValue});
14163 Fn->setMetadata(LLVMContext::MD_preserve_access_index, DbgInfo);
14166 case BPF::BI__builtin_preserve_enum_value: {
14172 const Expr *Arg0 =
E->getArg(0);
14177 const auto *UO = cast<UnaryOperator>(Arg0->
IgnoreParens());
14178 const auto *CE = cast<CStyleCastExpr>(UO->getSubExpr());
14179 const auto *DR = cast<DeclRefExpr>(CE->getSubExpr());
14180 const auto *Enumerator = cast<EnumConstantDecl>(DR->getDecl());
14182 auto InitVal = Enumerator->getInitVal();
14183 std::string InitValStr;
14184 if (InitVal.isNegative() || InitVal >
uint64_t(INT64_MAX))
14185 InitValStr = std::to_string(InitVal.getSExtValue());
14187 InitValStr = std::to_string(InitVal.getZExtValue());
14188 std::string EnumStr = Enumerator->getNameAsString() +
":" + InitValStr;
14189 Value *EnumStrVal =
Builder.CreateGlobalString(EnumStr);
14192 Value *FlagValue = ConstantInt::get(
Int64Ty, Flag->getSExtValue());
14193 Value *SeqNumVal = ConstantInt::get(
Int32Ty, BuiltinSeqNum++);
14195 llvm::Function *IntrinsicFn = llvm::Intrinsic::getOrInsertDeclaration(
14196 &
CGM.
getModule(), llvm::Intrinsic::bpf_preserve_enum_value, {});
14198 Builder.CreateCall(IntrinsicFn, {SeqNumVal, EnumStrVal, FlagValue});
14199 Fn->setMetadata(LLVMContext::MD_preserve_access_index, DbgInfo);
14207 assert((Ops.size() & (Ops.size() - 1)) == 0 &&
14208 "Not a power-of-two sized vector!");
14209 bool AllConstants =
true;
14210 for (
unsigned i = 0, e = Ops.size(); i != e && AllConstants; ++i)
14211 AllConstants &= isa<Constant>(Ops[i]);
14214 if (AllConstants) {
14216 for (
unsigned i = 0, e = Ops.size(); i != e; ++i)
14217 CstOps.push_back(cast<Constant>(Ops[i]));
14218 return llvm::ConstantVector::get(CstOps);
14223 llvm::FixedVectorType::get(Ops[0]->getType(), Ops.size()));
14225 for (
unsigned i = 0, e = Ops.size(); i != e; ++i)
14233 unsigned NumElts) {
14235 auto *MaskTy = llvm::FixedVectorType::get(
14237 cast<IntegerType>(Mask->
getType())->getBitWidth());
14238 Value *MaskVec = CGF.
Builder.CreateBitCast(Mask, MaskTy);
14244 for (
unsigned i = 0; i != NumElts; ++i)
14246 MaskVec = CGF.
Builder.CreateShuffleVector(
14247 MaskVec, MaskVec,
ArrayRef(Indices, NumElts),
"extract");
14254 Value *Ptr = Ops[0];
14258 cast<llvm::FixedVectorType>(Ops[1]->getType())->getNumElements());
14260 return CGF.
Builder.CreateMaskedStore(Ops[1], Ptr, Alignment, MaskVec);
14265 llvm::Type *Ty = Ops[1]->getType();
14266 Value *Ptr = Ops[0];
14269 CGF, Ops[2], cast<llvm::FixedVectorType>(Ty)->getNumElements());
14271 return CGF.
Builder.CreateMaskedLoad(Ty, Ptr, Alignment, MaskVec, Ops[1]);
14276 auto *ResultTy = cast<llvm::VectorType>(Ops[1]->getType());
14277 Value *Ptr = Ops[0];
14280 CGF, Ops[2], cast<FixedVectorType>(ResultTy)->getNumElements());
14282 llvm::Function *F = CGF.
CGM.
getIntrinsic(Intrinsic::masked_expandload,
14284 return CGF.
Builder.CreateCall(F, { Ptr, MaskVec, Ops[1] });
14290 auto *ResultTy = cast<llvm::FixedVectorType>(Ops[1]->getType());
14294 Intrinsic::ID IID = IsCompress ? Intrinsic::x86_avx512_mask_compress
14295 : Intrinsic::x86_avx512_mask_expand;
14297 return CGF.
Builder.CreateCall(F, { Ops[0], Ops[1], MaskVec });
14302 auto *ResultTy = cast<llvm::FixedVectorType>(Ops[1]->getType());
14303 Value *Ptr = Ops[0];
14307 llvm::Function *F = CGF.
CGM.
getIntrinsic(Intrinsic::masked_compressstore,
14309 return CGF.
Builder.CreateCall(F, { Ops[1], Ptr, MaskVec });
14314 bool InvertLHS =
false) {
14315 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
14320 LHS = CGF.
Builder.CreateNot(LHS);
14322 return CGF.
Builder.CreateBitCast(CGF.
Builder.CreateBinOp(Opc, LHS, RHS),
14323 Ops[0]->getType());
14327 Value *Amt,
bool IsRight) {
14328 llvm::Type *Ty = Op0->
getType();
14334 unsigned NumElts = cast<llvm::FixedVectorType>(Ty)->getNumElements();
14335 Amt = CGF.
Builder.CreateIntCast(Amt, Ty->getScalarType(),
false);
14336 Amt = CGF.
Builder.CreateVectorSplat(NumElts, Amt);
14339 unsigned IID = IsRight ? Intrinsic::fshr : Intrinsic::fshl;
14341 return CGF.
Builder.CreateCall(F, {Op0, Op1, Amt});
14346 Value *Op0 = Ops[0];
14347 Value *Op1 = Ops[1];
14348 llvm::Type *Ty = Op0->
getType();
14349 uint64_t Imm = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0x7;
14351 CmpInst::Predicate Pred;
14354 Pred = IsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
14357 Pred = IsSigned ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_ULE;
14360 Pred = IsSigned ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
14363 Pred = IsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE;
14366 Pred = ICmpInst::ICMP_EQ;
14369 Pred = ICmpInst::ICMP_NE;
14372 return llvm::Constant::getNullValue(Ty);
14374 return llvm::Constant::getAllOnesValue(Ty);
14376 llvm_unreachable(
"Unexpected XOP vpcom/vpcomu predicate");
14388 if (
const auto *
C = dyn_cast<Constant>(Mask))
14389 if (
C->isAllOnesValue())
14393 CGF, Mask, cast<llvm::FixedVectorType>(Op0->
getType())->getNumElements());
14395 return CGF.
Builder.CreateSelect(Mask, Op0, Op1);
14401 if (
const auto *
C = dyn_cast<Constant>(Mask))
14402 if (
C->isAllOnesValue())
14405 auto *MaskTy = llvm::FixedVectorType::get(
14406 CGF.
Builder.getInt1Ty(), Mask->
getType()->getIntegerBitWidth());
14407 Mask = CGF.
Builder.CreateBitCast(Mask, MaskTy);
14408 Mask = CGF.
Builder.CreateExtractElement(Mask, (uint64_t)0);
14409 return CGF.
Builder.CreateSelect(Mask, Op0, Op1);
14413 unsigned NumElts,
Value *MaskIn) {
14415 const auto *
C = dyn_cast<Constant>(MaskIn);
14416 if (!
C || !
C->isAllOnesValue())
14422 for (
unsigned i = 0; i != NumElts; ++i)
14424 for (
unsigned i = NumElts; i != 8; ++i)
14425 Indices[i] = i % NumElts + NumElts;
14426 Cmp = CGF.
Builder.CreateShuffleVector(
14427 Cmp, llvm::Constant::getNullValue(Cmp->getType()), Indices);
14430 return CGF.
Builder.CreateBitCast(Cmp,
14432 std::max(NumElts, 8U)));
14437 assert((Ops.size() == 2 || Ops.size() == 4) &&
14438 "Unexpected number of arguments");
14440 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
14444 Cmp = Constant::getNullValue(
14445 llvm::FixedVectorType::get(CGF.
Builder.getInt1Ty(), NumElts));
14446 }
else if (CC == 7) {
14447 Cmp = Constant::getAllOnesValue(
14448 llvm::FixedVectorType::get(CGF.
Builder.getInt1Ty(), NumElts));
14450 ICmpInst::Predicate Pred;
14452 default: llvm_unreachable(
"Unknown condition code");
14453 case 0: Pred = ICmpInst::ICMP_EQ;
break;
14454 case 1: Pred =
Signed ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
break;
14455 case 2: Pred =
Signed ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_ULE;
break;
14456 case 4: Pred = ICmpInst::ICMP_NE;
break;
14457 case 5: Pred =
Signed ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE;
break;
14458 case 6: Pred =
Signed ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
break;
14460 Cmp = CGF.
Builder.CreateICmp(Pred, Ops[0], Ops[1]);
14463 Value *MaskIn =
nullptr;
14464 if (Ops.size() == 4)
14471 Value *Zero = Constant::getNullValue(In->getType());
14477 unsigned Rnd = cast<llvm::ConstantInt>(Ops[3])->getZExtValue();
14478 llvm::Type *Ty = Ops[1]->getType();
14482 Intrinsic::ID IID = IsSigned ? Intrinsic::x86_avx512_sitofp_round
14483 : Intrinsic::x86_avx512_uitofp_round;
14485 Res = CGF.
Builder.CreateCall(F, { Ops[0], Ops[3] });
14487 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF,
E);
14488 Res = IsSigned ? CGF.
Builder.CreateSIToFP(Ops[0], Ty)
14489 : CGF.
Builder.CreateUIToFP(Ops[0], Ty);
14500 bool Subtract =
false;
14501 Intrinsic::ID IID = Intrinsic::not_intrinsic;
14502 switch (BuiltinID) {
14504 case clang::X86::BI__builtin_ia32_vfmsubph512_mask3:
14507 case clang::X86::BI__builtin_ia32_vfmaddph512_mask:
14508 case clang::X86::BI__builtin_ia32_vfmaddph512_maskz:
14509 case clang::X86::BI__builtin_ia32_vfmaddph512_mask3:
14510 IID = llvm::Intrinsic::x86_avx512fp16_vfmadd_ph_512;
14512 case clang::X86::BI__builtin_ia32_vfmsubaddph512_mask3:
14515 case clang::X86::BI__builtin_ia32_vfmaddsubph512_mask:
14516 case clang::X86::BI__builtin_ia32_vfmaddsubph512_maskz:
14517 case clang::X86::BI__builtin_ia32_vfmaddsubph512_mask3:
14518 IID = llvm::Intrinsic::x86_avx512fp16_vfmaddsub_ph_512;
14520 case clang::X86::BI__builtin_ia32_vfmsubps512_mask3:
14523 case clang::X86::BI__builtin_ia32_vfmaddps512_mask:
14524 case clang::X86::BI__builtin_ia32_vfmaddps512_maskz:
14525 case clang::X86::BI__builtin_ia32_vfmaddps512_mask3:
14526 IID = llvm::Intrinsic::x86_avx512_vfmadd_ps_512;
break;
14527 case clang::X86::BI__builtin_ia32_vfmsubpd512_mask3:
14530 case clang::X86::BI__builtin_ia32_vfmaddpd512_mask:
14531 case clang::X86::BI__builtin_ia32_vfmaddpd512_maskz:
14532 case clang::X86::BI__builtin_ia32_vfmaddpd512_mask3:
14533 IID = llvm::Intrinsic::x86_avx512_vfmadd_pd_512;
break;
14534 case clang::X86::BI__builtin_ia32_vfmsubaddps512_mask3:
14537 case clang::X86::BI__builtin_ia32_vfmaddsubps512_mask:
14538 case clang::X86::BI__builtin_ia32_vfmaddsubps512_maskz:
14539 case clang::X86::BI__builtin_ia32_vfmaddsubps512_mask3:
14540 IID = llvm::Intrinsic::x86_avx512_vfmaddsub_ps_512;
14542 case clang::X86::BI__builtin_ia32_vfmsubaddpd512_mask3:
14545 case clang::X86::BI__builtin_ia32_vfmaddsubpd512_mask:
14546 case clang::X86::BI__builtin_ia32_vfmaddsubpd512_maskz:
14547 case clang::X86::BI__builtin_ia32_vfmaddsubpd512_mask3:
14548 IID = llvm::Intrinsic::x86_avx512_vfmaddsub_pd_512;
14550 case clang::X86::BI__builtin_ia32_vfmsubph256_round_mask3:
14553 case clang::X86::BI__builtin_ia32_vfmaddph256_round_mask:
14554 case clang::X86::BI__builtin_ia32_vfmaddph256_round_maskz:
14555 case clang::X86::BI__builtin_ia32_vfmaddph256_round_mask3:
14556 IID = llvm::Intrinsic::x86_avx10_vfmaddph256;
14558 case clang::X86::BI__builtin_ia32_vfmsubaddph256_round_mask3:
14561 case clang::X86::BI__builtin_ia32_vfmaddsubph256_round_mask:
14562 case clang::X86::BI__builtin_ia32_vfmaddsubph256_round_maskz:
14563 case clang::X86::BI__builtin_ia32_vfmaddsubph256_round_mask3:
14564 IID = llvm::Intrinsic::x86_avx10_vfmaddsubph256;
14566 case clang::X86::BI__builtin_ia32_vfmsubps256_round_mask3:
14569 case clang::X86::BI__builtin_ia32_vfmaddps256_round_mask:
14570 case clang::X86::BI__builtin_ia32_vfmaddps256_round_maskz:
14571 case clang::X86::BI__builtin_ia32_vfmaddps256_round_mask3:
14572 IID = llvm::Intrinsic::x86_avx10_vfmaddps256;
14574 case clang::X86::BI__builtin_ia32_vfmsubpd256_round_mask3:
14577 case clang::X86::BI__builtin_ia32_vfmaddpd256_round_mask:
14578 case clang::X86::BI__builtin_ia32_vfmaddpd256_round_maskz:
14579 case clang::X86::BI__builtin_ia32_vfmaddpd256_round_mask3:
14580 IID = llvm::Intrinsic::x86_avx10_vfmaddpd256;
14582 case clang::X86::BI__builtin_ia32_vfmsubaddps256_round_mask3:
14585 case clang::X86::BI__builtin_ia32_vfmaddsubps256_round_mask:
14586 case clang::X86::BI__builtin_ia32_vfmaddsubps256_round_maskz:
14587 case clang::X86::BI__builtin_ia32_vfmaddsubps256_round_mask3:
14588 IID = llvm::Intrinsic::x86_avx10_vfmaddsubps256;
14590 case clang::X86::BI__builtin_ia32_vfmsubaddpd256_round_mask3:
14593 case clang::X86::BI__builtin_ia32_vfmaddsubpd256_round_mask:
14594 case clang::X86::BI__builtin_ia32_vfmaddsubpd256_round_maskz:
14595 case clang::X86::BI__builtin_ia32_vfmaddsubpd256_round_mask3:
14596 IID = llvm::Intrinsic::x86_avx10_vfmaddsubpd256;
14610 if (IID != Intrinsic::not_intrinsic &&
14611 (cast<llvm::ConstantInt>(Ops.back())->getZExtValue() != (uint64_t)4 ||
14614 Res = CGF.
Builder.CreateCall(Intr, {A, B,
C, Ops.back() });
14616 llvm::Type *Ty = A->
getType();
14618 if (CGF.
Builder.getIsFPConstrained()) {
14619 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF,
E);
14620 FMA = CGF.
CGM.
getIntrinsic(Intrinsic::experimental_constrained_fma, Ty);
14621 Res = CGF.
Builder.CreateConstrainedFPCall(FMA, {A, B,
C});
14624 Res = CGF.
Builder.CreateCall(FMA, {A, B,
C});
14629 Value *MaskFalseVal =
nullptr;
14630 switch (BuiltinID) {
14631 case clang::X86::BI__builtin_ia32_vfmaddph512_mask:
14632 case clang::X86::BI__builtin_ia32_vfmaddps512_mask:
14633 case clang::X86::BI__builtin_ia32_vfmaddpd512_mask:
14634 case clang::X86::BI__builtin_ia32_vfmaddsubph512_mask:
14635 case clang::X86::BI__builtin_ia32_vfmaddsubps512_mask:
14636 case clang::X86::BI__builtin_ia32_vfmaddsubpd512_mask:
14637 case clang::X86::BI__builtin_ia32_vfmaddph256_round_mask:
14638 case clang::X86::BI__builtin_ia32_vfmaddps256_round_mask:
14639 case clang::X86::BI__builtin_ia32_vfmaddpd256_round_mask:
14640 case clang::X86::BI__builtin_ia32_vfmaddsubph256_round_mask:
14641 case clang::X86::BI__builtin_ia32_vfmaddsubps256_round_mask:
14642 case clang::X86::BI__builtin_ia32_vfmaddsubpd256_round_mask:
14643 MaskFalseVal = Ops[0];
14645 case clang::X86::BI__builtin_ia32_vfmaddph512_maskz:
14646 case clang::X86::BI__builtin_ia32_vfmaddps512_maskz:
14647 case clang::X86::BI__builtin_ia32_vfmaddpd512_maskz:
14648 case clang::X86::BI__builtin_ia32_vfmaddsubph512_maskz:
14649 case clang::X86::BI__builtin_ia32_vfmaddsubps512_maskz:
14650 case clang::X86::BI__builtin_ia32_vfmaddsubpd512_maskz:
14651 case clang::X86::BI__builtin_ia32_vfmaddph256_round_maskz:
14652 case clang::X86::BI__builtin_ia32_vfmaddps256_round_maskz:
14653 case clang::X86::BI__builtin_ia32_vfmaddpd256_round_maskz:
14654 case clang::X86::BI__builtin_ia32_vfmaddsubph256_round_maskz:
14655 case clang::X86::BI__builtin_ia32_vfmaddsubps256_round_maskz:
14656 case clang::X86::BI__builtin_ia32_vfmaddsubpd256_round_maskz:
14657 MaskFalseVal = Constant::getNullValue(Ops[0]->getType());
14659 case clang::X86::BI__builtin_ia32_vfmsubph512_mask3:
14660 case clang::X86::BI__builtin_ia32_vfmaddph512_mask3:
14661 case clang::X86::BI__builtin_ia32_vfmsubps512_mask3:
14662 case clang::X86::BI__builtin_ia32_vfmaddps512_mask3:
14663 case clang::X86::BI__builtin_ia32_vfmsubpd512_mask3:
14664 case clang::X86::BI__builtin_ia32_vfmaddpd512_mask3:
14665 case clang::X86::BI__builtin_ia32_vfmsubaddph512_mask3:
14666 case clang::X86::BI__builtin_ia32_vfmaddsubph512_mask3:
14667 case clang::X86::BI__builtin_ia32_vfmsubaddps512_mask3:
14668 case clang::X86::BI__builtin_ia32_vfmaddsubps512_mask3:
14669 case clang::X86::BI__builtin_ia32_vfmsubaddpd512_mask3:
14670 case clang::X86::BI__builtin_ia32_vfmaddsubpd512_mask3:
14671 case clang::X86::BI__builtin_ia32_vfmsubph256_round_mask3:
14672 case clang::X86::BI__builtin_ia32_vfmaddph256_round_mask3:
14673 case clang::X86::BI__builtin_ia32_vfmsubps256_round_mask3:
14674 case clang::X86::BI__builtin_ia32_vfmaddps256_round_mask3:
14675 case clang::X86::BI__builtin_ia32_vfmsubpd256_round_mask3:
14676 case clang::X86::BI__builtin_ia32_vfmaddpd256_round_mask3:
14677 case clang::X86::BI__builtin_ia32_vfmsubaddph256_round_mask3:
14678 case clang::X86::BI__builtin_ia32_vfmaddsubph256_round_mask3:
14679 case clang::X86::BI__builtin_ia32_vfmsubaddps256_round_mask3:
14680 case clang::X86::BI__builtin_ia32_vfmaddsubps256_round_mask3:
14681 case clang::X86::BI__builtin_ia32_vfmsubaddpd256_round_mask3:
14682 case clang::X86::BI__builtin_ia32_vfmaddsubpd256_round_mask3:
14683 MaskFalseVal = Ops[2];
14695 bool ZeroMask =
false,
unsigned PTIdx = 0,
14696 bool NegAcc =
false) {
14698 if (Ops.size() > 4)
14699 Rnd = cast<llvm::ConstantInt>(Ops[4])->getZExtValue();
14702 Ops[2] = CGF.
Builder.CreateFNeg(Ops[2]);
14704 Ops[0] = CGF.
Builder.CreateExtractElement(Ops[0], (uint64_t)0);
14705 Ops[1] = CGF.
Builder.CreateExtractElement(Ops[1], (uint64_t)0);
14706 Ops[2] = CGF.
Builder.CreateExtractElement(Ops[2], (uint64_t)0);
14711 switch (Ops[0]->getType()->getPrimitiveSizeInBits()) {
14713 IID = Intrinsic::x86_avx512fp16_vfmadd_f16;
14716 IID = Intrinsic::x86_avx512_vfmadd_f32;
14719 IID = Intrinsic::x86_avx512_vfmadd_f64;
14722 llvm_unreachable(
"Unexpected size");
14725 {Ops[0], Ops[1], Ops[2], Ops[4]});
14726 }
else if (CGF.
Builder.getIsFPConstrained()) {
14727 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF,
E);
14729 Intrinsic::experimental_constrained_fma, Ops[0]->getType());
14730 Res = CGF.
Builder.CreateConstrainedFPCall(FMA, Ops.slice(0, 3));
14733 Res = CGF.
Builder.CreateCall(FMA, Ops.slice(0, 3));
14736 if (Ops.size() > 3) {
14737 Value *PassThru = ZeroMask ? Constant::getNullValue(Res->
getType())
14743 if (NegAcc && PTIdx == 2)
14744 PassThru = CGF.
Builder.CreateExtractElement(Upper, (uint64_t)0);
14748 return CGF.
Builder.CreateInsertElement(Upper, Res, (uint64_t)0);
14753 llvm::Type *Ty = Ops[0]->getType();
14755 Ty = llvm::FixedVectorType::get(CGF.
Int64Ty,
14756 Ty->getPrimitiveSizeInBits() / 64);
14762 Constant *ShiftAmt = ConstantInt::get(Ty, 32);
14763 LHS = CGF.
Builder.CreateShl(LHS, ShiftAmt);
14764 LHS = CGF.
Builder.CreateAShr(LHS, ShiftAmt);
14765 RHS = CGF.
Builder.CreateShl(RHS, ShiftAmt);
14766 RHS = CGF.
Builder.CreateAShr(RHS, ShiftAmt);
14769 Constant *Mask = ConstantInt::get(Ty, 0xffffffff);
14770 LHS = CGF.
Builder.CreateAnd(LHS, Mask);
14771 RHS = CGF.
Builder.CreateAnd(RHS, Mask);
14774 return CGF.
Builder.CreateMul(LHS, RHS);
14782 llvm::Type *Ty = Ops[0]->getType();
14784 unsigned VecWidth = Ty->getPrimitiveSizeInBits();
14785 unsigned EltWidth = Ty->getScalarSizeInBits();
14787 if (VecWidth == 128 && EltWidth == 32)
14788 IID = Intrinsic::x86_avx512_pternlog_d_128;
14789 else if (VecWidth == 256 && EltWidth == 32)
14790 IID = Intrinsic::x86_avx512_pternlog_d_256;
14791 else if (VecWidth == 512 && EltWidth == 32)
14792 IID = Intrinsic::x86_avx512_pternlog_d_512;
14793 else if (VecWidth == 128 && EltWidth == 64)
14794 IID = Intrinsic::x86_avx512_pternlog_q_128;
14795 else if (VecWidth == 256 && EltWidth == 64)
14796 IID = Intrinsic::x86_avx512_pternlog_q_256;
14797 else if (VecWidth == 512 && EltWidth == 64)
14798 IID = Intrinsic::x86_avx512_pternlog_q_512;
14800 llvm_unreachable(
"Unexpected intrinsic");
14804 Value *PassThru = ZeroMask ? ConstantAggregateZero::get(Ty) : Ops[0];
14809 llvm::Type *DstTy) {
14810 unsigned NumberOfElements =
14811 cast<llvm::FixedVectorType>(DstTy)->getNumElements();
14813 return CGF.
Builder.CreateSExt(Mask, DstTy,
"vpmovm2");
14818 StringRef CPUStr = cast<clang::StringLiteral>(CPUExpr)->getString();
14819 return EmitX86CpuIs(CPUStr);
14825 llvm::Type *DstTy) {
14826 assert((Ops.size() == 1 || Ops.size() == 3 || Ops.size() == 4) &&
14827 "Unknown cvtph2ps intrinsic");
14830 if (Ops.size() == 4 && cast<llvm::ConstantInt>(Ops[3])->getZExtValue() != 4) {
14833 return CGF.
Builder.CreateCall(F, {Ops[0], Ops[1], Ops[2], Ops[3]});
14836 unsigned NumDstElts = cast<llvm::FixedVectorType>(DstTy)->getNumElements();
14837 Value *Src = Ops[0];
14841 cast<llvm::FixedVectorType>(Src->
getType())->getNumElements()) {
14842 assert(NumDstElts == 4 &&
"Unexpected vector size");
14847 auto *HalfTy = llvm::FixedVectorType::get(
14849 Src = CGF.
Builder.CreateBitCast(Src, HalfTy);
14852 Value *Res = CGF.
Builder.CreateFPExt(Src, DstTy,
"cvtph2ps");
14854 if (Ops.size() >= 3)
14859Value *CodeGenFunction::EmitX86CpuIs(StringRef CPUStr) {
14870 llvm::ArrayType::get(
Int32Ty, 1));
14874 cast<llvm::GlobalValue>(CpuModel)->setDSOLocal(
true);
14880 std::tie(Index,
Value) = StringSwitch<std::pair<unsigned, unsigned>>(CPUStr)
14882 .Case(STRING, {0u,
static_cast<unsigned>(llvm::X86::ENUM)})
14884 .Case(
ALIAS, {1u,
static_cast<unsigned>(llvm::X86::ENUM)})
14886 .Case(STR, {1u,
static_cast<unsigned>(llvm::X86::ENUM)})
14888 .Case(
ALIAS, {2u,
static_cast<unsigned>(llvm::X86::ENUM)})
14890 .Case(STR, {2u,
static_cast<unsigned>(llvm::X86::ENUM)})
14891#include
"llvm/TargetParser/X86TargetParser.def"
14893 assert(
Value != 0 &&
"Invalid CPUStr passed to CpuIs");
14896 llvm::Value *Idxs[] = {ConstantInt::get(
Int32Ty, 0),
14897 ConstantInt::get(
Int32Ty, Index)};
14903 return Builder.CreateICmpEQ(CpuValue,
14909 StringRef FeatureStr = cast<StringLiteral>(FeatureExpr)->getString();
14910 if (!
getContext().getTargetInfo().validateCpuSupports(FeatureStr))
14912 return EmitX86CpuSupports(FeatureStr);
14916 return EmitX86CpuSupports(llvm::X86::getCpuSupportsMask(FeatureStrs));
14920CodeGenFunction::EmitX86CpuSupports(std::array<uint32_t, 4> FeatureMask) {
14922 if (FeatureMask[0] != 0) {
14930 llvm::ArrayType::get(
Int32Ty, 1));
14934 cast<llvm::GlobalValue>(CpuModel)->setDSOLocal(
true);
14951 llvm::Type *ATy = llvm::ArrayType::get(
Int32Ty, 3);
14952 llvm::Constant *CpuFeatures2 =
14954 cast<llvm::GlobalValue>(CpuFeatures2)->setDSOLocal(
true);
14955 for (
int i = 1; i != 4; ++i) {
14956 const uint32_t M = FeatureMask[i];
14973Value *CodeGenFunction::EmitAArch64CpuInit() {
14974 llvm::FunctionType *FTy = llvm::FunctionType::get(
VoidTy,
false);
14975 llvm::FunctionCallee
Func =
14977 cast<llvm::GlobalValue>(
Func.getCallee())->setDSOLocal(
true);
14978 cast<llvm::GlobalValue>(
Func.getCallee())
14979 ->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
14984 llvm::FunctionType *FTy = llvm::FunctionType::get(
VoidTy, {
VoidPtrTy},
false);
14985 llvm::FunctionCallee
Func =
14987 auto *CalleeGV = cast<llvm::GlobalValue>(
Func.getCallee());
14988 CalleeGV->setDSOLocal(
true);
14989 CalleeGV->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
14993Value *CodeGenFunction::EmitX86CpuInit() {
14994 llvm::FunctionType *FTy = llvm::FunctionType::get(
VoidTy,
14996 llvm::FunctionCallee
Func =
14998 cast<llvm::GlobalValue>(
Func.getCallee())->setDSOLocal(
true);
14999 cast<llvm::GlobalValue>(
Func.getCallee())
15000 ->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
15004Value *CodeGenFunction::EmitAArch64CpuSupports(
const CallExpr *
E) {
15006 StringRef ArgStr = cast<StringLiteral>(ArgExpr)->getString();
15008 ArgStr.split(Features,
"+");
15009 for (
auto &Feature : Features) {
15010 Feature = Feature.trim();
15011 if (!llvm::AArch64::parseFMVExtension(Feature))
15013 if (Feature !=
"default")
15014 Features.push_back(Feature);
15016 return EmitAArch64CpuSupports(Features);
15021 uint64_t FeaturesMask = llvm::AArch64::getCpuSupportsMask(FeaturesStrs);
15023 if (FeaturesMask != 0) {
15028 llvm::Type *STy = llvm::StructType::get(
Int64Ty);
15029 llvm::Constant *AArch64CPUFeatures =
15031 cast<llvm::GlobalValue>(AArch64CPUFeatures)->setDSOLocal(
true);
15033 STy, AArch64CPUFeatures,
15048 StringRef FeatureStr = cast<StringLiteral>(FeatureExpr)->getString();
15049 if (!
getContext().getTargetInfo().validateCpuSupports(FeatureStr))
15057 llvm::Type *Int32Ty = Builder.getInt32Ty();
15058 llvm::Type *Int64Ty = Builder.getInt64Ty();
15059 llvm::ArrayType *ArrayOfInt64Ty =
15060 llvm::ArrayType::get(Int64Ty, llvm::RISCVISAInfo::FeatureBitSize);
15061 llvm::Type *StructTy = llvm::StructType::get(Int32Ty, ArrayOfInt64Ty);
15062 llvm::Constant *RISCVFeaturesBits =
15064 cast<llvm::GlobalValue>(RISCVFeaturesBits)->setDSOLocal(
true);
15065 Value *IndexVal = llvm::ConstantInt::get(Int32Ty, Index);
15066 llvm::Value *GEPIndices[] = {Builder.getInt32(0), Builder.getInt32(1),
15069 Builder.CreateInBoundsGEP(StructTy, RISCVFeaturesBits, GEPIndices);
15070 Value *FeaturesBit =
15072 return FeaturesBit;
15076 const unsigned RISCVFeatureLength = llvm::RISCVISAInfo::FeatureBitSize;
15077 uint64_t RequireBitMasks[RISCVFeatureLength] = {0};
15079 for (
auto Feat : FeaturesStrs) {
15080 auto [GroupID, BitPos] = RISCVISAInfo::getRISCVFeaturesBitsInfo(Feat);
15087 RequireBitMasks[GroupID] |= (1ULL << BitPos);
15091 for (
unsigned Idx = 0; Idx < RISCVFeatureLength; Idx++) {
15092 if (RequireBitMasks[Idx] == 0)
15102 assert(
Result &&
"Should have value here.");
15109 if (BuiltinID == Builtin::BI__builtin_cpu_is)
15110 return EmitX86CpuIs(
E);
15111 if (BuiltinID == Builtin::BI__builtin_cpu_supports)
15112 return EmitX86CpuSupports(
E);
15113 if (BuiltinID == Builtin::BI__builtin_cpu_init)
15114 return EmitX86CpuInit();
15122 bool IsMaskFCmp =
false;
15123 bool IsConjFMA =
false;
15126 unsigned ICEArguments = 0;
15131 for (
unsigned i = 0, e =
E->getNumArgs(); i != e; i++) {
15141 auto getCmpIntrinsicCall = [
this, &Ops](Intrinsic::ID
ID,
unsigned Imm) {
15142 Ops.push_back(llvm::ConstantInt::get(
Int8Ty, Imm));
15144 return Builder.CreateCall(F, Ops);
15152 auto getVectorFCmpIR = [
this, &Ops,
E](CmpInst::Predicate Pred,
15153 bool IsSignaling) {
15154 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
15157 Cmp =
Builder.CreateFCmpS(Pred, Ops[0], Ops[1]);
15159 Cmp =
Builder.CreateFCmp(Pred, Ops[0], Ops[1]);
15160 llvm::VectorType *FPVecTy = cast<llvm::VectorType>(Ops[0]->getType());
15161 llvm::VectorType *IntVecTy = llvm::VectorType::getInteger(FPVecTy);
15163 return Builder.CreateBitCast(Sext, FPVecTy);
15166 switch (BuiltinID) {
15167 default:
return nullptr;
15168 case X86::BI_mm_prefetch: {
15170 ConstantInt *
C = cast<ConstantInt>(Ops[1]);
15171 Value *RW = ConstantInt::get(
Int32Ty, (
C->getZExtValue() >> 2) & 0x1);
15172 Value *Locality = ConstantInt::get(
Int32Ty,
C->getZExtValue() & 0x3);
15177 case X86::BI_mm_clflush: {
15181 case X86::BI_mm_lfence: {
15184 case X86::BI_mm_mfence: {
15187 case X86::BI_mm_sfence: {
15190 case X86::BI_mm_pause: {
15193 case X86::BI__rdtsc: {
15196 case X86::BI__builtin_ia32_rdtscp: {
15202 case X86::BI__builtin_ia32_lzcnt_u16:
15203 case X86::BI__builtin_ia32_lzcnt_u32:
15204 case X86::BI__builtin_ia32_lzcnt_u64: {
15208 case X86::BI__builtin_ia32_tzcnt_u16:
15209 case X86::BI__builtin_ia32_tzcnt_u32:
15210 case X86::BI__builtin_ia32_tzcnt_u64: {
15214 case X86::BI__builtin_ia32_undef128:
15215 case X86::BI__builtin_ia32_undef256:
15216 case X86::BI__builtin_ia32_undef512:
15223 case X86::BI__builtin_ia32_vec_ext_v4hi:
15224 case X86::BI__builtin_ia32_vec_ext_v16qi:
15225 case X86::BI__builtin_ia32_vec_ext_v8hi:
15226 case X86::BI__builtin_ia32_vec_ext_v4si:
15227 case X86::BI__builtin_ia32_vec_ext_v4sf:
15228 case X86::BI__builtin_ia32_vec_ext_v2di:
15229 case X86::BI__builtin_ia32_vec_ext_v32qi:
15230 case X86::BI__builtin_ia32_vec_ext_v16hi:
15231 case X86::BI__builtin_ia32_vec_ext_v8si:
15232 case X86::BI__builtin_ia32_vec_ext_v4di: {
15234 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
15235 uint64_t Index = cast<ConstantInt>(Ops[1])->getZExtValue();
15236 Index &= NumElts - 1;
15239 return Builder.CreateExtractElement(Ops[0], Index);
15241 case X86::BI__builtin_ia32_vec_set_v4hi:
15242 case X86::BI__builtin_ia32_vec_set_v16qi:
15243 case X86::BI__builtin_ia32_vec_set_v8hi:
15244 case X86::BI__builtin_ia32_vec_set_v4si:
15245 case X86::BI__builtin_ia32_vec_set_v2di:
15246 case X86::BI__builtin_ia32_vec_set_v32qi:
15247 case X86::BI__builtin_ia32_vec_set_v16hi:
15248 case X86::BI__builtin_ia32_vec_set_v8si:
15249 case X86::BI__builtin_ia32_vec_set_v4di: {
15251 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
15252 unsigned Index = cast<ConstantInt>(Ops[2])->getZExtValue();
15253 Index &= NumElts - 1;
15256 return Builder.CreateInsertElement(Ops[0], Ops[1], Index);
15258 case X86::BI_mm_setcsr:
15259 case X86::BI__builtin_ia32_ldmxcsr: {
15265 case X86::BI_mm_getcsr:
15266 case X86::BI__builtin_ia32_stmxcsr: {
15272 case X86::BI__builtin_ia32_xsave:
15273 case X86::BI__builtin_ia32_xsave64:
15274 case X86::BI__builtin_ia32_xrstor:
15275 case X86::BI__builtin_ia32_xrstor64:
15276 case X86::BI__builtin_ia32_xsaveopt:
15277 case X86::BI__builtin_ia32_xsaveopt64:
15278 case X86::BI__builtin_ia32_xrstors:
15279 case X86::BI__builtin_ia32_xrstors64:
15280 case X86::BI__builtin_ia32_xsavec:
15281 case X86::BI__builtin_ia32_xsavec64:
15282 case X86::BI__builtin_ia32_xsaves:
15283 case X86::BI__builtin_ia32_xsaves64:
15284 case X86::BI__builtin_ia32_xsetbv:
15285 case X86::BI_xsetbv: {
15287#define INTRINSIC_X86_XSAVE_ID(NAME) \
15288 case X86::BI__builtin_ia32_##NAME: \
15289 ID = Intrinsic::x86_##NAME; \
15291 switch (BuiltinID) {
15292 default: llvm_unreachable(
"Unsupported intrinsic!");
15306 case X86::BI_xsetbv:
15307 ID = Intrinsic::x86_xsetbv;
15310#undef INTRINSIC_X86_XSAVE_ID
15315 Ops.push_back(Mlo);
15318 case X86::BI__builtin_ia32_xgetbv:
15319 case X86::BI_xgetbv:
15321 case X86::BI__builtin_ia32_storedqudi128_mask:
15322 case X86::BI__builtin_ia32_storedqusi128_mask:
15323 case X86::BI__builtin_ia32_storedquhi128_mask:
15324 case X86::BI__builtin_ia32_storedquqi128_mask:
15325 case X86::BI__builtin_ia32_storeupd128_mask:
15326 case X86::BI__builtin_ia32_storeups128_mask:
15327 case X86::BI__builtin_ia32_storedqudi256_mask:
15328 case X86::BI__builtin_ia32_storedqusi256_mask:
15329 case X86::BI__builtin_ia32_storedquhi256_mask:
15330 case X86::BI__builtin_ia32_storedquqi256_mask:
15331 case X86::BI__builtin_ia32_storeupd256_mask:
15332 case X86::BI__builtin_ia32_storeups256_mask:
15333 case X86::BI__builtin_ia32_storedqudi512_mask:
15334 case X86::BI__builtin_ia32_storedqusi512_mask:
15335 case X86::BI__builtin_ia32_storedquhi512_mask:
15336 case X86::BI__builtin_ia32_storedquqi512_mask:
15337 case X86::BI__builtin_ia32_storeupd512_mask:
15338 case X86::BI__builtin_ia32_storeups512_mask:
15341 case X86::BI__builtin_ia32_storesbf16128_mask:
15342 case X86::BI__builtin_ia32_storesh128_mask:
15343 case X86::BI__builtin_ia32_storess128_mask:
15344 case X86::BI__builtin_ia32_storesd128_mask:
15347 case X86::BI__builtin_ia32_cvtmask2b128:
15348 case X86::BI__builtin_ia32_cvtmask2b256:
15349 case X86::BI__builtin_ia32_cvtmask2b512:
15350 case X86::BI__builtin_ia32_cvtmask2w128:
15351 case X86::BI__builtin_ia32_cvtmask2w256:
15352 case X86::BI__builtin_ia32_cvtmask2w512:
15353 case X86::BI__builtin_ia32_cvtmask2d128:
15354 case X86::BI__builtin_ia32_cvtmask2d256:
15355 case X86::BI__builtin_ia32_cvtmask2d512:
15356 case X86::BI__builtin_ia32_cvtmask2q128:
15357 case X86::BI__builtin_ia32_cvtmask2q256:
15358 case X86::BI__builtin_ia32_cvtmask2q512:
15361 case X86::BI__builtin_ia32_cvtb2mask128:
15362 case X86::BI__builtin_ia32_cvtb2mask256:
15363 case X86::BI__builtin_ia32_cvtb2mask512:
15364 case X86::BI__builtin_ia32_cvtw2mask128:
15365 case X86::BI__builtin_ia32_cvtw2mask256:
15366 case X86::BI__builtin_ia32_cvtw2mask512:
15367 case X86::BI__builtin_ia32_cvtd2mask128:
15368 case X86::BI__builtin_ia32_cvtd2mask256:
15369 case X86::BI__builtin_ia32_cvtd2mask512:
15370 case X86::BI__builtin_ia32_cvtq2mask128:
15371 case X86::BI__builtin_ia32_cvtq2mask256:
15372 case X86::BI__builtin_ia32_cvtq2mask512:
15375 case X86::BI__builtin_ia32_cvtdq2ps512_mask:
15376 case X86::BI__builtin_ia32_cvtqq2ps512_mask:
15377 case X86::BI__builtin_ia32_cvtqq2pd512_mask:
15378 case X86::BI__builtin_ia32_vcvtw2ph512_mask:
15379 case X86::BI__builtin_ia32_vcvtdq2ph512_mask:
15380 case X86::BI__builtin_ia32_vcvtqq2ph512_mask:
15381 case X86::BI__builtin_ia32_vcvtdq2ph256_round_mask:
15382 case X86::BI__builtin_ia32_vcvtdq2ps256_round_mask:
15383 case X86::BI__builtin_ia32_vcvtqq2pd256_round_mask:
15384 case X86::BI__builtin_ia32_vcvtqq2ph256_round_mask:
15385 case X86::BI__builtin_ia32_vcvtqq2ps256_round_mask:
15386 case X86::BI__builtin_ia32_vcvtw2ph256_round_mask:
15388 case X86::BI__builtin_ia32_cvtudq2ps512_mask:
15389 case X86::BI__builtin_ia32_cvtuqq2ps512_mask:
15390 case X86::BI__builtin_ia32_cvtuqq2pd512_mask:
15391 case X86::BI__builtin_ia32_vcvtuw2ph512_mask:
15392 case X86::BI__builtin_ia32_vcvtudq2ph512_mask:
15393 case X86::BI__builtin_ia32_vcvtuqq2ph512_mask:
15394 case X86::BI__builtin_ia32_vcvtudq2ph256_round_mask:
15395 case X86::BI__builtin_ia32_vcvtudq2ps256_round_mask:
15396 case X86::BI__builtin_ia32_vcvtuqq2pd256_round_mask:
15397 case X86::BI__builtin_ia32_vcvtuqq2ph256_round_mask:
15398 case X86::BI__builtin_ia32_vcvtuqq2ps256_round_mask:
15399 case X86::BI__builtin_ia32_vcvtuw2ph256_round_mask:
15402 case X86::BI__builtin_ia32_vfmaddss3:
15403 case X86::BI__builtin_ia32_vfmaddsd3:
15404 case X86::BI__builtin_ia32_vfmaddsh3_mask:
15405 case X86::BI__builtin_ia32_vfmaddss3_mask:
15406 case X86::BI__builtin_ia32_vfmaddsd3_mask:
15408 case X86::BI__builtin_ia32_vfmaddss:
15409 case X86::BI__builtin_ia32_vfmaddsd:
15411 Constant::getNullValue(Ops[0]->getType()));
15412 case X86::BI__builtin_ia32_vfmaddsh3_maskz:
15413 case X86::BI__builtin_ia32_vfmaddss3_maskz:
15414 case X86::BI__builtin_ia32_vfmaddsd3_maskz:
15416 case X86::BI__builtin_ia32_vfmaddsh3_mask3:
15417 case X86::BI__builtin_ia32_vfmaddss3_mask3:
15418 case X86::BI__builtin_ia32_vfmaddsd3_mask3:
15420 case X86::BI__builtin_ia32_vfmsubsh3_mask3:
15421 case X86::BI__builtin_ia32_vfmsubss3_mask3:
15422 case X86::BI__builtin_ia32_vfmsubsd3_mask3:
15425 case X86::BI__builtin_ia32_vfmaddph:
15426 case X86::BI__builtin_ia32_vfmaddps:
15427 case X86::BI__builtin_ia32_vfmaddpd:
15428 case X86::BI__builtin_ia32_vfmaddph256:
15429 case X86::BI__builtin_ia32_vfmaddps256:
15430 case X86::BI__builtin_ia32_vfmaddpd256:
15431 case X86::BI__builtin_ia32_vfmaddph512_mask:
15432 case X86::BI__builtin_ia32_vfmaddph512_maskz:
15433 case X86::BI__builtin_ia32_vfmaddph512_mask3:
15434 case X86::BI__builtin_ia32_vfmaddnepbh128:
15435 case X86::BI__builtin_ia32_vfmaddnepbh256:
15436 case X86::BI__builtin_ia32_vfmaddnepbh512:
15437 case X86::BI__builtin_ia32_vfmaddps512_mask:
15438 case X86::BI__builtin_ia32_vfmaddps512_maskz:
15439 case X86::BI__builtin_ia32_vfmaddps512_mask3:
15440 case X86::BI__builtin_ia32_vfmsubps512_mask3:
15441 case X86::BI__builtin_ia32_vfmaddpd512_mask:
15442 case X86::BI__builtin_ia32_vfmaddpd512_maskz:
15443 case X86::BI__builtin_ia32_vfmaddpd512_mask3:
15444 case X86::BI__builtin_ia32_vfmsubpd512_mask3:
15445 case X86::BI__builtin_ia32_vfmsubph512_mask3:
15446 case X86::BI__builtin_ia32_vfmaddph256_round_mask:
15447 case X86::BI__builtin_ia32_vfmaddph256_round_maskz:
15448 case X86::BI__builtin_ia32_vfmaddph256_round_mask3:
15449 case X86::BI__builtin_ia32_vfmaddps256_round_mask:
15450 case X86::BI__builtin_ia32_vfmaddps256_round_maskz:
15451 case X86::BI__builtin_ia32_vfmaddps256_round_mask3:
15452 case X86::BI__builtin_ia32_vfmsubps256_round_mask3:
15453 case X86::BI__builtin_ia32_vfmaddpd256_round_mask:
15454 case X86::BI__builtin_ia32_vfmaddpd256_round_maskz:
15455 case X86::BI__builtin_ia32_vfmaddpd256_round_mask3:
15456 case X86::BI__builtin_ia32_vfmsubpd256_round_mask3:
15457 case X86::BI__builtin_ia32_vfmsubph256_round_mask3:
15459 case X86::BI__builtin_ia32_vfmaddsubph512_mask:
15460 case X86::BI__builtin_ia32_vfmaddsubph512_maskz:
15461 case X86::BI__builtin_ia32_vfmaddsubph512_mask3:
15462 case X86::BI__builtin_ia32_vfmsubaddph512_mask3:
15463 case X86::BI__builtin_ia32_vfmaddsubps512_mask:
15464 case X86::BI__builtin_ia32_vfmaddsubps512_maskz:
15465 case X86::BI__builtin_ia32_vfmaddsubps512_mask3:
15466 case X86::BI__builtin_ia32_vfmsubaddps512_mask3:
15467 case X86::BI__builtin_ia32_vfmaddsubpd512_mask:
15468 case X86::BI__builtin_ia32_vfmaddsubpd512_maskz:
15469 case X86::BI__builtin_ia32_vfmaddsubpd512_mask3:
15470 case X86::BI__builtin_ia32_vfmsubaddpd512_mask3:
15471 case X86::BI__builtin_ia32_vfmaddsubph256_round_mask:
15472 case X86::BI__builtin_ia32_vfmaddsubph256_round_maskz:
15473 case X86::BI__builtin_ia32_vfmaddsubph256_round_mask3:
15474 case X86::BI__builtin_ia32_vfmsubaddph256_round_mask3:
15475 case X86::BI__builtin_ia32_vfmaddsubps256_round_mask:
15476 case X86::BI__builtin_ia32_vfmaddsubps256_round_maskz:
15477 case X86::BI__builtin_ia32_vfmaddsubps256_round_mask3:
15478 case X86::BI__builtin_ia32_vfmsubaddps256_round_mask3:
15479 case X86::BI__builtin_ia32_vfmaddsubpd256_round_mask:
15480 case X86::BI__builtin_ia32_vfmaddsubpd256_round_maskz:
15481 case X86::BI__builtin_ia32_vfmaddsubpd256_round_mask3:
15482 case X86::BI__builtin_ia32_vfmsubaddpd256_round_mask3:
15485 case X86::BI__builtin_ia32_movdqa32store128_mask:
15486 case X86::BI__builtin_ia32_movdqa64store128_mask:
15487 case X86::BI__builtin_ia32_storeaps128_mask:
15488 case X86::BI__builtin_ia32_storeapd128_mask:
15489 case X86::BI__builtin_ia32_movdqa32store256_mask:
15490 case X86::BI__builtin_ia32_movdqa64store256_mask:
15491 case X86::BI__builtin_ia32_storeaps256_mask:
15492 case X86::BI__builtin_ia32_storeapd256_mask:
15493 case X86::BI__builtin_ia32_movdqa32store512_mask:
15494 case X86::BI__builtin_ia32_movdqa64store512_mask:
15495 case X86::BI__builtin_ia32_storeaps512_mask:
15496 case X86::BI__builtin_ia32_storeapd512_mask:
15501 case X86::BI__builtin_ia32_loadups128_mask:
15502 case X86::BI__builtin_ia32_loadups256_mask:
15503 case X86::BI__builtin_ia32_loadups512_mask:
15504 case X86::BI__builtin_ia32_loadupd128_mask:
15505 case X86::BI__builtin_ia32_loadupd256_mask:
15506 case X86::BI__builtin_ia32_loadupd512_mask:
15507 case X86::BI__builtin_ia32_loaddquqi128_mask:
15508 case X86::BI__builtin_ia32_loaddquqi256_mask:
15509 case X86::BI__builtin_ia32_loaddquqi512_mask:
15510 case X86::BI__builtin_ia32_loaddquhi128_mask:
15511 case X86::BI__builtin_ia32_loaddquhi256_mask:
15512 case X86::BI__builtin_ia32_loaddquhi512_mask:
15513 case X86::BI__builtin_ia32_loaddqusi128_mask:
15514 case X86::BI__builtin_ia32_loaddqusi256_mask:
15515 case X86::BI__builtin_ia32_loaddqusi512_mask:
15516 case X86::BI__builtin_ia32_loaddqudi128_mask:
15517 case X86::BI__builtin_ia32_loaddqudi256_mask:
15518 case X86::BI__builtin_ia32_loaddqudi512_mask:
15521 case X86::BI__builtin_ia32_loadsbf16128_mask:
15522 case X86::BI__builtin_ia32_loadsh128_mask:
15523 case X86::BI__builtin_ia32_loadss128_mask:
15524 case X86::BI__builtin_ia32_loadsd128_mask:
15527 case X86::BI__builtin_ia32_loadaps128_mask:
15528 case X86::BI__builtin_ia32_loadaps256_mask:
15529 case X86::BI__builtin_ia32_loadaps512_mask:
15530 case X86::BI__builtin_ia32_loadapd128_mask:
15531 case X86::BI__builtin_ia32_loadapd256_mask:
15532 case X86::BI__builtin_ia32_loadapd512_mask:
15533 case X86::BI__builtin_ia32_movdqa32load128_mask:
15534 case X86::BI__builtin_ia32_movdqa32load256_mask:
15535 case X86::BI__builtin_ia32_movdqa32load512_mask:
15536 case X86::BI__builtin_ia32_movdqa64load128_mask:
15537 case X86::BI__builtin_ia32_movdqa64load256_mask:
15538 case X86::BI__builtin_ia32_movdqa64load512_mask:
15543 case X86::BI__builtin_ia32_expandloaddf128_mask:
15544 case X86::BI__builtin_ia32_expandloaddf256_mask:
15545 case X86::BI__builtin_ia32_expandloaddf512_mask:
15546 case X86::BI__builtin_ia32_expandloadsf128_mask:
15547 case X86::BI__builtin_ia32_expandloadsf256_mask:
15548 case X86::BI__builtin_ia32_expandloadsf512_mask:
15549 case X86::BI__builtin_ia32_expandloaddi128_mask:
15550 case X86::BI__builtin_ia32_expandloaddi256_mask:
15551 case X86::BI__builtin_ia32_expandloaddi512_mask:
15552 case X86::BI__builtin_ia32_expandloadsi128_mask:
15553 case X86::BI__builtin_ia32_expandloadsi256_mask:
15554 case X86::BI__builtin_ia32_expandloadsi512_mask:
15555 case X86::BI__builtin_ia32_expandloadhi128_mask:
15556 case X86::BI__builtin_ia32_expandloadhi256_mask:
15557 case X86::BI__builtin_ia32_expandloadhi512_mask:
15558 case X86::BI__builtin_ia32_expandloadqi128_mask:
15559 case X86::BI__builtin_ia32_expandloadqi256_mask:
15560 case X86::BI__builtin_ia32_expandloadqi512_mask:
15563 case X86::BI__builtin_ia32_compressstoredf128_mask:
15564 case X86::BI__builtin_ia32_compressstoredf256_mask:
15565 case X86::BI__builtin_ia32_compressstoredf512_mask:
15566 case X86::BI__builtin_ia32_compressstoresf128_mask:
15567 case X86::BI__builtin_ia32_compressstoresf256_mask:
15568 case X86::BI__builtin_ia32_compressstoresf512_mask:
15569 case X86::BI__builtin_ia32_compressstoredi128_mask:
15570 case X86::BI__builtin_ia32_compressstoredi256_mask:
15571 case X86::BI__builtin_ia32_compressstoredi512_mask:
15572 case X86::BI__builtin_ia32_compressstoresi128_mask:
15573 case X86::BI__builtin_ia32_compressstoresi256_mask:
15574 case X86::BI__builtin_ia32_compressstoresi512_mask:
15575 case X86::BI__builtin_ia32_compressstorehi128_mask:
15576 case X86::BI__builtin_ia32_compressstorehi256_mask:
15577 case X86::BI__builtin_ia32_compressstorehi512_mask:
15578 case X86::BI__builtin_ia32_compressstoreqi128_mask:
15579 case X86::BI__builtin_ia32_compressstoreqi256_mask:
15580 case X86::BI__builtin_ia32_compressstoreqi512_mask:
15583 case X86::BI__builtin_ia32_expanddf128_mask:
15584 case X86::BI__builtin_ia32_expanddf256_mask:
15585 case X86::BI__builtin_ia32_expanddf512_mask:
15586 case X86::BI__builtin_ia32_expandsf128_mask:
15587 case X86::BI__builtin_ia32_expandsf256_mask:
15588 case X86::BI__builtin_ia32_expandsf512_mask:
15589 case X86::BI__builtin_ia32_expanddi128_mask:
15590 case X86::BI__builtin_ia32_expanddi256_mask:
15591 case X86::BI__builtin_ia32_expanddi512_mask:
15592 case X86::BI__builtin_ia32_expandsi128_mask:
15593 case X86::BI__builtin_ia32_expandsi256_mask:
15594 case X86::BI__builtin_ia32_expandsi512_mask:
15595 case X86::BI__builtin_ia32_expandhi128_mask:
15596 case X86::BI__builtin_ia32_expandhi256_mask:
15597 case X86::BI__builtin_ia32_expandhi512_mask:
15598 case X86::BI__builtin_ia32_expandqi128_mask:
15599 case X86::BI__builtin_ia32_expandqi256_mask:
15600 case X86::BI__builtin_ia32_expandqi512_mask:
15603 case X86::BI__builtin_ia32_compressdf128_mask:
15604 case X86::BI__builtin_ia32_compressdf256_mask:
15605 case X86::BI__builtin_ia32_compressdf512_mask:
15606 case X86::BI__builtin_ia32_compresssf128_mask:
15607 case X86::BI__builtin_ia32_compresssf256_mask:
15608 case X86::BI__builtin_ia32_compresssf512_mask:
15609 case X86::BI__builtin_ia32_compressdi128_mask:
15610 case X86::BI__builtin_ia32_compressdi256_mask:
15611 case X86::BI__builtin_ia32_compressdi512_mask:
15612 case X86::BI__builtin_ia32_compresssi128_mask:
15613 case X86::BI__builtin_ia32_compresssi256_mask:
15614 case X86::BI__builtin_ia32_compresssi512_mask:
15615 case X86::BI__builtin_ia32_compresshi128_mask:
15616 case X86::BI__builtin_ia32_compresshi256_mask:
15617 case X86::BI__builtin_ia32_compresshi512_mask:
15618 case X86::BI__builtin_ia32_compressqi128_mask:
15619 case X86::BI__builtin_ia32_compressqi256_mask:
15620 case X86::BI__builtin_ia32_compressqi512_mask:
15623 case X86::BI__builtin_ia32_gather3div2df:
15624 case X86::BI__builtin_ia32_gather3div2di:
15625 case X86::BI__builtin_ia32_gather3div4df:
15626 case X86::BI__builtin_ia32_gather3div4di:
15627 case X86::BI__builtin_ia32_gather3div4sf:
15628 case X86::BI__builtin_ia32_gather3div4si:
15629 case X86::BI__builtin_ia32_gather3div8sf:
15630 case X86::BI__builtin_ia32_gather3div8si:
15631 case X86::BI__builtin_ia32_gather3siv2df:
15632 case X86::BI__builtin_ia32_gather3siv2di:
15633 case X86::BI__builtin_ia32_gather3siv4df:
15634 case X86::BI__builtin_ia32_gather3siv4di:
15635 case X86::BI__builtin_ia32_gather3siv4sf:
15636 case X86::BI__builtin_ia32_gather3siv4si:
15637 case X86::BI__builtin_ia32_gather3siv8sf:
15638 case X86::BI__builtin_ia32_gather3siv8si:
15639 case X86::BI__builtin_ia32_gathersiv8df:
15640 case X86::BI__builtin_ia32_gathersiv16sf:
15641 case X86::BI__builtin_ia32_gatherdiv8df:
15642 case X86::BI__builtin_ia32_gatherdiv16sf:
15643 case X86::BI__builtin_ia32_gathersiv8di:
15644 case X86::BI__builtin_ia32_gathersiv16si:
15645 case X86::BI__builtin_ia32_gatherdiv8di:
15646 case X86::BI__builtin_ia32_gatherdiv16si: {
15648 switch (BuiltinID) {
15649 default: llvm_unreachable(
"Unexpected builtin");
15650 case X86::BI__builtin_ia32_gather3div2df:
15651 IID = Intrinsic::x86_avx512_mask_gather3div2_df;
15653 case X86::BI__builtin_ia32_gather3div2di:
15654 IID = Intrinsic::x86_avx512_mask_gather3div2_di;
15656 case X86::BI__builtin_ia32_gather3div4df:
15657 IID = Intrinsic::x86_avx512_mask_gather3div4_df;
15659 case X86::BI__builtin_ia32_gather3div4di:
15660 IID = Intrinsic::x86_avx512_mask_gather3div4_di;
15662 case X86::BI__builtin_ia32_gather3div4sf:
15663 IID = Intrinsic::x86_avx512_mask_gather3div4_sf;
15665 case X86::BI__builtin_ia32_gather3div4si:
15666 IID = Intrinsic::x86_avx512_mask_gather3div4_si;
15668 case X86::BI__builtin_ia32_gather3div8sf:
15669 IID = Intrinsic::x86_avx512_mask_gather3div8_sf;
15671 case X86::BI__builtin_ia32_gather3div8si:
15672 IID = Intrinsic::x86_avx512_mask_gather3div8_si;
15674 case X86::BI__builtin_ia32_gather3siv2df:
15675 IID = Intrinsic::x86_avx512_mask_gather3siv2_df;
15677 case X86::BI__builtin_ia32_gather3siv2di:
15678 IID = Intrinsic::x86_avx512_mask_gather3siv2_di;
15680 case X86::BI__builtin_ia32_gather3siv4df:
15681 IID = Intrinsic::x86_avx512_mask_gather3siv4_df;
15683 case X86::BI__builtin_ia32_gather3siv4di:
15684 IID = Intrinsic::x86_avx512_mask_gather3siv4_di;
15686 case X86::BI__builtin_ia32_gather3siv4sf:
15687 IID = Intrinsic::x86_avx512_mask_gather3siv4_sf;
15689 case X86::BI__builtin_ia32_gather3siv4si:
15690 IID = Intrinsic::x86_avx512_mask_gather3siv4_si;
15692 case X86::BI__builtin_ia32_gather3siv8sf:
15693 IID = Intrinsic::x86_avx512_mask_gather3siv8_sf;
15695 case X86::BI__builtin_ia32_gather3siv8si:
15696 IID = Intrinsic::x86_avx512_mask_gather3siv8_si;
15698 case X86::BI__builtin_ia32_gathersiv8df:
15699 IID = Intrinsic::x86_avx512_mask_gather_dpd_512;
15701 case X86::BI__builtin_ia32_gathersiv16sf:
15702 IID = Intrinsic::x86_avx512_mask_gather_dps_512;
15704 case X86::BI__builtin_ia32_gatherdiv8df:
15705 IID = Intrinsic::x86_avx512_mask_gather_qpd_512;
15707 case X86::BI__builtin_ia32_gatherdiv16sf:
15708 IID = Intrinsic::x86_avx512_mask_gather_qps_512;
15710 case X86::BI__builtin_ia32_gathersiv8di:
15711 IID = Intrinsic::x86_avx512_mask_gather_dpq_512;
15713 case X86::BI__builtin_ia32_gathersiv16si:
15714 IID = Intrinsic::x86_avx512_mask_gather_dpi_512;
15716 case X86::BI__builtin_ia32_gatherdiv8di:
15717 IID = Intrinsic::x86_avx512_mask_gather_qpq_512;
15719 case X86::BI__builtin_ia32_gatherdiv16si:
15720 IID = Intrinsic::x86_avx512_mask_gather_qpi_512;
15724 unsigned MinElts = std::min(
15725 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements(),
15726 cast<llvm::FixedVectorType>(Ops[2]->getType())->getNumElements());
15729 return Builder.CreateCall(Intr, Ops);
15732 case X86::BI__builtin_ia32_scattersiv8df:
15733 case X86::BI__builtin_ia32_scattersiv16sf:
15734 case X86::BI__builtin_ia32_scatterdiv8df:
15735 case X86::BI__builtin_ia32_scatterdiv16sf:
15736 case X86::BI__builtin_ia32_scattersiv8di:
15737 case X86::BI__builtin_ia32_scattersiv16si:
15738 case X86::BI__builtin_ia32_scatterdiv8di:
15739 case X86::BI__builtin_ia32_scatterdiv16si:
15740 case X86::BI__builtin_ia32_scatterdiv2df:
15741 case X86::BI__builtin_ia32_scatterdiv2di:
15742 case X86::BI__builtin_ia32_scatterdiv4df:
15743 case X86::BI__builtin_ia32_scatterdiv4di:
15744 case X86::BI__builtin_ia32_scatterdiv4sf:
15745 case X86::BI__builtin_ia32_scatterdiv4si:
15746 case X86::BI__builtin_ia32_scatterdiv8sf:
15747 case X86::BI__builtin_ia32_scatterdiv8si:
15748 case X86::BI__builtin_ia32_scattersiv2df:
15749 case X86::BI__builtin_ia32_scattersiv2di:
15750 case X86::BI__builtin_ia32_scattersiv4df:
15751 case X86::BI__builtin_ia32_scattersiv4di:
15752 case X86::BI__builtin_ia32_scattersiv4sf:
15753 case X86::BI__builtin_ia32_scattersiv4si:
15754 case X86::BI__builtin_ia32_scattersiv8sf:
15755 case X86::BI__builtin_ia32_scattersiv8si: {
15757 switch (BuiltinID) {
15758 default: llvm_unreachable(
"Unexpected builtin");
15759 case X86::BI__builtin_ia32_scattersiv8df:
15760 IID = Intrinsic::x86_avx512_mask_scatter_dpd_512;
15762 case X86::BI__builtin_ia32_scattersiv16sf:
15763 IID = Intrinsic::x86_avx512_mask_scatter_dps_512;
15765 case X86::BI__builtin_ia32_scatterdiv8df:
15766 IID = Intrinsic::x86_avx512_mask_scatter_qpd_512;
15768 case X86::BI__builtin_ia32_scatterdiv16sf:
15769 IID = Intrinsic::x86_avx512_mask_scatter_qps_512;
15771 case X86::BI__builtin_ia32_scattersiv8di:
15772 IID = Intrinsic::x86_avx512_mask_scatter_dpq_512;
15774 case X86::BI__builtin_ia32_scattersiv16si:
15775 IID = Intrinsic::x86_avx512_mask_scatter_dpi_512;
15777 case X86::BI__builtin_ia32_scatterdiv8di:
15778 IID = Intrinsic::x86_avx512_mask_scatter_qpq_512;
15780 case X86::BI__builtin_ia32_scatterdiv16si:
15781 IID = Intrinsic::x86_avx512_mask_scatter_qpi_512;
15783 case X86::BI__builtin_ia32_scatterdiv2df:
15784 IID = Intrinsic::x86_avx512_mask_scatterdiv2_df;
15786 case X86::BI__builtin_ia32_scatterdiv2di:
15787 IID = Intrinsic::x86_avx512_mask_scatterdiv2_di;
15789 case X86::BI__builtin_ia32_scatterdiv4df:
15790 IID = Intrinsic::x86_avx512_mask_scatterdiv4_df;
15792 case X86::BI__builtin_ia32_scatterdiv4di:
15793 IID = Intrinsic::x86_avx512_mask_scatterdiv4_di;
15795 case X86::BI__builtin_ia32_scatterdiv4sf:
15796 IID = Intrinsic::x86_avx512_mask_scatterdiv4_sf;
15798 case X86::BI__builtin_ia32_scatterdiv4si:
15799 IID = Intrinsic::x86_avx512_mask_scatterdiv4_si;
15801 case X86::BI__builtin_ia32_scatterdiv8sf:
15802 IID = Intrinsic::x86_avx512_mask_scatterdiv8_sf;
15804 case X86::BI__builtin_ia32_scatterdiv8si:
15805 IID = Intrinsic::x86_avx512_mask_scatterdiv8_si;
15807 case X86::BI__builtin_ia32_scattersiv2df:
15808 IID = Intrinsic::x86_avx512_mask_scattersiv2_df;
15810 case X86::BI__builtin_ia32_scattersiv2di:
15811 IID = Intrinsic::x86_avx512_mask_scattersiv2_di;
15813 case X86::BI__builtin_ia32_scattersiv4df:
15814 IID = Intrinsic::x86_avx512_mask_scattersiv4_df;
15816 case X86::BI__builtin_ia32_scattersiv4di:
15817 IID = Intrinsic::x86_avx512_mask_scattersiv4_di;
15819 case X86::BI__builtin_ia32_scattersiv4sf:
15820 IID = Intrinsic::x86_avx512_mask_scattersiv4_sf;
15822 case X86::BI__builtin_ia32_scattersiv4si:
15823 IID = Intrinsic::x86_avx512_mask_scattersiv4_si;
15825 case X86::BI__builtin_ia32_scattersiv8sf:
15826 IID = Intrinsic::x86_avx512_mask_scattersiv8_sf;
15828 case X86::BI__builtin_ia32_scattersiv8si:
15829 IID = Intrinsic::x86_avx512_mask_scattersiv8_si;
15833 unsigned MinElts = std::min(
15834 cast<llvm::FixedVectorType>(Ops[2]->getType())->getNumElements(),
15835 cast<llvm::FixedVectorType>(Ops[3]->getType())->getNumElements());
15838 return Builder.CreateCall(Intr, Ops);
15841 case X86::BI__builtin_ia32_vextractf128_pd256:
15842 case X86::BI__builtin_ia32_vextractf128_ps256:
15843 case X86::BI__builtin_ia32_vextractf128_si256:
15844 case X86::BI__builtin_ia32_extract128i256:
15845 case X86::BI__builtin_ia32_extractf64x4_mask:
15846 case X86::BI__builtin_ia32_extractf32x4_mask:
15847 case X86::BI__builtin_ia32_extracti64x4_mask:
15848 case X86::BI__builtin_ia32_extracti32x4_mask:
15849 case X86::BI__builtin_ia32_extractf32x8_mask:
15850 case X86::BI__builtin_ia32_extracti32x8_mask:
15851 case X86::BI__builtin_ia32_extractf32x4_256_mask:
15852 case X86::BI__builtin_ia32_extracti32x4_256_mask:
15853 case X86::BI__builtin_ia32_extractf64x2_256_mask:
15854 case X86::BI__builtin_ia32_extracti64x2_256_mask:
15855 case X86::BI__builtin_ia32_extractf64x2_512_mask:
15856 case X86::BI__builtin_ia32_extracti64x2_512_mask: {
15858 unsigned NumElts = DstTy->getNumElements();
15859 unsigned SrcNumElts =
15860 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
15861 unsigned SubVectors = SrcNumElts / NumElts;
15862 unsigned Index = cast<ConstantInt>(Ops[1])->getZExtValue();
15863 assert(llvm::isPowerOf2_32(SubVectors) &&
"Expected power of 2 subvectors");
15864 Index &= SubVectors - 1;
15868 for (
unsigned i = 0; i != NumElts; ++i)
15869 Indices[i] = i + Index;
15874 if (Ops.size() == 4)
15879 case X86::BI__builtin_ia32_vinsertf128_pd256:
15880 case X86::BI__builtin_ia32_vinsertf128_ps256:
15881 case X86::BI__builtin_ia32_vinsertf128_si256:
15882 case X86::BI__builtin_ia32_insert128i256:
15883 case X86::BI__builtin_ia32_insertf64x4:
15884 case X86::BI__builtin_ia32_insertf32x4:
15885 case X86::BI__builtin_ia32_inserti64x4:
15886 case X86::BI__builtin_ia32_inserti32x4:
15887 case X86::BI__builtin_ia32_insertf32x8:
15888 case X86::BI__builtin_ia32_inserti32x8:
15889 case X86::BI__builtin_ia32_insertf32x4_256:
15890 case X86::BI__builtin_ia32_inserti32x4_256:
15891 case X86::BI__builtin_ia32_insertf64x2_256:
15892 case X86::BI__builtin_ia32_inserti64x2_256:
15893 case X86::BI__builtin_ia32_insertf64x2_512:
15894 case X86::BI__builtin_ia32_inserti64x2_512: {
15895 unsigned DstNumElts =
15896 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
15897 unsigned SrcNumElts =
15898 cast<llvm::FixedVectorType>(Ops[1]->getType())->getNumElements();
15899 unsigned SubVectors = DstNumElts / SrcNumElts;
15900 unsigned Index = cast<ConstantInt>(Ops[2])->getZExtValue();
15901 assert(llvm::isPowerOf2_32(SubVectors) &&
"Expected power of 2 subvectors");
15902 Index &= SubVectors - 1;
15903 Index *= SrcNumElts;
15906 for (
unsigned i = 0; i != DstNumElts; ++i)
15907 Indices[i] = (i >= SrcNumElts) ? SrcNumElts + (i % SrcNumElts) : i;
15910 Ops[1],
ArrayRef(Indices, DstNumElts),
"widen");
15912 for (
unsigned i = 0; i != DstNumElts; ++i) {
15913 if (i >= Index && i < (Index + SrcNumElts))
15914 Indices[i] = (i - Index) + DstNumElts;
15919 return Builder.CreateShuffleVector(Ops[0], Op1,
15920 ArrayRef(Indices, DstNumElts),
"insert");
15922 case X86::BI__builtin_ia32_pmovqd512_mask:
15923 case X86::BI__builtin_ia32_pmovwb512_mask: {
15924 Value *Res =
Builder.CreateTrunc(Ops[0], Ops[1]->getType());
15927 case X86::BI__builtin_ia32_pmovdb512_mask:
15928 case X86::BI__builtin_ia32_pmovdw512_mask:
15929 case X86::BI__builtin_ia32_pmovqw512_mask: {
15930 if (
const auto *
C = dyn_cast<Constant>(Ops[2]))
15931 if (
C->isAllOnesValue())
15932 return Builder.CreateTrunc(Ops[0], Ops[1]->getType());
15935 switch (BuiltinID) {
15936 default: llvm_unreachable(
"Unsupported intrinsic!");
15937 case X86::BI__builtin_ia32_pmovdb512_mask:
15938 IID = Intrinsic::x86_avx512_mask_pmov_db_512;
15940 case X86::BI__builtin_ia32_pmovdw512_mask:
15941 IID = Intrinsic::x86_avx512_mask_pmov_dw_512;
15943 case X86::BI__builtin_ia32_pmovqw512_mask:
15944 IID = Intrinsic::x86_avx512_mask_pmov_qw_512;
15949 return Builder.CreateCall(Intr, Ops);
15951 case X86::BI__builtin_ia32_pblendw128:
15952 case X86::BI__builtin_ia32_blendpd:
15953 case X86::BI__builtin_ia32_blendps:
15954 case X86::BI__builtin_ia32_blendpd256:
15955 case X86::BI__builtin_ia32_blendps256:
15956 case X86::BI__builtin_ia32_pblendw256:
15957 case X86::BI__builtin_ia32_pblendd128:
15958 case X86::BI__builtin_ia32_pblendd256: {
15960 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
15961 unsigned Imm = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
15966 for (
unsigned i = 0; i != NumElts; ++i)
15967 Indices[i] = ((Imm >> (i % 8)) & 0x1) ? NumElts + i : i;
15969 return Builder.CreateShuffleVector(Ops[0], Ops[1],
15970 ArrayRef(Indices, NumElts),
"blend");
15972 case X86::BI__builtin_ia32_pshuflw:
15973 case X86::BI__builtin_ia32_pshuflw256:
15974 case X86::BI__builtin_ia32_pshuflw512: {
15975 uint32_t Imm = cast<llvm::ConstantInt>(Ops[1])->getZExtValue();
15976 auto *Ty = cast<llvm::FixedVectorType>(Ops[0]->getType());
15977 unsigned NumElts = Ty->getNumElements();
15980 Imm = (Imm & 0xff) * 0x01010101;
15983 for (
unsigned l = 0; l != NumElts; l += 8) {
15984 for (
unsigned i = 0; i != 4; ++i) {
15985 Indices[l + i] = l + (Imm & 3);
15988 for (
unsigned i = 4; i != 8; ++i)
15989 Indices[l + i] = l + i;
15992 return Builder.CreateShuffleVector(Ops[0],
ArrayRef(Indices, NumElts),
15995 case X86::BI__builtin_ia32_pshufhw:
15996 case X86::BI__builtin_ia32_pshufhw256:
15997 case X86::BI__builtin_ia32_pshufhw512: {
15998 uint32_t Imm = cast<llvm::ConstantInt>(Ops[1])->getZExtValue();
15999 auto *Ty = cast<llvm::FixedVectorType>(Ops[0]->getType());
16000 unsigned NumElts = Ty->getNumElements();
16003 Imm = (Imm & 0xff) * 0x01010101;
16006 for (
unsigned l = 0; l != NumElts; l += 8) {
16007 for (
unsigned i = 0; i != 4; ++i)
16008 Indices[l + i] = l + i;
16009 for (
unsigned i = 4; i != 8; ++i) {
16010 Indices[l + i] = l + 4 + (Imm & 3);
16015 return Builder.CreateShuffleVector(Ops[0],
ArrayRef(Indices, NumElts),
16018 case X86::BI__builtin_ia32_pshufd:
16019 case X86::BI__builtin_ia32_pshufd256:
16020 case X86::BI__builtin_ia32_pshufd512:
16021 case X86::BI__builtin_ia32_vpermilpd:
16022 case X86::BI__builtin_ia32_vpermilps:
16023 case X86::BI__builtin_ia32_vpermilpd256:
16024 case X86::BI__builtin_ia32_vpermilps256:
16025 case X86::BI__builtin_ia32_vpermilpd512:
16026 case X86::BI__builtin_ia32_vpermilps512: {
16027 uint32_t Imm = cast<llvm::ConstantInt>(Ops[1])->getZExtValue();
16028 auto *Ty = cast<llvm::FixedVectorType>(Ops[0]->getType());
16029 unsigned NumElts = Ty->getNumElements();
16030 unsigned NumLanes = Ty->getPrimitiveSizeInBits() / 128;
16031 unsigned NumLaneElts = NumElts / NumLanes;
16034 Imm = (Imm & 0xff) * 0x01010101;
16037 for (
unsigned l = 0; l != NumElts; l += NumLaneElts) {
16038 for (
unsigned i = 0; i != NumLaneElts; ++i) {
16039 Indices[i + l] = (Imm % NumLaneElts) + l;
16040 Imm /= NumLaneElts;
16044 return Builder.CreateShuffleVector(Ops[0],
ArrayRef(Indices, NumElts),
16047 case X86::BI__builtin_ia32_shufpd:
16048 case X86::BI__builtin_ia32_shufpd256:
16049 case X86::BI__builtin_ia32_shufpd512:
16050 case X86::BI__builtin_ia32_shufps:
16051 case X86::BI__builtin_ia32_shufps256:
16052 case X86::BI__builtin_ia32_shufps512: {
16053 uint32_t Imm = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
16054 auto *Ty = cast<llvm::FixedVectorType>(Ops[0]->getType());
16055 unsigned NumElts = Ty->getNumElements();
16056 unsigned NumLanes = Ty->getPrimitiveSizeInBits() / 128;
16057 unsigned NumLaneElts = NumElts / NumLanes;
16060 Imm = (Imm & 0xff) * 0x01010101;
16063 for (
unsigned l = 0; l != NumElts; l += NumLaneElts) {
16064 for (
unsigned i = 0; i != NumLaneElts; ++i) {
16065 unsigned Index = Imm % NumLaneElts;
16066 Imm /= NumLaneElts;
16067 if (i >= (NumLaneElts / 2))
16069 Indices[l + i] = l + Index;
16073 return Builder.CreateShuffleVector(Ops[0], Ops[1],
16074 ArrayRef(Indices, NumElts),
"shufp");
16076 case X86::BI__builtin_ia32_permdi256:
16077 case X86::BI__builtin_ia32_permdf256:
16078 case X86::BI__builtin_ia32_permdi512:
16079 case X86::BI__builtin_ia32_permdf512: {
16080 unsigned Imm = cast<llvm::ConstantInt>(Ops[1])->getZExtValue();
16081 auto *Ty = cast<llvm::FixedVectorType>(Ops[0]->getType());
16082 unsigned NumElts = Ty->getNumElements();
16086 for (
unsigned l = 0; l != NumElts; l += 4)
16087 for (
unsigned i = 0; i != 4; ++i)
16088 Indices[l + i] = l + ((Imm >> (2 * i)) & 0x3);
16090 return Builder.CreateShuffleVector(Ops[0],
ArrayRef(Indices, NumElts),
16093 case X86::BI__builtin_ia32_palignr128:
16094 case X86::BI__builtin_ia32_palignr256:
16095 case X86::BI__builtin_ia32_palignr512: {
16096 unsigned ShiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0xff;
16099 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
16100 assert(NumElts % 16 == 0);
16104 if (ShiftVal >= 32)
16109 if (ShiftVal > 16) {
16112 Ops[0] = llvm::Constant::getNullValue(Ops[0]->getType());
16117 for (
unsigned l = 0; l != NumElts; l += 16) {
16118 for (
unsigned i = 0; i != 16; ++i) {
16119 unsigned Idx = ShiftVal + i;
16121 Idx += NumElts - 16;
16122 Indices[l + i] = Idx + l;
16126 return Builder.CreateShuffleVector(Ops[1], Ops[0],
16127 ArrayRef(Indices, NumElts),
"palignr");
16129 case X86::BI__builtin_ia32_alignd128:
16130 case X86::BI__builtin_ia32_alignd256:
16131 case X86::BI__builtin_ia32_alignd512:
16132 case X86::BI__builtin_ia32_alignq128:
16133 case X86::BI__builtin_ia32_alignq256:
16134 case X86::BI__builtin_ia32_alignq512: {
16136 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
16137 unsigned ShiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0xff;
16140 ShiftVal &= NumElts - 1;
16143 for (
unsigned i = 0; i != NumElts; ++i)
16144 Indices[i] = i + ShiftVal;
16146 return Builder.CreateShuffleVector(Ops[1], Ops[0],
16147 ArrayRef(Indices, NumElts),
"valign");
16149 case X86::BI__builtin_ia32_shuf_f32x4_256:
16150 case X86::BI__builtin_ia32_shuf_f64x2_256:
16151 case X86::BI__builtin_ia32_shuf_i32x4_256:
16152 case X86::BI__builtin_ia32_shuf_i64x2_256:
16153 case X86::BI__builtin_ia32_shuf_f32x4:
16154 case X86::BI__builtin_ia32_shuf_f64x2:
16155 case X86::BI__builtin_ia32_shuf_i32x4:
16156 case X86::BI__builtin_ia32_shuf_i64x2: {
16157 unsigned Imm = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
16158 auto *Ty = cast<llvm::FixedVectorType>(Ops[0]->getType());
16159 unsigned NumElts = Ty->getNumElements();
16160 unsigned NumLanes = Ty->getPrimitiveSizeInBits() == 512 ? 4 : 2;
16161 unsigned NumLaneElts = NumElts / NumLanes;
16164 for (
unsigned l = 0; l != NumElts; l += NumLaneElts) {
16165 unsigned Index = (Imm % NumLanes) * NumLaneElts;
16167 if (l >= (NumElts / 2))
16169 for (
unsigned i = 0; i != NumLaneElts; ++i) {
16170 Indices[l + i] = Index + i;
16174 return Builder.CreateShuffleVector(Ops[0], Ops[1],
16175 ArrayRef(Indices, NumElts),
"shuf");
16178 case X86::BI__builtin_ia32_vperm2f128_pd256:
16179 case X86::BI__builtin_ia32_vperm2f128_ps256:
16180 case X86::BI__builtin_ia32_vperm2f128_si256:
16181 case X86::BI__builtin_ia32_permti256: {
16182 unsigned Imm = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
16184 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
16193 for (
unsigned l = 0; l != 2; ++l) {
16195 if (Imm & (1 << ((l * 4) + 3)))
16196 OutOps[l] = llvm::ConstantAggregateZero::get(Ops[0]->getType());
16197 else if (Imm & (1 << ((l * 4) + 1)))
16198 OutOps[l] = Ops[1];
16200 OutOps[l] = Ops[0];
16202 for (
unsigned i = 0; i != NumElts/2; ++i) {
16204 unsigned Idx = (l * NumElts) + i;
16207 if (Imm & (1 << (l * 4)))
16209 Indices[(l * (NumElts/2)) + i] = Idx;
16213 return Builder.CreateShuffleVector(OutOps[0], OutOps[1],
16214 ArrayRef(Indices, NumElts),
"vperm");
16217 case X86::BI__builtin_ia32_pslldqi128_byteshift:
16218 case X86::BI__builtin_ia32_pslldqi256_byteshift:
16219 case X86::BI__builtin_ia32_pslldqi512_byteshift: {
16220 unsigned ShiftVal = cast<llvm::ConstantInt>(Ops[1])->getZExtValue() & 0xff;
16221 auto *ResultType = cast<llvm::FixedVectorType>(Ops[0]->getType());
16223 unsigned NumElts = ResultType->getNumElements() * 8;
16226 if (ShiftVal >= 16)
16227 return llvm::Constant::getNullValue(ResultType);
16231 for (
unsigned l = 0; l != NumElts; l += 16) {
16232 for (
unsigned i = 0; i != 16; ++i) {
16233 unsigned Idx = NumElts + i - ShiftVal;
16234 if (Idx < NumElts) Idx -= NumElts - 16;
16235 Indices[l + i] = Idx + l;
16239 auto *VecTy = llvm::FixedVectorType::get(
Int8Ty, NumElts);
16241 Value *
Zero = llvm::Constant::getNullValue(VecTy);
16243 Zero, Cast,
ArrayRef(Indices, NumElts),
"pslldq");
16244 return Builder.CreateBitCast(SV, Ops[0]->getType(),
"cast");
16246 case X86::BI__builtin_ia32_psrldqi128_byteshift:
16247 case X86::BI__builtin_ia32_psrldqi256_byteshift:
16248 case X86::BI__builtin_ia32_psrldqi512_byteshift: {
16249 unsigned ShiftVal = cast<llvm::ConstantInt>(Ops[1])->getZExtValue() & 0xff;
16250 auto *ResultType = cast<llvm::FixedVectorType>(Ops[0]->getType());
16252 unsigned NumElts = ResultType->getNumElements() * 8;
16255 if (ShiftVal >= 16)
16256 return llvm::Constant::getNullValue(ResultType);
16260 for (
unsigned l = 0; l != NumElts; l += 16) {
16261 for (
unsigned i = 0; i != 16; ++i) {
16262 unsigned Idx = i + ShiftVal;
16263 if (Idx >= 16) Idx += NumElts - 16;
16264 Indices[l + i] = Idx + l;
16268 auto *VecTy = llvm::FixedVectorType::get(
Int8Ty, NumElts);
16270 Value *
Zero = llvm::Constant::getNullValue(VecTy);
16272 Cast, Zero,
ArrayRef(Indices, NumElts),
"psrldq");
16273 return Builder.CreateBitCast(SV, ResultType,
"cast");
16275 case X86::BI__builtin_ia32_kshiftliqi:
16276 case X86::BI__builtin_ia32_kshiftlihi:
16277 case X86::BI__builtin_ia32_kshiftlisi:
16278 case X86::BI__builtin_ia32_kshiftlidi: {
16279 unsigned ShiftVal = cast<llvm::ConstantInt>(Ops[1])->getZExtValue() & 0xff;
16280 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
16282 if (ShiftVal >= NumElts)
16283 return llvm::Constant::getNullValue(Ops[0]->getType());
16288 for (
unsigned i = 0; i != NumElts; ++i)
16289 Indices[i] = NumElts + i - ShiftVal;
16291 Value *
Zero = llvm::Constant::getNullValue(
In->getType());
16293 Zero, In,
ArrayRef(Indices, NumElts),
"kshiftl");
16294 return Builder.CreateBitCast(SV, Ops[0]->getType());
16296 case X86::BI__builtin_ia32_kshiftriqi:
16297 case X86::BI__builtin_ia32_kshiftrihi:
16298 case X86::BI__builtin_ia32_kshiftrisi:
16299 case X86::BI__builtin_ia32_kshiftridi: {
16300 unsigned ShiftVal = cast<llvm::ConstantInt>(Ops[1])->getZExtValue() & 0xff;
16301 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
16303 if (ShiftVal >= NumElts)
16304 return llvm::Constant::getNullValue(Ops[0]->getType());
16309 for (
unsigned i = 0; i != NumElts; ++i)
16310 Indices[i] = i + ShiftVal;
16312 Value *
Zero = llvm::Constant::getNullValue(
In->getType());
16314 In, Zero,
ArrayRef(Indices, NumElts),
"kshiftr");
16315 return Builder.CreateBitCast(SV, Ops[0]->getType());
16317 case X86::BI__builtin_ia32_movnti:
16318 case X86::BI__builtin_ia32_movnti64:
16319 case X86::BI__builtin_ia32_movntsd:
16320 case X86::BI__builtin_ia32_movntss: {
16321 llvm::MDNode *
Node = llvm::MDNode::get(
16324 Value *Ptr = Ops[0];
16325 Value *Src = Ops[1];
16328 if (BuiltinID == X86::BI__builtin_ia32_movntsd ||
16329 BuiltinID == X86::BI__builtin_ia32_movntss)
16330 Src =
Builder.CreateExtractElement(Src, (uint64_t)0,
"extract");
16334 SI->setMetadata(llvm::LLVMContext::MD_nontemporal,
Node);
16335 SI->setAlignment(llvm::Align(1));
16339 case X86::BI__builtin_ia32_vprotb:
16340 case X86::BI__builtin_ia32_vprotw:
16341 case X86::BI__builtin_ia32_vprotd:
16342 case X86::BI__builtin_ia32_vprotq:
16343 case X86::BI__builtin_ia32_vprotbi:
16344 case X86::BI__builtin_ia32_vprotwi:
16345 case X86::BI__builtin_ia32_vprotdi:
16346 case X86::BI__builtin_ia32_vprotqi:
16347 case X86::BI__builtin_ia32_prold128:
16348 case X86::BI__builtin_ia32_prold256:
16349 case X86::BI__builtin_ia32_prold512:
16350 case X86::BI__builtin_ia32_prolq128:
16351 case X86::BI__builtin_ia32_prolq256:
16352 case X86::BI__builtin_ia32_prolq512:
16353 case X86::BI__builtin_ia32_prolvd128:
16354 case X86::BI__builtin_ia32_prolvd256:
16355 case X86::BI__builtin_ia32_prolvd512:
16356 case X86::BI__builtin_ia32_prolvq128:
16357 case X86::BI__builtin_ia32_prolvq256:
16358 case X86::BI__builtin_ia32_prolvq512:
16360 case X86::BI__builtin_ia32_prord128:
16361 case X86::BI__builtin_ia32_prord256:
16362 case X86::BI__builtin_ia32_prord512:
16363 case X86::BI__builtin_ia32_prorq128:
16364 case X86::BI__builtin_ia32_prorq256:
16365 case X86::BI__builtin_ia32_prorq512:
16366 case X86::BI__builtin_ia32_prorvd128:
16367 case X86::BI__builtin_ia32_prorvd256:
16368 case X86::BI__builtin_ia32_prorvd512:
16369 case X86::BI__builtin_ia32_prorvq128:
16370 case X86::BI__builtin_ia32_prorvq256:
16371 case X86::BI__builtin_ia32_prorvq512:
16373 case X86::BI__builtin_ia32_selectb_128:
16374 case X86::BI__builtin_ia32_selectb_256:
16375 case X86::BI__builtin_ia32_selectb_512:
16376 case X86::BI__builtin_ia32_selectw_128:
16377 case X86::BI__builtin_ia32_selectw_256:
16378 case X86::BI__builtin_ia32_selectw_512:
16379 case X86::BI__builtin_ia32_selectd_128:
16380 case X86::BI__builtin_ia32_selectd_256:
16381 case X86::BI__builtin_ia32_selectd_512:
16382 case X86::BI__builtin_ia32_selectq_128:
16383 case X86::BI__builtin_ia32_selectq_256:
16384 case X86::BI__builtin_ia32_selectq_512:
16385 case X86::BI__builtin_ia32_selectph_128:
16386 case X86::BI__builtin_ia32_selectph_256:
16387 case X86::BI__builtin_ia32_selectph_512:
16388 case X86::BI__builtin_ia32_selectpbf_128:
16389 case X86::BI__builtin_ia32_selectpbf_256:
16390 case X86::BI__builtin_ia32_selectpbf_512:
16391 case X86::BI__builtin_ia32_selectps_128:
16392 case X86::BI__builtin_ia32_selectps_256:
16393 case X86::BI__builtin_ia32_selectps_512:
16394 case X86::BI__builtin_ia32_selectpd_128:
16395 case X86::BI__builtin_ia32_selectpd_256:
16396 case X86::BI__builtin_ia32_selectpd_512:
16398 case X86::BI__builtin_ia32_selectsh_128:
16399 case X86::BI__builtin_ia32_selectsbf_128:
16400 case X86::BI__builtin_ia32_selectss_128:
16401 case X86::BI__builtin_ia32_selectsd_128: {
16402 Value *A =
Builder.CreateExtractElement(Ops[1], (uint64_t)0);
16403 Value *B =
Builder.CreateExtractElement(Ops[2], (uint64_t)0);
16405 return Builder.CreateInsertElement(Ops[1], A, (uint64_t)0);
16407 case X86::BI__builtin_ia32_cmpb128_mask:
16408 case X86::BI__builtin_ia32_cmpb256_mask:
16409 case X86::BI__builtin_ia32_cmpb512_mask:
16410 case X86::BI__builtin_ia32_cmpw128_mask:
16411 case X86::BI__builtin_ia32_cmpw256_mask:
16412 case X86::BI__builtin_ia32_cmpw512_mask:
16413 case X86::BI__builtin_ia32_cmpd128_mask:
16414 case X86::BI__builtin_ia32_cmpd256_mask:
16415 case X86::BI__builtin_ia32_cmpd512_mask:
16416 case X86::BI__builtin_ia32_cmpq128_mask:
16417 case X86::BI__builtin_ia32_cmpq256_mask:
16418 case X86::BI__builtin_ia32_cmpq512_mask: {
16419 unsigned CC = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0x7;
16422 case X86::BI__builtin_ia32_ucmpb128_mask:
16423 case X86::BI__builtin_ia32_ucmpb256_mask:
16424 case X86::BI__builtin_ia32_ucmpb512_mask:
16425 case X86::BI__builtin_ia32_ucmpw128_mask:
16426 case X86::BI__builtin_ia32_ucmpw256_mask:
16427 case X86::BI__builtin_ia32_ucmpw512_mask:
16428 case X86::BI__builtin_ia32_ucmpd128_mask:
16429 case X86::BI__builtin_ia32_ucmpd256_mask:
16430 case X86::BI__builtin_ia32_ucmpd512_mask:
16431 case X86::BI__builtin_ia32_ucmpq128_mask:
16432 case X86::BI__builtin_ia32_ucmpq256_mask:
16433 case X86::BI__builtin_ia32_ucmpq512_mask: {
16434 unsigned CC = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0x7;
16437 case X86::BI__builtin_ia32_vpcomb:
16438 case X86::BI__builtin_ia32_vpcomw:
16439 case X86::BI__builtin_ia32_vpcomd:
16440 case X86::BI__builtin_ia32_vpcomq:
16442 case X86::BI__builtin_ia32_vpcomub:
16443 case X86::BI__builtin_ia32_vpcomuw:
16444 case X86::BI__builtin_ia32_vpcomud:
16445 case X86::BI__builtin_ia32_vpcomuq:
16448 case X86::BI__builtin_ia32_kortestcqi:
16449 case X86::BI__builtin_ia32_kortestchi:
16450 case X86::BI__builtin_ia32_kortestcsi:
16451 case X86::BI__builtin_ia32_kortestcdi: {
16453 Value *
C = llvm::Constant::getAllOnesValue(Ops[0]->getType());
16457 case X86::BI__builtin_ia32_kortestzqi:
16458 case X86::BI__builtin_ia32_kortestzhi:
16459 case X86::BI__builtin_ia32_kortestzsi:
16460 case X86::BI__builtin_ia32_kortestzdi: {
16462 Value *
C = llvm::Constant::getNullValue(Ops[0]->getType());
16467 case X86::BI__builtin_ia32_ktestcqi:
16468 case X86::BI__builtin_ia32_ktestzqi:
16469 case X86::BI__builtin_ia32_ktestchi:
16470 case X86::BI__builtin_ia32_ktestzhi:
16471 case X86::BI__builtin_ia32_ktestcsi:
16472 case X86::BI__builtin_ia32_ktestzsi:
16473 case X86::BI__builtin_ia32_ktestcdi:
16474 case X86::BI__builtin_ia32_ktestzdi: {
16476 switch (BuiltinID) {
16477 default: llvm_unreachable(
"Unsupported intrinsic!");
16478 case X86::BI__builtin_ia32_ktestcqi:
16479 IID = Intrinsic::x86_avx512_ktestc_b;
16481 case X86::BI__builtin_ia32_ktestzqi:
16482 IID = Intrinsic::x86_avx512_ktestz_b;
16484 case X86::BI__builtin_ia32_ktestchi:
16485 IID = Intrinsic::x86_avx512_ktestc_w;
16487 case X86::BI__builtin_ia32_ktestzhi:
16488 IID = Intrinsic::x86_avx512_ktestz_w;
16490 case X86::BI__builtin_ia32_ktestcsi:
16491 IID = Intrinsic::x86_avx512_ktestc_d;
16493 case X86::BI__builtin_ia32_ktestzsi:
16494 IID = Intrinsic::x86_avx512_ktestz_d;
16496 case X86::BI__builtin_ia32_ktestcdi:
16497 IID = Intrinsic::x86_avx512_ktestc_q;
16499 case X86::BI__builtin_ia32_ktestzdi:
16500 IID = Intrinsic::x86_avx512_ktestz_q;
16504 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
16508 return Builder.CreateCall(Intr, {LHS, RHS});
16511 case X86::BI__builtin_ia32_kaddqi:
16512 case X86::BI__builtin_ia32_kaddhi:
16513 case X86::BI__builtin_ia32_kaddsi:
16514 case X86::BI__builtin_ia32_kadddi: {
16516 switch (BuiltinID) {
16517 default: llvm_unreachable(
"Unsupported intrinsic!");
16518 case X86::BI__builtin_ia32_kaddqi:
16519 IID = Intrinsic::x86_avx512_kadd_b;
16521 case X86::BI__builtin_ia32_kaddhi:
16522 IID = Intrinsic::x86_avx512_kadd_w;
16524 case X86::BI__builtin_ia32_kaddsi:
16525 IID = Intrinsic::x86_avx512_kadd_d;
16527 case X86::BI__builtin_ia32_kadddi:
16528 IID = Intrinsic::x86_avx512_kadd_q;
16532 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
16537 return Builder.CreateBitCast(Res, Ops[0]->getType());
16539 case X86::BI__builtin_ia32_kandqi:
16540 case X86::BI__builtin_ia32_kandhi:
16541 case X86::BI__builtin_ia32_kandsi:
16542 case X86::BI__builtin_ia32_kanddi:
16544 case X86::BI__builtin_ia32_kandnqi:
16545 case X86::BI__builtin_ia32_kandnhi:
16546 case X86::BI__builtin_ia32_kandnsi:
16547 case X86::BI__builtin_ia32_kandndi:
16549 case X86::BI__builtin_ia32_korqi:
16550 case X86::BI__builtin_ia32_korhi:
16551 case X86::BI__builtin_ia32_korsi:
16552 case X86::BI__builtin_ia32_kordi:
16554 case X86::BI__builtin_ia32_kxnorqi:
16555 case X86::BI__builtin_ia32_kxnorhi:
16556 case X86::BI__builtin_ia32_kxnorsi:
16557 case X86::BI__builtin_ia32_kxnordi:
16559 case X86::BI__builtin_ia32_kxorqi:
16560 case X86::BI__builtin_ia32_kxorhi:
16561 case X86::BI__builtin_ia32_kxorsi:
16562 case X86::BI__builtin_ia32_kxordi:
16564 case X86::BI__builtin_ia32_knotqi:
16565 case X86::BI__builtin_ia32_knothi:
16566 case X86::BI__builtin_ia32_knotsi:
16567 case X86::BI__builtin_ia32_knotdi: {
16568 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
16571 Ops[0]->getType());
16573 case X86::BI__builtin_ia32_kmovb:
16574 case X86::BI__builtin_ia32_kmovw:
16575 case X86::BI__builtin_ia32_kmovd:
16576 case X86::BI__builtin_ia32_kmovq: {
16580 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
16582 return Builder.CreateBitCast(Res, Ops[0]->getType());
16585 case X86::BI__builtin_ia32_kunpckdi:
16586 case X86::BI__builtin_ia32_kunpcksi:
16587 case X86::BI__builtin_ia32_kunpckhi: {
16588 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
16592 for (
unsigned i = 0; i != NumElts; ++i)
16597 LHS =
Builder.CreateShuffleVector(LHS, LHS,
ArrayRef(Indices, NumElts / 2));
16598 RHS =
Builder.CreateShuffleVector(RHS, RHS,
ArrayRef(Indices, NumElts / 2));
16603 return Builder.CreateBitCast(Res, Ops[0]->getType());
16606 case X86::BI__builtin_ia32_vplzcntd_128:
16607 case X86::BI__builtin_ia32_vplzcntd_256:
16608 case X86::BI__builtin_ia32_vplzcntd_512:
16609 case X86::BI__builtin_ia32_vplzcntq_128:
16610 case X86::BI__builtin_ia32_vplzcntq_256:
16611 case X86::BI__builtin_ia32_vplzcntq_512: {
16615 case X86::BI__builtin_ia32_sqrtss:
16616 case X86::BI__builtin_ia32_sqrtsd: {
16617 Value *A =
Builder.CreateExtractElement(Ops[0], (uint64_t)0);
16619 if (
Builder.getIsFPConstrained()) {
16620 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
16623 A =
Builder.CreateConstrainedFPCall(F, {A});
16626 A =
Builder.CreateCall(F, {A});
16628 return Builder.CreateInsertElement(Ops[0], A, (uint64_t)0);
16630 case X86::BI__builtin_ia32_sqrtsh_round_mask:
16631 case X86::BI__builtin_ia32_sqrtsd_round_mask:
16632 case X86::BI__builtin_ia32_sqrtss_round_mask: {
16633 unsigned CC = cast<llvm::ConstantInt>(Ops[4])->getZExtValue();
16639 switch (BuiltinID) {
16641 llvm_unreachable(
"Unsupported intrinsic!");
16642 case X86::BI__builtin_ia32_sqrtsh_round_mask:
16643 IID = Intrinsic::x86_avx512fp16_mask_sqrt_sh;
16645 case X86::BI__builtin_ia32_sqrtsd_round_mask:
16646 IID = Intrinsic::x86_avx512_mask_sqrt_sd;
16648 case X86::BI__builtin_ia32_sqrtss_round_mask:
16649 IID = Intrinsic::x86_avx512_mask_sqrt_ss;
16654 Value *A =
Builder.CreateExtractElement(Ops[1], (uint64_t)0);
16656 if (
Builder.getIsFPConstrained()) {
16657 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
16660 A =
Builder.CreateConstrainedFPCall(F, A);
16663 A =
Builder.CreateCall(F, A);
16665 Value *Src =
Builder.CreateExtractElement(Ops[2], (uint64_t)0);
16667 return Builder.CreateInsertElement(Ops[0], A, (uint64_t)0);
16669 case X86::BI__builtin_ia32_sqrtpd256:
16670 case X86::BI__builtin_ia32_sqrtpd:
16671 case X86::BI__builtin_ia32_sqrtps256:
16672 case X86::BI__builtin_ia32_sqrtps:
16673 case X86::BI__builtin_ia32_sqrtph256:
16674 case X86::BI__builtin_ia32_sqrtph:
16675 case X86::BI__builtin_ia32_sqrtph512:
16676 case X86::BI__builtin_ia32_vsqrtnepbf16256:
16677 case X86::BI__builtin_ia32_vsqrtnepbf16:
16678 case X86::BI__builtin_ia32_vsqrtnepbf16512:
16679 case X86::BI__builtin_ia32_sqrtps512:
16680 case X86::BI__builtin_ia32_sqrtpd512: {
16681 if (Ops.size() == 2) {
16682 unsigned CC = cast<llvm::ConstantInt>(Ops[1])->getZExtValue();
16688 switch (BuiltinID) {
16690 llvm_unreachable(
"Unsupported intrinsic!");
16691 case X86::BI__builtin_ia32_sqrtph512:
16692 IID = Intrinsic::x86_avx512fp16_sqrt_ph_512;
16694 case X86::BI__builtin_ia32_sqrtps512:
16695 IID = Intrinsic::x86_avx512_sqrt_ps_512;
16697 case X86::BI__builtin_ia32_sqrtpd512:
16698 IID = Intrinsic::x86_avx512_sqrt_pd_512;
16704 if (
Builder.getIsFPConstrained()) {
16705 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
16707 Ops[0]->getType());
16708 return Builder.CreateConstrainedFPCall(F, Ops[0]);
16711 return Builder.CreateCall(F, Ops[0]);
16715 case X86::BI__builtin_ia32_pmuludq128:
16716 case X86::BI__builtin_ia32_pmuludq256:
16717 case X86::BI__builtin_ia32_pmuludq512:
16720 case X86::BI__builtin_ia32_pmuldq128:
16721 case X86::BI__builtin_ia32_pmuldq256:
16722 case X86::BI__builtin_ia32_pmuldq512:
16725 case X86::BI__builtin_ia32_pternlogd512_mask:
16726 case X86::BI__builtin_ia32_pternlogq512_mask:
16727 case X86::BI__builtin_ia32_pternlogd128_mask:
16728 case X86::BI__builtin_ia32_pternlogd256_mask:
16729 case X86::BI__builtin_ia32_pternlogq128_mask:
16730 case X86::BI__builtin_ia32_pternlogq256_mask:
16733 case X86::BI__builtin_ia32_pternlogd512_maskz:
16734 case X86::BI__builtin_ia32_pternlogq512_maskz:
16735 case X86::BI__builtin_ia32_pternlogd128_maskz:
16736 case X86::BI__builtin_ia32_pternlogd256_maskz:
16737 case X86::BI__builtin_ia32_pternlogq128_maskz:
16738 case X86::BI__builtin_ia32_pternlogq256_maskz:
16741 case X86::BI__builtin_ia32_vpshldd128:
16742 case X86::BI__builtin_ia32_vpshldd256:
16743 case X86::BI__builtin_ia32_vpshldd512:
16744 case X86::BI__builtin_ia32_vpshldq128:
16745 case X86::BI__builtin_ia32_vpshldq256:
16746 case X86::BI__builtin_ia32_vpshldq512:
16747 case X86::BI__builtin_ia32_vpshldw128:
16748 case X86::BI__builtin_ia32_vpshldw256:
16749 case X86::BI__builtin_ia32_vpshldw512:
16752 case X86::BI__builtin_ia32_vpshrdd128:
16753 case X86::BI__builtin_ia32_vpshrdd256:
16754 case X86::BI__builtin_ia32_vpshrdd512:
16755 case X86::BI__builtin_ia32_vpshrdq128:
16756 case X86::BI__builtin_ia32_vpshrdq256:
16757 case X86::BI__builtin_ia32_vpshrdq512:
16758 case X86::BI__builtin_ia32_vpshrdw128:
16759 case X86::BI__builtin_ia32_vpshrdw256:
16760 case X86::BI__builtin_ia32_vpshrdw512:
16764 case X86::BI__builtin_ia32_vpshldvd128:
16765 case X86::BI__builtin_ia32_vpshldvd256:
16766 case X86::BI__builtin_ia32_vpshldvd512:
16767 case X86::BI__builtin_ia32_vpshldvq128:
16768 case X86::BI__builtin_ia32_vpshldvq256:
16769 case X86::BI__builtin_ia32_vpshldvq512:
16770 case X86::BI__builtin_ia32_vpshldvw128:
16771 case X86::BI__builtin_ia32_vpshldvw256:
16772 case X86::BI__builtin_ia32_vpshldvw512:
16775 case X86::BI__builtin_ia32_vpshrdvd128:
16776 case X86::BI__builtin_ia32_vpshrdvd256:
16777 case X86::BI__builtin_ia32_vpshrdvd512:
16778 case X86::BI__builtin_ia32_vpshrdvq128:
16779 case X86::BI__builtin_ia32_vpshrdvq256:
16780 case X86::BI__builtin_ia32_vpshrdvq512:
16781 case X86::BI__builtin_ia32_vpshrdvw128:
16782 case X86::BI__builtin_ia32_vpshrdvw256:
16783 case X86::BI__builtin_ia32_vpshrdvw512:
16788 case X86::BI__builtin_ia32_reduce_fadd_pd512:
16789 case X86::BI__builtin_ia32_reduce_fadd_ps512:
16790 case X86::BI__builtin_ia32_reduce_fadd_ph512:
16791 case X86::BI__builtin_ia32_reduce_fadd_ph256:
16792 case X86::BI__builtin_ia32_reduce_fadd_ph128: {
16795 IRBuilder<>::FastMathFlagGuard FMFGuard(
Builder);
16796 Builder.getFastMathFlags().setAllowReassoc();
16797 return Builder.CreateCall(F, {Ops[0], Ops[1]});
16799 case X86::BI__builtin_ia32_reduce_fmul_pd512:
16800 case X86::BI__builtin_ia32_reduce_fmul_ps512:
16801 case X86::BI__builtin_ia32_reduce_fmul_ph512:
16802 case X86::BI__builtin_ia32_reduce_fmul_ph256:
16803 case X86::BI__builtin_ia32_reduce_fmul_ph128: {
16806 IRBuilder<>::FastMathFlagGuard FMFGuard(
Builder);
16807 Builder.getFastMathFlags().setAllowReassoc();
16808 return Builder.CreateCall(F, {Ops[0], Ops[1]});
16810 case X86::BI__builtin_ia32_reduce_fmax_pd512:
16811 case X86::BI__builtin_ia32_reduce_fmax_ps512:
16812 case X86::BI__builtin_ia32_reduce_fmax_ph512:
16813 case X86::BI__builtin_ia32_reduce_fmax_ph256:
16814 case X86::BI__builtin_ia32_reduce_fmax_ph128: {
16817 IRBuilder<>::FastMathFlagGuard FMFGuard(
Builder);
16818 Builder.getFastMathFlags().setNoNaNs();
16819 return Builder.CreateCall(F, {Ops[0]});
16821 case X86::BI__builtin_ia32_reduce_fmin_pd512:
16822 case X86::BI__builtin_ia32_reduce_fmin_ps512:
16823 case X86::BI__builtin_ia32_reduce_fmin_ph512:
16824 case X86::BI__builtin_ia32_reduce_fmin_ph256:
16825 case X86::BI__builtin_ia32_reduce_fmin_ph128: {
16828 IRBuilder<>::FastMathFlagGuard FMFGuard(
Builder);
16829 Builder.getFastMathFlags().setNoNaNs();
16830 return Builder.CreateCall(F, {Ops[0]});
16833 case X86::BI__builtin_ia32_rdrand16_step:
16834 case X86::BI__builtin_ia32_rdrand32_step:
16835 case X86::BI__builtin_ia32_rdrand64_step:
16836 case X86::BI__builtin_ia32_rdseed16_step:
16837 case X86::BI__builtin_ia32_rdseed32_step:
16838 case X86::BI__builtin_ia32_rdseed64_step: {
16840 switch (BuiltinID) {
16841 default: llvm_unreachable(
"Unsupported intrinsic!");
16842 case X86::BI__builtin_ia32_rdrand16_step:
16843 ID = Intrinsic::x86_rdrand_16;
16845 case X86::BI__builtin_ia32_rdrand32_step:
16846 ID = Intrinsic::x86_rdrand_32;
16848 case X86::BI__builtin_ia32_rdrand64_step:
16849 ID = Intrinsic::x86_rdrand_64;
16851 case X86::BI__builtin_ia32_rdseed16_step:
16852 ID = Intrinsic::x86_rdseed_16;
16854 case X86::BI__builtin_ia32_rdseed32_step:
16855 ID = Intrinsic::x86_rdseed_32;
16857 case X86::BI__builtin_ia32_rdseed64_step:
16858 ID = Intrinsic::x86_rdseed_64;
16867 case X86::BI__builtin_ia32_addcarryx_u32:
16868 case X86::BI__builtin_ia32_addcarryx_u64:
16869 case X86::BI__builtin_ia32_subborrow_u32:
16870 case X86::BI__builtin_ia32_subborrow_u64: {
16872 switch (BuiltinID) {
16873 default: llvm_unreachable(
"Unsupported intrinsic!");
16874 case X86::BI__builtin_ia32_addcarryx_u32:
16875 IID = Intrinsic::x86_addcarry_32;
16877 case X86::BI__builtin_ia32_addcarryx_u64:
16878 IID = Intrinsic::x86_addcarry_64;
16880 case X86::BI__builtin_ia32_subborrow_u32:
16881 IID = Intrinsic::x86_subborrow_32;
16883 case X86::BI__builtin_ia32_subborrow_u64:
16884 IID = Intrinsic::x86_subborrow_64;
16889 { Ops[0], Ops[1], Ops[2] });
16895 case X86::BI__builtin_ia32_fpclassps128_mask:
16896 case X86::BI__builtin_ia32_fpclassps256_mask:
16897 case X86::BI__builtin_ia32_fpclassps512_mask:
16898 case X86::BI__builtin_ia32_vfpclasspbf16128_mask:
16899 case X86::BI__builtin_ia32_vfpclasspbf16256_mask:
16900 case X86::BI__builtin_ia32_vfpclasspbf16512_mask:
16901 case X86::BI__builtin_ia32_fpclassph128_mask:
16902 case X86::BI__builtin_ia32_fpclassph256_mask:
16903 case X86::BI__builtin_ia32_fpclassph512_mask:
16904 case X86::BI__builtin_ia32_fpclasspd128_mask:
16905 case X86::BI__builtin_ia32_fpclasspd256_mask:
16906 case X86::BI__builtin_ia32_fpclasspd512_mask: {
16908 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
16909 Value *MaskIn = Ops[2];
16910 Ops.erase(&Ops[2]);
16913 switch (BuiltinID) {
16914 default: llvm_unreachable(
"Unsupported intrinsic!");
16915 case X86::BI__builtin_ia32_vfpclasspbf16128_mask:
16916 ID = Intrinsic::x86_avx10_fpclass_nepbf16_128;
16918 case X86::BI__builtin_ia32_vfpclasspbf16256_mask:
16919 ID = Intrinsic::x86_avx10_fpclass_nepbf16_256;
16921 case X86::BI__builtin_ia32_vfpclasspbf16512_mask:
16922 ID = Intrinsic::x86_avx10_fpclass_nepbf16_512;
16924 case X86::BI__builtin_ia32_fpclassph128_mask:
16925 ID = Intrinsic::x86_avx512fp16_fpclass_ph_128;
16927 case X86::BI__builtin_ia32_fpclassph256_mask:
16928 ID = Intrinsic::x86_avx512fp16_fpclass_ph_256;
16930 case X86::BI__builtin_ia32_fpclassph512_mask:
16931 ID = Intrinsic::x86_avx512fp16_fpclass_ph_512;
16933 case X86::BI__builtin_ia32_fpclassps128_mask:
16934 ID = Intrinsic::x86_avx512_fpclass_ps_128;
16936 case X86::BI__builtin_ia32_fpclassps256_mask:
16937 ID = Intrinsic::x86_avx512_fpclass_ps_256;
16939 case X86::BI__builtin_ia32_fpclassps512_mask:
16940 ID = Intrinsic::x86_avx512_fpclass_ps_512;
16942 case X86::BI__builtin_ia32_fpclasspd128_mask:
16943 ID = Intrinsic::x86_avx512_fpclass_pd_128;
16945 case X86::BI__builtin_ia32_fpclasspd256_mask:
16946 ID = Intrinsic::x86_avx512_fpclass_pd_256;
16948 case X86::BI__builtin_ia32_fpclasspd512_mask:
16949 ID = Intrinsic::x86_avx512_fpclass_pd_512;
16957 case X86::BI__builtin_ia32_vp2intersect_q_512:
16958 case X86::BI__builtin_ia32_vp2intersect_q_256:
16959 case X86::BI__builtin_ia32_vp2intersect_q_128:
16960 case X86::BI__builtin_ia32_vp2intersect_d_512:
16961 case X86::BI__builtin_ia32_vp2intersect_d_256:
16962 case X86::BI__builtin_ia32_vp2intersect_d_128: {
16964 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
16967 switch (BuiltinID) {
16968 default: llvm_unreachable(
"Unsupported intrinsic!");
16969 case X86::BI__builtin_ia32_vp2intersect_q_512:
16970 ID = Intrinsic::x86_avx512_vp2intersect_q_512;
16972 case X86::BI__builtin_ia32_vp2intersect_q_256:
16973 ID = Intrinsic::x86_avx512_vp2intersect_q_256;
16975 case X86::BI__builtin_ia32_vp2intersect_q_128:
16976 ID = Intrinsic::x86_avx512_vp2intersect_q_128;
16978 case X86::BI__builtin_ia32_vp2intersect_d_512:
16979 ID = Intrinsic::x86_avx512_vp2intersect_d_512;
16981 case X86::BI__builtin_ia32_vp2intersect_d_256:
16982 ID = Intrinsic::x86_avx512_vp2intersect_d_256;
16984 case X86::BI__builtin_ia32_vp2intersect_d_128:
16985 ID = Intrinsic::x86_avx512_vp2intersect_d_128;
16999 case X86::BI__builtin_ia32_vpmultishiftqb128:
17000 case X86::BI__builtin_ia32_vpmultishiftqb256:
17001 case X86::BI__builtin_ia32_vpmultishiftqb512: {
17003 switch (BuiltinID) {
17004 default: llvm_unreachable(
"Unsupported intrinsic!");
17005 case X86::BI__builtin_ia32_vpmultishiftqb128:
17006 ID = Intrinsic::x86_avx512_pmultishift_qb_128;
17008 case X86::BI__builtin_ia32_vpmultishiftqb256:
17009 ID = Intrinsic::x86_avx512_pmultishift_qb_256;
17011 case X86::BI__builtin_ia32_vpmultishiftqb512:
17012 ID = Intrinsic::x86_avx512_pmultishift_qb_512;
17019 case X86::BI__builtin_ia32_vpshufbitqmb128_mask:
17020 case X86::BI__builtin_ia32_vpshufbitqmb256_mask:
17021 case X86::BI__builtin_ia32_vpshufbitqmb512_mask: {
17023 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
17024 Value *MaskIn = Ops[2];
17025 Ops.erase(&Ops[2]);
17028 switch (BuiltinID) {
17029 default: llvm_unreachable(
"Unsupported intrinsic!");
17030 case X86::BI__builtin_ia32_vpshufbitqmb128_mask:
17031 ID = Intrinsic::x86_avx512_vpshufbitqmb_128;
17033 case X86::BI__builtin_ia32_vpshufbitqmb256_mask:
17034 ID = Intrinsic::x86_avx512_vpshufbitqmb_256;
17036 case X86::BI__builtin_ia32_vpshufbitqmb512_mask:
17037 ID = Intrinsic::x86_avx512_vpshufbitqmb_512;
17046 case X86::BI__builtin_ia32_cmpeqps:
17047 case X86::BI__builtin_ia32_cmpeqpd:
17048 return getVectorFCmpIR(CmpInst::FCMP_OEQ,
false);
17049 case X86::BI__builtin_ia32_cmpltps:
17050 case X86::BI__builtin_ia32_cmpltpd:
17051 return getVectorFCmpIR(CmpInst::FCMP_OLT,
true);
17052 case X86::BI__builtin_ia32_cmpleps:
17053 case X86::BI__builtin_ia32_cmplepd:
17054 return getVectorFCmpIR(CmpInst::FCMP_OLE,
true);
17055 case X86::BI__builtin_ia32_cmpunordps:
17056 case X86::BI__builtin_ia32_cmpunordpd:
17057 return getVectorFCmpIR(CmpInst::FCMP_UNO,
false);
17058 case X86::BI__builtin_ia32_cmpneqps:
17059 case X86::BI__builtin_ia32_cmpneqpd:
17060 return getVectorFCmpIR(CmpInst::FCMP_UNE,
false);
17061 case X86::BI__builtin_ia32_cmpnltps:
17062 case X86::BI__builtin_ia32_cmpnltpd:
17063 return getVectorFCmpIR(CmpInst::FCMP_UGE,
true);
17064 case X86::BI__builtin_ia32_cmpnleps:
17065 case X86::BI__builtin_ia32_cmpnlepd:
17066 return getVectorFCmpIR(CmpInst::FCMP_UGT,
true);
17067 case X86::BI__builtin_ia32_cmpordps:
17068 case X86::BI__builtin_ia32_cmpordpd:
17069 return getVectorFCmpIR(CmpInst::FCMP_ORD,
false);
17070 case X86::BI__builtin_ia32_cmpph128_mask:
17071 case X86::BI__builtin_ia32_cmpph256_mask:
17072 case X86::BI__builtin_ia32_cmpph512_mask:
17073 case X86::BI__builtin_ia32_cmpps128_mask:
17074 case X86::BI__builtin_ia32_cmpps256_mask:
17075 case X86::BI__builtin_ia32_cmpps512_mask:
17076 case X86::BI__builtin_ia32_cmppd128_mask:
17077 case X86::BI__builtin_ia32_cmppd256_mask:
17078 case X86::BI__builtin_ia32_cmppd512_mask:
17079 case X86::BI__builtin_ia32_vcmppd256_round_mask:
17080 case X86::BI__builtin_ia32_vcmpps256_round_mask:
17081 case X86::BI__builtin_ia32_vcmpph256_round_mask:
17082 case X86::BI__builtin_ia32_vcmppbf16512_mask:
17083 case X86::BI__builtin_ia32_vcmppbf16256_mask:
17084 case X86::BI__builtin_ia32_vcmppbf16128_mask:
17087 case X86::BI__builtin_ia32_cmpps:
17088 case X86::BI__builtin_ia32_cmpps256:
17089 case X86::BI__builtin_ia32_cmppd:
17090 case X86::BI__builtin_ia32_cmppd256: {
17098 unsigned CC = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0x1f;
17103 FCmpInst::Predicate Pred;
17107 switch (CC & 0xf) {
17108 case 0x00: Pred = FCmpInst::FCMP_OEQ; IsSignaling =
false;
break;
17109 case 0x01: Pred = FCmpInst::FCMP_OLT; IsSignaling =
true;
break;
17110 case 0x02: Pred = FCmpInst::FCMP_OLE; IsSignaling =
true;
break;
17111 case 0x03: Pred = FCmpInst::FCMP_UNO; IsSignaling =
false;
break;
17112 case 0x04: Pred = FCmpInst::FCMP_UNE; IsSignaling =
false;
break;
17113 case 0x05: Pred = FCmpInst::FCMP_UGE; IsSignaling =
true;
break;
17114 case 0x06: Pred = FCmpInst::FCMP_UGT; IsSignaling =
true;
break;
17115 case 0x07: Pred = FCmpInst::FCMP_ORD; IsSignaling =
false;
break;
17116 case 0x08: Pred = FCmpInst::FCMP_UEQ; IsSignaling =
false;
break;
17117 case 0x09: Pred = FCmpInst::FCMP_ULT; IsSignaling =
true;
break;
17118 case 0x0a: Pred = FCmpInst::FCMP_ULE; IsSignaling =
true;
break;
17119 case 0x0b: Pred = FCmpInst::FCMP_FALSE; IsSignaling =
false;
break;
17120 case 0x0c: Pred = FCmpInst::FCMP_ONE; IsSignaling =
false;
break;
17121 case 0x0d: Pred = FCmpInst::FCMP_OGE; IsSignaling =
true;
break;
17122 case 0x0e: Pred = FCmpInst::FCMP_OGT; IsSignaling =
true;
break;
17123 case 0x0f: Pred = FCmpInst::FCMP_TRUE; IsSignaling =
false;
break;
17124 default: llvm_unreachable(
"Unhandled CC");
17129 IsSignaling = !IsSignaling;
17136 if (
Builder.getIsFPConstrained() &&
17137 (Pred == FCmpInst::FCMP_TRUE || Pred == FCmpInst::FCMP_FALSE ||
17141 switch (BuiltinID) {
17142 default: llvm_unreachable(
"Unexpected builtin");
17143 case X86::BI__builtin_ia32_cmpps:
17144 IID = Intrinsic::x86_sse_cmp_ps;
17146 case X86::BI__builtin_ia32_cmpps256:
17147 IID = Intrinsic::x86_avx_cmp_ps_256;
17149 case X86::BI__builtin_ia32_cmppd:
17150 IID = Intrinsic::x86_sse2_cmp_pd;
17152 case X86::BI__builtin_ia32_cmppd256:
17153 IID = Intrinsic::x86_avx_cmp_pd_256;
17155 case X86::BI__builtin_ia32_cmpph128_mask:
17156 IID = Intrinsic::x86_avx512fp16_mask_cmp_ph_128;
17158 case X86::BI__builtin_ia32_cmpph256_mask:
17159 IID = Intrinsic::x86_avx512fp16_mask_cmp_ph_256;
17161 case X86::BI__builtin_ia32_cmpph512_mask:
17162 IID = Intrinsic::x86_avx512fp16_mask_cmp_ph_512;
17164 case X86::BI__builtin_ia32_cmpps512_mask:
17165 IID = Intrinsic::x86_avx512_mask_cmp_ps_512;
17167 case X86::BI__builtin_ia32_cmppd512_mask:
17168 IID = Intrinsic::x86_avx512_mask_cmp_pd_512;
17170 case X86::BI__builtin_ia32_cmpps128_mask:
17171 IID = Intrinsic::x86_avx512_mask_cmp_ps_128;
17173 case X86::BI__builtin_ia32_cmpps256_mask:
17174 IID = Intrinsic::x86_avx512_mask_cmp_ps_256;
17176 case X86::BI__builtin_ia32_cmppd128_mask:
17177 IID = Intrinsic::x86_avx512_mask_cmp_pd_128;
17179 case X86::BI__builtin_ia32_cmppd256_mask:
17180 IID = Intrinsic::x86_avx512_mask_cmp_pd_256;
17187 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
17193 return Builder.CreateCall(Intr, Ops);
17204 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements();
17207 Cmp =
Builder.CreateFCmpS(Pred, Ops[0], Ops[1]);
17209 Cmp =
Builder.CreateFCmp(Pred, Ops[0], Ops[1]);
17213 return getVectorFCmpIR(Pred, IsSignaling);
17217 case X86::BI__builtin_ia32_cmpeqss:
17218 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 0);
17219 case X86::BI__builtin_ia32_cmpltss:
17220 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 1);
17221 case X86::BI__builtin_ia32_cmpless:
17222 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 2);
17223 case X86::BI__builtin_ia32_cmpunordss:
17224 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 3);
17225 case X86::BI__builtin_ia32_cmpneqss:
17226 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 4);
17227 case X86::BI__builtin_ia32_cmpnltss:
17228 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 5);
17229 case X86::BI__builtin_ia32_cmpnless:
17230 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 6);
17231 case X86::BI__builtin_ia32_cmpordss:
17232 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 7);
17233 case X86::BI__builtin_ia32_cmpeqsd:
17234 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 0);
17235 case X86::BI__builtin_ia32_cmpltsd:
17236 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 1);
17237 case X86::BI__builtin_ia32_cmplesd:
17238 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 2);
17239 case X86::BI__builtin_ia32_cmpunordsd:
17240 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 3);
17241 case X86::BI__builtin_ia32_cmpneqsd:
17242 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 4);
17243 case X86::BI__builtin_ia32_cmpnltsd:
17244 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 5);
17245 case X86::BI__builtin_ia32_cmpnlesd:
17246 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 6);
17247 case X86::BI__builtin_ia32_cmpordsd:
17248 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 7);
17251 case X86::BI__builtin_ia32_vcvtph2ps:
17252 case X86::BI__builtin_ia32_vcvtph2ps256:
17253 case X86::BI__builtin_ia32_vcvtph2ps_mask:
17254 case X86::BI__builtin_ia32_vcvtph2ps256_mask:
17255 case X86::BI__builtin_ia32_vcvtph2ps512_mask: {
17256 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*
this,
E);
17261 case X86::BI__builtin_ia32_cvtneps2bf16_128_mask: {
17264 cast<llvm::FixedVectorType>(Ops[0]->getType())->getNumElements());
17265 Intrinsic::ID IID = Intrinsic::x86_avx512bf16_mask_cvtneps2bf16_128;
17268 case X86::BI__builtin_ia32_cvtsbf162ss_32:
17271 case X86::BI__builtin_ia32_cvtneps2bf16_256_mask:
17272 case X86::BI__builtin_ia32_cvtneps2bf16_512_mask: {
17274 switch (BuiltinID) {
17275 default: llvm_unreachable(
"Unsupported intrinsic!");
17276 case X86::BI__builtin_ia32_cvtneps2bf16_256_mask:
17277 IID = Intrinsic::x86_avx512bf16_cvtneps2bf16_256;
17279 case X86::BI__builtin_ia32_cvtneps2bf16_512_mask:
17280 IID = Intrinsic::x86_avx512bf16_cvtneps2bf16_512;
17287 case X86::BI__cpuid:
17288 case X86::BI__cpuidex: {
17290 Value *SubFuncId = BuiltinID == X86::BI__cpuidex
17294 llvm::StructType *CpuidRetTy =
17296 llvm::FunctionType *FTy =
17299 StringRef
Asm, Constraints;
17300 if (
getTarget().getTriple().getArch() == llvm::Triple::x86) {
17302 Constraints =
"={ax},={bx},={cx},={dx},{ax},{cx}";
17305 Asm =
"xchgq %rbx, ${1:q}\n"
17307 "xchgq %rbx, ${1:q}";
17308 Constraints =
"={ax},=r,={cx},={dx},0,2";
17311 llvm::InlineAsm *IA = llvm::InlineAsm::get(FTy,
Asm, Constraints,
17313 Value *IACall =
Builder.CreateCall(IA, {FuncId, SubFuncId});
17316 for (
unsigned i = 0; i < 4; i++) {
17317 Value *Extracted =
Builder.CreateExtractValue(IACall, i);
17327 case X86::BI__emul:
17328 case X86::BI__emulu: {
17330 bool isSigned = (BuiltinID == X86::BI__emul);
17333 return Builder.CreateMul(LHS, RHS,
"", !isSigned, isSigned);
17335 case X86::BI__mulh:
17336 case X86::BI__umulh:
17337 case X86::BI_mul128:
17338 case X86::BI_umul128: {
17340 llvm::Type *Int128Ty = llvm::IntegerType::get(
getLLVMContext(), 128);
17342 bool IsSigned = (BuiltinID == X86::BI__mulh || BuiltinID == X86::BI_mul128);
17343 Value *LHS =
Builder.CreateIntCast(Ops[0], Int128Ty, IsSigned);
17344 Value *RHS =
Builder.CreateIntCast(Ops[1], Int128Ty, IsSigned);
17346 Value *MulResult, *HigherBits;
17348 MulResult =
Builder.CreateNSWMul(LHS, RHS);
17349 HigherBits =
Builder.CreateAShr(MulResult, 64);
17351 MulResult =
Builder.CreateNUWMul(LHS, RHS);
17352 HigherBits =
Builder.CreateLShr(MulResult, 64);
17354 HigherBits =
Builder.CreateIntCast(HigherBits, ResType, IsSigned);
17356 if (BuiltinID == X86::BI__mulh || BuiltinID == X86::BI__umulh)
17361 return Builder.CreateIntCast(MulResult, ResType, IsSigned);
17364 case X86::BI__faststorefence: {
17365 return Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent,
17366 llvm::SyncScope::System);
17368 case X86::BI__shiftleft128:
17369 case X86::BI__shiftright128: {
17371 BuiltinID == X86::BI__shiftleft128 ? Intrinsic::fshl : Intrinsic::fshr,
17376 std::swap(Ops[0], Ops[1]);
17378 return Builder.CreateCall(F, Ops);
17380 case X86::BI_ReadWriteBarrier:
17381 case X86::BI_ReadBarrier:
17382 case X86::BI_WriteBarrier: {
17383 return Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent,
17384 llvm::SyncScope::SingleThread);
17387 case X86::BI_AddressOfReturnAddress: {
17390 return Builder.CreateCall(F);
17392 case X86::BI__stosb: {
17398 case X86::BI__builtin_ia32_t2rpntlvwz0_internal:
17399 case X86::BI__builtin_ia32_t2rpntlvwz0rs_internal:
17400 case X86::BI__builtin_ia32_t2rpntlvwz0t1_internal:
17401 case X86::BI__builtin_ia32_t2rpntlvwz0rst1_internal:
17402 case X86::BI__builtin_ia32_t2rpntlvwz1_internal:
17403 case X86::BI__builtin_ia32_t2rpntlvwz1rs_internal:
17404 case X86::BI__builtin_ia32_t2rpntlvwz1t1_internal:
17405 case X86::BI__builtin_ia32_t2rpntlvwz1rst1_internal: {
17407 switch (BuiltinID) {
17409 llvm_unreachable(
"Unsupported intrinsic!");
17410 case X86::BI__builtin_ia32_t2rpntlvwz0_internal:
17411 IID = Intrinsic::x86_t2rpntlvwz0_internal;
17413 case X86::BI__builtin_ia32_t2rpntlvwz0rs_internal:
17414 IID = Intrinsic::x86_t2rpntlvwz0rs_internal;
17416 case X86::BI__builtin_ia32_t2rpntlvwz0t1_internal:
17417 IID = Intrinsic::x86_t2rpntlvwz0t1_internal;
17419 case X86::BI__builtin_ia32_t2rpntlvwz0rst1_internal:
17420 IID = Intrinsic::x86_t2rpntlvwz0rst1_internal;
17422 case X86::BI__builtin_ia32_t2rpntlvwz1_internal:
17423 IID = Intrinsic::x86_t2rpntlvwz1_internal;
17425 case X86::BI__builtin_ia32_t2rpntlvwz1rs_internal:
17426 IID = Intrinsic::x86_t2rpntlvwz1rs_internal;
17428 case X86::BI__builtin_ia32_t2rpntlvwz1t1_internal:
17429 IID = Intrinsic::x86_t2rpntlvwz1t1_internal;
17431 case X86::BI__builtin_ia32_t2rpntlvwz1rst1_internal:
17432 IID = Intrinsic::x86_t2rpntlvwz1rst1_internal;
17438 {Ops[0], Ops[1], Ops[2], Ops[5], Ops[6]});
17441 assert(PtrTy &&
"arg3 must be of pointer type");
17448 Value *VecT0 =
Builder.CreateIntrinsic(Intrinsic::x86_cast_tile_to_vector,
17454 Value *VecT1 =
Builder.CreateIntrinsic(Intrinsic::x86_cast_tile_to_vector,
17468 case X86::BI__int2c: {
17470 llvm::FunctionType *FTy = llvm::FunctionType::get(
VoidTy,
false);
17471 llvm::InlineAsm *IA =
17472 llvm::InlineAsm::get(FTy,
"int $$0x2c",
"",
true);
17473 llvm::AttributeList NoReturnAttr = llvm::AttributeList::get(
17475 llvm::Attribute::NoReturn);
17476 llvm::CallInst *CI =
Builder.CreateCall(IA);
17477 CI->setAttributes(NoReturnAttr);
17480 case X86::BI__readfsbyte:
17481 case X86::BI__readfsword:
17482 case X86::BI__readfsdword:
17483 case X86::BI__readfsqword: {
17489 Load->setVolatile(
true);
17492 case X86::BI__readgsbyte:
17493 case X86::BI__readgsword:
17494 case X86::BI__readgsdword:
17495 case X86::BI__readgsqword: {
17501 Load->setVolatile(
true);
17504 case X86::BI__builtin_ia32_encodekey128_u32: {
17505 Intrinsic::ID IID = Intrinsic::x86_encodekey128;
17509 for (
int i = 0; i < 3; ++i) {
17517 case X86::BI__builtin_ia32_encodekey256_u32: {
17518 Intrinsic::ID IID = Intrinsic::x86_encodekey256;
17523 for (
int i = 0; i < 4; ++i) {
17531 case X86::BI__builtin_ia32_aesenc128kl_u8:
17532 case X86::BI__builtin_ia32_aesdec128kl_u8:
17533 case X86::BI__builtin_ia32_aesenc256kl_u8:
17534 case X86::BI__builtin_ia32_aesdec256kl_u8: {
17536 StringRef BlockName;
17537 switch (BuiltinID) {
17539 llvm_unreachable(
"Unexpected builtin");
17540 case X86::BI__builtin_ia32_aesenc128kl_u8:
17541 IID = Intrinsic::x86_aesenc128kl;
17542 BlockName =
"aesenc128kl";
17544 case X86::BI__builtin_ia32_aesdec128kl_u8:
17545 IID = Intrinsic::x86_aesdec128kl;
17546 BlockName =
"aesdec128kl";
17548 case X86::BI__builtin_ia32_aesenc256kl_u8:
17549 IID = Intrinsic::x86_aesenc256kl;
17550 BlockName =
"aesenc256kl";
17552 case X86::BI__builtin_ia32_aesdec256kl_u8:
17553 IID = Intrinsic::x86_aesdec256kl;
17554 BlockName =
"aesdec256kl";
17560 BasicBlock *NoError =
17568 Builder.CreateCondBr(Succ, NoError, Error);
17570 Builder.SetInsertPoint(NoError);
17574 Builder.SetInsertPoint(Error);
17575 Constant *
Zero = llvm::Constant::getNullValue(Out->getType());
17582 case X86::BI__builtin_ia32_aesencwide128kl_u8:
17583 case X86::BI__builtin_ia32_aesdecwide128kl_u8:
17584 case X86::BI__builtin_ia32_aesencwide256kl_u8:
17585 case X86::BI__builtin_ia32_aesdecwide256kl_u8: {
17587 StringRef BlockName;
17588 switch (BuiltinID) {
17589 case X86::BI__builtin_ia32_aesencwide128kl_u8:
17590 IID = Intrinsic::x86_aesencwide128kl;
17591 BlockName =
"aesencwide128kl";
17593 case X86::BI__builtin_ia32_aesdecwide128kl_u8:
17594 IID = Intrinsic::x86_aesdecwide128kl;
17595 BlockName =
"aesdecwide128kl";
17597 case X86::BI__builtin_ia32_aesencwide256kl_u8:
17598 IID = Intrinsic::x86_aesencwide256kl;
17599 BlockName =
"aesencwide256kl";
17601 case X86::BI__builtin_ia32_aesdecwide256kl_u8:
17602 IID = Intrinsic::x86_aesdecwide256kl;
17603 BlockName =
"aesdecwide256kl";
17607 llvm::Type *Ty = FixedVectorType::get(
Builder.getInt64Ty(), 2);
17610 for (
int i = 0; i != 8; ++i) {
17611 Value *Ptr =
Builder.CreateConstGEP1_32(Ty, Ops[1], i);
17617 BasicBlock *NoError =
17624 Builder.CreateCondBr(Succ, NoError, Error);
17626 Builder.SetInsertPoint(NoError);
17627 for (
int i = 0; i != 8; ++i) {
17634 Builder.SetInsertPoint(Error);
17635 for (
int i = 0; i != 8; ++i) {
17637 Constant *
Zero = llvm::Constant::getNullValue(Out->getType());
17638 Value *Ptr =
Builder.CreateConstGEP1_32(Out->getType(), Ops[0], i);
17646 case X86::BI__builtin_ia32_vfcmaddcph512_mask:
17649 case X86::BI__builtin_ia32_vfmaddcph512_mask: {
17650 Intrinsic::ID IID = IsConjFMA
17651 ? Intrinsic::x86_avx512fp16_mask_vfcmadd_cph_512
17652 : Intrinsic::x86_avx512fp16_mask_vfmadd_cph_512;
17656 case X86::BI__builtin_ia32_vfcmaddcph256_round_mask:
17659 case X86::BI__builtin_ia32_vfmaddcph256_round_mask: {
17660 Intrinsic::ID IID = IsConjFMA ? Intrinsic::x86_avx10_mask_vfcmaddcph256
17661 : Intrinsic::x86_avx10_mask_vfmaddcph256;
17665 case X86::BI__builtin_ia32_vfcmaddcsh_round_mask:
17668 case X86::BI__builtin_ia32_vfmaddcsh_round_mask: {
17669 Intrinsic::ID IID = IsConjFMA ? Intrinsic::x86_avx512fp16_mask_vfcmadd_csh
17670 : Intrinsic::x86_avx512fp16_mask_vfmadd_csh;
17675 case X86::BI__builtin_ia32_vfcmaddcsh_round_mask3:
17678 case X86::BI__builtin_ia32_vfmaddcsh_round_mask3: {
17679 Intrinsic::ID IID = IsConjFMA ? Intrinsic::x86_avx512fp16_mask_vfcmadd_csh
17680 : Intrinsic::x86_avx512fp16_mask_vfmadd_csh;
17682 static constexpr int Mask[] = {0, 5, 6, 7};
17683 return Builder.CreateShuffleVector(
Call, Ops[2], Mask);
17685 case X86::BI__builtin_ia32_prefetchi:
17688 {Ops[0], llvm::ConstantInt::get(Int32Ty, 0), Ops[1],
17689 llvm::ConstantInt::get(Int32Ty, 0)});
17707 Intrinsic::ID
ID = Intrinsic::not_intrinsic;
17709#include "llvm/TargetParser/PPCTargetParser.def"
17710 auto GenAIXPPCBuiltinCpuExpr = [&](
unsigned SupportMethod,
unsigned FieldIdx,
17711 unsigned Mask, CmpInst::Predicate CompOp,
17712 unsigned OpValue) ->
Value * {
17713 if (SupportMethod == BUILTIN_PPC_FALSE)
17716 if (SupportMethod == BUILTIN_PPC_TRUE)
17719 assert(SupportMethod <= SYS_CALL &&
"Invalid value for SupportMethod.");
17721 llvm::Value *FieldValue =
nullptr;
17722 if (SupportMethod == USE_SYS_CONF) {
17723 llvm::Type *STy = llvm::StructType::get(PPC_SYSTEMCONFIG_TYPE);
17724 llvm::Constant *SysConf =
17728 llvm::Value *Idxs[] = {ConstantInt::get(
Int32Ty, 0),
17729 ConstantInt::get(
Int32Ty, FieldIdx)};
17734 }
else if (SupportMethod == SYS_CALL) {
17735 llvm::FunctionType *FTy =
17737 llvm::FunctionCallee
Func =
17743 assert(FieldValue &&
17744 "SupportMethod value is not defined in PPCTargetParser.def.");
17747 FieldValue =
Builder.CreateAnd(FieldValue, Mask);
17749 llvm::Type *ValueType = FieldValue->getType();
17750 bool IsValueType64Bit = ValueType->isIntegerTy(64);
17752 (IsValueType64Bit || ValueType->isIntegerTy(32)) &&
17753 "Only 32/64-bit integers are supported in GenAIXPPCBuiltinCpuExpr().");
17756 CompOp, FieldValue,
17757 ConstantInt::get(IsValueType64Bit ?
Int64Ty :
Int32Ty, OpValue));
17760 switch (BuiltinID) {
17761 default:
return nullptr;
17763 case Builtin::BI__builtin_cpu_is: {
17765 StringRef CPUStr = cast<clang::StringLiteral>(CPUExpr)->getString();
17768 unsigned LinuxSupportMethod, LinuxIDValue, AIXSupportMethod, AIXIDValue;
17769 typedef std::tuple<unsigned, unsigned, unsigned, unsigned>
CPUInfo;
17771 std::tie(LinuxSupportMethod, LinuxIDValue, AIXSupportMethod, AIXIDValue) =
17772 static_cast<CPUInfo>(StringSwitch<CPUInfo>(CPUStr)
17773#define PPC_CPU(NAME, Linux_SUPPORT_METHOD, LinuxID, AIX_SUPPORT_METHOD, \
17775 .Case(NAME, {Linux_SUPPORT_METHOD, LinuxID, AIX_SUPPORT_METHOD, AIXID})
17776#include "llvm/TargetParser/PPCTargetParser.def"
17777 .Default({BUILTIN_PPC_UNSUPPORTED, 0,
17778 BUILTIN_PPC_UNSUPPORTED, 0}));
17780 if (Triple.isOSAIX()) {
17781 assert((AIXSupportMethod != BUILTIN_PPC_UNSUPPORTED) &&
17782 "Invalid CPU name. Missed by SemaChecking?");
17783 return GenAIXPPCBuiltinCpuExpr(AIXSupportMethod, AIX_SYSCON_IMPL_IDX, 0,
17784 ICmpInst::ICMP_EQ, AIXIDValue);
17787 assert(Triple.isOSLinux() &&
17788 "__builtin_cpu_is() is only supported for AIX and Linux.");
17790 assert((LinuxSupportMethod != BUILTIN_PPC_UNSUPPORTED) &&
17791 "Invalid CPU name. Missed by SemaChecking?");
17793 if (LinuxSupportMethod == BUILTIN_PPC_FALSE)
17796 Value *Op0 = llvm::ConstantInt::get(
Int32Ty, PPC_FAWORD_CPUID);
17798 Value *TheCall =
Builder.CreateCall(F, {Op0},
"cpu_is");
17799 return Builder.CreateICmpEQ(TheCall,
17800 llvm::ConstantInt::get(
Int32Ty, LinuxIDValue));
17802 case Builtin::BI__builtin_cpu_supports: {
17805 StringRef CPUStr = cast<clang::StringLiteral>(CPUExpr)->getString();
17806 if (Triple.isOSAIX()) {
17807 unsigned SupportMethod, FieldIdx, Mask,
Value;
17808 CmpInst::Predicate CompOp;
17812 std::tie(SupportMethod, FieldIdx, Mask, CompOp,
Value) =
17813 static_cast<CPUSupportType
>(StringSwitch<CPUSupportType>(CPUStr)
17814#define PPC_AIX_FEATURE(NAME, DESC, SUPPORT_METHOD, INDEX, MASK, COMP_OP, \
17816 .Case(NAME, {SUPPORT_METHOD, INDEX, MASK, COMP_OP, VALUE})
17817#include "llvm/TargetParser/PPCTargetParser.def"
17818 .Default({BUILTIN_PPC_FALSE, 0, 0,
17819 CmpInst::Predicate(), 0}));
17820 return GenAIXPPCBuiltinCpuExpr(SupportMethod, FieldIdx, Mask, CompOp,
17824 assert(Triple.isOSLinux() &&
17825 "__builtin_cpu_supports() is only supported for AIX and Linux.");
17826 unsigned FeatureWord;
17828 std::tie(FeatureWord, BitMask) =
17829 StringSwitch<std::pair<unsigned, unsigned>>(CPUStr)
17830#define
PPC_LNX_FEATURE(Name, Description, EnumName, Bitmask, FA_WORD) \
17831 .Case(Name, {FA_WORD, Bitmask})
17832#include
"llvm/TargetParser/PPCTargetParser.def"
17836 Value *Op0 = llvm::ConstantInt::get(
Int32Ty, FeatureWord);
17838 Value *TheCall =
Builder.CreateCall(F, {Op0},
"cpu_supports");
17840 Builder.CreateAnd(TheCall, llvm::ConstantInt::get(
Int32Ty, BitMask));
17841 return Builder.CreateICmpNE(Mask, llvm::Constant::getNullValue(
Int32Ty));
17842#undef PPC_FAWORD_HWCAP
17843#undef PPC_FAWORD_HWCAP2
17844#undef PPC_FAWORD_CPUID
17849 case PPC::BI__builtin_ppc_get_timebase:
17853 case PPC::BI__builtin_altivec_lvx:
17854 case PPC::BI__builtin_altivec_lvxl:
17855 case PPC::BI__builtin_altivec_lvebx:
17856 case PPC::BI__builtin_altivec_lvehx:
17857 case PPC::BI__builtin_altivec_lvewx:
17858 case PPC::BI__builtin_altivec_lvsl:
17859 case PPC::BI__builtin_altivec_lvsr:
17860 case PPC::BI__builtin_vsx_lxvd2x:
17861 case PPC::BI__builtin_vsx_lxvw4x:
17862 case PPC::BI__builtin_vsx_lxvd2x_be:
17863 case PPC::BI__builtin_vsx_lxvw4x_be:
17864 case PPC::BI__builtin_vsx_lxvl:
17865 case PPC::BI__builtin_vsx_lxvll:
17870 if (!(BuiltinID == PPC::BI__builtin_vsx_lxvl ||
17871 BuiltinID == PPC::BI__builtin_vsx_lxvll)) {
17876 switch (BuiltinID) {
17877 default: llvm_unreachable(
"Unsupported ld/lvsl/lvsr intrinsic!");
17878 case PPC::BI__builtin_altivec_lvx:
17879 ID = Intrinsic::ppc_altivec_lvx;
17881 case PPC::BI__builtin_altivec_lvxl:
17882 ID = Intrinsic::ppc_altivec_lvxl;
17884 case PPC::BI__builtin_altivec_lvebx:
17885 ID = Intrinsic::ppc_altivec_lvebx;
17887 case PPC::BI__builtin_altivec_lvehx:
17888 ID = Intrinsic::ppc_altivec_lvehx;
17890 case PPC::BI__builtin_altivec_lvewx:
17891 ID = Intrinsic::ppc_altivec_lvewx;
17893 case PPC::BI__builtin_altivec_lvsl:
17894 ID = Intrinsic::ppc_altivec_lvsl;
17896 case PPC::BI__builtin_altivec_lvsr:
17897 ID = Intrinsic::ppc_altivec_lvsr;
17899 case PPC::BI__builtin_vsx_lxvd2x:
17900 ID = Intrinsic::ppc_vsx_lxvd2x;
17902 case PPC::BI__builtin_vsx_lxvw4x:
17903 ID = Intrinsic::ppc_vsx_lxvw4x;
17905 case PPC::BI__builtin_vsx_lxvd2x_be:
17906 ID = Intrinsic::ppc_vsx_lxvd2x_be;
17908 case PPC::BI__builtin_vsx_lxvw4x_be:
17909 ID = Intrinsic::ppc_vsx_lxvw4x_be;
17911 case PPC::BI__builtin_vsx_lxvl:
17912 ID = Intrinsic::ppc_vsx_lxvl;
17914 case PPC::BI__builtin_vsx_lxvll:
17915 ID = Intrinsic::ppc_vsx_lxvll;
17919 return Builder.CreateCall(F, Ops,
"");
17923 case PPC::BI__builtin_altivec_stvx:
17924 case PPC::BI__builtin_altivec_stvxl:
17925 case PPC::BI__builtin_altivec_stvebx:
17926 case PPC::BI__builtin_altivec_stvehx:
17927 case PPC::BI__builtin_altivec_stvewx:
17928 case PPC::BI__builtin_vsx_stxvd2x:
17929 case PPC::BI__builtin_vsx_stxvw4x:
17930 case PPC::BI__builtin_vsx_stxvd2x_be:
17931 case PPC::BI__builtin_vsx_stxvw4x_be:
17932 case PPC::BI__builtin_vsx_stxvl:
17933 case PPC::BI__builtin_vsx_stxvll:
17939 if (!(BuiltinID == PPC::BI__builtin_vsx_stxvl ||
17940 BuiltinID == PPC::BI__builtin_vsx_stxvll)) {
17945 switch (BuiltinID) {
17946 default: llvm_unreachable(
"Unsupported st intrinsic!");
17947 case PPC::BI__builtin_altivec_stvx:
17948 ID = Intrinsic::ppc_altivec_stvx;
17950 case PPC::BI__builtin_altivec_stvxl:
17951 ID = Intrinsic::ppc_altivec_stvxl;
17953 case PPC::BI__builtin_altivec_stvebx:
17954 ID = Intrinsic::ppc_altivec_stvebx;
17956 case PPC::BI__builtin_altivec_stvehx:
17957 ID = Intrinsic::ppc_altivec_stvehx;
17959 case PPC::BI__builtin_altivec_stvewx:
17960 ID = Intrinsic::ppc_altivec_stvewx;
17962 case PPC::BI__builtin_vsx_stxvd2x:
17963 ID = Intrinsic::ppc_vsx_stxvd2x;
17965 case PPC::BI__builtin_vsx_stxvw4x:
17966 ID = Intrinsic::ppc_vsx_stxvw4x;
17968 case PPC::BI__builtin_vsx_stxvd2x_be:
17969 ID = Intrinsic::ppc_vsx_stxvd2x_be;
17971 case PPC::BI__builtin_vsx_stxvw4x_be:
17972 ID = Intrinsic::ppc_vsx_stxvw4x_be;
17974 case PPC::BI__builtin_vsx_stxvl:
17975 ID = Intrinsic::ppc_vsx_stxvl;
17977 case PPC::BI__builtin_vsx_stxvll:
17978 ID = Intrinsic::ppc_vsx_stxvll;
17982 return Builder.CreateCall(F, Ops,
"");
17984 case PPC::BI__builtin_vsx_ldrmb: {
17990 int64_t NumBytes = cast<ConstantInt>(Op1)->getZExtValue();
17995 if (NumBytes == 16) {
18003 for (
int Idx = 0; Idx < 16; Idx++)
18004 RevMask.push_back(15 - Idx);
18005 return Builder.CreateShuffleVector(LD, LD, RevMask);
18009 llvm::Function *Lvs =
CGM.
getIntrinsic(IsLE ? Intrinsic::ppc_altivec_lvsr
18010 : Intrinsic::ppc_altivec_lvsl);
18011 llvm::Function *Vperm =
CGM.
getIntrinsic(Intrinsic::ppc_altivec_vperm);
18013 Int8Ty, Op0, ConstantInt::get(Op1->
getType(), NumBytes - 1));
18015 Value *HiLd =
Builder.CreateCall(Lvx, HiMem,
"ld.hi");
18018 Op0 = IsLE ? HiLd : LoLd;
18019 Op1 = IsLE ? LoLd : HiLd;
18020 Value *AllElts =
Builder.CreateCall(Vperm, {Op0, Op1, Mask1},
"shuffle1");
18021 Constant *
Zero = llvm::Constant::getNullValue(IsLE ? ResTy : AllElts->
getType());
18025 for (
int Idx = 0; Idx < 16; Idx++) {
18026 int Val = (NumBytes - Idx - 1 >= 0) ? (NumBytes - Idx - 1)
18027 : 16 - (NumBytes - Idx);
18028 Consts.push_back(Val);
18030 return Builder.CreateShuffleVector(
Builder.CreateBitCast(AllElts, ResTy),
18034 for (
int Idx = 0; Idx < 16; Idx++)
18035 Consts.push_back(
Builder.getInt8(NumBytes + Idx));
18036 Value *Mask2 = ConstantVector::get(Consts);
18037 return Builder.CreateBitCast(
18038 Builder.CreateCall(Vperm, {Zero, AllElts, Mask2},
"shuffle2"), ResTy);
18040 case PPC::BI__builtin_vsx_strmb: {
18044 int64_t NumBytes = cast<ConstantInt>(Op1)->getZExtValue();
18046 auto StoreSubVec = [&](
unsigned Width,
unsigned Offset,
unsigned EltNo) {
18050 Value *StVec = Op2;
18053 for (
int Idx = 0; Idx < 16; Idx++)
18054 RevMask.push_back(15 - Idx);
18055 StVec =
Builder.CreateShuffleVector(Op2, Op2, RevMask);
18061 unsigned NumElts = 0;
18064 llvm_unreachable(
"width for stores must be a power of 2");
18083 Op2, llvm::FixedVectorType::get(ConvTy, NumElts));
18086 Value *Elt =
Builder.CreateExtractElement(Vec, EltNo);
18087 if (IsLE && Width > 1) {
18089 Elt =
Builder.CreateCall(F, Elt);
18094 unsigned Stored = 0;
18095 unsigned RemainingBytes = NumBytes;
18097 if (NumBytes == 16)
18098 return StoreSubVec(16, 0, 0);
18099 if (NumBytes >= 8) {
18100 Result = StoreSubVec(8, NumBytes - 8, IsLE ? 0 : 1);
18101 RemainingBytes -= 8;
18104 if (RemainingBytes >= 4) {
18105 Result = StoreSubVec(4, NumBytes - Stored - 4,
18106 IsLE ? (Stored >> 2) : 3 - (Stored >> 2));
18107 RemainingBytes -= 4;
18110 if (RemainingBytes >= 2) {
18111 Result = StoreSubVec(2, NumBytes - Stored - 2,
18112 IsLE ? (Stored >> 1) : 7 - (Stored >> 1));
18113 RemainingBytes -= 2;
18116 if (RemainingBytes)
18118 StoreSubVec(1, NumBytes - Stored - 1, IsLE ? Stored : 15 - Stored);
18122 case PPC::BI__builtin_vsx_xvsqrtsp:
18123 case PPC::BI__builtin_vsx_xvsqrtdp: {
18126 if (
Builder.getIsFPConstrained()) {
18128 Intrinsic::experimental_constrained_sqrt, ResultType);
18129 return Builder.CreateConstrainedFPCall(F,
X);
18136 case PPC::BI__builtin_altivec_vclzb:
18137 case PPC::BI__builtin_altivec_vclzh:
18138 case PPC::BI__builtin_altivec_vclzw:
18139 case PPC::BI__builtin_altivec_vclzd: {
18142 Value *Undef = ConstantInt::get(
Builder.getInt1Ty(),
false);
18144 return Builder.CreateCall(F, {
X, Undef});
18146 case PPC::BI__builtin_altivec_vctzb:
18147 case PPC::BI__builtin_altivec_vctzh:
18148 case PPC::BI__builtin_altivec_vctzw:
18149 case PPC::BI__builtin_altivec_vctzd: {
18152 Value *Undef = ConstantInt::get(
Builder.getInt1Ty(),
false);
18154 return Builder.CreateCall(F, {
X, Undef});
18156 case PPC::BI__builtin_altivec_vinsd:
18157 case PPC::BI__builtin_altivec_vinsw:
18158 case PPC::BI__builtin_altivec_vinsd_elt:
18159 case PPC::BI__builtin_altivec_vinsw_elt: {
18165 bool IsUnaligned = (BuiltinID == PPC::BI__builtin_altivec_vinsw ||
18166 BuiltinID == PPC::BI__builtin_altivec_vinsd);
18168 bool Is32bit = (BuiltinID == PPC::BI__builtin_altivec_vinsw ||
18169 BuiltinID == PPC::BI__builtin_altivec_vinsw_elt);
18172 ConstantInt *ArgCI = dyn_cast<ConstantInt>(Op2);
18174 "Third Arg to vinsw/vinsd intrinsic must be a constant integer!");
18178 int ValidMaxValue = 0;
18180 ValidMaxValue = (Is32bit) ? 12 : 8;
18182 ValidMaxValue = (Is32bit) ? 3 : 1;
18185 int64_t ConstArg = ArgCI->getSExtValue();
18188 std::string RangeErrMsg = IsUnaligned ?
"byte" :
"element";
18189 RangeErrMsg +=
" number " + llvm::to_string(ConstArg);
18190 RangeErrMsg +=
" is outside of the valid range [0, ";
18191 RangeErrMsg += llvm::to_string(ValidMaxValue) +
"]";
18194 if (ConstArg < 0 || ConstArg > ValidMaxValue)
18198 if (!IsUnaligned) {
18199 ConstArg *= Is32bit ? 4 : 8;
18202 ConstArg = (Is32bit ? 12 : 8) - ConstArg;
18205 ID = Is32bit ? Intrinsic::ppc_altivec_vinsw : Intrinsic::ppc_altivec_vinsd;
18206 Op2 = ConstantInt::getSigned(
Int32Ty, ConstArg);
18210 ?
Builder.CreateBitCast(Op0, llvm::FixedVectorType::get(
Int32Ty, 4))
18212 llvm::FixedVectorType::get(
Int64Ty, 2));
18213 return Builder.CreateBitCast(
18216 case PPC::BI__builtin_altivec_vadduqm:
18217 case PPC::BI__builtin_altivec_vsubuqm: {
18220 llvm::Type *Int128Ty = llvm::IntegerType::get(
getLLVMContext(), 128);
18221 Op0 =
Builder.CreateBitCast(Op0, llvm::FixedVectorType::get(Int128Ty, 1));
18222 Op1 =
Builder.CreateBitCast(Op1, llvm::FixedVectorType::get(Int128Ty, 1));
18223 if (BuiltinID == PPC::BI__builtin_altivec_vadduqm)
18224 return Builder.CreateAdd(Op0, Op1,
"vadduqm");
18226 return Builder.CreateSub(Op0, Op1,
"vsubuqm");
18228 case PPC::BI__builtin_altivec_vaddcuq_c:
18229 case PPC::BI__builtin_altivec_vsubcuq_c: {
18233 llvm::Type *V1I128Ty = llvm::FixedVectorType::get(
18235 Ops.push_back(
Builder.CreateBitCast(Op0, V1I128Ty));
18236 Ops.push_back(
Builder.CreateBitCast(Op1, V1I128Ty));
18237 ID = (BuiltinID == PPC::BI__builtin_altivec_vaddcuq_c)
18238 ? Intrinsic::ppc_altivec_vaddcuq
18239 : Intrinsic::ppc_altivec_vsubcuq;
18242 case PPC::BI__builtin_altivec_vaddeuqm_c:
18243 case PPC::BI__builtin_altivec_vaddecuq_c:
18244 case PPC::BI__builtin_altivec_vsubeuqm_c:
18245 case PPC::BI__builtin_altivec_vsubecuq_c: {
18250 llvm::Type *V1I128Ty = llvm::FixedVectorType::get(
18252 Ops.push_back(
Builder.CreateBitCast(Op0, V1I128Ty));
18253 Ops.push_back(
Builder.CreateBitCast(Op1, V1I128Ty));
18254 Ops.push_back(
Builder.CreateBitCast(Op2, V1I128Ty));
18255 switch (BuiltinID) {
18257 llvm_unreachable(
"Unsupported intrinsic!");
18258 case PPC::BI__builtin_altivec_vaddeuqm_c:
18259 ID = Intrinsic::ppc_altivec_vaddeuqm;
18261 case PPC::BI__builtin_altivec_vaddecuq_c:
18262 ID = Intrinsic::ppc_altivec_vaddecuq;
18264 case PPC::BI__builtin_altivec_vsubeuqm_c:
18265 ID = Intrinsic::ppc_altivec_vsubeuqm;
18267 case PPC::BI__builtin_altivec_vsubecuq_c:
18268 ID = Intrinsic::ppc_altivec_vsubecuq;
18273 case PPC::BI__builtin_ppc_rldimi:
18274 case PPC::BI__builtin_ppc_rlwimi: {
18281 if (BuiltinID == PPC::BI__builtin_ppc_rldimi &&
18291 ? Intrinsic::ppc_rldimi
18292 : Intrinsic::ppc_rlwimi),
18293 {Op0, Op1, Op2, Op3});
18295 case PPC::BI__builtin_ppc_rlwnm: {
18302 case PPC::BI__builtin_ppc_poppar4:
18303 case PPC::BI__builtin_ppc_poppar8: {
18305 llvm::Type *ArgType = Op0->
getType();
18311 if (
Result->getType() != ResultType)
18316 case PPC::BI__builtin_ppc_cmpb: {
18319 if (
getTarget().getTriple().isPPC64()) {
18322 return Builder.CreateCall(F, {Op0, Op1},
"cmpb");
18342 Constant *ShiftAmt = ConstantInt::get(
Int64Ty, 32);
18351 Value *ResHi =
Builder.CreateShl(ResHiShift, ShiftAmt);
18352 return Builder.CreateOr(ResLo, ResHi);
18355 case PPC::BI__builtin_vsx_xvcpsgnsp:
18356 case PPC::BI__builtin_vsx_xvcpsgndp: {
18360 ID = Intrinsic::copysign;
18362 return Builder.CreateCall(F, {
X, Y});
18365 case PPC::BI__builtin_vsx_xvrspip:
18366 case PPC::BI__builtin_vsx_xvrdpip:
18367 case PPC::BI__builtin_vsx_xvrdpim:
18368 case PPC::BI__builtin_vsx_xvrspim:
18369 case PPC::BI__builtin_vsx_xvrdpi:
18370 case PPC::BI__builtin_vsx_xvrspi:
18371 case PPC::BI__builtin_vsx_xvrdpic:
18372 case PPC::BI__builtin_vsx_xvrspic:
18373 case PPC::BI__builtin_vsx_xvrdpiz:
18374 case PPC::BI__builtin_vsx_xvrspiz: {
18377 if (BuiltinID == PPC::BI__builtin_vsx_xvrdpim ||
18378 BuiltinID == PPC::BI__builtin_vsx_xvrspim)
18380 ? Intrinsic::experimental_constrained_floor
18381 : Intrinsic::floor;
18382 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpi ||
18383 BuiltinID == PPC::BI__builtin_vsx_xvrspi)
18385 ? Intrinsic::experimental_constrained_round
18386 : Intrinsic::round;
18387 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpic ||
18388 BuiltinID == PPC::BI__builtin_vsx_xvrspic)
18390 ? Intrinsic::experimental_constrained_rint
18392 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpip ||
18393 BuiltinID == PPC::BI__builtin_vsx_xvrspip)
18395 ? Intrinsic::experimental_constrained_ceil
18397 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpiz ||
18398 BuiltinID == PPC::BI__builtin_vsx_xvrspiz)
18400 ? Intrinsic::experimental_constrained_trunc
18401 : Intrinsic::trunc;
18403 return Builder.getIsFPConstrained() ?
Builder.CreateConstrainedFPCall(F,
X)
18408 case PPC::BI__builtin_vsx_xvabsdp:
18409 case PPC::BI__builtin_vsx_xvabssp: {
18417 case PPC::BI__builtin_ppc_recipdivf:
18418 case PPC::BI__builtin_ppc_recipdivd:
18419 case PPC::BI__builtin_ppc_rsqrtf:
18420 case PPC::BI__builtin_ppc_rsqrtd: {
18421 FastMathFlags FMF =
Builder.getFastMathFlags();
18422 Builder.getFastMathFlags().setFast();
18426 if (BuiltinID == PPC::BI__builtin_ppc_recipdivf ||
18427 BuiltinID == PPC::BI__builtin_ppc_recipdivd) {
18430 Builder.getFastMathFlags() &= (FMF);
18433 auto *One = ConstantFP::get(ResultType, 1.0);
18436 Builder.getFastMathFlags() &= (FMF);
18439 case PPC::BI__builtin_ppc_alignx: {
18442 ConstantInt *AlignmentCI = cast<ConstantInt>(Op0);
18443 if (AlignmentCI->getValue().ugt(llvm::Value::MaximumAlignment))
18444 AlignmentCI = ConstantInt::get(AlignmentCI->getIntegerType(),
18445 llvm::Value::MaximumAlignment);
18449 AlignmentCI,
nullptr);
18452 case PPC::BI__builtin_ppc_rdlam: {
18456 llvm::Type *Ty = Op0->
getType();
18457 Value *ShiftAmt =
Builder.CreateIntCast(Op1, Ty,
false);
18459 Value *Rotate =
Builder.CreateCall(F, {Op0, Op0, ShiftAmt});
18460 return Builder.CreateAnd(Rotate, Op2);
18462 case PPC::BI__builtin_ppc_load2r: {
18469 case PPC::BI__builtin_ppc_fnmsub:
18470 case PPC::BI__builtin_ppc_fnmsubs:
18471 case PPC::BI__builtin_vsx_xvmaddadp:
18472 case PPC::BI__builtin_vsx_xvmaddasp:
18473 case PPC::BI__builtin_vsx_xvnmaddadp:
18474 case PPC::BI__builtin_vsx_xvnmaddasp:
18475 case PPC::BI__builtin_vsx_xvmsubadp:
18476 case PPC::BI__builtin_vsx_xvmsubasp:
18477 case PPC::BI__builtin_vsx_xvnmsubadp:
18478 case PPC::BI__builtin_vsx_xvnmsubasp: {
18484 if (
Builder.getIsFPConstrained())
18485 F =
CGM.
getIntrinsic(Intrinsic::experimental_constrained_fma, ResultType);
18488 switch (BuiltinID) {
18489 case PPC::BI__builtin_vsx_xvmaddadp:
18490 case PPC::BI__builtin_vsx_xvmaddasp:
18491 if (
Builder.getIsFPConstrained())
18492 return Builder.CreateConstrainedFPCall(F, {
X, Y, Z});
18494 return Builder.CreateCall(F, {
X, Y, Z});
18495 case PPC::BI__builtin_vsx_xvnmaddadp:
18496 case PPC::BI__builtin_vsx_xvnmaddasp:
18497 if (
Builder.getIsFPConstrained())
18499 Builder.CreateConstrainedFPCall(F, {X, Y, Z}),
"neg");
18501 return Builder.CreateFNeg(
Builder.CreateCall(F, {X, Y, Z}),
"neg");
18502 case PPC::BI__builtin_vsx_xvmsubadp:
18503 case PPC::BI__builtin_vsx_xvmsubasp:
18504 if (
Builder.getIsFPConstrained())
18505 return Builder.CreateConstrainedFPCall(
18506 F, {
X, Y,
Builder.CreateFNeg(Z,
"neg")});
18509 case PPC::BI__builtin_ppc_fnmsub:
18510 case PPC::BI__builtin_ppc_fnmsubs:
18511 case PPC::BI__builtin_vsx_xvnmsubadp:
18512 case PPC::BI__builtin_vsx_xvnmsubasp:
18513 if (
Builder.getIsFPConstrained())
18515 Builder.CreateConstrainedFPCall(
18516 F, {X, Y, Builder.CreateFNeg(Z,
"neg")}),
18522 llvm_unreachable(
"Unknown FMA operation");
18526 case PPC::BI__builtin_vsx_insertword: {
18534 ConstantInt *ArgCI = dyn_cast<ConstantInt>(Op2);
18536 "Third arg to xxinsertw intrinsic must be constant integer");
18538 int64_t Index = std::clamp(ArgCI->getSExtValue(), (int64_t)0, MaxIndex);
18545 std::swap(Op0, Op1);
18549 Op1 =
Builder.CreateBitCast(Op1, llvm::FixedVectorType::get(
Int64Ty, 2));
18553 Op0 =
Builder.CreateBitCast(Op0, llvm::FixedVectorType::get(
Int64Ty, 2));
18557 Index = MaxIndex - Index;
18561 Op0 =
Builder.CreateBitCast(Op0, llvm::FixedVectorType::get(
Int32Ty, 4));
18562 Op2 = ConstantInt::getSigned(
Int32Ty, Index);
18563 return Builder.CreateCall(F, {Op0, Op1, Op2});
18566 case PPC::BI__builtin_vsx_extractuword: {
18569 llvm::Function *F =
CGM.
getIntrinsic(Intrinsic::ppc_vsx_xxextractuw);
18572 Op0 =
Builder.CreateBitCast(Op0, llvm::FixedVectorType::get(
Int64Ty, 2));
18576 ConstantInt *ArgCI = dyn_cast<ConstantInt>(Op1);
18578 "Second Arg to xxextractuw intrinsic must be a constant integer!");
18580 int64_t Index = std::clamp(ArgCI->getSExtValue(), (int64_t)0, MaxIndex);
18584 Index = MaxIndex - Index;
18585 Op1 = ConstantInt::getSigned(
Int32Ty, Index);
18590 Value *ShuffleCall =
18592 return ShuffleCall;
18594 Op1 = ConstantInt::getSigned(
Int32Ty, Index);
18595 return Builder.CreateCall(F, {Op0, Op1});
18599 case PPC::BI__builtin_vsx_xxpermdi: {
18603 ConstantInt *ArgCI = dyn_cast<ConstantInt>(Op2);
18604 assert(ArgCI &&
"Third arg must be constant integer!");
18606 unsigned Index = ArgCI->getZExtValue();
18607 Op0 =
Builder.CreateBitCast(Op0, llvm::FixedVectorType::get(
Int64Ty, 2));
18608 Op1 =
Builder.CreateBitCast(Op1, llvm::FixedVectorType::get(
Int64Ty, 2));
18613 int ElemIdx0 = (Index & 2) >> 1;
18614 int ElemIdx1 = 2 + (Index & 1);
18616 int ShuffleElts[2] = {ElemIdx0, ElemIdx1};
18617 Value *ShuffleCall =
Builder.CreateShuffleVector(Op0, Op1, ShuffleElts);
18620 return Builder.CreateBitCast(ShuffleCall, RetTy);
18623 case PPC::BI__builtin_vsx_xxsldwi: {
18627 ConstantInt *ArgCI = dyn_cast<ConstantInt>(Op2);
18628 assert(ArgCI &&
"Third argument must be a compile time constant");
18629 unsigned Index = ArgCI->getZExtValue() & 0x3;
18630 Op0 =
Builder.CreateBitCast(Op0, llvm::FixedVectorType::get(
Int32Ty, 4));
18631 Op1 =
Builder.CreateBitCast(Op1, llvm::FixedVectorType::get(
Int32Ty, 4));
18642 ElemIdx0 = (8 - Index) % 8;
18643 ElemIdx1 = (9 - Index) % 8;
18644 ElemIdx2 = (10 - Index) % 8;
18645 ElemIdx3 = (11 - Index) % 8;
18649 ElemIdx1 = Index + 1;
18650 ElemIdx2 = Index + 2;
18651 ElemIdx3 = Index + 3;
18654 int ShuffleElts[4] = {ElemIdx0, ElemIdx1, ElemIdx2, ElemIdx3};
18655 Value *ShuffleCall =
Builder.CreateShuffleVector(Op0, Op1, ShuffleElts);
18658 return Builder.CreateBitCast(ShuffleCall, RetTy);
18661 case PPC::BI__builtin_pack_vector_int128: {
18665 Value *PoisonValue =
18666 llvm::PoisonValue::get(llvm::FixedVectorType::get(Op0->
getType(), 2));
18668 PoisonValue, Op0, (uint64_t)(isLittleEndian ? 1 : 0));
18669 Res =
Builder.CreateInsertElement(Res, Op1,
18670 (uint64_t)(isLittleEndian ? 0 : 1));
18674 case PPC::BI__builtin_unpack_vector_int128: {
18677 ConstantInt *Index = cast<ConstantInt>(Op1);
18683 ConstantInt::get(Index->getIntegerType(), 1 - Index->getZExtValue());
18685 return Builder.CreateExtractElement(Unpacked, Index);
18688 case PPC::BI__builtin_ppc_sthcx: {
18692 return Builder.CreateCall(F, {Op0, Op1});
18701#define CUSTOM_BUILTIN(Name, Intr, Types, Accumulate, Feature) \
18702 case PPC::BI__builtin_##Name:
18703#include "clang/Basic/BuiltinsPPC.def"
18706 for (
unsigned i = 0, e =
E->getNumArgs(); i != e; i++)
18716 if (BuiltinID == PPC::BI__builtin_mma_disassemble_acc ||
18717 BuiltinID == PPC::BI__builtin_vsx_disassemble_pair ||
18718 BuiltinID == PPC::BI__builtin_mma_disassemble_pair) {
18719 unsigned NumVecs = 2;
18720 auto Intrinsic = Intrinsic::ppc_vsx_disassemble_pair;
18721 if (BuiltinID == PPC::BI__builtin_mma_disassemble_acc) {
18723 Intrinsic = Intrinsic::ppc_mma_disassemble_acc;
18729 llvm::Type *VTy = llvm::FixedVectorType::get(
Int8Ty, 16);
18730 Value *Ptr = Ops[0];
18731 for (
unsigned i=0; i<NumVecs; i++) {
18733 llvm::ConstantInt* Index = llvm::ConstantInt::get(
IntTy, i);
18739 if (BuiltinID == PPC::BI__builtin_vsx_build_pair ||
18740 BuiltinID == PPC::BI__builtin_mma_build_acc) {
18748 std::reverse(Ops.begin() + 1, Ops.end());
18751 switch (BuiltinID) {
18752 #define CUSTOM_BUILTIN(Name, Intr, Types, Acc, Feature) \
18753 case PPC::BI__builtin_##Name: \
18754 ID = Intrinsic::ppc_##Intr; \
18755 Accumulate = Acc; \
18757 #include "clang/Basic/BuiltinsPPC.def"
18759 if (BuiltinID == PPC::BI__builtin_vsx_lxvp ||
18760 BuiltinID == PPC::BI__builtin_vsx_stxvp ||
18761 BuiltinID == PPC::BI__builtin_mma_lxvp ||
18762 BuiltinID == PPC::BI__builtin_mma_stxvp) {
18763 if (BuiltinID == PPC::BI__builtin_vsx_lxvp ||
18764 BuiltinID == PPC::BI__builtin_mma_lxvp) {
18771 return Builder.CreateCall(F, Ops,
"");
18777 CallOps.push_back(Acc);
18779 for (
unsigned i=1; i<Ops.size(); i++)
18780 CallOps.push_back(Ops[i]);
18786 case PPC::BI__builtin_ppc_compare_and_swap:
18787 case PPC::BI__builtin_ppc_compare_and_swaplp: {
18796 llvm::AtomicOrdering::Monotonic, llvm::AtomicOrdering::Monotonic,
true);
18804 Value *LoadedVal = Pair.first.getScalarVal();
18808 case PPC::BI__builtin_ppc_fetch_and_add:
18809 case PPC::BI__builtin_ppc_fetch_and_addlp: {
18811 llvm::AtomicOrdering::Monotonic);
18813 case PPC::BI__builtin_ppc_fetch_and_and:
18814 case PPC::BI__builtin_ppc_fetch_and_andlp: {
18816 llvm::AtomicOrdering::Monotonic);
18819 case PPC::BI__builtin_ppc_fetch_and_or:
18820 case PPC::BI__builtin_ppc_fetch_and_orlp: {
18822 llvm::AtomicOrdering::Monotonic);
18824 case PPC::BI__builtin_ppc_fetch_and_swap:
18825 case PPC::BI__builtin_ppc_fetch_and_swaplp: {
18827 llvm::AtomicOrdering::Monotonic);
18829 case PPC::BI__builtin_ppc_ldarx:
18830 case PPC::BI__builtin_ppc_lwarx:
18831 case PPC::BI__builtin_ppc_lharx:
18832 case PPC::BI__builtin_ppc_lbarx:
18834 case PPC::BI__builtin_ppc_mfspr: {
18840 return Builder.CreateCall(F, {Op0});
18842 case PPC::BI__builtin_ppc_mtspr: {
18849 return Builder.CreateCall(F, {Op0, Op1});
18851 case PPC::BI__builtin_ppc_popcntb: {
18853 llvm::Type *ArgType = ArgValue->
getType();
18855 return Builder.CreateCall(F, {ArgValue},
"popcntb");
18857 case PPC::BI__builtin_ppc_mtfsf: {
18867 case PPC::BI__builtin_ppc_swdiv_nochk:
18868 case PPC::BI__builtin_ppc_swdivs_nochk: {
18871 FastMathFlags FMF =
Builder.getFastMathFlags();
18872 Builder.getFastMathFlags().setFast();
18873 Value *FDiv =
Builder.CreateFDiv(Op0, Op1,
"swdiv_nochk");
18874 Builder.getFastMathFlags() &= (FMF);
18877 case PPC::BI__builtin_ppc_fric:
18879 *
this,
E, Intrinsic::rint,
18880 Intrinsic::experimental_constrained_rint))
18882 case PPC::BI__builtin_ppc_frim:
18883 case PPC::BI__builtin_ppc_frims:
18885 *
this,
E, Intrinsic::floor,
18886 Intrinsic::experimental_constrained_floor))
18888 case PPC::BI__builtin_ppc_frin:
18889 case PPC::BI__builtin_ppc_frins:
18891 *
this,
E, Intrinsic::round,
18892 Intrinsic::experimental_constrained_round))
18894 case PPC::BI__builtin_ppc_frip:
18895 case PPC::BI__builtin_ppc_frips:
18897 *
this,
E, Intrinsic::ceil,
18898 Intrinsic::experimental_constrained_ceil))
18900 case PPC::BI__builtin_ppc_friz:
18901 case PPC::BI__builtin_ppc_frizs:
18903 *
this,
E, Intrinsic::trunc,
18904 Intrinsic::experimental_constrained_trunc))
18906 case PPC::BI__builtin_ppc_fsqrt:
18907 case PPC::BI__builtin_ppc_fsqrts:
18909 *
this,
E, Intrinsic::sqrt,
18910 Intrinsic::experimental_constrained_sqrt))
18912 case PPC::BI__builtin_ppc_test_data_class: {
18917 {Op0, Op1},
"test_data_class");
18919 case PPC::BI__builtin_ppc_maxfe: {
18925 {Op0, Op1, Op2, Op3});
18927 case PPC::BI__builtin_ppc_maxfl: {
18933 {Op0, Op1, Op2, Op3});
18935 case PPC::BI__builtin_ppc_maxfs: {
18941 {Op0, Op1, Op2, Op3});
18943 case PPC::BI__builtin_ppc_minfe: {
18949 {Op0, Op1, Op2, Op3});
18951 case PPC::BI__builtin_ppc_minfl: {
18957 {Op0, Op1, Op2, Op3});
18959 case PPC::BI__builtin_ppc_minfs: {
18965 {Op0, Op1, Op2, Op3});
18967 case PPC::BI__builtin_ppc_swdiv:
18968 case PPC::BI__builtin_ppc_swdivs: {
18971 return Builder.CreateFDiv(Op0, Op1,
"swdiv");
18973 case PPC::BI__builtin_ppc_set_fpscr_rn:
18975 {EmitScalarExpr(E->getArg(0))});
18976 case PPC::BI__builtin_ppc_mffs:
18989 Attribute::getWithDereferenceableBytes(
Call->getContext(), 64));
18990 Call->addRetAttr(Attribute::getWithAlignment(
Call->getContext(), Align(4)));
18994 auto *RetTy = cast<llvm::PointerType>(CGF.
ConvertType(BuiltinRetType));
18995 if (RetTy ==
Call->getType())
19004 Attribute::getWithDereferenceableBytes(
Call->getContext(), 256));
19005 Call->addRetAttr(Attribute::getWithAlignment(
Call->getContext(), Align(8)));
19020 llvm::LoadInst *LD;
19024 if (Cov == CodeObjectVersionKind::COV_None) {
19025 StringRef Name =
"__oclc_ABI_version";
19026 auto *ABIVersionC = CGF.
CGM.
getModule().getNamedGlobal(Name);
19028 ABIVersionC =
new llvm::GlobalVariable(
19030 llvm::GlobalValue::ExternalLinkage,
nullptr, Name,
nullptr,
19031 llvm::GlobalVariable::NotThreadLocal,
19042 llvm::ConstantInt::get(CGF.
Int32Ty, CodeObjectVersionKind::COV_5));
19046 CGF.
Int8Ty, EmitAMDGPUImplicitArgPtr(CGF), 12 + Index * 2);
19050 CGF.
Int8Ty, EmitAMDGPUDispatchPtr(CGF), 4 + Index * 2);
19052 auto Result = CGF.
Builder.CreateSelect(IsCOV5, ImplicitGEP, DispatchGEP);
19056 Value *GEP =
nullptr;
19057 if (Cov >= CodeObjectVersionKind::COV_5) {
19059 GEP = CGF.
Builder.CreateConstGEP1_32(
19060 CGF.
Int8Ty, EmitAMDGPUImplicitArgPtr(CGF), 12 + Index * 2);
19063 GEP = CGF.
Builder.CreateConstGEP1_32(
19064 CGF.
Int8Ty, EmitAMDGPUDispatchPtr(CGF), 4 + Index * 2);
19071 llvm::MDNode *RNode = MDHelper.createRange(
APInt(16, 1),
19073 LD->setMetadata(llvm::LLVMContext::MD_range, RNode);
19074 LD->setMetadata(llvm::LLVMContext::MD_noundef,
19076 LD->setMetadata(llvm::LLVMContext::MD_invariant_load,
19083 const unsigned XOffset = 12;
19084 auto *DP = EmitAMDGPUDispatchPtr(CGF);
19086 auto *Offset = llvm::ConstantInt::get(CGF.
Int32Ty, XOffset + Index * 4);
19094 LD->setMetadata(llvm::LLVMContext::MD_range,
19095 MDB.createRange(
APInt(32, 1), APInt::getZero(32)));
19096 LD->setMetadata(llvm::LLVMContext::MD_invariant_load,
19109 llvm::AtomicOrdering &AO,
19110 llvm::SyncScope::ID &SSID) {
19111 int ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
19114 assert(llvm::isValidAtomicOrderingCABI(ord));
19115 switch (
static_cast<llvm::AtomicOrderingCABI
>(ord)) {
19116 case llvm::AtomicOrderingCABI::acquire:
19117 case llvm::AtomicOrderingCABI::consume:
19118 AO = llvm::AtomicOrdering::Acquire;
19120 case llvm::AtomicOrderingCABI::release:
19121 AO = llvm::AtomicOrdering::Release;
19123 case llvm::AtomicOrderingCABI::acq_rel:
19124 AO = llvm::AtomicOrdering::AcquireRelease;
19126 case llvm::AtomicOrderingCABI::seq_cst:
19127 AO = llvm::AtomicOrdering::SequentiallyConsistent;
19129 case llvm::AtomicOrderingCABI::relaxed:
19130 AO = llvm::AtomicOrdering::Monotonic;
19136 if (llvm::getConstantStringInfo(
Scope, scp)) {
19142 int scope = cast<llvm::ConstantInt>(
Scope)->getZExtValue();
19145 SSID = llvm::SyncScope::System;
19157 SSID = llvm::SyncScope::SingleThread;
19160 SSID = llvm::SyncScope::System;
19168 llvm::Value *Arg =
nullptr;
19169 if ((ICEArguments & (1 << Idx)) == 0) {
19174 std::optional<llvm::APSInt>
Result =
19176 assert(
Result &&
"Expected argument to be a constant");
19185 return RT.getFDotIntrinsic();
19187 return RT.getSDotIntrinsic();
19189 return RT.getUDotIntrinsic();
19194 return RT.getFirstBitSHighIntrinsic();
19198 return RT.getFirstBitUHighIntrinsic();
19207 switch (BuiltinID) {
19208 case Builtin::BI__builtin_hlsl_resource_getpointer: {
19213 llvm::Type *RetTy = llvm::PointerType::getUnqual(
getLLVMContext());
19215 return Builder.CreateIntrinsic(RetTy, Intrinsic::dx_resource_getpointer,
19218 case Builtin::BI__builtin_hlsl_all: {
19220 return Builder.CreateIntrinsic(
19225 case Builtin::BI__builtin_hlsl_any: {
19227 return Builder.CreateIntrinsic(
19232 case Builtin::BI__builtin_hlsl_asdouble:
19234 case Builtin::BI__builtin_hlsl_elementwise_clamp: {
19241 Ty = VecTy->getElementType();
19243 Intrinsic::ID Intr;
19252 return Builder.CreateIntrinsic(
19256 case Builtin::BI__builtin_hlsl_cross: {
19261 "cross operands must have a float representation");
19266 "input vectors must have 3 elements each");
19267 return Builder.CreateIntrinsic(
19271 case Builtin::BI__builtin_hlsl_dot: {
19274 llvm::Type *T0 = Op0->
getType();
19275 llvm::Type *T1 = Op1->
getType();
19278 if (!T0->isVectorTy() && !T1->isVectorTy()) {
19279 if (T0->isFloatingPointTy())
19280 return Builder.CreateFMul(Op0, Op1,
"hlsl.dot");
19282 if (T0->isIntegerTy())
19283 return Builder.CreateMul(Op0, Op1,
"hlsl.dot");
19286 "Scalar dot product is only supported on ints and floats.");
19291 assert(T0->isVectorTy() && T1->isVectorTy() &&
19292 "Dot product of vector and scalar is not supported.");
19295 [[maybe_unused]]
auto *VecTy1 =
19299 "Dot product of vectors need the same element types.");
19302 "Dot product requires vectors to be of the same size.");
19304 return Builder.CreateIntrinsic(
19305 T0->getScalarType(),
19309 case Builtin::BI__builtin_hlsl_dot4add_i8packed: {
19315 return Builder.CreateIntrinsic(
19317 "hlsl.dot4add.i8packed");
19319 case Builtin::BI__builtin_hlsl_dot4add_u8packed: {
19325 return Builder.CreateIntrinsic(
19327 "hlsl.dot4add.u8packed");
19329 case Builtin::BI__builtin_hlsl_elementwise_firstbithigh: {
19333 return Builder.CreateIntrinsic(
19338 case Builtin::BI__builtin_hlsl_lerp: {
19343 llvm_unreachable(
"lerp operand must have a float representation");
19344 return Builder.CreateIntrinsic(
19348 case Builtin::BI__builtin_hlsl_length: {
19352 "length operand must have a float representation");
19357 return Builder.CreateIntrinsic(
19358 X->getType()->getScalarType(),
19360 nullptr,
"hlsl.length");
19362 case Builtin::BI__builtin_hlsl_normalize: {
19366 "normalize operand must have a float representation");
19368 return Builder.CreateIntrinsic(
19371 nullptr,
"hlsl.normalize");
19373 case Builtin::BI__builtin_hlsl_elementwise_degrees: {
19377 "degree operand must have a float representation");
19379 return Builder.CreateIntrinsic(
19383 case Builtin::BI__builtin_hlsl_elementwise_frac: {
19386 llvm_unreachable(
"frac operand must have a float representation");
19387 return Builder.CreateIntrinsic(
19391case Builtin::BI__builtin_hlsl_elementwise_isinf: {
19393 llvm::Type *Xty = Op0->
getType();
19394 llvm::Type *retType = llvm::Type::getInt1Ty(this->
getLLVMContext());
19395 if (Xty->isVectorTy()) {
19397 retType = llvm::VectorType::get(
19398 retType, ElementCount::getFixed(XVecTy->getNumElements()));
19401 llvm_unreachable(
"isinf operand must have a float representation");
19402 return Builder.CreateIntrinsic(retType, Intrinsic::dx_isinf,
19405 case Builtin::BI__builtin_hlsl_mad: {
19410 return Builder.CreateIntrinsic(
19411 M->
getType(), Intrinsic::fmuladd,
19416 return Builder.CreateIntrinsic(
19417 M->
getType(), Intrinsic::dx_imad,
19421 return Builder.CreateNSWAdd(Mul, B);
19425 return Builder.CreateIntrinsic(
19426 M->
getType(), Intrinsic::dx_umad,
19430 return Builder.CreateNUWAdd(Mul, B);
19432 case Builtin::BI__builtin_hlsl_elementwise_rcp: {
19435 llvm_unreachable(
"rcp operand must have a float representation");
19436 llvm::Type *Ty = Op0->
getType();
19437 llvm::Type *EltTy = Ty->getScalarType();
19438 Constant *One = Ty->isVectorTy()
19439 ? ConstantVector::getSplat(
19440 ElementCount::getFixed(
19441 cast<FixedVectorType>(Ty)->getNumElements()),
19442 ConstantFP::get(EltTy, 1.0))
19443 : ConstantFP::get(EltTy, 1.0);
19444 return Builder.CreateFDiv(One, Op0,
"hlsl.rcp");
19446 case Builtin::BI__builtin_hlsl_elementwise_rsqrt: {
19449 llvm_unreachable(
"rsqrt operand must have a float representation");
19450 return Builder.CreateIntrinsic(
19454 case Builtin::BI__builtin_hlsl_elementwise_saturate: {
19457 "saturate operand must have a float representation");
19458 return Builder.CreateIntrinsic(
19461 nullptr,
"hlsl.saturate");
19463 case Builtin::BI__builtin_hlsl_select: {
19477 Builder.CreateSelect(OpCond, OpTrue, OpFalse,
"hlsl.select");
19484 case Builtin::BI__builtin_hlsl_step: {
19489 "step operands must have a float representation");
19490 return Builder.CreateIntrinsic(
19494 case Builtin::BI__builtin_hlsl_wave_active_all_true: {
19496 assert(Op->
getType()->isIntegerTy(1) &&
19497 "Intrinsic WaveActiveAllTrue operand must be a bool");
19501 Intrinsic::getOrInsertDeclaration(&
CGM.
getModule(), ID), {Op});
19503 case Builtin::BI__builtin_hlsl_wave_active_any_true: {
19505 assert(Op->
getType()->isIntegerTy(1) &&
19506 "Intrinsic WaveActiveAnyTrue operand must be a bool");
19510 Intrinsic::getOrInsertDeclaration(&
CGM.
getModule(), ID), {Op});
19512 case Builtin::BI__builtin_hlsl_wave_active_count_bits: {
19516 Intrinsic::getOrInsertDeclaration(&
CGM.
getModule(), ID),
19519 case Builtin::BI__builtin_hlsl_wave_get_lane_index: {
19524 case llvm::Triple::dxil:
19527 case llvm::Triple::spirv:
19529 llvm::FunctionType::get(
IntTy, {},
false),
19530 "__hlsl_wave_get_lane_index", {},
false,
true));
19533 "Intrinsic WaveGetLaneIndex not supported by target architecture");
19536 case Builtin::BI__builtin_hlsl_wave_is_first_lane: {
19539 Intrinsic::getOrInsertDeclaration(&
CGM.
getModule(), ID));
19541 case Builtin::BI__builtin_hlsl_wave_read_lane_at: {
19546 llvm::FunctionType *FT = llvm::FunctionType::get(
19557 ArrayRef{OpExpr, OpIndex},
"hlsl.wave.readlane");
19559 case Builtin::BI__builtin_hlsl_elementwise_sign: {
19560 auto *Arg0 =
E->getArg(0);
19562 llvm::Type *Xty = Op0->
getType();
19563 llvm::Type *retType = llvm::Type::getInt32Ty(this->
getLLVMContext());
19564 if (Xty->isVectorTy()) {
19566 retType = llvm::VectorType::get(
19567 retType, ElementCount::getFixed(XVecTy->getNumElements()));
19571 "sign operand must have a float or int representation");
19574 Value *Cmp =
Builder.CreateICmpEQ(Op0, ConstantInt::get(Xty, 0));
19575 return Builder.CreateSelect(Cmp, ConstantInt::get(retType, 0),
19576 ConstantInt::get(retType, 1),
"hlsl.sign");
19579 return Builder.CreateIntrinsic(
19583 case Builtin::BI__builtin_hlsl_elementwise_radians: {
19586 "radians operand must have a float representation");
19587 return Builder.CreateIntrinsic(
19590 nullptr,
"hlsl.radians");
19592 case Builtin::BI__builtin_hlsl_buffer_update_counter: {
19596 return Builder.CreateIntrinsic(
19601 case Builtin::BI__builtin_hlsl_elementwise_splitdouble: {
19606 "asuint operands types mismatch");
19609 case Builtin::BI__builtin_hlsl_elementwise_clip:
19611 "clip operands types mismatch");
19613 case Builtin::BI__builtin_hlsl_group_memory_barrier_with_group_sync: {
19617 Intrinsic::getOrInsertDeclaration(&
CGM.
getModule(), ID));
19625 constexpr const char *
Tag =
"amdgpu-as";
19627 LLVMContext &Ctx = Inst->getContext();
19629 for (
unsigned K = 2; K <
E->getNumArgs(); ++K) {
19632 if (llvm::getConstantStringInfo(
V, AS)) {
19633 MMRAs.push_back({
Tag, AS});
19638 "expected an address space name as a string literal");
19642 MMRAs.erase(llvm::unique(MMRAs), MMRAs.end());
19643 Inst->setMetadata(LLVMContext::MD_mmra, MMRAMetadata::getMD(Ctx, MMRAs));
19648 llvm::AtomicOrdering AO = llvm::AtomicOrdering::SequentiallyConsistent;
19649 llvm::SyncScope::ID SSID;
19650 switch (BuiltinID) {
19651 case AMDGPU::BI__builtin_amdgcn_div_scale:
19652 case AMDGPU::BI__builtin_amdgcn_div_scalef: {
19665 llvm::Value *Tmp =
Builder.CreateCall(Callee, {
X, Y, Z});
19668 llvm::Value *Flag =
Builder.CreateExtractValue(Tmp, 1);
19672 llvm::Value *FlagExt =
Builder.CreateZExt(Flag, RealFlagType);
19676 case AMDGPU::BI__builtin_amdgcn_div_fmas:
19677 case AMDGPU::BI__builtin_amdgcn_div_fmasf: {
19685 llvm::Value *Src3ToBool =
Builder.CreateIsNotNull(Src3);
19686 return Builder.CreateCall(F, {Src0, Src1, Src2, Src3ToBool});
19689 case AMDGPU::BI__builtin_amdgcn_ds_swizzle:
19690 return emitBuiltinWithOneOverloadedType<2>(*
this,
E,
19691 Intrinsic::amdgcn_ds_swizzle);
19692 case AMDGPU::BI__builtin_amdgcn_mov_dpp8:
19693 case AMDGPU::BI__builtin_amdgcn_mov_dpp:
19694 case AMDGPU::BI__builtin_amdgcn_update_dpp: {
19698 unsigned ICEArguments = 0;
19703 unsigned Size = DataTy->getPrimitiveSizeInBits();
19704 llvm::Type *
IntTy =
19705 llvm::IntegerType::get(
Builder.getContext(), std::max(Size, 32u));
19708 ? Intrinsic::amdgcn_mov_dpp8
19709 : Intrinsic::amdgcn_update_dpp,
19711 assert(
E->getNumArgs() == 5 ||
E->getNumArgs() == 6 ||
19712 E->getNumArgs() == 2);
19713 bool InsertOld = BuiltinID == AMDGPU::BI__builtin_amdgcn_mov_dpp;
19715 Args.push_back(llvm::PoisonValue::get(
IntTy));
19716 for (
unsigned I = 0; I !=
E->getNumArgs(); ++I) {
19718 if (I < (BuiltinID == AMDGPU::BI__builtin_amdgcn_update_dpp ? 2u : 1u) &&
19720 if (!DataTy->isIntegerTy())
19722 V, llvm::IntegerType::get(
Builder.getContext(), Size));
19725 llvm::Type *ExpTy =
19726 F->getFunctionType()->getFunctionParamType(I + InsertOld);
19727 Args.push_back(
Builder.CreateTruncOrBitCast(
V, ExpTy));
19730 if (Size < 32 && !DataTy->isIntegerTy())
19732 V, llvm::IntegerType::get(
Builder.getContext(), Size));
19733 return Builder.CreateTruncOrBitCast(
V, DataTy);
19735 case AMDGPU::BI__builtin_amdgcn_permlane16:
19736 case AMDGPU::BI__builtin_amdgcn_permlanex16:
19737 return emitBuiltinWithOneOverloadedType<6>(
19739 BuiltinID == AMDGPU::BI__builtin_amdgcn_permlane16
19740 ? Intrinsic::amdgcn_permlane16
19741 : Intrinsic::amdgcn_permlanex16);
19742 case AMDGPU::BI__builtin_amdgcn_permlane64:
19743 return emitBuiltinWithOneOverloadedType<1>(*
this,
E,
19744 Intrinsic::amdgcn_permlane64);
19745 case AMDGPU::BI__builtin_amdgcn_readlane:
19746 return emitBuiltinWithOneOverloadedType<2>(*
this,
E,
19747 Intrinsic::amdgcn_readlane);
19748 case AMDGPU::BI__builtin_amdgcn_readfirstlane:
19749 return emitBuiltinWithOneOverloadedType<1>(*
this,
E,
19750 Intrinsic::amdgcn_readfirstlane);
19751 case AMDGPU::BI__builtin_amdgcn_div_fixup:
19752 case AMDGPU::BI__builtin_amdgcn_div_fixupf:
19753 case AMDGPU::BI__builtin_amdgcn_div_fixuph:
19754 return emitBuiltinWithOneOverloadedType<3>(*
this,
E,
19755 Intrinsic::amdgcn_div_fixup);
19756 case AMDGPU::BI__builtin_amdgcn_trig_preop:
19757 case AMDGPU::BI__builtin_amdgcn_trig_preopf:
19759 case AMDGPU::BI__builtin_amdgcn_rcp:
19760 case AMDGPU::BI__builtin_amdgcn_rcpf:
19761 case AMDGPU::BI__builtin_amdgcn_rcph:
19762 return emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::amdgcn_rcp);
19763 case AMDGPU::BI__builtin_amdgcn_sqrt:
19764 case AMDGPU::BI__builtin_amdgcn_sqrtf:
19765 case AMDGPU::BI__builtin_amdgcn_sqrth:
19766 return emitBuiltinWithOneOverloadedType<1>(*
this,
E,
19767 Intrinsic::amdgcn_sqrt);
19768 case AMDGPU::BI__builtin_amdgcn_rsq:
19769 case AMDGPU::BI__builtin_amdgcn_rsqf:
19770 case AMDGPU::BI__builtin_amdgcn_rsqh:
19771 return emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::amdgcn_rsq);
19772 case AMDGPU::BI__builtin_amdgcn_rsq_clamp:
19773 case AMDGPU::BI__builtin_amdgcn_rsq_clampf:
19774 return emitBuiltinWithOneOverloadedType<1>(*
this,
E,
19775 Intrinsic::amdgcn_rsq_clamp);
19776 case AMDGPU::BI__builtin_amdgcn_sinf:
19777 case AMDGPU::BI__builtin_amdgcn_sinh:
19778 return emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::amdgcn_sin);
19779 case AMDGPU::BI__builtin_amdgcn_cosf:
19780 case AMDGPU::BI__builtin_amdgcn_cosh:
19781 return emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::amdgcn_cos);
19782 case AMDGPU::BI__builtin_amdgcn_dispatch_ptr:
19783 return EmitAMDGPUDispatchPtr(*
this,
E);
19784 case AMDGPU::BI__builtin_amdgcn_logf:
19785 return emitBuiltinWithOneOverloadedType<1>(*
this,
E, Intrinsic::amdgcn_log);
19786 case AMDGPU::BI__builtin_amdgcn_exp2f:
19787 return emitBuiltinWithOneOverloadedType<1>(*
this,
E,
19788 Intrinsic::amdgcn_exp2);
19789 case AMDGPU::BI__builtin_amdgcn_log_clampf:
19790 return emitBuiltinWithOneOverloadedType<1>(*
this,
E,
19791 Intrinsic::amdgcn_log_clamp);
19792 case AMDGPU::BI__builtin_amdgcn_ldexp:
19793 case AMDGPU::BI__builtin_amdgcn_ldexpf: {
19796 llvm::Function *F =
19797 CGM.
getIntrinsic(Intrinsic::ldexp, {Src0->getType(), Src1->getType()});
19798 return Builder.CreateCall(F, {Src0, Src1});
19800 case AMDGPU::BI__builtin_amdgcn_ldexph: {
19805 llvm::Function *F =
19809 case AMDGPU::BI__builtin_amdgcn_frexp_mant:
19810 case AMDGPU::BI__builtin_amdgcn_frexp_mantf:
19811 case AMDGPU::BI__builtin_amdgcn_frexp_manth:
19812 return emitBuiltinWithOneOverloadedType<1>(*
this,
E,
19813 Intrinsic::amdgcn_frexp_mant);
19814 case AMDGPU::BI__builtin_amdgcn_frexp_exp:
19815 case AMDGPU::BI__builtin_amdgcn_frexp_expf: {
19819 return Builder.CreateCall(F, Src0);
19821 case AMDGPU::BI__builtin_amdgcn_frexp_exph: {
19825 return Builder.CreateCall(F, Src0);
19827 case AMDGPU::BI__builtin_amdgcn_fract:
19828 case AMDGPU::BI__builtin_amdgcn_fractf:
19829 case AMDGPU::BI__builtin_amdgcn_fracth:
19830 return emitBuiltinWithOneOverloadedType<1>(*
this,
E,
19831 Intrinsic::amdgcn_fract);
19832 case AMDGPU::BI__builtin_amdgcn_lerp:
19833 return emitBuiltinWithOneOverloadedType<3>(*
this,
E,
19834 Intrinsic::amdgcn_lerp);
19835 case AMDGPU::BI__builtin_amdgcn_ubfe:
19836 return emitBuiltinWithOneOverloadedType<3>(*
this,
E,
19837 Intrinsic::amdgcn_ubfe);
19838 case AMDGPU::BI__builtin_amdgcn_sbfe:
19839 return emitBuiltinWithOneOverloadedType<3>(*
this,
E,
19840 Intrinsic::amdgcn_sbfe);
19841 case AMDGPU::BI__builtin_amdgcn_ballot_w32:
19842 case AMDGPU::BI__builtin_amdgcn_ballot_w64: {
19846 return Builder.CreateCall(F, { Src });
19848 case AMDGPU::BI__builtin_amdgcn_uicmp:
19849 case AMDGPU::BI__builtin_amdgcn_uicmpl:
19850 case AMDGPU::BI__builtin_amdgcn_sicmp:
19851 case AMDGPU::BI__builtin_amdgcn_sicmpl: {
19858 {
Builder.getInt64Ty(), Src0->getType() });
19859 return Builder.CreateCall(F, { Src0, Src1, Src2 });
19861 case AMDGPU::BI__builtin_amdgcn_fcmp:
19862 case AMDGPU::BI__builtin_amdgcn_fcmpf: {
19869 {
Builder.getInt64Ty(), Src0->getType() });
19870 return Builder.CreateCall(F, { Src0, Src1, Src2 });
19872 case AMDGPU::BI__builtin_amdgcn_class:
19873 case AMDGPU::BI__builtin_amdgcn_classf:
19874 case AMDGPU::BI__builtin_amdgcn_classh:
19876 case AMDGPU::BI__builtin_amdgcn_fmed3f:
19877 case AMDGPU::BI__builtin_amdgcn_fmed3h:
19878 return emitBuiltinWithOneOverloadedType<3>(*
this,
E,
19879 Intrinsic::amdgcn_fmed3);
19880 case AMDGPU::BI__builtin_amdgcn_ds_append:
19881 case AMDGPU::BI__builtin_amdgcn_ds_consume: {
19882 Intrinsic::ID Intrin = BuiltinID == AMDGPU::BI__builtin_amdgcn_ds_append ?
19883 Intrinsic::amdgcn_ds_append : Intrinsic::amdgcn_ds_consume;
19888 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b64_i32:
19889 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b64_v2i32:
19890 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v4i16:
19891 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v4f16:
19892 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v4bf16:
19893 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v8i16:
19894 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v8f16:
19895 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v8bf16:
19896 case AMDGPU::BI__builtin_amdgcn_ds_read_tr4_b64_v2i32:
19897 case AMDGPU::BI__builtin_amdgcn_ds_read_tr8_b64_v2i32:
19898 case AMDGPU::BI__builtin_amdgcn_ds_read_tr6_b96_v3i32:
19899 case AMDGPU::BI__builtin_amdgcn_ds_read_tr16_b64_v4f16:
19900 case AMDGPU::BI__builtin_amdgcn_ds_read_tr16_b64_v4bf16:
19901 case AMDGPU::BI__builtin_amdgcn_ds_read_tr16_b64_v4i16: {
19903 switch (BuiltinID) {
19904 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b64_i32:
19905 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b64_v2i32:
19906 IID = Intrinsic::amdgcn_global_load_tr_b64;
19908 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v4i16:
19909 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v4f16:
19910 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v4bf16:
19911 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v8i16:
19912 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v8f16:
19913 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v8bf16:
19914 IID = Intrinsic::amdgcn_global_load_tr_b128;
19916 case AMDGPU::BI__builtin_amdgcn_ds_read_tr4_b64_v2i32:
19917 IID = Intrinsic::amdgcn_ds_read_tr4_b64;
19919 case AMDGPU::BI__builtin_amdgcn_ds_read_tr8_b64_v2i32:
19920 IID = Intrinsic::amdgcn_ds_read_tr8_b64;
19922 case AMDGPU::BI__builtin_amdgcn_ds_read_tr6_b96_v3i32:
19923 IID = Intrinsic::amdgcn_ds_read_tr6_b96;
19925 case AMDGPU::BI__builtin_amdgcn_ds_read_tr16_b64_v4i16:
19926 case AMDGPU::BI__builtin_amdgcn_ds_read_tr16_b64_v4f16:
19927 case AMDGPU::BI__builtin_amdgcn_ds_read_tr16_b64_v4bf16:
19928 IID = Intrinsic::amdgcn_ds_read_tr16_b64;
19934 return Builder.CreateCall(F, {Addr});
19936 case AMDGPU::BI__builtin_amdgcn_get_fpenv: {
19939 return Builder.CreateCall(F);
19941 case AMDGPU::BI__builtin_amdgcn_set_fpenv: {
19947 case AMDGPU::BI__builtin_amdgcn_read_exec:
19949 case AMDGPU::BI__builtin_amdgcn_read_exec_lo:
19951 case AMDGPU::BI__builtin_amdgcn_read_exec_hi:
19953 case AMDGPU::BI__builtin_amdgcn_image_bvh_intersect_ray:
19954 case AMDGPU::BI__builtin_amdgcn_image_bvh_intersect_ray_h:
19955 case AMDGPU::BI__builtin_amdgcn_image_bvh_intersect_ray_l:
19956 case AMDGPU::BI__builtin_amdgcn_image_bvh_intersect_ray_lh: {
19966 RayOrigin =
Builder.CreateShuffleVector(RayOrigin, RayOrigin,
19970 RayInverseDir =
Builder.CreateShuffleVector(RayInverseDir, RayInverseDir,
19974 {NodePtr->getType(), RayDir->getType()});
19975 return Builder.CreateCall(F, {NodePtr, RayExtent, RayOrigin, RayDir,
19976 RayInverseDir, TextureDescr});
19979 case AMDGPU::BI__builtin_amdgcn_ds_bvh_stack_rtn: {
19981 for (
int i = 0, e =
E->getNumArgs(); i != e; ++i)
19989 Value *I0 =
Builder.CreateInsertElement(PoisonValue::get(RetTy), Rtn,
19991 return Builder.CreateInsertElement(I0, A, 1);
19993 case AMDGPU::BI__builtin_amdgcn_mfma_scale_f32_16x16x128_f8f6f4:
19994 case AMDGPU::BI__builtin_amdgcn_mfma_scale_f32_32x32x64_f8f6f4: {
19995 llvm::FixedVectorType *VT = FixedVectorType::get(
Builder.getInt32Ty(), 8);
19997 BuiltinID == AMDGPU::BI__builtin_amdgcn_mfma_scale_f32_32x32x64_f8f6f4
19998 ? Intrinsic::amdgcn_mfma_scale_f32_32x32x64_f8f6f4
19999 : Intrinsic::amdgcn_mfma_scale_f32_16x16x128_f8f6f4,
20003 for (
unsigned I = 0, N =
E->getNumArgs(); I != N; ++I)
20005 return Builder.CreateCall(F, Args);
20007 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w32:
20008 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_tied_w32:
20009 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w64:
20010 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_tied_w64:
20011 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w32:
20012 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_tied_w32:
20013 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w64:
20014 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_tied_w64:
20015 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w32:
20016 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w64:
20017 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w32:
20018 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w64:
20019 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w32:
20020 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w64:
20021 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w32:
20022 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w64:
20023 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w32_gfx12:
20024 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w64_gfx12:
20025 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w32_gfx12:
20026 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w64_gfx12:
20027 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w32_gfx12:
20028 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w64_gfx12:
20029 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w32_gfx12:
20030 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w64_gfx12:
20031 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w32_gfx12:
20032 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w64_gfx12:
20033 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w32_gfx12:
20034 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w64_gfx12:
20035 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_fp8_w32_gfx12:
20036 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_fp8_w64_gfx12:
20037 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_bf8_w32_gfx12:
20038 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_bf8_w64_gfx12:
20039 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_fp8_w32_gfx12:
20040 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_fp8_w64_gfx12:
20041 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_bf8_w32_gfx12:
20042 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_bf8_w64_gfx12:
20043 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x32_iu4_w32_gfx12:
20044 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x32_iu4_w64_gfx12:
20045 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_f16_w32:
20046 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_f16_w64:
20047 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf16_w32:
20048 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf16_w64:
20049 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x32_f16_w32:
20050 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x32_f16_w64:
20051 case AMDGPU::BI__builtin_amdgcn_swmmac_bf16_16x16x32_bf16_w32:
20052 case AMDGPU::BI__builtin_amdgcn_swmmac_bf16_16x16x32_bf16_w64:
20053 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu8_w32:
20054 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu8_w64:
20055 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu4_w32:
20056 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu4_w64:
20057 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x64_iu4_w32:
20058 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x64_iu4_w64:
20059 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_fp8_w32:
20060 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_fp8_w64:
20061 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_bf8_w32:
20062 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_bf8_w64:
20063 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_fp8_w32:
20064 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_fp8_w64:
20065 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_bf8_w32:
20066 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_bf8_w64: {
20079 bool AppendFalseForOpselArg =
false;
20080 unsigned BuiltinWMMAOp;
20082 switch (BuiltinID) {
20083 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w32:
20084 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w64:
20085 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w32_gfx12:
20086 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w64_gfx12:
20087 ArgsForMatchingMatrixTypes = {2, 0};
20088 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x16_f16;
20090 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w32:
20091 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w64:
20092 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w32_gfx12:
20093 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w64_gfx12:
20094 ArgsForMatchingMatrixTypes = {2, 0};
20095 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x16_bf16;
20097 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w32_gfx12:
20098 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w64_gfx12:
20099 AppendFalseForOpselArg =
true;
20101 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w32:
20102 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w64:
20103 ArgsForMatchingMatrixTypes = {2, 0};
20104 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f16_16x16x16_f16;
20106 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w32_gfx12:
20107 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w64_gfx12:
20108 AppendFalseForOpselArg =
true;
20110 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w32:
20111 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w64:
20112 ArgsForMatchingMatrixTypes = {2, 0};
20113 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_bf16_16x16x16_bf16;
20115 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_tied_w32:
20116 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_tied_w64:
20117 ArgsForMatchingMatrixTypes = {2, 0};
20118 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f16_16x16x16_f16_tied;
20120 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_tied_w32:
20121 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_tied_w64:
20122 ArgsForMatchingMatrixTypes = {2, 0};
20123 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_bf16_16x16x16_bf16_tied;
20125 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w32:
20126 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w64:
20127 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w32_gfx12:
20128 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w64_gfx12:
20129 ArgsForMatchingMatrixTypes = {4, 1};
20130 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_i32_16x16x16_iu8;
20132 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w32:
20133 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w64:
20134 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w32_gfx12:
20135 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w64_gfx12:
20136 ArgsForMatchingMatrixTypes = {4, 1};
20137 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_i32_16x16x16_iu4;
20139 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_fp8_w32_gfx12:
20140 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_fp8_w64_gfx12:
20141 ArgsForMatchingMatrixTypes = {2, 0};
20142 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x16_fp8_fp8;
20144 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_bf8_w32_gfx12:
20145 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_bf8_w64_gfx12:
20146 ArgsForMatchingMatrixTypes = {2, 0};
20147 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x16_fp8_bf8;
20149 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_fp8_w32_gfx12:
20150 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_fp8_w64_gfx12:
20151 ArgsForMatchingMatrixTypes = {2, 0};
20152 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x16_bf8_fp8;
20154 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_bf8_w32_gfx12:
20155 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_bf8_w64_gfx12:
20156 ArgsForMatchingMatrixTypes = {2, 0};
20157 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x16_bf8_bf8;
20159 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x32_iu4_w32_gfx12:
20160 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x32_iu4_w64_gfx12:
20161 ArgsForMatchingMatrixTypes = {4, 1};
20162 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_i32_16x16x32_iu4;
20164 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_f16_w32:
20165 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_f16_w64:
20166 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
20167 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x32_f16;
20169 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf16_w32:
20170 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf16_w64:
20171 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
20172 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x32_bf16;
20174 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x32_f16_w32:
20175 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x32_f16_w64:
20176 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
20177 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f16_16x16x32_f16;
20179 case AMDGPU::BI__builtin_amdgcn_swmmac_bf16_16x16x32_bf16_w32:
20180 case AMDGPU::BI__builtin_amdgcn_swmmac_bf16_16x16x32_bf16_w64:
20181 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
20182 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_bf16_16x16x32_bf16;
20184 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu8_w32:
20185 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu8_w64:
20186 ArgsForMatchingMatrixTypes = {4, 1, 3, 5};
20187 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_i32_16x16x32_iu8;
20189 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu4_w32:
20190 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu4_w64:
20191 ArgsForMatchingMatrixTypes = {4, 1, 3, 5};
20192 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_i32_16x16x32_iu4;
20194 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x64_iu4_w32:
20195 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x64_iu4_w64:
20196 ArgsForMatchingMatrixTypes = {4, 1, 3, 5};
20197 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_i32_16x16x64_iu4;
20199 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_fp8_w32:
20200 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_fp8_w64:
20201 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
20202 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x32_fp8_fp8;
20204 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_bf8_w32:
20205 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_bf8_w64:
20206 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
20207 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x32_fp8_bf8;
20209 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_fp8_w32:
20210 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_fp8_w64:
20211 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
20212 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x32_bf8_fp8;
20214 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_bf8_w32:
20215 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_bf8_w64:
20216 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
20217 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x32_bf8_bf8;
20222 for (
int i = 0, e =
E->getNumArgs(); i != e; ++i)
20224 if (AppendFalseForOpselArg)
20225 Args.push_back(
Builder.getFalse());
20228 for (
auto ArgIdx : ArgsForMatchingMatrixTypes)
20229 ArgTypes.push_back(Args[ArgIdx]->getType());
20232 return Builder.CreateCall(F, Args);
20236 case AMDGPU::BI__builtin_amdgcn_workitem_id_x:
20238 case AMDGPU::BI__builtin_amdgcn_workitem_id_y:
20240 case AMDGPU::BI__builtin_amdgcn_workitem_id_z:
20244 case AMDGPU::BI__builtin_amdgcn_workgroup_size_x:
20245 return EmitAMDGPUWorkGroupSize(*
this, 0);
20246 case AMDGPU::BI__builtin_amdgcn_workgroup_size_y:
20247 return EmitAMDGPUWorkGroupSize(*
this, 1);
20248 case AMDGPU::BI__builtin_amdgcn_workgroup_size_z:
20249 return EmitAMDGPUWorkGroupSize(*
this, 2);
20252 case AMDGPU::BI__builtin_amdgcn_grid_size_x:
20253 return EmitAMDGPUGridSize(*
this, 0);
20254 case AMDGPU::BI__builtin_amdgcn_grid_size_y:
20255 return EmitAMDGPUGridSize(*
this, 1);
20256 case AMDGPU::BI__builtin_amdgcn_grid_size_z:
20257 return EmitAMDGPUGridSize(*
this, 2);
20260 case AMDGPU::BI__builtin_r600_recipsqrt_ieee:
20261 case AMDGPU::BI__builtin_r600_recipsqrt_ieeef:
20262 return emitBuiltinWithOneOverloadedType<1>(*
this,
E,
20263 Intrinsic::r600_recipsqrt_ieee);
20264 case AMDGPU::BI__builtin_r600_read_tidig_x:
20266 case AMDGPU::BI__builtin_r600_read_tidig_y:
20268 case AMDGPU::BI__builtin_r600_read_tidig_z:
20270 case AMDGPU::BI__builtin_amdgcn_alignbit: {
20275 return Builder.CreateCall(F, { Src0, Src1, Src2 });
20277 case AMDGPU::BI__builtin_amdgcn_fence: {
20280 FenceInst *Fence =
Builder.CreateFence(AO, SSID);
20281 if (
E->getNumArgs() > 2)
20285 case AMDGPU::BI__builtin_amdgcn_atomic_inc32:
20286 case AMDGPU::BI__builtin_amdgcn_atomic_inc64:
20287 case AMDGPU::BI__builtin_amdgcn_atomic_dec32:
20288 case AMDGPU::BI__builtin_amdgcn_atomic_dec64:
20289 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_f64:
20290 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_f32:
20291 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_v2f16:
20292 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_v2bf16:
20293 case AMDGPU::BI__builtin_amdgcn_ds_faddf:
20294 case AMDGPU::BI__builtin_amdgcn_ds_fminf:
20295 case AMDGPU::BI__builtin_amdgcn_ds_fmaxf:
20296 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_f32:
20297 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_f64:
20298 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_v2f16:
20299 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_v2f16:
20300 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_f32:
20301 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_f64:
20302 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_v2bf16:
20303 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_v2bf16:
20304 case AMDGPU::BI__builtin_amdgcn_global_atomic_fmin_f64:
20305 case AMDGPU::BI__builtin_amdgcn_global_atomic_fmax_f64:
20306 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fmin_f64:
20307 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fmax_f64: {
20308 llvm::AtomicRMWInst::BinOp BinOp;
20309 switch (BuiltinID) {
20310 case AMDGPU::BI__builtin_amdgcn_atomic_inc32:
20311 case AMDGPU::BI__builtin_amdgcn_atomic_inc64:
20312 BinOp = llvm::AtomicRMWInst::UIncWrap;
20314 case AMDGPU::BI__builtin_amdgcn_atomic_dec32:
20315 case AMDGPU::BI__builtin_amdgcn_atomic_dec64:
20316 BinOp = llvm::AtomicRMWInst::UDecWrap;
20318 case AMDGPU::BI__builtin_amdgcn_ds_faddf:
20319 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_f64:
20320 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_f32:
20321 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_v2f16:
20322 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_v2bf16:
20323 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_f32:
20324 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_f64:
20325 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_v2f16:
20326 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_v2f16:
20327 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_f32:
20328 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_f64:
20329 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_v2bf16:
20330 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_v2bf16:
20331 BinOp = llvm::AtomicRMWInst::FAdd;
20333 case AMDGPU::BI__builtin_amdgcn_ds_fminf:
20334 case AMDGPU::BI__builtin_amdgcn_global_atomic_fmin_f64:
20335 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fmin_f64:
20336 BinOp = llvm::AtomicRMWInst::FMin;
20338 case AMDGPU::BI__builtin_amdgcn_global_atomic_fmax_f64:
20339 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fmax_f64:
20340 case AMDGPU::BI__builtin_amdgcn_ds_fmaxf:
20341 BinOp = llvm::AtomicRMWInst::FMax;
20347 llvm::Type *OrigTy = Val->
getType();
20352 if (BuiltinID == AMDGPU::BI__builtin_amdgcn_ds_faddf ||
20353 BuiltinID == AMDGPU::BI__builtin_amdgcn_ds_fminf ||
20354 BuiltinID == AMDGPU::BI__builtin_amdgcn_ds_fmaxf) {
20364 if (
E->getNumArgs() >= 4) {
20376 AO = AtomicOrdering::Monotonic;
20379 if (BuiltinID == AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_v2bf16 ||
20380 BuiltinID == AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_v2bf16 ||
20381 BuiltinID == AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_v2bf16) {
20382 llvm::Type *V2BF16Ty = FixedVectorType::get(
20383 llvm::Type::getBFloatTy(
Builder.getContext()), 2);
20384 Val =
Builder.CreateBitCast(Val, V2BF16Ty);
20388 llvm::AtomicRMWInst *RMW =
20391 RMW->setVolatile(
true);
20393 unsigned AddrSpace = Ptr.
getType()->getAddressSpace();
20394 if (AddrSpace != llvm::AMDGPUAS::LOCAL_ADDRESS) {
20398 RMW->setMetadata(
"amdgpu.no.fine.grained.memory", EmptyMD);
20402 if (BinOp == llvm::AtomicRMWInst::FAdd && Val->
getType()->isFloatTy())
20403 RMW->setMetadata(
"amdgpu.ignore.denormal.mode", EmptyMD);
20406 return Builder.CreateBitCast(RMW, OrigTy);
20408 case AMDGPU::BI__builtin_amdgcn_s_sendmsg_rtn:
20409 case AMDGPU::BI__builtin_amdgcn_s_sendmsg_rtnl: {
20415 return Builder.CreateCall(F, {Arg});
20417 case AMDGPU::BI__builtin_amdgcn_permlane16_swap:
20418 case AMDGPU::BI__builtin_amdgcn_permlane32_swap: {
20426 CGM.
getIntrinsic(BuiltinID == AMDGPU::BI__builtin_amdgcn_permlane16_swap
20427 ? Intrinsic::amdgcn_permlane16_swap
20428 : Intrinsic::amdgcn_permlane32_swap);
20429 llvm::CallInst *
Call =
20430 Builder.CreateCall(F, {VDstOld, VSrcOld, FI, BoundCtrl});
20432 llvm::Value *Elt0 =
Builder.CreateExtractValue(
Call, 0);
20433 llvm::Value *Elt1 =
Builder.CreateExtractValue(
Call, 1);
20437 llvm::Value *Insert0 =
Builder.CreateInsertElement(
20438 llvm::PoisonValue::get(ResultType), Elt0, UINT64_C(0));
20439 llvm::Value *AsVector =
20440 Builder.CreateInsertElement(Insert0, Elt1, UINT64_C(1));
20443 case AMDGPU::BI__builtin_amdgcn_bitop3_b32:
20444 case AMDGPU::BI__builtin_amdgcn_bitop3_b16:
20446 case AMDGPU::BI__builtin_amdgcn_make_buffer_rsrc:
20447 return emitBuiltinWithOneOverloadedType<4>(
20448 *
this,
E, Intrinsic::amdgcn_make_buffer_rsrc);
20449 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_b8:
20450 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_b16:
20451 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_b32:
20452 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_b64:
20453 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_b96:
20454 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_b128:
20455 return emitBuiltinWithOneOverloadedType<5>(
20456 *
this,
E, Intrinsic::amdgcn_raw_ptr_buffer_store);
20457 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b8:
20458 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b16:
20459 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b32:
20460 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b64:
20461 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b96:
20462 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b128: {
20463 llvm::Type *RetTy =
nullptr;
20464 switch (BuiltinID) {
20465 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b8:
20468 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b16:
20471 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b32:
20474 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b64:
20475 RetTy = llvm::FixedVectorType::get(
Int32Ty, 2);
20477 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b96:
20478 RetTy = llvm::FixedVectorType::get(
Int32Ty, 3);
20480 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b128:
20481 RetTy = llvm::FixedVectorType::get(
Int32Ty, 4);
20490 case AMDGPU::BI__builtin_amdgcn_s_prefetch_data:
20491 return emitBuiltinWithOneOverloadedType<2>(
20492 *
this,
E, Intrinsic::amdgcn_s_prefetch_data);
20500 switch (BuiltinID) {
20501 case SPIRV::BI__builtin_spirv_distance: {
20506 "Distance operands must have a float representation");
20509 "Distance operands must be a vector");
20510 return Builder.CreateIntrinsic(
20511 X->getType()->getScalarType(), Intrinsic::spv_distance,
20522 unsigned IntrinsicID,
20524 unsigned NumArgs =
E->getNumArgs() - 1;
20526 for (
unsigned I = 0; I < NumArgs; ++I)
20538 switch (BuiltinID) {
20539 case SystemZ::BI__builtin_tbegin: {
20541 Value *Control = llvm::ConstantInt::get(
Int32Ty, 0xff0c);
20543 return Builder.CreateCall(F, {TDB, Control});
20545 case SystemZ::BI__builtin_tbegin_nofloat: {
20547 Value *Control = llvm::ConstantInt::get(
Int32Ty, 0xff0c);
20549 return Builder.CreateCall(F, {TDB, Control});
20551 case SystemZ::BI__builtin_tbeginc: {
20553 Value *Control = llvm::ConstantInt::get(
Int32Ty, 0xff08);
20555 return Builder.CreateCall(F, {TDB, Control});
20557 case SystemZ::BI__builtin_tabort: {
20562 case SystemZ::BI__builtin_non_tx_store: {
20574 case SystemZ::BI__builtin_s390_vclzb:
20575 case SystemZ::BI__builtin_s390_vclzh:
20576 case SystemZ::BI__builtin_s390_vclzf:
20577 case SystemZ::BI__builtin_s390_vclzg: {
20580 Value *Undef = ConstantInt::get(
Builder.getInt1Ty(),
false);
20582 return Builder.CreateCall(F, {
X, Undef});
20585 case SystemZ::BI__builtin_s390_vctzb:
20586 case SystemZ::BI__builtin_s390_vctzh:
20587 case SystemZ::BI__builtin_s390_vctzf:
20588 case SystemZ::BI__builtin_s390_vctzg: {
20591 Value *Undef = ConstantInt::get(
Builder.getInt1Ty(),
false);
20593 return Builder.CreateCall(F, {
X, Undef});
20596 case SystemZ::BI__builtin_s390_verllb:
20597 case SystemZ::BI__builtin_s390_verllh:
20598 case SystemZ::BI__builtin_s390_verllf:
20599 case SystemZ::BI__builtin_s390_verllg: {
20604 unsigned NumElts = cast<llvm::FixedVectorType>(ResultType)->getNumElements();
20605 Amt =
Builder.CreateIntCast(Amt, ResultType->getScalarType(),
false);
20606 Amt =
Builder.CreateVectorSplat(NumElts, Amt);
20608 return Builder.CreateCall(F, { Src, Src, Amt });
20611 case SystemZ::BI__builtin_s390_verllvb:
20612 case SystemZ::BI__builtin_s390_verllvh:
20613 case SystemZ::BI__builtin_s390_verllvf:
20614 case SystemZ::BI__builtin_s390_verllvg: {
20619 return Builder.CreateCall(F, { Src, Src, Amt });
20622 case SystemZ::BI__builtin_s390_vfsqsb:
20623 case SystemZ::BI__builtin_s390_vfsqdb: {
20626 if (
Builder.getIsFPConstrained()) {
20628 return Builder.CreateConstrainedFPCall(F, {
X });
20634 case SystemZ::BI__builtin_s390_vfmasb:
20635 case SystemZ::BI__builtin_s390_vfmadb: {
20640 if (
Builder.getIsFPConstrained()) {
20642 return Builder.CreateConstrainedFPCall(F, {
X, Y, Z});
20645 return Builder.CreateCall(F, {
X, Y, Z});
20648 case SystemZ::BI__builtin_s390_vfmssb:
20649 case SystemZ::BI__builtin_s390_vfmsdb: {
20654 if (
Builder.getIsFPConstrained()) {
20656 return Builder.CreateConstrainedFPCall(F, {
X, Y,
Builder.CreateFNeg(Z,
"neg")});
20662 case SystemZ::BI__builtin_s390_vfnmasb:
20663 case SystemZ::BI__builtin_s390_vfnmadb: {
20668 if (
Builder.getIsFPConstrained()) {
20670 return Builder.CreateFNeg(
Builder.CreateConstrainedFPCall(F, {X, Y, Z}),
"neg");
20673 return Builder.CreateFNeg(
Builder.CreateCall(F, {X, Y, Z}),
"neg");
20676 case SystemZ::BI__builtin_s390_vfnmssb:
20677 case SystemZ::BI__builtin_s390_vfnmsdb: {
20682 if (
Builder.getIsFPConstrained()) {
20685 return Builder.CreateFNeg(
Builder.CreateConstrainedFPCall(F, {X, Y, NegZ}));
20692 case SystemZ::BI__builtin_s390_vflpsb:
20693 case SystemZ::BI__builtin_s390_vflpdb: {
20699 case SystemZ::BI__builtin_s390_vflnsb:
20700 case SystemZ::BI__builtin_s390_vflndb: {
20706 case SystemZ::BI__builtin_s390_vfisb:
20707 case SystemZ::BI__builtin_s390_vfidb: {
20715 Intrinsic::ID
ID = Intrinsic::not_intrinsic;
20717 switch (M4.getZExtValue()) {
20720 switch (M5.getZExtValue()) {
20722 case 0:
ID = Intrinsic::rint;
20723 CI = Intrinsic::experimental_constrained_rint;
break;
20727 switch (M5.getZExtValue()) {
20729 case 0:
ID = Intrinsic::nearbyint;
20730 CI = Intrinsic::experimental_constrained_nearbyint;
break;
20731 case 1:
ID = Intrinsic::round;
20732 CI = Intrinsic::experimental_constrained_round;
break;
20733 case 5:
ID = Intrinsic::trunc;
20734 CI = Intrinsic::experimental_constrained_trunc;
break;
20735 case 6:
ID = Intrinsic::ceil;
20736 CI = Intrinsic::experimental_constrained_ceil;
break;
20737 case 7:
ID = Intrinsic::floor;
20738 CI = Intrinsic::experimental_constrained_floor;
break;
20742 if (ID != Intrinsic::not_intrinsic) {
20743 if (
Builder.getIsFPConstrained()) {
20745 return Builder.CreateConstrainedFPCall(F,
X);
20751 switch (BuiltinID) {
20752 case SystemZ::BI__builtin_s390_vfisb:
ID = Intrinsic::s390_vfisb;
break;
20753 case SystemZ::BI__builtin_s390_vfidb:
ID = Intrinsic::s390_vfidb;
break;
20754 default: llvm_unreachable(
"Unknown BuiltinID");
20759 return Builder.CreateCall(F, {
X, M4Value, M5Value});
20761 case SystemZ::BI__builtin_s390_vfmaxsb:
20762 case SystemZ::BI__builtin_s390_vfmaxdb: {
20770 Intrinsic::ID
ID = Intrinsic::not_intrinsic;
20772 switch (M4.getZExtValue()) {
20774 case 4:
ID = Intrinsic::maxnum;
20775 CI = Intrinsic::experimental_constrained_maxnum;
break;
20777 if (ID != Intrinsic::not_intrinsic) {
20778 if (
Builder.getIsFPConstrained()) {
20780 return Builder.CreateConstrainedFPCall(F, {
X, Y});
20783 return Builder.CreateCall(F, {
X, Y});
20786 switch (BuiltinID) {
20787 case SystemZ::BI__builtin_s390_vfmaxsb:
ID = Intrinsic::s390_vfmaxsb;
break;
20788 case SystemZ::BI__builtin_s390_vfmaxdb:
ID = Intrinsic::s390_vfmaxdb;
break;
20789 default: llvm_unreachable(
"Unknown BuiltinID");
20793 return Builder.CreateCall(F, {
X, Y, M4Value});
20795 case SystemZ::BI__builtin_s390_vfminsb:
20796 case SystemZ::BI__builtin_s390_vfmindb: {
20804 Intrinsic::ID
ID = Intrinsic::not_intrinsic;
20806 switch (M4.getZExtValue()) {
20808 case 4:
ID = Intrinsic::minnum;
20809 CI = Intrinsic::experimental_constrained_minnum;
break;
20811 if (ID != Intrinsic::not_intrinsic) {
20812 if (
Builder.getIsFPConstrained()) {
20814 return Builder.CreateConstrainedFPCall(F, {
X, Y});
20817 return Builder.CreateCall(F, {
X, Y});
20820 switch (BuiltinID) {
20821 case SystemZ::BI__builtin_s390_vfminsb:
ID = Intrinsic::s390_vfminsb;
break;
20822 case SystemZ::BI__builtin_s390_vfmindb:
ID = Intrinsic::s390_vfmindb;
break;
20823 default: llvm_unreachable(
"Unknown BuiltinID");
20827 return Builder.CreateCall(F, {
X, Y, M4Value});
20830 case SystemZ::BI__builtin_s390_vlbrh:
20831 case SystemZ::BI__builtin_s390_vlbrf:
20832 case SystemZ::BI__builtin_s390_vlbrg: {
20841#define INTRINSIC_WITH_CC(NAME) \
20842 case SystemZ::BI__builtin_##NAME: \
20843 return EmitSystemZIntrinsicWithCC(*this, Intrinsic::NAME, E)
20922#undef INTRINSIC_WITH_CC
20931struct NVPTXMmaLdstInfo {
20932 unsigned NumResults;
20938#define MMA_INTR(geom_op_type, layout) \
20939 Intrinsic::nvvm_wmma_##geom_op_type##_##layout##_stride
20940#define MMA_LDST(n, geom_op_type) \
20941 { n, MMA_INTR(geom_op_type, col), MMA_INTR(geom_op_type, row) }
20943static NVPTXMmaLdstInfo getNVPTXMmaLdstInfo(
unsigned BuiltinID) {
20944 switch (BuiltinID) {
20946 case NVPTX::BI__hmma_m16n16k16_ld_a:
20947 return MMA_LDST(8, m16n16k16_load_a_f16);
20948 case NVPTX::BI__hmma_m16n16k16_ld_b:
20949 return MMA_LDST(8, m16n16k16_load_b_f16);
20950 case NVPTX::BI__hmma_m16n16k16_ld_c_f16:
20951 return MMA_LDST(4, m16n16k16_load_c_f16);
20952 case NVPTX::BI__hmma_m16n16k16_ld_c_f32:
20953 return MMA_LDST(8, m16n16k16_load_c_f32);
20954 case NVPTX::BI__hmma_m32n8k16_ld_a:
20955 return MMA_LDST(8, m32n8k16_load_a_f16);
20956 case NVPTX::BI__hmma_m32n8k16_ld_b:
20957 return MMA_LDST(8, m32n8k16_load_b_f16);
20958 case NVPTX::BI__hmma_m32n8k16_ld_c_f16:
20959 return MMA_LDST(4, m32n8k16_load_c_f16);
20960 case NVPTX::BI__hmma_m32n8k16_ld_c_f32:
20961 return MMA_LDST(8, m32n8k16_load_c_f32);
20962 case NVPTX::BI__hmma_m8n32k16_ld_a:
20963 return MMA_LDST(8, m8n32k16_load_a_f16);
20964 case NVPTX::BI__hmma_m8n32k16_ld_b:
20965 return MMA_LDST(8, m8n32k16_load_b_f16);
20966 case NVPTX::BI__hmma_m8n32k16_ld_c_f16:
20967 return MMA_LDST(4, m8n32k16_load_c_f16);
20968 case NVPTX::BI__hmma_m8n32k16_ld_c_f32:
20969 return MMA_LDST(8, m8n32k16_load_c_f32);
20972 case NVPTX::BI__imma_m16n16k16_ld_a_s8:
20973 return MMA_LDST(2, m16n16k16_load_a_s8);
20974 case NVPTX::BI__imma_m16n16k16_ld_a_u8:
20975 return MMA_LDST(2, m16n16k16_load_a_u8);
20976 case NVPTX::BI__imma_m16n16k16_ld_b_s8:
20977 return MMA_LDST(2, m16n16k16_load_b_s8);
20978 case NVPTX::BI__imma_m16n16k16_ld_b_u8:
20979 return MMA_LDST(2, m16n16k16_load_b_u8);
20980 case NVPTX::BI__imma_m16n16k16_ld_c:
20981 return MMA_LDST(8, m16n16k16_load_c_s32);
20982 case NVPTX::BI__imma_m32n8k16_ld_a_s8:
20983 return MMA_LDST(4, m32n8k16_load_a_s8);
20984 case NVPTX::BI__imma_m32n8k16_ld_a_u8:
20985 return MMA_LDST(4, m32n8k16_load_a_u8);
20986 case NVPTX::BI__imma_m32n8k16_ld_b_s8:
20987 return MMA_LDST(1, m32n8k16_load_b_s8);
20988 case NVPTX::BI__imma_m32n8k16_ld_b_u8:
20989 return MMA_LDST(1, m32n8k16_load_b_u8);
20990 case NVPTX::BI__imma_m32n8k16_ld_c:
20991 return MMA_LDST(8, m32n8k16_load_c_s32);
20992 case NVPTX::BI__imma_m8n32k16_ld_a_s8:
20993 return MMA_LDST(1, m8n32k16_load_a_s8);
20994 case NVPTX::BI__imma_m8n32k16_ld_a_u8:
20995 return MMA_LDST(1, m8n32k16_load_a_u8);
20996 case NVPTX::BI__imma_m8n32k16_ld_b_s8:
20997 return MMA_LDST(4, m8n32k16_load_b_s8);
20998 case NVPTX::BI__imma_m8n32k16_ld_b_u8:
20999 return MMA_LDST(4, m8n32k16_load_b_u8);
21000 case NVPTX::BI__imma_m8n32k16_ld_c:
21001 return MMA_LDST(8, m8n32k16_load_c_s32);
21005 case NVPTX::BI__imma_m8n8k32_ld_a_s4:
21006 return {1, 0,
MMA_INTR(m8n8k32_load_a_s4, row)};
21007 case NVPTX::BI__imma_m8n8k32_ld_a_u4:
21008 return {1, 0,
MMA_INTR(m8n8k32_load_a_u4, row)};
21009 case NVPTX::BI__imma_m8n8k32_ld_b_s4:
21010 return {1,
MMA_INTR(m8n8k32_load_b_s4, col), 0};
21011 case NVPTX::BI__imma_m8n8k32_ld_b_u4:
21012 return {1,
MMA_INTR(m8n8k32_load_b_u4, col), 0};
21013 case NVPTX::BI__imma_m8n8k32_ld_c:
21014 return MMA_LDST(2, m8n8k32_load_c_s32);
21015 case NVPTX::BI__bmma_m8n8k128_ld_a_b1:
21016 return {1, 0,
MMA_INTR(m8n8k128_load_a_b1, row)};
21017 case NVPTX::BI__bmma_m8n8k128_ld_b_b1:
21018 return {1,
MMA_INTR(m8n8k128_load_b_b1, col), 0};
21019 case NVPTX::BI__bmma_m8n8k128_ld_c:
21020 return MMA_LDST(2, m8n8k128_load_c_s32);
21023 case NVPTX::BI__dmma_m8n8k4_ld_a:
21024 return MMA_LDST(1, m8n8k4_load_a_f64);
21025 case NVPTX::BI__dmma_m8n8k4_ld_b:
21026 return MMA_LDST(1, m8n8k4_load_b_f64);
21027 case NVPTX::BI__dmma_m8n8k4_ld_c:
21028 return MMA_LDST(2, m8n8k4_load_c_f64);
21031 case NVPTX::BI__mma_bf16_m16n16k16_ld_a:
21032 return MMA_LDST(4, m16n16k16_load_a_bf16);
21033 case NVPTX::BI__mma_bf16_m16n16k16_ld_b:
21034 return MMA_LDST(4, m16n16k16_load_b_bf16);
21035 case NVPTX::BI__mma_bf16_m8n32k16_ld_a:
21036 return MMA_LDST(2, m8n32k16_load_a_bf16);
21037 case NVPTX::BI__mma_bf16_m8n32k16_ld_b:
21038 return MMA_LDST(8, m8n32k16_load_b_bf16);
21039 case NVPTX::BI__mma_bf16_m32n8k16_ld_a:
21040 return MMA_LDST(8, m32n8k16_load_a_bf16);
21041 case NVPTX::BI__mma_bf16_m32n8k16_ld_b:
21042 return MMA_LDST(2, m32n8k16_load_b_bf16);
21043 case NVPTX::BI__mma_tf32_m16n16k8_ld_a:
21044 return MMA_LDST(4, m16n16k8_load_a_tf32);
21045 case NVPTX::BI__mma_tf32_m16n16k8_ld_b:
21046 return MMA_LDST(4, m16n16k8_load_b_tf32);
21047 case NVPTX::BI__mma_tf32_m16n16k8_ld_c:
21048 return MMA_LDST(8, m16n16k8_load_c_f32);
21054 case NVPTX::BI__hmma_m16n16k16_st_c_f16:
21055 return MMA_LDST(4, m16n16k16_store_d_f16);
21056 case NVPTX::BI__hmma_m16n16k16_st_c_f32:
21057 return MMA_LDST(8, m16n16k16_store_d_f32);
21058 case NVPTX::BI__hmma_m32n8k16_st_c_f16:
21059 return MMA_LDST(4, m32n8k16_store_d_f16);
21060 case NVPTX::BI__hmma_m32n8k16_st_c_f32:
21061 return MMA_LDST(8, m32n8k16_store_d_f32);
21062 case NVPTX::BI__hmma_m8n32k16_st_c_f16:
21063 return MMA_LDST(4, m8n32k16_store_d_f16);
21064 case NVPTX::BI__hmma_m8n32k16_st_c_f32:
21065 return MMA_LDST(8, m8n32k16_store_d_f32);
21070 case NVPTX::BI__imma_m16n16k16_st_c_i32:
21071 return MMA_LDST(8, m16n16k16_store_d_s32);
21072 case NVPTX::BI__imma_m32n8k16_st_c_i32:
21073 return MMA_LDST(8, m32n8k16_store_d_s32);
21074 case NVPTX::BI__imma_m8n32k16_st_c_i32:
21075 return MMA_LDST(8, m8n32k16_store_d_s32);
21076 case NVPTX::BI__imma_m8n8k32_st_c_i32:
21077 return MMA_LDST(2, m8n8k32_store_d_s32);
21078 case NVPTX::BI__bmma_m8n8k128_st_c_i32:
21079 return MMA_LDST(2, m8n8k128_store_d_s32);
21082 case NVPTX::BI__dmma_m8n8k4_st_c_f64:
21083 return MMA_LDST(2, m8n8k4_store_d_f64);
21086 case NVPTX::BI__mma_m16n16k8_st_c_f32:
21087 return MMA_LDST(8, m16n16k8_store_d_f32);
21090 llvm_unreachable(
"Unknown MMA builtin");
21097struct NVPTXMmaInfo {
21106 std::array<unsigned, 8> Variants;
21108 unsigned getMMAIntrinsic(
int Layout,
bool Satf) {
21109 unsigned Index = Layout + 4 * Satf;
21110 if (Index >= Variants.size())
21112 return Variants[Index];
21118static NVPTXMmaInfo getNVPTXMmaInfo(
unsigned BuiltinID) {
21120#define MMA_VARIANTS(geom, type) \
21121 Intrinsic::nvvm_wmma_##geom##_mma_row_row_##type, \
21122 Intrinsic::nvvm_wmma_##geom##_mma_row_col_##type, \
21123 Intrinsic::nvvm_wmma_##geom##_mma_col_row_##type, \
21124 Intrinsic::nvvm_wmma_##geom##_mma_col_col_##type
21125#define MMA_SATF_VARIANTS(geom, type) \
21126 MMA_VARIANTS(geom, type), \
21127 Intrinsic::nvvm_wmma_##geom##_mma_row_row_##type##_satfinite, \
21128 Intrinsic::nvvm_wmma_##geom##_mma_row_col_##type##_satfinite, \
21129 Intrinsic::nvvm_wmma_##geom##_mma_col_row_##type##_satfinite, \
21130 Intrinsic::nvvm_wmma_##geom##_mma_col_col_##type##_satfinite
21132#define MMA_VARIANTS_I4(geom, type) \
21134 Intrinsic::nvvm_wmma_##geom##_mma_row_col_##type, \
21138 Intrinsic::nvvm_wmma_##geom##_mma_row_col_##type##_satfinite, \
21142#define MMA_VARIANTS_B1_XOR(geom, type) \
21144 Intrinsic::nvvm_wmma_##geom##_mma_xor_popc_row_col_##type, \
21151#define MMA_VARIANTS_B1_AND(geom, type) \
21153 Intrinsic::nvvm_wmma_##geom##_mma_and_popc_row_col_##type, \
21161 switch (BuiltinID) {
21165 case NVPTX::BI__hmma_m16n16k16_mma_f16f16:
21167 case NVPTX::BI__hmma_m16n16k16_mma_f32f16:
21169 case NVPTX::BI__hmma_m16n16k16_mma_f16f32:
21171 case NVPTX::BI__hmma_m16n16k16_mma_f32f32:
21173 case NVPTX::BI__hmma_m32n8k16_mma_f16f16:
21175 case NVPTX::BI__hmma_m32n8k16_mma_f32f16:
21177 case NVPTX::BI__hmma_m32n8k16_mma_f16f32:
21179 case NVPTX::BI__hmma_m32n8k16_mma_f32f32:
21181 case NVPTX::BI__hmma_m8n32k16_mma_f16f16:
21183 case NVPTX::BI__hmma_m8n32k16_mma_f32f16:
21185 case NVPTX::BI__hmma_m8n32k16_mma_f16f32:
21187 case NVPTX::BI__hmma_m8n32k16_mma_f32f32:
21191 case NVPTX::BI__imma_m16n16k16_mma_s8:
21193 case NVPTX::BI__imma_m16n16k16_mma_u8:
21195 case NVPTX::BI__imma_m32n8k16_mma_s8:
21197 case NVPTX::BI__imma_m32n8k16_mma_u8:
21199 case NVPTX::BI__imma_m8n32k16_mma_s8:
21201 case NVPTX::BI__imma_m8n32k16_mma_u8:
21205 case NVPTX::BI__imma_m8n8k32_mma_s4:
21207 case NVPTX::BI__imma_m8n8k32_mma_u4:
21209 case NVPTX::BI__bmma_m8n8k128_mma_xor_popc_b1:
21211 case NVPTX::BI__bmma_m8n8k128_mma_and_popc_b1:
21215 case NVPTX::BI__dmma_m8n8k4_mma_f64:
21219 case NVPTX::BI__mma_bf16_m16n16k16_mma_f32:
21220 return {4, 4, 8, 8, {{
MMA_VARIANTS(m16n16k16, bf16)}}};
21221 case NVPTX::BI__mma_bf16_m8n32k16_mma_f32:
21222 return {2, 8, 8, 8, {{
MMA_VARIANTS(m8n32k16, bf16)}}};
21223 case NVPTX::BI__mma_bf16_m32n8k16_mma_f32:
21224 return {8, 2, 8, 8, {{
MMA_VARIANTS(m32n8k16, bf16)}}};
21225 case NVPTX::BI__mma_tf32_m16n16k8_mma_f32:
21226 return {4, 4, 8, 8, {{
MMA_VARIANTS(m16n16k8, tf32)}}};
21228 llvm_unreachable(
"Unexpected builtin ID.");
21231#undef MMA_SATF_VARIANTS
21232#undef MMA_VARIANTS_I4
21233#undef MMA_VARIANTS_B1_AND
21234#undef MMA_VARIANTS_B1_XOR
21243 return CGF.
Builder.CreateCall(
21245 {Ptr, ConstantInt::get(CGF.Builder.getInt32Ty(), Align.getQuantity())});
21257 MDNode *MD = MDNode::get(CGF.
Builder.getContext(), {});
21258 LD->setMetadata(LLVMContext::MD_invariant_load, MD);
21266 llvm::Type *ElemTy =
21268 return CGF.
Builder.CreateCall(
21270 {Ptr, CGF.EmitScalarExpr(E->getArg(1))});
21273static Value *MakeCpAsync(
unsigned IntrinsicID,
unsigned IntrinsicIDS,
21276 return E->getNumArgs() == 3
21278 {CGF.EmitScalarExpr(E->getArg(0)),
21279 CGF.EmitScalarExpr(E->getArg(1)),
21280 CGF.EmitScalarExpr(E->getArg(2))})
21282 {CGF.EmitScalarExpr(E->getArg(0)),
21283 CGF.EmitScalarExpr(E->getArg(1))});
21286static Value *MakeHalfType(
unsigned IntrinsicID,
unsigned BuiltinID,
21289 if (!(
C.getLangOpts().NativeHalfType ||
21290 !
C.getTargetInfo().useFP16ConversionIntrinsics())) {
21292 " requires native half type support.");
21296 if (BuiltinID == NVPTX::BI__nvvm_ldg_h || BuiltinID == NVPTX::BI__nvvm_ldg_h2)
21297 return MakeLdg(CGF,
E);
21299 if (IntrinsicID == Intrinsic::nvvm_ldu_global_f)
21300 return MakeLdu(IntrinsicID, CGF,
E);
21304 auto *FTy = F->getFunctionType();
21305 unsigned ICEArguments = 0;
21307 C.GetBuiltinType(BuiltinID, Error, &ICEArguments);
21309 for (
unsigned i = 0, e =
E->getNumArgs(); i != e; ++i) {
21310 assert((ICEArguments & (1 << i)) == 0);
21312 auto *PTy = FTy->getParamType(i);
21313 if (PTy != ArgValue->
getType())
21314 ArgValue = CGF.
Builder.CreateBitCast(ArgValue, PTy);
21315 Args.push_back(ArgValue);
21318 return CGF.
Builder.CreateCall(F, Args);
21324 switch (BuiltinID) {
21325 case NVPTX::BI__nvvm_atom_add_gen_i:
21326 case NVPTX::BI__nvvm_atom_add_gen_l:
21327 case NVPTX::BI__nvvm_atom_add_gen_ll:
21330 case NVPTX::BI__nvvm_atom_sub_gen_i:
21331 case NVPTX::BI__nvvm_atom_sub_gen_l:
21332 case NVPTX::BI__nvvm_atom_sub_gen_ll:
21335 case NVPTX::BI__nvvm_atom_and_gen_i:
21336 case NVPTX::BI__nvvm_atom_and_gen_l:
21337 case NVPTX::BI__nvvm_atom_and_gen_ll:
21340 case NVPTX::BI__nvvm_atom_or_gen_i:
21341 case NVPTX::BI__nvvm_atom_or_gen_l:
21342 case NVPTX::BI__nvvm_atom_or_gen_ll:
21345 case NVPTX::BI__nvvm_atom_xor_gen_i:
21346 case NVPTX::BI__nvvm_atom_xor_gen_l:
21347 case NVPTX::BI__nvvm_atom_xor_gen_ll:
21350 case NVPTX::BI__nvvm_atom_xchg_gen_i:
21351 case NVPTX::BI__nvvm_atom_xchg_gen_l:
21352 case NVPTX::BI__nvvm_atom_xchg_gen_ll:
21355 case NVPTX::BI__nvvm_atom_max_gen_i:
21356 case NVPTX::BI__nvvm_atom_max_gen_l:
21357 case NVPTX::BI__nvvm_atom_max_gen_ll:
21360 case NVPTX::BI__nvvm_atom_max_gen_ui:
21361 case NVPTX::BI__nvvm_atom_max_gen_ul:
21362 case NVPTX::BI__nvvm_atom_max_gen_ull:
21365 case NVPTX::BI__nvvm_atom_min_gen_i:
21366 case NVPTX::BI__nvvm_atom_min_gen_l:
21367 case NVPTX::BI__nvvm_atom_min_gen_ll:
21370 case NVPTX::BI__nvvm_atom_min_gen_ui:
21371 case NVPTX::BI__nvvm_atom_min_gen_ul:
21372 case NVPTX::BI__nvvm_atom_min_gen_ull:
21375 case NVPTX::BI__nvvm_atom_cas_gen_us:
21376 case NVPTX::BI__nvvm_atom_cas_gen_i:
21377 case NVPTX::BI__nvvm_atom_cas_gen_l:
21378 case NVPTX::BI__nvvm_atom_cas_gen_ll:
21383 case NVPTX::BI__nvvm_atom_add_gen_f:
21384 case NVPTX::BI__nvvm_atom_add_gen_d: {
21389 AtomicOrdering::SequentiallyConsistent);
21392 case NVPTX::BI__nvvm_atom_inc_gen_ui: {
21397 return Builder.CreateCall(FnALI32, {Ptr, Val});
21400 case NVPTX::BI__nvvm_atom_dec_gen_ui: {
21405 return Builder.CreateCall(FnALD32, {Ptr, Val});
21408 case NVPTX::BI__nvvm_ldg_c:
21409 case NVPTX::BI__nvvm_ldg_sc:
21410 case NVPTX::BI__nvvm_ldg_c2:
21411 case NVPTX::BI__nvvm_ldg_sc2:
21412 case NVPTX::BI__nvvm_ldg_c4:
21413 case NVPTX::BI__nvvm_ldg_sc4:
21414 case NVPTX::BI__nvvm_ldg_s:
21415 case NVPTX::BI__nvvm_ldg_s2:
21416 case NVPTX::BI__nvvm_ldg_s4:
21417 case NVPTX::BI__nvvm_ldg_i:
21418 case NVPTX::BI__nvvm_ldg_i2:
21419 case NVPTX::BI__nvvm_ldg_i4:
21420 case NVPTX::BI__nvvm_ldg_l:
21421 case NVPTX::BI__nvvm_ldg_l2:
21422 case NVPTX::BI__nvvm_ldg_ll:
21423 case NVPTX::BI__nvvm_ldg_ll2:
21424 case NVPTX::BI__nvvm_ldg_uc:
21425 case NVPTX::BI__nvvm_ldg_uc2:
21426 case NVPTX::BI__nvvm_ldg_uc4:
21427 case NVPTX::BI__nvvm_ldg_us:
21428 case NVPTX::BI__nvvm_ldg_us2:
21429 case NVPTX::BI__nvvm_ldg_us4:
21430 case NVPTX::BI__nvvm_ldg_ui:
21431 case NVPTX::BI__nvvm_ldg_ui2:
21432 case NVPTX::BI__nvvm_ldg_ui4:
21433 case NVPTX::BI__nvvm_ldg_ul:
21434 case NVPTX::BI__nvvm_ldg_ul2:
21435 case NVPTX::BI__nvvm_ldg_ull:
21436 case NVPTX::BI__nvvm_ldg_ull2:
21437 case NVPTX::BI__nvvm_ldg_f:
21438 case NVPTX::BI__nvvm_ldg_f2:
21439 case NVPTX::BI__nvvm_ldg_f4:
21440 case NVPTX::BI__nvvm_ldg_d:
21441 case NVPTX::BI__nvvm_ldg_d2:
21445 return MakeLdg(*
this,
E);
21447 case NVPTX::BI__nvvm_ldu_c:
21448 case NVPTX::BI__nvvm_ldu_sc:
21449 case NVPTX::BI__nvvm_ldu_c2:
21450 case NVPTX::BI__nvvm_ldu_sc2:
21451 case NVPTX::BI__nvvm_ldu_c4:
21452 case NVPTX::BI__nvvm_ldu_sc4:
21453 case NVPTX::BI__nvvm_ldu_s:
21454 case NVPTX::BI__nvvm_ldu_s2:
21455 case NVPTX::BI__nvvm_ldu_s4:
21456 case NVPTX::BI__nvvm_ldu_i:
21457 case NVPTX::BI__nvvm_ldu_i2:
21458 case NVPTX::BI__nvvm_ldu_i4:
21459 case NVPTX::BI__nvvm_ldu_l:
21460 case NVPTX::BI__nvvm_ldu_l2:
21461 case NVPTX::BI__nvvm_ldu_ll:
21462 case NVPTX::BI__nvvm_ldu_ll2:
21463 case NVPTX::BI__nvvm_ldu_uc:
21464 case NVPTX::BI__nvvm_ldu_uc2:
21465 case NVPTX::BI__nvvm_ldu_uc4:
21466 case NVPTX::BI__nvvm_ldu_us:
21467 case NVPTX::BI__nvvm_ldu_us2:
21468 case NVPTX::BI__nvvm_ldu_us4:
21469 case NVPTX::BI__nvvm_ldu_ui:
21470 case NVPTX::BI__nvvm_ldu_ui2:
21471 case NVPTX::BI__nvvm_ldu_ui4:
21472 case NVPTX::BI__nvvm_ldu_ul:
21473 case NVPTX::BI__nvvm_ldu_ul2:
21474 case NVPTX::BI__nvvm_ldu_ull:
21475 case NVPTX::BI__nvvm_ldu_ull2:
21476 return MakeLdu(Intrinsic::nvvm_ldu_global_i, *
this,
E);
21477 case NVPTX::BI__nvvm_ldu_f:
21478 case NVPTX::BI__nvvm_ldu_f2:
21479 case NVPTX::BI__nvvm_ldu_f4:
21480 case NVPTX::BI__nvvm_ldu_d:
21481 case NVPTX::BI__nvvm_ldu_d2:
21482 return MakeLdu(Intrinsic::nvvm_ldu_global_f, *
this,
E);
21484 case NVPTX::BI__nvvm_atom_cta_add_gen_i:
21485 case NVPTX::BI__nvvm_atom_cta_add_gen_l:
21486 case NVPTX::BI__nvvm_atom_cta_add_gen_ll:
21487 return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_i_cta, *
this,
E);
21488 case NVPTX::BI__nvvm_atom_sys_add_gen_i:
21489 case NVPTX::BI__nvvm_atom_sys_add_gen_l:
21490 case NVPTX::BI__nvvm_atom_sys_add_gen_ll:
21491 return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_i_sys, *
this,
E);
21492 case NVPTX::BI__nvvm_atom_cta_add_gen_f:
21493 case NVPTX::BI__nvvm_atom_cta_add_gen_d:
21494 return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_f_cta, *
this,
E);
21495 case NVPTX::BI__nvvm_atom_sys_add_gen_f:
21496 case NVPTX::BI__nvvm_atom_sys_add_gen_d:
21497 return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_f_sys, *
this,
E);
21498 case NVPTX::BI__nvvm_atom_cta_xchg_gen_i:
21499 case NVPTX::BI__nvvm_atom_cta_xchg_gen_l:
21500 case NVPTX::BI__nvvm_atom_cta_xchg_gen_ll:
21501 return MakeScopedAtomic(Intrinsic::nvvm_atomic_exch_gen_i_cta, *
this,
E);
21502 case NVPTX::BI__nvvm_atom_sys_xchg_gen_i:
21503 case NVPTX::BI__nvvm_atom_sys_xchg_gen_l:
21504 case NVPTX::BI__nvvm_atom_sys_xchg_gen_ll:
21505 return MakeScopedAtomic(Intrinsic::nvvm_atomic_exch_gen_i_sys, *
this,
E);
21506 case NVPTX::BI__nvvm_atom_cta_max_gen_i:
21507 case NVPTX::BI__nvvm_atom_cta_max_gen_ui:
21508 case NVPTX::BI__nvvm_atom_cta_max_gen_l:
21509 case NVPTX::BI__nvvm_atom_cta_max_gen_ul:
21510 case NVPTX::BI__nvvm_atom_cta_max_gen_ll:
21511 case NVPTX::BI__nvvm_atom_cta_max_gen_ull:
21512 return MakeScopedAtomic(Intrinsic::nvvm_atomic_max_gen_i_cta, *
this,
E);
21513 case NVPTX::BI__nvvm_atom_sys_max_gen_i:
21514 case NVPTX::BI__nvvm_atom_sys_max_gen_ui:
21515 case NVPTX::BI__nvvm_atom_sys_max_gen_l:
21516 case NVPTX::BI__nvvm_atom_sys_max_gen_ul:
21517 case NVPTX::BI__nvvm_atom_sys_max_gen_ll:
21518 case NVPTX::BI__nvvm_atom_sys_max_gen_ull:
21519 return MakeScopedAtomic(Intrinsic::nvvm_atomic_max_gen_i_sys, *
this,
E);
21520 case NVPTX::BI__nvvm_atom_cta_min_gen_i:
21521 case NVPTX::BI__nvvm_atom_cta_min_gen_ui:
21522 case NVPTX::BI__nvvm_atom_cta_min_gen_l:
21523 case NVPTX::BI__nvvm_atom_cta_min_gen_ul:
21524 case NVPTX::BI__nvvm_atom_cta_min_gen_ll:
21525 case NVPTX::BI__nvvm_atom_cta_min_gen_ull:
21526 return MakeScopedAtomic(Intrinsic::nvvm_atomic_min_gen_i_cta, *
this,
E);
21527 case NVPTX::BI__nvvm_atom_sys_min_gen_i:
21528 case NVPTX::BI__nvvm_atom_sys_min_gen_ui:
21529 case NVPTX::BI__nvvm_atom_sys_min_gen_l:
21530 case NVPTX::BI__nvvm_atom_sys_min_gen_ul:
21531 case NVPTX::BI__nvvm_atom_sys_min_gen_ll:
21532 case NVPTX::BI__nvvm_atom_sys_min_gen_ull:
21533 return MakeScopedAtomic(Intrinsic::nvvm_atomic_min_gen_i_sys, *
this,
E);
21534 case NVPTX::BI__nvvm_atom_cta_inc_gen_ui:
21535 return MakeScopedAtomic(Intrinsic::nvvm_atomic_inc_gen_i_cta, *
this,
E);
21536 case NVPTX::BI__nvvm_atom_cta_dec_gen_ui:
21537 return MakeScopedAtomic(Intrinsic::nvvm_atomic_dec_gen_i_cta, *
this,
E);
21538 case NVPTX::BI__nvvm_atom_sys_inc_gen_ui:
21539 return MakeScopedAtomic(Intrinsic::nvvm_atomic_inc_gen_i_sys, *
this,
E);
21540 case NVPTX::BI__nvvm_atom_sys_dec_gen_ui:
21541 return MakeScopedAtomic(Intrinsic::nvvm_atomic_dec_gen_i_sys, *
this,
E);
21542 case NVPTX::BI__nvvm_atom_cta_and_gen_i:
21543 case NVPTX::BI__nvvm_atom_cta_and_gen_l:
21544 case NVPTX::BI__nvvm_atom_cta_and_gen_ll:
21545 return MakeScopedAtomic(Intrinsic::nvvm_atomic_and_gen_i_cta, *
this,
E);
21546 case NVPTX::BI__nvvm_atom_sys_and_gen_i:
21547 case NVPTX::BI__nvvm_atom_sys_and_gen_l:
21548 case NVPTX::BI__nvvm_atom_sys_and_gen_ll:
21549 return MakeScopedAtomic(Intrinsic::nvvm_atomic_and_gen_i_sys, *
this,
E);
21550 case NVPTX::BI__nvvm_atom_cta_or_gen_i:
21551 case NVPTX::BI__nvvm_atom_cta_or_gen_l:
21552 case NVPTX::BI__nvvm_atom_cta_or_gen_ll:
21553 return MakeScopedAtomic(Intrinsic::nvvm_atomic_or_gen_i_cta, *
this,
E);
21554 case NVPTX::BI__nvvm_atom_sys_or_gen_i:
21555 case NVPTX::BI__nvvm_atom_sys_or_gen_l:
21556 case NVPTX::BI__nvvm_atom_sys_or_gen_ll:
21557 return MakeScopedAtomic(Intrinsic::nvvm_atomic_or_gen_i_sys, *
this,
E);
21558 case NVPTX::BI__nvvm_atom_cta_xor_gen_i:
21559 case NVPTX::BI__nvvm_atom_cta_xor_gen_l:
21560 case NVPTX::BI__nvvm_atom_cta_xor_gen_ll:
21561 return MakeScopedAtomic(Intrinsic::nvvm_atomic_xor_gen_i_cta, *
this,
E);
21562 case NVPTX::BI__nvvm_atom_sys_xor_gen_i:
21563 case NVPTX::BI__nvvm_atom_sys_xor_gen_l:
21564 case NVPTX::BI__nvvm_atom_sys_xor_gen_ll:
21565 return MakeScopedAtomic(Intrinsic::nvvm_atomic_xor_gen_i_sys, *
this,
E);
21566 case NVPTX::BI__nvvm_atom_cta_cas_gen_us:
21567 case NVPTX::BI__nvvm_atom_cta_cas_gen_i:
21568 case NVPTX::BI__nvvm_atom_cta_cas_gen_l:
21569 case NVPTX::BI__nvvm_atom_cta_cas_gen_ll: {
21571 llvm::Type *ElemTy =
21575 Intrinsic::nvvm_atomic_cas_gen_i_cta, {ElemTy, Ptr->getType()}),
21576 {Ptr, EmitScalarExpr(E->getArg(1)), EmitScalarExpr(E->getArg(2))});
21578 case NVPTX::BI__nvvm_atom_sys_cas_gen_us:
21579 case NVPTX::BI__nvvm_atom_sys_cas_gen_i:
21580 case NVPTX::BI__nvvm_atom_sys_cas_gen_l:
21581 case NVPTX::BI__nvvm_atom_sys_cas_gen_ll: {
21583 llvm::Type *ElemTy =
21587 Intrinsic::nvvm_atomic_cas_gen_i_sys, {ElemTy, Ptr->getType()}),
21588 {Ptr, EmitScalarExpr(E->getArg(1)), EmitScalarExpr(E->getArg(2))});
21590 case NVPTX::BI__nvvm_match_all_sync_i32p:
21591 case NVPTX::BI__nvvm_match_all_sync_i64p: {
21597 ? Intrinsic::nvvm_match_all_sync_i32p
21598 : Intrinsic::nvvm_match_all_sync_i64p),
21603 return Builder.CreateExtractValue(ResultPair, 0);
21607 case NVPTX::BI__hmma_m16n16k16_ld_a:
21608 case NVPTX::BI__hmma_m16n16k16_ld_b:
21609 case NVPTX::BI__hmma_m16n16k16_ld_c_f16:
21610 case NVPTX::BI__hmma_m16n16k16_ld_c_f32:
21611 case NVPTX::BI__hmma_m32n8k16_ld_a:
21612 case NVPTX::BI__hmma_m32n8k16_ld_b:
21613 case NVPTX::BI__hmma_m32n8k16_ld_c_f16:
21614 case NVPTX::BI__hmma_m32n8k16_ld_c_f32:
21615 case NVPTX::BI__hmma_m8n32k16_ld_a:
21616 case NVPTX::BI__hmma_m8n32k16_ld_b:
21617 case NVPTX::BI__hmma_m8n32k16_ld_c_f16:
21618 case NVPTX::BI__hmma_m8n32k16_ld_c_f32:
21620 case NVPTX::BI__imma_m16n16k16_ld_a_s8:
21621 case NVPTX::BI__imma_m16n16k16_ld_a_u8:
21622 case NVPTX::BI__imma_m16n16k16_ld_b_s8:
21623 case NVPTX::BI__imma_m16n16k16_ld_b_u8:
21624 case NVPTX::BI__imma_m16n16k16_ld_c:
21625 case NVPTX::BI__imma_m32n8k16_ld_a_s8:
21626 case NVPTX::BI__imma_m32n8k16_ld_a_u8:
21627 case NVPTX::BI__imma_m32n8k16_ld_b_s8:
21628 case NVPTX::BI__imma_m32n8k16_ld_b_u8:
21629 case NVPTX::BI__imma_m32n8k16_ld_c:
21630 case NVPTX::BI__imma_m8n32k16_ld_a_s8:
21631 case NVPTX::BI__imma_m8n32k16_ld_a_u8:
21632 case NVPTX::BI__imma_m8n32k16_ld_b_s8:
21633 case NVPTX::BI__imma_m8n32k16_ld_b_u8:
21634 case NVPTX::BI__imma_m8n32k16_ld_c:
21636 case NVPTX::BI__imma_m8n8k32_ld_a_s4:
21637 case NVPTX::BI__imma_m8n8k32_ld_a_u4:
21638 case NVPTX::BI__imma_m8n8k32_ld_b_s4:
21639 case NVPTX::BI__imma_m8n8k32_ld_b_u4:
21640 case NVPTX::BI__imma_m8n8k32_ld_c:
21641 case NVPTX::BI__bmma_m8n8k128_ld_a_b1:
21642 case NVPTX::BI__bmma_m8n8k128_ld_b_b1:
21643 case NVPTX::BI__bmma_m8n8k128_ld_c:
21645 case NVPTX::BI__dmma_m8n8k4_ld_a:
21646 case NVPTX::BI__dmma_m8n8k4_ld_b:
21647 case NVPTX::BI__dmma_m8n8k4_ld_c:
21649 case NVPTX::BI__mma_bf16_m16n16k16_ld_a:
21650 case NVPTX::BI__mma_bf16_m16n16k16_ld_b:
21651 case NVPTX::BI__mma_bf16_m8n32k16_ld_a:
21652 case NVPTX::BI__mma_bf16_m8n32k16_ld_b:
21653 case NVPTX::BI__mma_bf16_m32n8k16_ld_a:
21654 case NVPTX::BI__mma_bf16_m32n8k16_ld_b:
21655 case NVPTX::BI__mma_tf32_m16n16k8_ld_a:
21656 case NVPTX::BI__mma_tf32_m16n16k8_ld_b:
21657 case NVPTX::BI__mma_tf32_m16n16k8_ld_c: {
21661 std::optional<llvm::APSInt> isColMajorArg =
21663 if (!isColMajorArg)
21665 bool isColMajor = isColMajorArg->getSExtValue();
21666 NVPTXMmaLdstInfo II = getNVPTXMmaLdstInfo(BuiltinID);
21667 unsigned IID = isColMajor ? II.IID_col : II.IID_row;
21675 assert(II.NumResults);
21676 if (II.NumResults == 1) {
21680 for (
unsigned i = 0; i < II.NumResults; ++i) {
21685 llvm::ConstantInt::get(
IntTy, i)),
21692 case NVPTX::BI__hmma_m16n16k16_st_c_f16:
21693 case NVPTX::BI__hmma_m16n16k16_st_c_f32:
21694 case NVPTX::BI__hmma_m32n8k16_st_c_f16:
21695 case NVPTX::BI__hmma_m32n8k16_st_c_f32:
21696 case NVPTX::BI__hmma_m8n32k16_st_c_f16:
21697 case NVPTX::BI__hmma_m8n32k16_st_c_f32:
21698 case NVPTX::BI__imma_m16n16k16_st_c_i32:
21699 case NVPTX::BI__imma_m32n8k16_st_c_i32:
21700 case NVPTX::BI__imma_m8n32k16_st_c_i32:
21701 case NVPTX::BI__imma_m8n8k32_st_c_i32:
21702 case NVPTX::BI__bmma_m8n8k128_st_c_i32:
21703 case NVPTX::BI__dmma_m8n8k4_st_c_f64:
21704 case NVPTX::BI__mma_m16n16k8_st_c_f32: {
21708 std::optional<llvm::APSInt> isColMajorArg =
21710 if (!isColMajorArg)
21712 bool isColMajor = isColMajorArg->getSExtValue();
21713 NVPTXMmaLdstInfo II = getNVPTXMmaLdstInfo(BuiltinID);
21714 unsigned IID = isColMajor ? II.IID_col : II.IID_row;
21719 llvm::Type *ParamType = Intrinsic->getFunctionType()->getParamType(1);
21721 for (
unsigned i = 0; i < II.NumResults; ++i) {
21725 llvm::ConstantInt::get(
IntTy, i)),
21727 Values.push_back(
Builder.CreateBitCast(
V, ParamType));
21729 Values.push_back(Ldm);
21736 case NVPTX::BI__hmma_m16n16k16_mma_f16f16:
21737 case NVPTX::BI__hmma_m16n16k16_mma_f32f16:
21738 case NVPTX::BI__hmma_m16n16k16_mma_f32f32:
21739 case NVPTX::BI__hmma_m16n16k16_mma_f16f32:
21740 case NVPTX::BI__hmma_m32n8k16_mma_f16f16:
21741 case NVPTX::BI__hmma_m32n8k16_mma_f32f16:
21742 case NVPTX::BI__hmma_m32n8k16_mma_f32f32:
21743 case NVPTX::BI__hmma_m32n8k16_mma_f16f32:
21744 case NVPTX::BI__hmma_m8n32k16_mma_f16f16:
21745 case NVPTX::BI__hmma_m8n32k16_mma_f32f16:
21746 case NVPTX::BI__hmma_m8n32k16_mma_f32f32:
21747 case NVPTX::BI__hmma_m8n32k16_mma_f16f32:
21748 case NVPTX::BI__imma_m16n16k16_mma_s8:
21749 case NVPTX::BI__imma_m16n16k16_mma_u8:
21750 case NVPTX::BI__imma_m32n8k16_mma_s8:
21751 case NVPTX::BI__imma_m32n8k16_mma_u8:
21752 case NVPTX::BI__imma_m8n32k16_mma_s8:
21753 case NVPTX::BI__imma_m8n32k16_mma_u8:
21754 case NVPTX::BI__imma_m8n8k32_mma_s4:
21755 case NVPTX::BI__imma_m8n8k32_mma_u4:
21756 case NVPTX::BI__bmma_m8n8k128_mma_xor_popc_b1:
21757 case NVPTX::BI__bmma_m8n8k128_mma_and_popc_b1:
21758 case NVPTX::BI__dmma_m8n8k4_mma_f64:
21759 case NVPTX::BI__mma_bf16_m16n16k16_mma_f32:
21760 case NVPTX::BI__mma_bf16_m8n32k16_mma_f32:
21761 case NVPTX::BI__mma_bf16_m32n8k16_mma_f32:
21762 case NVPTX::BI__mma_tf32_m16n16k8_mma_f32: {
21767 std::optional<llvm::APSInt> LayoutArg =
21771 int Layout = LayoutArg->getSExtValue();
21772 if (Layout < 0 || Layout > 3)
21774 llvm::APSInt SatfArg;
21775 if (BuiltinID == NVPTX::BI__bmma_m8n8k128_mma_xor_popc_b1 ||
21776 BuiltinID == NVPTX::BI__bmma_m8n8k128_mma_and_popc_b1)
21778 else if (std::optional<llvm::APSInt> OptSatfArg =
21780 SatfArg = *OptSatfArg;
21783 bool Satf = SatfArg.getSExtValue();
21784 NVPTXMmaInfo MI = getNVPTXMmaInfo(BuiltinID);
21785 unsigned IID = MI.getMMAIntrinsic(Layout, Satf);
21791 llvm::Type *AType = Intrinsic->getFunctionType()->getParamType(0);
21793 for (
unsigned i = 0; i < MI.NumEltsA; ++i) {
21797 llvm::ConstantInt::get(
IntTy, i)),
21799 Values.push_back(
Builder.CreateBitCast(
V, AType));
21802 llvm::Type *BType = Intrinsic->getFunctionType()->getParamType(MI.NumEltsA);
21803 for (
unsigned i = 0; i < MI.NumEltsB; ++i) {
21807 llvm::ConstantInt::get(
IntTy, i)),
21809 Values.push_back(
Builder.CreateBitCast(
V, BType));
21812 llvm::Type *CType =
21813 Intrinsic->getFunctionType()->getParamType(MI.NumEltsA + MI.NumEltsB);
21814 for (
unsigned i = 0; i < MI.NumEltsC; ++i) {
21818 llvm::ConstantInt::get(
IntTy, i)),
21820 Values.push_back(
Builder.CreateBitCast(
V, CType));
21824 for (
unsigned i = 0; i < MI.NumEltsD; ++i)
21828 llvm::ConstantInt::get(
IntTy, i)),
21833 case NVPTX::BI__nvvm_ex2_approx_f16:
21834 return MakeHalfType(Intrinsic::nvvm_ex2_approx_f16, BuiltinID,
E, *
this);
21835 case NVPTX::BI__nvvm_ex2_approx_f16x2:
21836 return MakeHalfType(Intrinsic::nvvm_ex2_approx_f16x2, BuiltinID,
E, *
this);
21837 case NVPTX::BI__nvvm_ff2f16x2_rn:
21838 return MakeHalfType(Intrinsic::nvvm_ff2f16x2_rn, BuiltinID,
E, *
this);
21839 case NVPTX::BI__nvvm_ff2f16x2_rn_relu:
21840 return MakeHalfType(Intrinsic::nvvm_ff2f16x2_rn_relu, BuiltinID,
E, *
this);
21841 case NVPTX::BI__nvvm_ff2f16x2_rz:
21842 return MakeHalfType(Intrinsic::nvvm_ff2f16x2_rz, BuiltinID,
E, *
this);
21843 case NVPTX::BI__nvvm_ff2f16x2_rz_relu:
21844 return MakeHalfType(Intrinsic::nvvm_ff2f16x2_rz_relu, BuiltinID,
E, *
this);
21845 case NVPTX::BI__nvvm_fma_rn_f16:
21846 return MakeHalfType(Intrinsic::nvvm_fma_rn_f16, BuiltinID,
E, *
this);
21847 case NVPTX::BI__nvvm_fma_rn_f16x2:
21848 return MakeHalfType(Intrinsic::nvvm_fma_rn_f16x2, BuiltinID,
E, *
this);
21849 case NVPTX::BI__nvvm_fma_rn_ftz_f16:
21850 return MakeHalfType(Intrinsic::nvvm_fma_rn_ftz_f16, BuiltinID,
E, *
this);
21851 case NVPTX::BI__nvvm_fma_rn_ftz_f16x2:
21852 return MakeHalfType(Intrinsic::nvvm_fma_rn_ftz_f16x2, BuiltinID,
E, *
this);
21853 case NVPTX::BI__nvvm_fma_rn_ftz_relu_f16:
21854 return MakeHalfType(Intrinsic::nvvm_fma_rn_ftz_relu_f16, BuiltinID,
E,
21856 case NVPTX::BI__nvvm_fma_rn_ftz_relu_f16x2:
21857 return MakeHalfType(Intrinsic::nvvm_fma_rn_ftz_relu_f16x2, BuiltinID,
E,
21859 case NVPTX::BI__nvvm_fma_rn_ftz_sat_f16:
21860 return MakeHalfType(Intrinsic::nvvm_fma_rn_ftz_sat_f16, BuiltinID,
E,
21862 case NVPTX::BI__nvvm_fma_rn_ftz_sat_f16x2:
21863 return MakeHalfType(Intrinsic::nvvm_fma_rn_ftz_sat_f16x2, BuiltinID,
E,
21865 case NVPTX::BI__nvvm_fma_rn_relu_f16:
21866 return MakeHalfType(Intrinsic::nvvm_fma_rn_relu_f16, BuiltinID,
E, *
this);
21867 case NVPTX::BI__nvvm_fma_rn_relu_f16x2:
21868 return MakeHalfType(Intrinsic::nvvm_fma_rn_relu_f16x2, BuiltinID,
E, *
this);
21869 case NVPTX::BI__nvvm_fma_rn_sat_f16:
21870 return MakeHalfType(Intrinsic::nvvm_fma_rn_sat_f16, BuiltinID,
E, *
this);
21871 case NVPTX::BI__nvvm_fma_rn_sat_f16x2:
21872 return MakeHalfType(Intrinsic::nvvm_fma_rn_sat_f16x2, BuiltinID,
E, *
this);
21873 case NVPTX::BI__nvvm_fmax_f16:
21874 return MakeHalfType(Intrinsic::nvvm_fmax_f16, BuiltinID,
E, *
this);
21875 case NVPTX::BI__nvvm_fmax_f16x2:
21876 return MakeHalfType(Intrinsic::nvvm_fmax_f16x2, BuiltinID,
E, *
this);
21877 case NVPTX::BI__nvvm_fmax_ftz_f16:
21878 return MakeHalfType(Intrinsic::nvvm_fmax_ftz_f16, BuiltinID,
E, *
this);
21879 case NVPTX::BI__nvvm_fmax_ftz_f16x2:
21880 return MakeHalfType(Intrinsic::nvvm_fmax_ftz_f16x2, BuiltinID,
E, *
this);
21881 case NVPTX::BI__nvvm_fmax_ftz_nan_f16:
21882 return MakeHalfType(Intrinsic::nvvm_fmax_ftz_nan_f16, BuiltinID,
E, *
this);
21883 case NVPTX::BI__nvvm_fmax_ftz_nan_f16x2:
21884 return MakeHalfType(Intrinsic::nvvm_fmax_ftz_nan_f16x2, BuiltinID,
E,
21886 case NVPTX::BI__nvvm_fmax_ftz_nan_xorsign_abs_f16:
21887 return MakeHalfType(Intrinsic::nvvm_fmax_ftz_nan_xorsign_abs_f16, BuiltinID,
21889 case NVPTX::BI__nvvm_fmax_ftz_nan_xorsign_abs_f16x2:
21890 return MakeHalfType(Intrinsic::nvvm_fmax_ftz_nan_xorsign_abs_f16x2,
21891 BuiltinID,
E, *
this);
21892 case NVPTX::BI__nvvm_fmax_ftz_xorsign_abs_f16:
21893 return MakeHalfType(Intrinsic::nvvm_fmax_ftz_xorsign_abs_f16, BuiltinID,
E,
21895 case NVPTX::BI__nvvm_fmax_ftz_xorsign_abs_f16x2:
21896 return MakeHalfType(Intrinsic::nvvm_fmax_ftz_xorsign_abs_f16x2, BuiltinID,
21898 case NVPTX::BI__nvvm_fmax_nan_f16:
21899 return MakeHalfType(Intrinsic::nvvm_fmax_nan_f16, BuiltinID,
E, *
this);
21900 case NVPTX::BI__nvvm_fmax_nan_f16x2:
21901 return MakeHalfType(Intrinsic::nvvm_fmax_nan_f16x2, BuiltinID,
E, *
this);
21902 case NVPTX::BI__nvvm_fmax_nan_xorsign_abs_f16:
21903 return MakeHalfType(Intrinsic::nvvm_fmax_nan_xorsign_abs_f16, BuiltinID,
E,
21905 case NVPTX::BI__nvvm_fmax_nan_xorsign_abs_f16x2:
21906 return MakeHalfType(Intrinsic::nvvm_fmax_nan_xorsign_abs_f16x2, BuiltinID,
21908 case NVPTX::BI__nvvm_fmax_xorsign_abs_f16:
21909 return MakeHalfType(Intrinsic::nvvm_fmax_xorsign_abs_f16, BuiltinID,
E,
21911 case NVPTX::BI__nvvm_fmax_xorsign_abs_f16x2:
21912 return MakeHalfType(Intrinsic::nvvm_fmax_xorsign_abs_f16x2, BuiltinID,
E,
21914 case NVPTX::BI__nvvm_fmin_f16:
21915 return MakeHalfType(Intrinsic::nvvm_fmin_f16, BuiltinID,
E, *
this);
21916 case NVPTX::BI__nvvm_fmin_f16x2:
21917 return MakeHalfType(Intrinsic::nvvm_fmin_f16x2, BuiltinID,
E, *
this);
21918 case NVPTX::BI__nvvm_fmin_ftz_f16:
21919 return MakeHalfType(Intrinsic::nvvm_fmin_ftz_f16, BuiltinID,
E, *
this);
21920 case NVPTX::BI__nvvm_fmin_ftz_f16x2:
21921 return MakeHalfType(Intrinsic::nvvm_fmin_ftz_f16x2, BuiltinID,
E, *
this);
21922 case NVPTX::BI__nvvm_fmin_ftz_nan_f16:
21923 return MakeHalfType(Intrinsic::nvvm_fmin_ftz_nan_f16, BuiltinID,
E, *
this);
21924 case NVPTX::BI__nvvm_fmin_ftz_nan_f16x2:
21925 return MakeHalfType(Intrinsic::nvvm_fmin_ftz_nan_f16x2, BuiltinID,
E,
21927 case NVPTX::BI__nvvm_fmin_ftz_nan_xorsign_abs_f16:
21928 return MakeHalfType(Intrinsic::nvvm_fmin_ftz_nan_xorsign_abs_f16, BuiltinID,
21930 case NVPTX::BI__nvvm_fmin_ftz_nan_xorsign_abs_f16x2:
21931 return MakeHalfType(Intrinsic::nvvm_fmin_ftz_nan_xorsign_abs_f16x2,
21932 BuiltinID,
E, *
this);
21933 case NVPTX::BI__nvvm_fmin_ftz_xorsign_abs_f16:
21934 return MakeHalfType(Intrinsic::nvvm_fmin_ftz_xorsign_abs_f16, BuiltinID,
E,
21936 case NVPTX::BI__nvvm_fmin_ftz_xorsign_abs_f16x2:
21937 return MakeHalfType(Intrinsic::nvvm_fmin_ftz_xorsign_abs_f16x2, BuiltinID,
21939 case NVPTX::BI__nvvm_fmin_nan_f16:
21940 return MakeHalfType(Intrinsic::nvvm_fmin_nan_f16, BuiltinID,
E, *
this);
21941 case NVPTX::BI__nvvm_fmin_nan_f16x2:
21942 return MakeHalfType(Intrinsic::nvvm_fmin_nan_f16x2, BuiltinID,
E, *
this);
21943 case NVPTX::BI__nvvm_fmin_nan_xorsign_abs_f16:
21944 return MakeHalfType(Intrinsic::nvvm_fmin_nan_xorsign_abs_f16, BuiltinID,
E,
21946 case NVPTX::BI__nvvm_fmin_nan_xorsign_abs_f16x2:
21947 return MakeHalfType(Intrinsic::nvvm_fmin_nan_xorsign_abs_f16x2, BuiltinID,
21949 case NVPTX::BI__nvvm_fmin_xorsign_abs_f16:
21950 return MakeHalfType(Intrinsic::nvvm_fmin_xorsign_abs_f16, BuiltinID,
E,
21952 case NVPTX::BI__nvvm_fmin_xorsign_abs_f16x2:
21953 return MakeHalfType(Intrinsic::nvvm_fmin_xorsign_abs_f16x2, BuiltinID,
E,
21955 case NVPTX::BI__nvvm_ldg_h:
21956 case NVPTX::BI__nvvm_ldg_h2:
21957 return MakeHalfType(Intrinsic::not_intrinsic, BuiltinID,
E, *
this);
21958 case NVPTX::BI__nvvm_ldu_h:
21959 case NVPTX::BI__nvvm_ldu_h2:
21960 return MakeHalfType(Intrinsic::nvvm_ldu_global_f, BuiltinID,
E, *
this);
21961 case NVPTX::BI__nvvm_cp_async_ca_shared_global_4:
21962 return MakeCpAsync(Intrinsic::nvvm_cp_async_ca_shared_global_4,
21963 Intrinsic::nvvm_cp_async_ca_shared_global_4_s, *
this,
E,
21965 case NVPTX::BI__nvvm_cp_async_ca_shared_global_8:
21966 return MakeCpAsync(Intrinsic::nvvm_cp_async_ca_shared_global_8,
21967 Intrinsic::nvvm_cp_async_ca_shared_global_8_s, *
this,
E,
21969 case NVPTX::BI__nvvm_cp_async_ca_shared_global_16:
21970 return MakeCpAsync(Intrinsic::nvvm_cp_async_ca_shared_global_16,
21971 Intrinsic::nvvm_cp_async_ca_shared_global_16_s, *
this,
E,
21973 case NVPTX::BI__nvvm_cp_async_cg_shared_global_16:
21974 return MakeCpAsync(Intrinsic::nvvm_cp_async_cg_shared_global_16,
21975 Intrinsic::nvvm_cp_async_cg_shared_global_16_s, *
this,
E,
21977 case NVPTX::BI__nvvm_read_ptx_sreg_clusterid_x:
21980 case NVPTX::BI__nvvm_read_ptx_sreg_clusterid_y:
21983 case NVPTX::BI__nvvm_read_ptx_sreg_clusterid_z:
21986 case NVPTX::BI__nvvm_read_ptx_sreg_clusterid_w:
21989 case NVPTX::BI__nvvm_read_ptx_sreg_nclusterid_x:
21992 case NVPTX::BI__nvvm_read_ptx_sreg_nclusterid_y:
21995 case NVPTX::BI__nvvm_read_ptx_sreg_nclusterid_z:
21998 case NVPTX::BI__nvvm_read_ptx_sreg_nclusterid_w:
22001 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_ctaid_x:
22004 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_ctaid_y:
22007 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_ctaid_z:
22010 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_ctaid_w:
22013 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_nctaid_x:
22016 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_nctaid_y:
22019 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_nctaid_z:
22022 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_nctaid_w:
22025 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_ctarank:
22028 case NVPTX::BI__nvvm_read_ptx_sreg_cluster_nctarank:
22031 case NVPTX::BI__nvvm_is_explicit_cluster:
22034 case NVPTX::BI__nvvm_isspacep_shared_cluster:
22038 case NVPTX::BI__nvvm_mapa:
22041 {EmitScalarExpr(E->getArg(0)), EmitScalarExpr(E->getArg(1))});
22042 case NVPTX::BI__nvvm_mapa_shared_cluster:
22045 {EmitScalarExpr(E->getArg(0)), EmitScalarExpr(E->getArg(1))});
22046 case NVPTX::BI__nvvm_getctarank:
22050 case NVPTX::BI__nvvm_getctarank_shared_cluster:
22054 case NVPTX::BI__nvvm_barrier_cluster_arrive:
22057 case NVPTX::BI__nvvm_barrier_cluster_arrive_relaxed:
22060 case NVPTX::BI__nvvm_barrier_cluster_wait:
22063 case NVPTX::BI__nvvm_fence_sc_cluster:
22072struct BuiltinAlignArgs {
22073 llvm::Value *Src =
nullptr;
22074 llvm::Type *SrcType =
nullptr;
22075 llvm::Value *Alignment =
nullptr;
22076 llvm::Value *Mask =
nullptr;
22077 llvm::IntegerType *IntType =
nullptr;
22085 SrcType = Src->getType();
22086 if (SrcType->isPointerTy()) {
22087 IntType = IntegerType::get(
22091 assert(SrcType->isIntegerTy());
22092 IntType = cast<llvm::IntegerType>(SrcType);
22095 Alignment = CGF.
Builder.CreateZExtOrTrunc(Alignment, IntType,
"alignment");
22096 auto *One = llvm::ConstantInt::get(IntType, 1);
22097 Mask = CGF.
Builder.CreateSub(Alignment, One,
"mask");
22104 BuiltinAlignArgs Args(
E, *
this);
22105 llvm::Value *SrcAddress = Args.Src;
22106 if (Args.SrcType->isPointerTy())
22108 Builder.CreateBitOrPointerCast(Args.Src, Args.IntType,
"src_addr");
22110 Builder.CreateAnd(SrcAddress, Args.Mask,
"set_bits"),
22111 llvm::Constant::getNullValue(Args.IntType),
"is_aligned"));
22118 BuiltinAlignArgs Args(
E, *
this);
22119 llvm::Value *SrcForMask = Args.Src;
22125 if (Args.Src->getType()->isPointerTy()) {
22135 SrcForMask =
Builder.CreateAdd(SrcForMask, Args.Mask,
"over_boundary");
22139 llvm::Value *InvertedMask =
Builder.CreateNot(Args.Mask,
"inverted_mask");
22140 llvm::Value *
Result =
nullptr;
22141 if (Args.Src->getType()->isPointerTy()) {
22143 Intrinsic::ptrmask, {Args.SrcType, Args.IntType},
22144 {SrcForMask, InvertedMask},
nullptr,
"aligned_result");
22146 Result =
Builder.CreateAnd(SrcForMask, InvertedMask,
"aligned_result");
22148 assert(
Result->getType() == Args.SrcType);
22154 switch (BuiltinID) {
22155 case WebAssembly::BI__builtin_wasm_memory_size: {
22160 return Builder.CreateCall(Callee, I);
22162 case WebAssembly::BI__builtin_wasm_memory_grow: {
22168 return Builder.CreateCall(Callee, Args);
22170 case WebAssembly::BI__builtin_wasm_tls_size: {
22173 return Builder.CreateCall(Callee);
22175 case WebAssembly::BI__builtin_wasm_tls_align: {
22178 return Builder.CreateCall(Callee);
22180 case WebAssembly::BI__builtin_wasm_tls_base: {
22182 return Builder.CreateCall(Callee);
22184 case WebAssembly::BI__builtin_wasm_throw: {
22188 return Builder.CreateCall(Callee, {
Tag, Obj});
22190 case WebAssembly::BI__builtin_wasm_rethrow: {
22192 return Builder.CreateCall(Callee);
22194 case WebAssembly::BI__builtin_wasm_memory_atomic_wait32: {
22201 case WebAssembly::BI__builtin_wasm_memory_atomic_wait64: {
22208 case WebAssembly::BI__builtin_wasm_memory_atomic_notify: {
22212 return Builder.CreateCall(Callee, {Addr, Count});
22214 case WebAssembly::BI__builtin_wasm_trunc_s_i32_f32:
22215 case WebAssembly::BI__builtin_wasm_trunc_s_i32_f64:
22216 case WebAssembly::BI__builtin_wasm_trunc_s_i64_f32:
22217 case WebAssembly::BI__builtin_wasm_trunc_s_i64_f64: {
22222 return Builder.CreateCall(Callee, {Src});
22224 case WebAssembly::BI__builtin_wasm_trunc_u_i32_f32:
22225 case WebAssembly::BI__builtin_wasm_trunc_u_i32_f64:
22226 case WebAssembly::BI__builtin_wasm_trunc_u_i64_f32:
22227 case WebAssembly::BI__builtin_wasm_trunc_u_i64_f64: {
22232 return Builder.CreateCall(Callee, {Src});
22234 case WebAssembly::BI__builtin_wasm_trunc_saturate_s_i32_f32:
22235 case WebAssembly::BI__builtin_wasm_trunc_saturate_s_i32_f64:
22236 case WebAssembly::BI__builtin_wasm_trunc_saturate_s_i64_f32:
22237 case WebAssembly::BI__builtin_wasm_trunc_saturate_s_i64_f64:
22238 case WebAssembly::BI__builtin_wasm_trunc_saturate_s_i16x8_f16x8:
22239 case WebAssembly::BI__builtin_wasm_trunc_saturate_s_i32x4_f32x4: {
22244 return Builder.CreateCall(Callee, {Src});
22246 case WebAssembly::BI__builtin_wasm_trunc_saturate_u_i32_f32:
22247 case WebAssembly::BI__builtin_wasm_trunc_saturate_u_i32_f64:
22248 case WebAssembly::BI__builtin_wasm_trunc_saturate_u_i64_f32:
22249 case WebAssembly::BI__builtin_wasm_trunc_saturate_u_i64_f64:
22250 case WebAssembly::BI__builtin_wasm_trunc_saturate_u_i16x8_f16x8:
22251 case WebAssembly::BI__builtin_wasm_trunc_saturate_u_i32x4_f32x4: {
22256 return Builder.CreateCall(Callee, {Src});
22258 case WebAssembly::BI__builtin_wasm_min_f32:
22259 case WebAssembly::BI__builtin_wasm_min_f64:
22260 case WebAssembly::BI__builtin_wasm_min_f16x8:
22261 case WebAssembly::BI__builtin_wasm_min_f32x4:
22262 case WebAssembly::BI__builtin_wasm_min_f64x2: {
22267 return Builder.CreateCall(Callee, {LHS, RHS});
22269 case WebAssembly::BI__builtin_wasm_max_f32:
22270 case WebAssembly::BI__builtin_wasm_max_f64:
22271 case WebAssembly::BI__builtin_wasm_max_f16x8:
22272 case WebAssembly::BI__builtin_wasm_max_f32x4:
22273 case WebAssembly::BI__builtin_wasm_max_f64x2: {
22278 return Builder.CreateCall(Callee, {LHS, RHS});
22280 case WebAssembly::BI__builtin_wasm_pmin_f16x8:
22281 case WebAssembly::BI__builtin_wasm_pmin_f32x4:
22282 case WebAssembly::BI__builtin_wasm_pmin_f64x2: {
22287 return Builder.CreateCall(Callee, {LHS, RHS});
22289 case WebAssembly::BI__builtin_wasm_pmax_f16x8:
22290 case WebAssembly::BI__builtin_wasm_pmax_f32x4:
22291 case WebAssembly::BI__builtin_wasm_pmax_f64x2: {
22296 return Builder.CreateCall(Callee, {LHS, RHS});
22298 case WebAssembly::BI__builtin_wasm_ceil_f16x8:
22299 case WebAssembly::BI__builtin_wasm_floor_f16x8:
22300 case WebAssembly::BI__builtin_wasm_trunc_f16x8:
22301 case WebAssembly::BI__builtin_wasm_nearest_f16x8:
22302 case WebAssembly::BI__builtin_wasm_ceil_f32x4:
22303 case WebAssembly::BI__builtin_wasm_floor_f32x4:
22304 case WebAssembly::BI__builtin_wasm_trunc_f32x4:
22305 case WebAssembly::BI__builtin_wasm_nearest_f32x4:
22306 case WebAssembly::BI__builtin_wasm_ceil_f64x2:
22307 case WebAssembly::BI__builtin_wasm_floor_f64x2:
22308 case WebAssembly::BI__builtin_wasm_trunc_f64x2:
22309 case WebAssembly::BI__builtin_wasm_nearest_f64x2: {
22311 switch (BuiltinID) {
22312 case WebAssembly::BI__builtin_wasm_ceil_f16x8:
22313 case WebAssembly::BI__builtin_wasm_ceil_f32x4:
22314 case WebAssembly::BI__builtin_wasm_ceil_f64x2:
22315 IntNo = Intrinsic::ceil;
22317 case WebAssembly::BI__builtin_wasm_floor_f16x8:
22318 case WebAssembly::BI__builtin_wasm_floor_f32x4:
22319 case WebAssembly::BI__builtin_wasm_floor_f64x2:
22320 IntNo = Intrinsic::floor;
22322 case WebAssembly::BI__builtin_wasm_trunc_f16x8:
22323 case WebAssembly::BI__builtin_wasm_trunc_f32x4:
22324 case WebAssembly::BI__builtin_wasm_trunc_f64x2:
22325 IntNo = Intrinsic::trunc;
22327 case WebAssembly::BI__builtin_wasm_nearest_f16x8:
22328 case WebAssembly::BI__builtin_wasm_nearest_f32x4:
22329 case WebAssembly::BI__builtin_wasm_nearest_f64x2:
22330 IntNo = Intrinsic::nearbyint;
22333 llvm_unreachable(
"unexpected builtin ID");
22339 case WebAssembly::BI__builtin_wasm_ref_null_extern: {
22341 return Builder.CreateCall(Callee);
22343 case WebAssembly::BI__builtin_wasm_ref_null_func: {
22345 return Builder.CreateCall(Callee);
22347 case WebAssembly::BI__builtin_wasm_swizzle_i8x16: {
22351 return Builder.CreateCall(Callee, {Src, Indices});
22353 case WebAssembly::BI__builtin_wasm_abs_i8x16:
22354 case WebAssembly::BI__builtin_wasm_abs_i16x8:
22355 case WebAssembly::BI__builtin_wasm_abs_i32x4:
22356 case WebAssembly::BI__builtin_wasm_abs_i64x2: {
22359 Constant *
Zero = llvm::Constant::getNullValue(Vec->
getType());
22360 Value *ICmp =
Builder.CreateICmpSLT(Vec, Zero,
"abscond");
22361 return Builder.CreateSelect(ICmp, Neg, Vec,
"abs");
22363 case WebAssembly::BI__builtin_wasm_avgr_u_i8x16:
22364 case WebAssembly::BI__builtin_wasm_avgr_u_i16x8: {
22369 return Builder.CreateCall(Callee, {LHS, RHS});
22371 case WebAssembly::BI__builtin_wasm_q15mulr_sat_s_i16x8: {
22375 return Builder.CreateCall(Callee, {LHS, RHS});
22377 case WebAssembly::BI__builtin_wasm_extadd_pairwise_i8x16_s_i16x8:
22378 case WebAssembly::BI__builtin_wasm_extadd_pairwise_i8x16_u_i16x8:
22379 case WebAssembly::BI__builtin_wasm_extadd_pairwise_i16x8_s_i32x4:
22380 case WebAssembly::BI__builtin_wasm_extadd_pairwise_i16x8_u_i32x4: {
22383 switch (BuiltinID) {
22384 case WebAssembly::BI__builtin_wasm_extadd_pairwise_i8x16_s_i16x8:
22385 case WebAssembly::BI__builtin_wasm_extadd_pairwise_i16x8_s_i32x4:
22386 IntNo = Intrinsic::wasm_extadd_pairwise_signed;
22388 case WebAssembly::BI__builtin_wasm_extadd_pairwise_i8x16_u_i16x8:
22389 case WebAssembly::BI__builtin_wasm_extadd_pairwise_i16x8_u_i32x4:
22390 IntNo = Intrinsic::wasm_extadd_pairwise_unsigned;
22393 llvm_unreachable(
"unexpected builtin ID");
22397 return Builder.CreateCall(Callee, Vec);
22399 case WebAssembly::BI__builtin_wasm_bitselect: {
22405 return Builder.CreateCall(Callee, {V1, V2,
C});
22407 case WebAssembly::BI__builtin_wasm_dot_s_i32x4_i16x8: {
22411 return Builder.CreateCall(Callee, {LHS, RHS});
22413 case WebAssembly::BI__builtin_wasm_any_true_v128:
22414 case WebAssembly::BI__builtin_wasm_all_true_i8x16:
22415 case WebAssembly::BI__builtin_wasm_all_true_i16x8:
22416 case WebAssembly::BI__builtin_wasm_all_true_i32x4:
22417 case WebAssembly::BI__builtin_wasm_all_true_i64x2: {
22419 switch (BuiltinID) {
22420 case WebAssembly::BI__builtin_wasm_any_true_v128:
22421 IntNo = Intrinsic::wasm_anytrue;
22423 case WebAssembly::BI__builtin_wasm_all_true_i8x16:
22424 case WebAssembly::BI__builtin_wasm_all_true_i16x8:
22425 case WebAssembly::BI__builtin_wasm_all_true_i32x4:
22426 case WebAssembly::BI__builtin_wasm_all_true_i64x2:
22427 IntNo = Intrinsic::wasm_alltrue;
22430 llvm_unreachable(
"unexpected builtin ID");
22434 return Builder.CreateCall(Callee, {Vec});
22436 case WebAssembly::BI__builtin_wasm_bitmask_i8x16:
22437 case WebAssembly::BI__builtin_wasm_bitmask_i16x8:
22438 case WebAssembly::BI__builtin_wasm_bitmask_i32x4:
22439 case WebAssembly::BI__builtin_wasm_bitmask_i64x2: {
22443 return Builder.CreateCall(Callee, {Vec});
22445 case WebAssembly::BI__builtin_wasm_abs_f16x8:
22446 case WebAssembly::BI__builtin_wasm_abs_f32x4:
22447 case WebAssembly::BI__builtin_wasm_abs_f64x2: {
22450 return Builder.CreateCall(Callee, {Vec});
22452 case WebAssembly::BI__builtin_wasm_sqrt_f16x8:
22453 case WebAssembly::BI__builtin_wasm_sqrt_f32x4:
22454 case WebAssembly::BI__builtin_wasm_sqrt_f64x2: {
22457 return Builder.CreateCall(Callee, {Vec});
22459 case WebAssembly::BI__builtin_wasm_narrow_s_i8x16_i16x8:
22460 case WebAssembly::BI__builtin_wasm_narrow_u_i8x16_i16x8:
22461 case WebAssembly::BI__builtin_wasm_narrow_s_i16x8_i32x4:
22462 case WebAssembly::BI__builtin_wasm_narrow_u_i16x8_i32x4: {
22466 switch (BuiltinID) {
22467 case WebAssembly::BI__builtin_wasm_narrow_s_i8x16_i16x8:
22468 case WebAssembly::BI__builtin_wasm_narrow_s_i16x8_i32x4:
22469 IntNo = Intrinsic::wasm_narrow_signed;
22471 case WebAssembly::BI__builtin_wasm_narrow_u_i8x16_i16x8:
22472 case WebAssembly::BI__builtin_wasm_narrow_u_i16x8_i32x4:
22473 IntNo = Intrinsic::wasm_narrow_unsigned;
22476 llvm_unreachable(
"unexpected builtin ID");
22480 return Builder.CreateCall(Callee, {Low, High});
22482 case WebAssembly::BI__builtin_wasm_trunc_sat_s_zero_f64x2_i32x4:
22483 case WebAssembly::BI__builtin_wasm_trunc_sat_u_zero_f64x2_i32x4: {
22486 switch (BuiltinID) {
22487 case WebAssembly::BI__builtin_wasm_trunc_sat_s_zero_f64x2_i32x4:
22488 IntNo = Intrinsic::fptosi_sat;
22490 case WebAssembly::BI__builtin_wasm_trunc_sat_u_zero_f64x2_i32x4:
22491 IntNo = Intrinsic::fptoui_sat;
22494 llvm_unreachable(
"unexpected builtin ID");
22496 llvm::Type *SrcT = Vec->
getType();
22497 llvm::Type *TruncT = SrcT->getWithNewType(
Builder.getInt32Ty());
22500 Value *Splat = Constant::getNullValue(TruncT);
22503 case WebAssembly::BI__builtin_wasm_shuffle_i8x16: {
22508 while (OpIdx < 18) {
22509 std::optional<llvm::APSInt> LaneConst =
22511 assert(LaneConst &&
"Constant arg isn't actually constant?");
22512 Ops[OpIdx++] = llvm::ConstantInt::get(
getLLVMContext(), *LaneConst);
22515 return Builder.CreateCall(Callee, Ops);
22517 case WebAssembly::BI__builtin_wasm_relaxed_madd_f16x8:
22518 case WebAssembly::BI__builtin_wasm_relaxed_nmadd_f16x8:
22519 case WebAssembly::BI__builtin_wasm_relaxed_madd_f32x4:
22520 case WebAssembly::BI__builtin_wasm_relaxed_nmadd_f32x4:
22521 case WebAssembly::BI__builtin_wasm_relaxed_madd_f64x2:
22522 case WebAssembly::BI__builtin_wasm_relaxed_nmadd_f64x2: {
22527 switch (BuiltinID) {
22528 case WebAssembly::BI__builtin_wasm_relaxed_madd_f16x8:
22529 case WebAssembly::BI__builtin_wasm_relaxed_madd_f32x4:
22530 case WebAssembly::BI__builtin_wasm_relaxed_madd_f64x2:
22531 IntNo = Intrinsic::wasm_relaxed_madd;
22533 case WebAssembly::BI__builtin_wasm_relaxed_nmadd_f16x8:
22534 case WebAssembly::BI__builtin_wasm_relaxed_nmadd_f32x4:
22535 case WebAssembly::BI__builtin_wasm_relaxed_nmadd_f64x2:
22536 IntNo = Intrinsic::wasm_relaxed_nmadd;
22539 llvm_unreachable(
"unexpected builtin ID");
22542 return Builder.CreateCall(Callee, {A, B,
C});
22544 case WebAssembly::BI__builtin_wasm_relaxed_laneselect_i8x16:
22545 case WebAssembly::BI__builtin_wasm_relaxed_laneselect_i16x8:
22546 case WebAssembly::BI__builtin_wasm_relaxed_laneselect_i32x4:
22547 case WebAssembly::BI__builtin_wasm_relaxed_laneselect_i64x2: {
22553 return Builder.CreateCall(Callee, {A, B,
C});
22555 case WebAssembly::BI__builtin_wasm_relaxed_swizzle_i8x16: {
22559 return Builder.CreateCall(Callee, {Src, Indices});
22561 case WebAssembly::BI__builtin_wasm_relaxed_min_f32x4:
22562 case WebAssembly::BI__builtin_wasm_relaxed_max_f32x4:
22563 case WebAssembly::BI__builtin_wasm_relaxed_min_f64x2:
22564 case WebAssembly::BI__builtin_wasm_relaxed_max_f64x2: {
22568 switch (BuiltinID) {
22569 case WebAssembly::BI__builtin_wasm_relaxed_min_f32x4:
22570 case WebAssembly::BI__builtin_wasm_relaxed_min_f64x2:
22571 IntNo = Intrinsic::wasm_relaxed_min;
22573 case WebAssembly::BI__builtin_wasm_relaxed_max_f32x4:
22574 case WebAssembly::BI__builtin_wasm_relaxed_max_f64x2:
22575 IntNo = Intrinsic::wasm_relaxed_max;
22578 llvm_unreachable(
"unexpected builtin ID");
22581 return Builder.CreateCall(Callee, {LHS, RHS});
22583 case WebAssembly::BI__builtin_wasm_relaxed_trunc_s_i32x4_f32x4:
22584 case WebAssembly::BI__builtin_wasm_relaxed_trunc_u_i32x4_f32x4:
22585 case WebAssembly::BI__builtin_wasm_relaxed_trunc_s_zero_i32x4_f64x2:
22586 case WebAssembly::BI__builtin_wasm_relaxed_trunc_u_zero_i32x4_f64x2: {
22589 switch (BuiltinID) {
22590 case WebAssembly::BI__builtin_wasm_relaxed_trunc_s_i32x4_f32x4:
22591 IntNo = Intrinsic::wasm_relaxed_trunc_signed;
22593 case WebAssembly::BI__builtin_wasm_relaxed_trunc_u_i32x4_f32x4:
22594 IntNo = Intrinsic::wasm_relaxed_trunc_unsigned;
22596 case WebAssembly::BI__builtin_wasm_relaxed_trunc_s_zero_i32x4_f64x2:
22597 IntNo = Intrinsic::wasm_relaxed_trunc_signed_zero;
22599 case WebAssembly::BI__builtin_wasm_relaxed_trunc_u_zero_i32x4_f64x2:
22600 IntNo = Intrinsic::wasm_relaxed_trunc_unsigned_zero;
22603 llvm_unreachable(
"unexpected builtin ID");
22606 return Builder.CreateCall(Callee, {Vec});
22608 case WebAssembly::BI__builtin_wasm_relaxed_q15mulr_s_i16x8: {
22612 return Builder.CreateCall(Callee, {LHS, RHS});
22614 case WebAssembly::BI__builtin_wasm_relaxed_dot_i8x16_i7x16_s_i16x8: {
22619 return Builder.CreateCall(Callee, {LHS, RHS});
22621 case WebAssembly::BI__builtin_wasm_relaxed_dot_i8x16_i7x16_add_s_i32x4: {
22626 CGM.
getIntrinsic(Intrinsic::wasm_relaxed_dot_i8x16_i7x16_add_signed);
22627 return Builder.CreateCall(Callee, {LHS, RHS, Acc});
22629 case WebAssembly::BI__builtin_wasm_relaxed_dot_bf16x8_add_f32_f32x4: {
22635 return Builder.CreateCall(Callee, {LHS, RHS, Acc});
22637 case WebAssembly::BI__builtin_wasm_loadf16_f32: {
22640 return Builder.CreateCall(Callee, {Addr});
22642 case WebAssembly::BI__builtin_wasm_storef16_f32: {
22646 return Builder.CreateCall(Callee, {Val, Addr});
22648 case WebAssembly::BI__builtin_wasm_splat_f16x8: {
22651 return Builder.CreateCall(Callee, {Val});
22653 case WebAssembly::BI__builtin_wasm_extract_lane_f16x8: {
22659 case WebAssembly::BI__builtin_wasm_replace_lane_f16x8: {
22666 case WebAssembly::BI__builtin_wasm_table_get: {
22677 "Unexpected reference type for __builtin_wasm_table_get");
22678 return Builder.CreateCall(Callee, {Table, Index});
22680 case WebAssembly::BI__builtin_wasm_table_set: {
22692 "Unexpected reference type for __builtin_wasm_table_set");
22693 return Builder.CreateCall(Callee, {Table, Index, Val});
22695 case WebAssembly::BI__builtin_wasm_table_size: {
22701 case WebAssembly::BI__builtin_wasm_table_grow: {
22714 "Unexpected reference type for __builtin_wasm_table_grow");
22716 return Builder.CreateCall(Callee, {Table, Val, NElems});
22718 case WebAssembly::BI__builtin_wasm_table_fill: {
22732 "Unexpected reference type for __builtin_wasm_table_fill");
22734 return Builder.CreateCall(Callee, {Table, Index, Val, NElems});
22736 case WebAssembly::BI__builtin_wasm_table_copy: {
22746 return Builder.CreateCall(Callee, {TableX, TableY, SrcIdx, DstIdx, NElems});
22753static std::pair<Intrinsic::ID, unsigned>
22756 unsigned BuiltinID;
22757 Intrinsic::ID IntrinsicID;
22760 static Info Infos[] = {
22761#define CUSTOM_BUILTIN_MAPPING(x,s) \
22762 { Hexagon::BI__builtin_HEXAGON_##x, Intrinsic::hexagon_##x, s },
22794#include "clang/Basic/BuiltinsHexagonMapCustomDep.def"
22795#undef CUSTOM_BUILTIN_MAPPING
22798 auto CmpInfo = [] (Info A, Info B) {
return A.BuiltinID < B.BuiltinID; };
22799 static const bool SortOnce = (llvm::sort(Infos, CmpInfo),
true);
22802 const Info *F = llvm::lower_bound(Infos, Info{BuiltinID, 0, 0}, CmpInfo);
22803 if (F == std::end(Infos) || F->BuiltinID != BuiltinID)
22804 return {Intrinsic::not_intrinsic, 0};
22806 return {F->IntrinsicID, F->VecLen};
22815 auto MakeCircOp = [
this,
E](
unsigned IntID,
bool IsLoad) {
22829 for (
unsigned i = 1, e =
E->getNumArgs(); i != e; ++i)
22835 llvm::Value *NewBase = IsLoad ?
Builder.CreateExtractValue(
Result, 1)
22839 llvm::Value *RetVal =
22849 auto MakeBrevLd = [
this,
E](
unsigned IntID, llvm::Type *DestTy) {
22866 CGM.
getIntrinsic(IntID), {BaseAddress, EmitScalarExpr(E->getArg(2))});
22869 llvm::Value *DestVal =
Builder.CreateExtractValue(
Result, 0);
22874 DestVal =
Builder.CreateTrunc(DestVal, DestTy);
22881 auto V2Q = [
this, VecLen] (llvm::Value *Vec) {
22882 Intrinsic::ID
ID = VecLen == 128 ? Intrinsic::hexagon_V6_vandvrt_128B
22883 : Intrinsic::hexagon_V6_vandvrt;
22885 {Vec,
Builder.getInt32(-1)});
22887 auto Q2V = [
this, VecLen] (llvm::Value *Pred) {
22888 Intrinsic::ID
ID = VecLen == 128 ? Intrinsic::hexagon_V6_vandqrt_128B
22889 : Intrinsic::hexagon_V6_vandqrt;
22891 {Pred,
Builder.getInt32(-1)});
22894 switch (BuiltinID) {
22898 case Hexagon::BI__builtin_HEXAGON_V6_vaddcarry:
22899 case Hexagon::BI__builtin_HEXAGON_V6_vaddcarry_128B:
22900 case Hexagon::BI__builtin_HEXAGON_V6_vsubcarry:
22901 case Hexagon::BI__builtin_HEXAGON_V6_vsubcarry_128B: {
22908 {EmitScalarExpr(E->getArg(0)), EmitScalarExpr(E->getArg(1)), PredIn});
22910 llvm::Value *PredOut =
Builder.CreateExtractValue(
Result, 1);
22918 case Hexagon::BI__builtin_HEXAGON_V6_vaddcarryo:
22919 case Hexagon::BI__builtin_HEXAGON_V6_vaddcarryo_128B:
22920 case Hexagon::BI__builtin_HEXAGON_V6_vsubcarryo:
22921 case Hexagon::BI__builtin_HEXAGON_V6_vsubcarryo_128B: {
22927 {EmitScalarExpr(E->getArg(0)), EmitScalarExpr(E->getArg(1))});
22929 llvm::Value *PredOut =
Builder.CreateExtractValue(
Result, 1);
22935 case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstoreq:
22936 case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstorenq:
22937 case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstorentq:
22938 case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstorentnq:
22939 case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstoreq_128B:
22940 case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstorenq_128B:
22941 case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstorentq_128B:
22942 case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstorentnq_128B: {
22944 const Expr *PredOp =
E->getArg(0);
22946 if (
auto *Cast = dyn_cast<ImplicitCastExpr>(PredOp)) {
22947 if (
Cast->getCastKind() == CK_BitCast)
22948 PredOp =
Cast->getSubExpr();
22951 for (
int i = 1, e =
E->getNumArgs(); i != e; ++i)
22956 case Hexagon::BI__builtin_HEXAGON_L2_loadrub_pci:
22957 case Hexagon::BI__builtin_HEXAGON_L2_loadrb_pci:
22958 case Hexagon::BI__builtin_HEXAGON_L2_loadruh_pci:
22959 case Hexagon::BI__builtin_HEXAGON_L2_loadrh_pci:
22960 case Hexagon::BI__builtin_HEXAGON_L2_loadri_pci:
22961 case Hexagon::BI__builtin_HEXAGON_L2_loadrd_pci:
22962 case Hexagon::BI__builtin_HEXAGON_L2_loadrub_pcr:
22963 case Hexagon::BI__builtin_HEXAGON_L2_loadrb_pcr:
22964 case Hexagon::BI__builtin_HEXAGON_L2_loadruh_pcr:
22965 case Hexagon::BI__builtin_HEXAGON_L2_loadrh_pcr:
22966 case Hexagon::BI__builtin_HEXAGON_L2_loadri_pcr:
22967 case Hexagon::BI__builtin_HEXAGON_L2_loadrd_pcr:
22968 return MakeCircOp(ID,
true);
22969 case Hexagon::BI__builtin_HEXAGON_S2_storerb_pci:
22970 case Hexagon::BI__builtin_HEXAGON_S2_storerh_pci:
22971 case Hexagon::BI__builtin_HEXAGON_S2_storerf_pci:
22972 case Hexagon::BI__builtin_HEXAGON_S2_storeri_pci:
22973 case Hexagon::BI__builtin_HEXAGON_S2_storerd_pci:
22974 case Hexagon::BI__builtin_HEXAGON_S2_storerb_pcr:
22975 case Hexagon::BI__builtin_HEXAGON_S2_storerh_pcr:
22976 case Hexagon::BI__builtin_HEXAGON_S2_storerf_pcr:
22977 case Hexagon::BI__builtin_HEXAGON_S2_storeri_pcr:
22978 case Hexagon::BI__builtin_HEXAGON_S2_storerd_pcr:
22979 return MakeCircOp(ID,
false);
22980 case Hexagon::BI__builtin_brev_ldub:
22981 return MakeBrevLd(Intrinsic::hexagon_L2_loadrub_pbr,
Int8Ty);
22982 case Hexagon::BI__builtin_brev_ldb:
22983 return MakeBrevLd(Intrinsic::hexagon_L2_loadrb_pbr,
Int8Ty);
22984 case Hexagon::BI__builtin_brev_lduh:
22985 return MakeBrevLd(Intrinsic::hexagon_L2_loadruh_pbr,
Int16Ty);
22986 case Hexagon::BI__builtin_brev_ldh:
22987 return MakeBrevLd(Intrinsic::hexagon_L2_loadrh_pbr,
Int16Ty);
22988 case Hexagon::BI__builtin_brev_ldw:
22989 return MakeBrevLd(Intrinsic::hexagon_L2_loadri_pbr,
Int32Ty);
22990 case Hexagon::BI__builtin_brev_ldd:
22991 return MakeBrevLd(Intrinsic::hexagon_L2_loadrd_pbr,
Int64Ty);
22999 StringRef CPUStr = cast<clang::StringLiteral>(CPUExpr)->getString();
23007 llvm::Constant *RISCVCPUModel =
23009 cast<llvm::GlobalValue>(RISCVCPUModel)->setDSOLocal(
true);
23011 auto loadRISCVCPUID = [&](
unsigned Index) {
23014 Ptr, llvm::MaybeAlign());
23018 const llvm::RISCV::CPUModel Model = llvm::RISCV::getCPUModel(CPUStr);
23021 Value *VendorID = loadRISCVCPUID(0);
23023 Builder.CreateICmpEQ(VendorID,
Builder.getInt32(Model.MVendorID));
23026 Value *ArchID = loadRISCVCPUID(1);
23031 Value *ImpID = loadRISCVCPUID(2);
23042 if (BuiltinID == Builtin::BI__builtin_cpu_supports)
23044 if (BuiltinID == Builtin::BI__builtin_cpu_init)
23046 if (BuiltinID == Builtin::BI__builtin_cpu_is)
23053 unsigned ICEArguments = 0;
23061 if (BuiltinID == RISCVVector::BI__builtin_rvv_vget_v ||
23062 BuiltinID == RISCVVector::BI__builtin_rvv_vset_v)
23063 ICEArguments = 1 << 1;
23068 if (BuiltinID == RISCV::BI__builtin_riscv_ntl_load)
23069 ICEArguments |= (1 << 1);
23070 if (BuiltinID == RISCV::BI__builtin_riscv_ntl_store)
23071 ICEArguments |= (1 << 2);
23073 for (
unsigned i = 0, e =
E->getNumArgs(); i != e; i++) {
23078 Ops.push_back(AggValue);
23084 Intrinsic::ID
ID = Intrinsic::not_intrinsic;
23087 constexpr unsigned RVV_VTA = 0x1;
23088 constexpr unsigned RVV_VMA = 0x2;
23089 int PolicyAttrs = 0;
23090 bool IsMasked =
false;
23092 unsigned SegInstSEW = 8;
23096 switch (BuiltinID) {
23097 default: llvm_unreachable(
"unexpected builtin ID");
23098 case RISCV::BI__builtin_riscv_orc_b_32:
23099 case RISCV::BI__builtin_riscv_orc_b_64:
23100 case RISCV::BI__builtin_riscv_clmul_32:
23101 case RISCV::BI__builtin_riscv_clmul_64:
23102 case RISCV::BI__builtin_riscv_clmulh_32:
23103 case RISCV::BI__builtin_riscv_clmulh_64:
23104 case RISCV::BI__builtin_riscv_clmulr_32:
23105 case RISCV::BI__builtin_riscv_clmulr_64:
23106 case RISCV::BI__builtin_riscv_xperm4_32:
23107 case RISCV::BI__builtin_riscv_xperm4_64:
23108 case RISCV::BI__builtin_riscv_xperm8_32:
23109 case RISCV::BI__builtin_riscv_xperm8_64:
23110 case RISCV::BI__builtin_riscv_brev8_32:
23111 case RISCV::BI__builtin_riscv_brev8_64:
23112 case RISCV::BI__builtin_riscv_zip_32:
23113 case RISCV::BI__builtin_riscv_unzip_32: {
23114 switch (BuiltinID) {
23115 default: llvm_unreachable(
"unexpected builtin ID");
23117 case RISCV::BI__builtin_riscv_orc_b_32:
23118 case RISCV::BI__builtin_riscv_orc_b_64:
23119 ID = Intrinsic::riscv_orc_b;
23123 case RISCV::BI__builtin_riscv_clmul_32:
23124 case RISCV::BI__builtin_riscv_clmul_64:
23125 ID = Intrinsic::riscv_clmul;
23127 case RISCV::BI__builtin_riscv_clmulh_32:
23128 case RISCV::BI__builtin_riscv_clmulh_64:
23129 ID = Intrinsic::riscv_clmulh;
23131 case RISCV::BI__builtin_riscv_clmulr_32:
23132 case RISCV::BI__builtin_riscv_clmulr_64:
23133 ID = Intrinsic::riscv_clmulr;
23137 case RISCV::BI__builtin_riscv_xperm8_32:
23138 case RISCV::BI__builtin_riscv_xperm8_64:
23139 ID = Intrinsic::riscv_xperm8;
23141 case RISCV::BI__builtin_riscv_xperm4_32:
23142 case RISCV::BI__builtin_riscv_xperm4_64:
23143 ID = Intrinsic::riscv_xperm4;
23147 case RISCV::BI__builtin_riscv_brev8_32:
23148 case RISCV::BI__builtin_riscv_brev8_64:
23149 ID = Intrinsic::riscv_brev8;
23151 case RISCV::BI__builtin_riscv_zip_32:
23152 ID = Intrinsic::riscv_zip;
23154 case RISCV::BI__builtin_riscv_unzip_32:
23155 ID = Intrinsic::riscv_unzip;
23159 IntrinsicTypes = {ResultType};
23166 case RISCV::BI__builtin_riscv_sha256sig0:
23167 ID = Intrinsic::riscv_sha256sig0;
23169 case RISCV::BI__builtin_riscv_sha256sig1:
23170 ID = Intrinsic::riscv_sha256sig1;
23172 case RISCV::BI__builtin_riscv_sha256sum0:
23173 ID = Intrinsic::riscv_sha256sum0;
23175 case RISCV::BI__builtin_riscv_sha256sum1:
23176 ID = Intrinsic::riscv_sha256sum1;
23180 case RISCV::BI__builtin_riscv_sm4ks:
23181 ID = Intrinsic::riscv_sm4ks;
23183 case RISCV::BI__builtin_riscv_sm4ed:
23184 ID = Intrinsic::riscv_sm4ed;
23188 case RISCV::BI__builtin_riscv_sm3p0:
23189 ID = Intrinsic::riscv_sm3p0;
23191 case RISCV::BI__builtin_riscv_sm3p1:
23192 ID = Intrinsic::riscv_sm3p1;
23195 case RISCV::BI__builtin_riscv_clz_32:
23196 case RISCV::BI__builtin_riscv_clz_64: {
23199 if (
Result->getType() != ResultType)
23204 case RISCV::BI__builtin_riscv_ctz_32:
23205 case RISCV::BI__builtin_riscv_ctz_64: {
23208 if (
Result->getType() != ResultType)
23215 case RISCV::BI__builtin_riscv_ntl_load: {
23217 unsigned DomainVal = 5;
23218 if (Ops.size() == 2)
23219 DomainVal = cast<ConstantInt>(Ops[1])->getZExtValue();
23221 llvm::MDNode *RISCVDomainNode = llvm::MDNode::get(
23223 llvm::ConstantAsMetadata::get(
Builder.getInt32(DomainVal)));
23224 llvm::MDNode *NontemporalNode = llvm::MDNode::get(
23228 if(ResTy->isScalableTy()) {
23229 const ScalableVectorType *SVTy = cast<ScalableVectorType>(ResTy);
23230 llvm::Type *ScalarTy = ResTy->getScalarType();
23231 Width = ScalarTy->getPrimitiveSizeInBits() *
23232 SVTy->getElementCount().getKnownMinValue();
23234 Width = ResTy->getPrimitiveSizeInBits();
23238 Load->setMetadata(llvm::LLVMContext::MD_nontemporal, NontemporalNode);
23239 Load->setMetadata(
CGM.
getModule().getMDKindID(
"riscv-nontemporal-domain"),
23244 case RISCV::BI__builtin_riscv_ntl_store: {
23245 unsigned DomainVal = 5;
23246 if (Ops.size() == 3)
23247 DomainVal = cast<ConstantInt>(Ops[2])->getZExtValue();
23249 llvm::MDNode *RISCVDomainNode = llvm::MDNode::get(
23251 llvm::ConstantAsMetadata::get(
Builder.getInt32(DomainVal)));
23252 llvm::MDNode *NontemporalNode = llvm::MDNode::get(
23256 Store->setMetadata(llvm::LLVMContext::MD_nontemporal, NontemporalNode);
23263 case RISCV::BI__builtin_riscv_cv_alu_addN:
23264 ID = Intrinsic::riscv_cv_alu_addN;
23266 case RISCV::BI__builtin_riscv_cv_alu_addRN:
23267 ID = Intrinsic::riscv_cv_alu_addRN;
23269 case RISCV::BI__builtin_riscv_cv_alu_adduN:
23270 ID = Intrinsic::riscv_cv_alu_adduN;
23272 case RISCV::BI__builtin_riscv_cv_alu_adduRN:
23273 ID = Intrinsic::riscv_cv_alu_adduRN;
23275 case RISCV::BI__builtin_riscv_cv_alu_clip:
23276 ID = Intrinsic::riscv_cv_alu_clip;
23278 case RISCV::BI__builtin_riscv_cv_alu_clipu:
23279 ID = Intrinsic::riscv_cv_alu_clipu;
23281 case RISCV::BI__builtin_riscv_cv_alu_extbs:
23284 case RISCV::BI__builtin_riscv_cv_alu_extbz:
23287 case RISCV::BI__builtin_riscv_cv_alu_exths:
23290 case RISCV::BI__builtin_riscv_cv_alu_exthz:
23293 case RISCV::BI__builtin_riscv_cv_alu_slet:
23296 case RISCV::BI__builtin_riscv_cv_alu_sletu:
23299 case RISCV::BI__builtin_riscv_cv_alu_subN:
23300 ID = Intrinsic::riscv_cv_alu_subN;
23302 case RISCV::BI__builtin_riscv_cv_alu_subRN:
23303 ID = Intrinsic::riscv_cv_alu_subRN;
23305 case RISCV::BI__builtin_riscv_cv_alu_subuN:
23306 ID = Intrinsic::riscv_cv_alu_subuN;
23308 case RISCV::BI__builtin_riscv_cv_alu_subuRN:
23309 ID = Intrinsic::riscv_cv_alu_subuRN;
23313#include "clang/Basic/riscv_vector_builtin_cg.inc"
23316#include "clang/Basic/riscv_sifive_vector_builtin_cg.inc"
23319 assert(ID != Intrinsic::not_intrinsic);
23322 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 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 * emitQuaternaryBuiltin(CodeGenFunction &CGF, const CallExpr *E, unsigned IntrinsicID)
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)
void EmitCheck(ArrayRef< std::pair< llvm::Value *, SanitizerMask > > 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 EmitBuiltinNewDeleteCall(const FunctionProtoType *Type, const CallExpr *TheCallExpr, bool IsDelete)
llvm::Value * EmitRISCVCpuInit()
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)