1 //===---- CGBuiltin.cpp - Emit LLVM Code for builtins ---------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This contains code to emit Builtin calls as LLVM code. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "CGCXXABI.h" 15 #include "CGObjCRuntime.h" 16 #include "CGOpenCLRuntime.h" 17 #include "CodeGenFunction.h" 18 #include "CodeGenModule.h" 19 #include "TargetInfo.h" 20 #include "clang/AST/ASTContext.h" 21 #include "clang/AST/Decl.h" 22 #include "clang/Analysis/Analyses/OSLog.h" 23 #include "clang/Basic/TargetBuiltins.h" 24 #include "clang/Basic/TargetInfo.h" 25 #include "clang/CodeGen/CGFunctionInfo.h" 26 #include "llvm/ADT/StringExtras.h" 27 #include "llvm/IR/CallSite.h" 28 #include "llvm/IR/DataLayout.h" 29 #include "llvm/IR/InlineAsm.h" 30 #include "llvm/IR/Intrinsics.h" 31 #include "llvm/IR/MDBuilder.h" 32 #include <sstream> 33 34 using namespace clang; 35 using namespace CodeGen; 36 using namespace llvm; 37 38 /// getBuiltinLibFunction - Given a builtin id for a function like 39 /// "__builtin_fabsf", return a Function* for "fabsf". 40 llvm::Constant *CodeGenModule::getBuiltinLibFunction(const FunctionDecl *FD, 41 unsigned BuiltinID) { 42 assert(Context.BuiltinInfo.isLibFunction(BuiltinID)); 43 44 // Get the name, skip over the __builtin_ prefix (if necessary). 45 StringRef Name; 46 GlobalDecl D(FD); 47 48 // If the builtin has been declared explicitly with an assembler label, 49 // use the mangled name. This differs from the plain label on platforms 50 // that prefix labels. 51 if (FD->hasAttr<AsmLabelAttr>()) 52 Name = getMangledName(D); 53 else 54 Name = Context.BuiltinInfo.getName(BuiltinID) + 10; 55 56 llvm::FunctionType *Ty = 57 cast<llvm::FunctionType>(getTypes().ConvertType(FD->getType())); 58 59 return GetOrCreateLLVMFunction(Name, Ty, D, /*ForVTable=*/false); 60 } 61 62 /// Emit the conversions required to turn the given value into an 63 /// integer of the given size. 64 static Value *EmitToInt(CodeGenFunction &CGF, llvm::Value *V, 65 QualType T, llvm::IntegerType *IntType) { 66 V = CGF.EmitToMemory(V, T); 67 68 if (V->getType()->isPointerTy()) 69 return CGF.Builder.CreatePtrToInt(V, IntType); 70 71 assert(V->getType() == IntType); 72 return V; 73 } 74 75 static Value *EmitFromInt(CodeGenFunction &CGF, llvm::Value *V, 76 QualType T, llvm::Type *ResultType) { 77 V = CGF.EmitFromMemory(V, T); 78 79 if (ResultType->isPointerTy()) 80 return CGF.Builder.CreateIntToPtr(V, ResultType); 81 82 assert(V->getType() == ResultType); 83 return V; 84 } 85 86 /// Utility to insert an atomic instruction based on Instrinsic::ID 87 /// and the expression node. 88 static Value *MakeBinaryAtomicValue(CodeGenFunction &CGF, 89 llvm::AtomicRMWInst::BinOp Kind, 90 const CallExpr *E) { 91 QualType T = E->getType(); 92 assert(E->getArg(0)->getType()->isPointerType()); 93 assert(CGF.getContext().hasSameUnqualifiedType(T, 94 E->getArg(0)->getType()->getPointeeType())); 95 assert(CGF.getContext().hasSameUnqualifiedType(T, E->getArg(1)->getType())); 96 97 llvm::Value *DestPtr = CGF.EmitScalarExpr(E->getArg(0)); 98 unsigned AddrSpace = DestPtr->getType()->getPointerAddressSpace(); 99 100 llvm::IntegerType *IntType = 101 llvm::IntegerType::get(CGF.getLLVMContext(), 102 CGF.getContext().getTypeSize(T)); 103 llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace); 104 105 llvm::Value *Args[2]; 106 Args[0] = CGF.Builder.CreateBitCast(DestPtr, IntPtrType); 107 Args[1] = CGF.EmitScalarExpr(E->getArg(1)); 108 llvm::Type *ValueType = Args[1]->getType(); 109 Args[1] = EmitToInt(CGF, Args[1], T, IntType); 110 111 llvm::Value *Result = CGF.Builder.CreateAtomicRMW( 112 Kind, Args[0], Args[1], llvm::AtomicOrdering::SequentiallyConsistent); 113 return EmitFromInt(CGF, Result, T, ValueType); 114 } 115 116 static Value *EmitNontemporalStore(CodeGenFunction &CGF, const CallExpr *E) { 117 Value *Val = CGF.EmitScalarExpr(E->getArg(0)); 118 Value *Address = CGF.EmitScalarExpr(E->getArg(1)); 119 120 // Convert the type of the pointer to a pointer to the stored type. 121 Val = CGF.EmitToMemory(Val, E->getArg(0)->getType()); 122 Value *BC = CGF.Builder.CreateBitCast( 123 Address, llvm::PointerType::getUnqual(Val->getType()), "cast"); 124 LValue LV = CGF.MakeNaturalAlignAddrLValue(BC, E->getArg(0)->getType()); 125 LV.setNontemporal(true); 126 CGF.EmitStoreOfScalar(Val, LV, false); 127 return nullptr; 128 } 129 130 static Value *EmitNontemporalLoad(CodeGenFunction &CGF, const CallExpr *E) { 131 Value *Address = CGF.EmitScalarExpr(E->getArg(0)); 132 133 LValue LV = CGF.MakeNaturalAlignAddrLValue(Address, E->getType()); 134 LV.setNontemporal(true); 135 return CGF.EmitLoadOfScalar(LV, E->getExprLoc()); 136 } 137 138 static RValue EmitBinaryAtomic(CodeGenFunction &CGF, 139 llvm::AtomicRMWInst::BinOp Kind, 140 const CallExpr *E) { 141 return RValue::get(MakeBinaryAtomicValue(CGF, Kind, E)); 142 } 143 144 /// Utility to insert an atomic instruction based Instrinsic::ID and 145 /// the expression node, where the return value is the result of the 146 /// operation. 147 static RValue EmitBinaryAtomicPost(CodeGenFunction &CGF, 148 llvm::AtomicRMWInst::BinOp Kind, 149 const CallExpr *E, 150 Instruction::BinaryOps Op, 151 bool Invert = false) { 152 QualType T = E->getType(); 153 assert(E->getArg(0)->getType()->isPointerType()); 154 assert(CGF.getContext().hasSameUnqualifiedType(T, 155 E->getArg(0)->getType()->getPointeeType())); 156 assert(CGF.getContext().hasSameUnqualifiedType(T, E->getArg(1)->getType())); 157 158 llvm::Value *DestPtr = CGF.EmitScalarExpr(E->getArg(0)); 159 unsigned AddrSpace = DestPtr->getType()->getPointerAddressSpace(); 160 161 llvm::IntegerType *IntType = 162 llvm::IntegerType::get(CGF.getLLVMContext(), 163 CGF.getContext().getTypeSize(T)); 164 llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace); 165 166 llvm::Value *Args[2]; 167 Args[1] = CGF.EmitScalarExpr(E->getArg(1)); 168 llvm::Type *ValueType = Args[1]->getType(); 169 Args[1] = EmitToInt(CGF, Args[1], T, IntType); 170 Args[0] = CGF.Builder.CreateBitCast(DestPtr, IntPtrType); 171 172 llvm::Value *Result = CGF.Builder.CreateAtomicRMW( 173 Kind, Args[0], Args[1], llvm::AtomicOrdering::SequentiallyConsistent); 174 Result = CGF.Builder.CreateBinOp(Op, Result, Args[1]); 175 if (Invert) 176 Result = CGF.Builder.CreateBinOp(llvm::Instruction::Xor, Result, 177 llvm::ConstantInt::get(IntType, -1)); 178 Result = EmitFromInt(CGF, Result, T, ValueType); 179 return RValue::get(Result); 180 } 181 182 /// @brief Utility to insert an atomic cmpxchg instruction. 183 /// 184 /// @param CGF The current codegen function. 185 /// @param E Builtin call expression to convert to cmpxchg. 186 /// arg0 - address to operate on 187 /// arg1 - value to compare with 188 /// arg2 - new value 189 /// @param ReturnBool Specifies whether to return success flag of 190 /// cmpxchg result or the old value. 191 /// 192 /// @returns result of cmpxchg, according to ReturnBool 193 static Value *MakeAtomicCmpXchgValue(CodeGenFunction &CGF, const CallExpr *E, 194 bool ReturnBool) { 195 QualType T = ReturnBool ? E->getArg(1)->getType() : E->getType(); 196 llvm::Value *DestPtr = CGF.EmitScalarExpr(E->getArg(0)); 197 unsigned AddrSpace = DestPtr->getType()->getPointerAddressSpace(); 198 199 llvm::IntegerType *IntType = llvm::IntegerType::get( 200 CGF.getLLVMContext(), CGF.getContext().getTypeSize(T)); 201 llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace); 202 203 Value *Args[3]; 204 Args[0] = CGF.Builder.CreateBitCast(DestPtr, IntPtrType); 205 Args[1] = CGF.EmitScalarExpr(E->getArg(1)); 206 llvm::Type *ValueType = Args[1]->getType(); 207 Args[1] = EmitToInt(CGF, Args[1], T, IntType); 208 Args[2] = EmitToInt(CGF, CGF.EmitScalarExpr(E->getArg(2)), T, IntType); 209 210 Value *Pair = CGF.Builder.CreateAtomicCmpXchg( 211 Args[0], Args[1], Args[2], llvm::AtomicOrdering::SequentiallyConsistent, 212 llvm::AtomicOrdering::SequentiallyConsistent); 213 if (ReturnBool) 214 // Extract boolean success flag and zext it to int. 215 return CGF.Builder.CreateZExt(CGF.Builder.CreateExtractValue(Pair, 1), 216 CGF.ConvertType(E->getType())); 217 else 218 // Extract old value and emit it using the same type as compare value. 219 return EmitFromInt(CGF, CGF.Builder.CreateExtractValue(Pair, 0), T, 220 ValueType); 221 } 222 223 // Emit a simple mangled intrinsic that has 1 argument and a return type 224 // matching the argument type. 225 static Value *emitUnaryBuiltin(CodeGenFunction &CGF, 226 const CallExpr *E, 227 unsigned IntrinsicID) { 228 llvm::Value *Src0 = CGF.EmitScalarExpr(E->getArg(0)); 229 230 Value *F = CGF.CGM.getIntrinsic(IntrinsicID, Src0->getType()); 231 return CGF.Builder.CreateCall(F, Src0); 232 } 233 234 // Emit an intrinsic that has 2 operands of the same type as its result. 235 static Value *emitBinaryBuiltin(CodeGenFunction &CGF, 236 const CallExpr *E, 237 unsigned IntrinsicID) { 238 llvm::Value *Src0 = CGF.EmitScalarExpr(E->getArg(0)); 239 llvm::Value *Src1 = CGF.EmitScalarExpr(E->getArg(1)); 240 241 Value *F = CGF.CGM.getIntrinsic(IntrinsicID, Src0->getType()); 242 return CGF.Builder.CreateCall(F, { Src0, Src1 }); 243 } 244 245 // Emit an intrinsic that has 3 operands of the same type as its result. 246 static Value *emitTernaryBuiltin(CodeGenFunction &CGF, 247 const CallExpr *E, 248 unsigned IntrinsicID) { 249 llvm::Value *Src0 = CGF.EmitScalarExpr(E->getArg(0)); 250 llvm::Value *Src1 = CGF.EmitScalarExpr(E->getArg(1)); 251 llvm::Value *Src2 = CGF.EmitScalarExpr(E->getArg(2)); 252 253 Value *F = CGF.CGM.getIntrinsic(IntrinsicID, Src0->getType()); 254 return CGF.Builder.CreateCall(F, { Src0, Src1, Src2 }); 255 } 256 257 // Emit an intrinsic that has 1 float or double operand, and 1 integer. 258 static Value *emitFPIntBuiltin(CodeGenFunction &CGF, 259 const CallExpr *E, 260 unsigned IntrinsicID) { 261 llvm::Value *Src0 = CGF.EmitScalarExpr(E->getArg(0)); 262 llvm::Value *Src1 = CGF.EmitScalarExpr(E->getArg(1)); 263 264 Value *F = CGF.CGM.getIntrinsic(IntrinsicID, Src0->getType()); 265 return CGF.Builder.CreateCall(F, {Src0, Src1}); 266 } 267 268 /// EmitFAbs - Emit a call to @llvm.fabs(). 269 static Value *EmitFAbs(CodeGenFunction &CGF, Value *V) { 270 Value *F = CGF.CGM.getIntrinsic(Intrinsic::fabs, V->getType()); 271 llvm::CallInst *Call = CGF.Builder.CreateCall(F, V); 272 Call->setDoesNotAccessMemory(); 273 return Call; 274 } 275 276 /// Emit the computation of the sign bit for a floating point value. Returns 277 /// the i1 sign bit value. 278 static Value *EmitSignBit(CodeGenFunction &CGF, Value *V) { 279 LLVMContext &C = CGF.CGM.getLLVMContext(); 280 281 llvm::Type *Ty = V->getType(); 282 int Width = Ty->getPrimitiveSizeInBits(); 283 llvm::Type *IntTy = llvm::IntegerType::get(C, Width); 284 V = CGF.Builder.CreateBitCast(V, IntTy); 285 if (Ty->isPPC_FP128Ty()) { 286 // We want the sign bit of the higher-order double. The bitcast we just 287 // did works as if the double-double was stored to memory and then 288 // read as an i128. The "store" will put the higher-order double in the 289 // lower address in both little- and big-Endian modes, but the "load" 290 // will treat those bits as a different part of the i128: the low bits in 291 // little-Endian, the high bits in big-Endian. Therefore, on big-Endian 292 // we need to shift the high bits down to the low before truncating. 293 Width >>= 1; 294 if (CGF.getTarget().isBigEndian()) { 295 Value *ShiftCst = llvm::ConstantInt::get(IntTy, Width); 296 V = CGF.Builder.CreateLShr(V, ShiftCst); 297 } 298 // We are truncating value in order to extract the higher-order 299 // double, which we will be using to extract the sign from. 300 IntTy = llvm::IntegerType::get(C, Width); 301 V = CGF.Builder.CreateTrunc(V, IntTy); 302 } 303 Value *Zero = llvm::Constant::getNullValue(IntTy); 304 return CGF.Builder.CreateICmpSLT(V, Zero); 305 } 306 307 static RValue emitLibraryCall(CodeGenFunction &CGF, const FunctionDecl *FD, 308 const CallExpr *E, llvm::Constant *calleeValue) { 309 CGCallee callee = CGCallee::forDirect(calleeValue, FD); 310 return CGF.EmitCall(E->getCallee()->getType(), callee, E, ReturnValueSlot()); 311 } 312 313 /// \brief Emit a call to llvm.{sadd,uadd,ssub,usub,smul,umul}.with.overflow.* 314 /// depending on IntrinsicID. 315 /// 316 /// \arg CGF The current codegen function. 317 /// \arg IntrinsicID The ID for the Intrinsic we wish to generate. 318 /// \arg X The first argument to the llvm.*.with.overflow.*. 319 /// \arg Y The second argument to the llvm.*.with.overflow.*. 320 /// \arg Carry The carry returned by the llvm.*.with.overflow.*. 321 /// \returns The result (i.e. sum/product) returned by the intrinsic. 322 static llvm::Value *EmitOverflowIntrinsic(CodeGenFunction &CGF, 323 const llvm::Intrinsic::ID IntrinsicID, 324 llvm::Value *X, llvm::Value *Y, 325 llvm::Value *&Carry) { 326 // Make sure we have integers of the same width. 327 assert(X->getType() == Y->getType() && 328 "Arguments must be the same type. (Did you forget to make sure both " 329 "arguments have the same integer width?)"); 330 331 llvm::Value *Callee = CGF.CGM.getIntrinsic(IntrinsicID, X->getType()); 332 llvm::Value *Tmp = CGF.Builder.CreateCall(Callee, {X, Y}); 333 Carry = CGF.Builder.CreateExtractValue(Tmp, 1); 334 return CGF.Builder.CreateExtractValue(Tmp, 0); 335 } 336 337 static Value *emitRangedBuiltin(CodeGenFunction &CGF, 338 unsigned IntrinsicID, 339 int low, int high) { 340 llvm::MDBuilder MDHelper(CGF.getLLVMContext()); 341 llvm::MDNode *RNode = MDHelper.createRange(APInt(32, low), APInt(32, high)); 342 Value *F = CGF.CGM.getIntrinsic(IntrinsicID, {}); 343 llvm::Instruction *Call = CGF.Builder.CreateCall(F); 344 Call->setMetadata(llvm::LLVMContext::MD_range, RNode); 345 return Call; 346 } 347 348 namespace { 349 struct WidthAndSignedness { 350 unsigned Width; 351 bool Signed; 352 }; 353 } 354 355 static WidthAndSignedness 356 getIntegerWidthAndSignedness(const clang::ASTContext &context, 357 const clang::QualType Type) { 358 assert(Type->isIntegerType() && "Given type is not an integer."); 359 unsigned Width = Type->isBooleanType() ? 1 : context.getTypeInfo(Type).Width; 360 bool Signed = Type->isSignedIntegerType(); 361 return {Width, Signed}; 362 } 363 364 // Given one or more integer types, this function produces an integer type that 365 // encompasses them: any value in one of the given types could be expressed in 366 // the encompassing type. 367 static struct WidthAndSignedness 368 EncompassingIntegerType(ArrayRef<struct WidthAndSignedness> Types) { 369 assert(Types.size() > 0 && "Empty list of types."); 370 371 // If any of the given types is signed, we must return a signed type. 372 bool Signed = false; 373 for (const auto &Type : Types) { 374 Signed |= Type.Signed; 375 } 376 377 // The encompassing type must have a width greater than or equal to the width 378 // of the specified types. Aditionally, if the encompassing type is signed, 379 // its width must be strictly greater than the width of any unsigned types 380 // given. 381 unsigned Width = 0; 382 for (const auto &Type : Types) { 383 unsigned MinWidth = Type.Width + (Signed && !Type.Signed); 384 if (Width < MinWidth) { 385 Width = MinWidth; 386 } 387 } 388 389 return {Width, Signed}; 390 } 391 392 Value *CodeGenFunction::EmitVAStartEnd(Value *ArgValue, bool IsStart) { 393 llvm::Type *DestType = Int8PtrTy; 394 if (ArgValue->getType() != DestType) 395 ArgValue = 396 Builder.CreateBitCast(ArgValue, DestType, ArgValue->getName().data()); 397 398 Intrinsic::ID inst = IsStart ? Intrinsic::vastart : Intrinsic::vaend; 399 return Builder.CreateCall(CGM.getIntrinsic(inst), ArgValue); 400 } 401 402 /// Checks if using the result of __builtin_object_size(p, @p From) in place of 403 /// __builtin_object_size(p, @p To) is correct 404 static bool areBOSTypesCompatible(int From, int To) { 405 // Note: Our __builtin_object_size implementation currently treats Type=0 and 406 // Type=2 identically. Encoding this implementation detail here may make 407 // improving __builtin_object_size difficult in the future, so it's omitted. 408 return From == To || (From == 0 && To == 1) || (From == 3 && To == 2); 409 } 410 411 static llvm::Value * 412 getDefaultBuiltinObjectSizeResult(unsigned Type, llvm::IntegerType *ResType) { 413 return ConstantInt::get(ResType, (Type & 2) ? 0 : -1, /*isSigned=*/true); 414 } 415 416 llvm::Value * 417 CodeGenFunction::evaluateOrEmitBuiltinObjectSize(const Expr *E, unsigned Type, 418 llvm::IntegerType *ResType) { 419 uint64_t ObjectSize; 420 if (!E->tryEvaluateObjectSize(ObjectSize, getContext(), Type)) 421 return emitBuiltinObjectSize(E, Type, ResType); 422 return ConstantInt::get(ResType, ObjectSize, /*isSigned=*/true); 423 } 424 425 /// Returns a Value corresponding to the size of the given expression. 426 /// This Value may be either of the following: 427 /// - A llvm::Argument (if E is a param with the pass_object_size attribute on 428 /// it) 429 /// - A call to the @llvm.objectsize intrinsic 430 llvm::Value * 431 CodeGenFunction::emitBuiltinObjectSize(const Expr *E, unsigned Type, 432 llvm::IntegerType *ResType) { 433 // We need to reference an argument if the pointer is a parameter with the 434 // pass_object_size attribute. 435 if (auto *D = dyn_cast<DeclRefExpr>(E->IgnoreParenImpCasts())) { 436 auto *Param = dyn_cast<ParmVarDecl>(D->getDecl()); 437 auto *PS = D->getDecl()->getAttr<PassObjectSizeAttr>(); 438 if (Param != nullptr && PS != nullptr && 439 areBOSTypesCompatible(PS->getType(), Type)) { 440 auto Iter = SizeArguments.find(Param); 441 assert(Iter != SizeArguments.end()); 442 443 const ImplicitParamDecl *D = Iter->second; 444 auto DIter = LocalDeclMap.find(D); 445 assert(DIter != LocalDeclMap.end()); 446 447 return EmitLoadOfScalar(DIter->second, /*volatile=*/false, 448 getContext().getSizeType(), E->getLocStart()); 449 } 450 } 451 452 // LLVM can't handle Type=3 appropriately, and __builtin_object_size shouldn't 453 // evaluate E for side-effects. In either case, we shouldn't lower to 454 // @llvm.objectsize. 455 if (Type == 3 || E->HasSideEffects(getContext())) 456 return getDefaultBuiltinObjectSizeResult(Type, ResType); 457 458 // LLVM only supports 0 and 2, make sure that we pass along that 459 // as a boolean. 460 auto *CI = ConstantInt::get(Builder.getInt1Ty(), (Type & 2) >> 1); 461 // FIXME: Get right address space. 462 llvm::Type *Tys[] = {ResType, Builder.getInt8PtrTy(0)}; 463 Value *F = CGM.getIntrinsic(Intrinsic::objectsize, Tys); 464 return Builder.CreateCall(F, {EmitScalarExpr(E), CI}); 465 } 466 467 // Many of MSVC builtins are on both x64 and ARM; to avoid repeating code, we 468 // handle them here. 469 enum class CodeGenFunction::MSVCIntrin { 470 _BitScanForward, 471 _BitScanReverse, 472 _InterlockedAnd, 473 _InterlockedDecrement, 474 _InterlockedExchange, 475 _InterlockedExchangeAdd, 476 _InterlockedExchangeSub, 477 _InterlockedIncrement, 478 _InterlockedOr, 479 _InterlockedXor, 480 }; 481 482 Value *CodeGenFunction::EmitMSVCBuiltinExpr(MSVCIntrin BuiltinID, 483 const CallExpr *E) { 484 switch (BuiltinID) { 485 case MSVCIntrin::_BitScanForward: 486 case MSVCIntrin::_BitScanReverse: { 487 Value *ArgValue = EmitScalarExpr(E->getArg(1)); 488 489 llvm::Type *ArgType = ArgValue->getType(); 490 llvm::Type *IndexType = 491 EmitScalarExpr(E->getArg(0))->getType()->getPointerElementType(); 492 llvm::Type *ResultType = ConvertType(E->getType()); 493 494 Value *ArgZero = llvm::Constant::getNullValue(ArgType); 495 Value *ResZero = llvm::Constant::getNullValue(ResultType); 496 Value *ResOne = llvm::ConstantInt::get(ResultType, 1); 497 498 BasicBlock *Begin = Builder.GetInsertBlock(); 499 BasicBlock *End = createBasicBlock("bitscan_end", this->CurFn); 500 Builder.SetInsertPoint(End); 501 PHINode *Result = Builder.CreatePHI(ResultType, 2, "bitscan_result"); 502 503 Builder.SetInsertPoint(Begin); 504 Value *IsZero = Builder.CreateICmpEQ(ArgValue, ArgZero); 505 BasicBlock *NotZero = createBasicBlock("bitscan_not_zero", this->CurFn); 506 Builder.CreateCondBr(IsZero, End, NotZero); 507 Result->addIncoming(ResZero, Begin); 508 509 Builder.SetInsertPoint(NotZero); 510 Address IndexAddress = EmitPointerWithAlignment(E->getArg(0)); 511 512 if (BuiltinID == MSVCIntrin::_BitScanForward) { 513 Value *F = CGM.getIntrinsic(Intrinsic::cttz, ArgType); 514 Value *ZeroCount = Builder.CreateCall(F, {ArgValue, Builder.getTrue()}); 515 ZeroCount = Builder.CreateIntCast(ZeroCount, IndexType, false); 516 Builder.CreateStore(ZeroCount, IndexAddress, false); 517 } else { 518 unsigned ArgWidth = cast<llvm::IntegerType>(ArgType)->getBitWidth(); 519 Value *ArgTypeLastIndex = llvm::ConstantInt::get(IndexType, ArgWidth - 1); 520 521 Value *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType); 522 Value *ZeroCount = Builder.CreateCall(F, {ArgValue, Builder.getTrue()}); 523 ZeroCount = Builder.CreateIntCast(ZeroCount, IndexType, false); 524 Value *Index = Builder.CreateNSWSub(ArgTypeLastIndex, ZeroCount); 525 Builder.CreateStore(Index, IndexAddress, false); 526 } 527 Builder.CreateBr(End); 528 Result->addIncoming(ResOne, NotZero); 529 530 Builder.SetInsertPoint(End); 531 return Result; 532 } 533 case MSVCIntrin::_InterlockedAnd: 534 return MakeBinaryAtomicValue(*this, AtomicRMWInst::And, E); 535 case MSVCIntrin::_InterlockedExchange: 536 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Xchg, E); 537 case MSVCIntrin::_InterlockedExchangeAdd: 538 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Add, E); 539 case MSVCIntrin::_InterlockedExchangeSub: 540 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Sub, E); 541 case MSVCIntrin::_InterlockedOr: 542 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Or, E); 543 case MSVCIntrin::_InterlockedXor: 544 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Xor, E); 545 546 case MSVCIntrin::_InterlockedDecrement: { 547 llvm::Type *IntTy = ConvertType(E->getType()); 548 AtomicRMWInst *RMWI = Builder.CreateAtomicRMW( 549 AtomicRMWInst::Sub, 550 EmitScalarExpr(E->getArg(0)), 551 ConstantInt::get(IntTy, 1), 552 llvm::AtomicOrdering::SequentiallyConsistent); 553 return Builder.CreateSub(RMWI, ConstantInt::get(IntTy, 1)); 554 } 555 case MSVCIntrin::_InterlockedIncrement: { 556 llvm::Type *IntTy = ConvertType(E->getType()); 557 AtomicRMWInst *RMWI = Builder.CreateAtomicRMW( 558 AtomicRMWInst::Add, 559 EmitScalarExpr(E->getArg(0)), 560 ConstantInt::get(IntTy, 1), 561 llvm::AtomicOrdering::SequentiallyConsistent); 562 return Builder.CreateAdd(RMWI, ConstantInt::get(IntTy, 1)); 563 } 564 } 565 llvm_unreachable("Incorrect MSVC intrinsic!"); 566 } 567 568 namespace { 569 // ARC cleanup for __builtin_os_log_format 570 struct CallObjCArcUse final : EHScopeStack::Cleanup { 571 CallObjCArcUse(llvm::Value *object) : object(object) {} 572 llvm::Value *object; 573 574 void Emit(CodeGenFunction &CGF, Flags flags) override { 575 CGF.EmitARCIntrinsicUse(object); 576 } 577 }; 578 } 579 580 RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, 581 unsigned BuiltinID, const CallExpr *E, 582 ReturnValueSlot ReturnValue) { 583 // See if we can constant fold this builtin. If so, don't emit it at all. 584 Expr::EvalResult Result; 585 if (E->EvaluateAsRValue(Result, CGM.getContext()) && 586 !Result.hasSideEffects()) { 587 if (Result.Val.isInt()) 588 return RValue::get(llvm::ConstantInt::get(getLLVMContext(), 589 Result.Val.getInt())); 590 if (Result.Val.isFloat()) 591 return RValue::get(llvm::ConstantFP::get(getLLVMContext(), 592 Result.Val.getFloat())); 593 } 594 595 switch (BuiltinID) { 596 default: break; // Handle intrinsics and libm functions below. 597 case Builtin::BI__builtin___CFStringMakeConstantString: 598 case Builtin::BI__builtin___NSStringMakeConstantString: 599 return RValue::get(CGM.EmitConstantExpr(E, E->getType(), nullptr)); 600 case Builtin::BI__builtin_stdarg_start: 601 case Builtin::BI__builtin_va_start: 602 case Builtin::BI__va_start: 603 case Builtin::BI__builtin_va_end: 604 return RValue::get( 605 EmitVAStartEnd(BuiltinID == Builtin::BI__va_start 606 ? EmitScalarExpr(E->getArg(0)) 607 : EmitVAListRef(E->getArg(0)).getPointer(), 608 BuiltinID != Builtin::BI__builtin_va_end)); 609 case Builtin::BI__builtin_va_copy: { 610 Value *DstPtr = EmitVAListRef(E->getArg(0)).getPointer(); 611 Value *SrcPtr = EmitVAListRef(E->getArg(1)).getPointer(); 612 613 llvm::Type *Type = Int8PtrTy; 614 615 DstPtr = Builder.CreateBitCast(DstPtr, Type); 616 SrcPtr = Builder.CreateBitCast(SrcPtr, Type); 617 return RValue::get(Builder.CreateCall(CGM.getIntrinsic(Intrinsic::vacopy), 618 {DstPtr, SrcPtr})); 619 } 620 case Builtin::BI__builtin_abs: 621 case Builtin::BI__builtin_labs: 622 case Builtin::BI__builtin_llabs: { 623 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 624 625 Value *NegOp = Builder.CreateNeg(ArgValue, "neg"); 626 Value *CmpResult = 627 Builder.CreateICmpSGE(ArgValue, 628 llvm::Constant::getNullValue(ArgValue->getType()), 629 "abscond"); 630 Value *Result = 631 Builder.CreateSelect(CmpResult, ArgValue, NegOp, "abs"); 632 633 return RValue::get(Result); 634 } 635 case Builtin::BI__builtin_fabs: 636 case Builtin::BI__builtin_fabsf: 637 case Builtin::BI__builtin_fabsl: { 638 return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::fabs)); 639 } 640 case Builtin::BI__builtin_fmod: 641 case Builtin::BI__builtin_fmodf: 642 case Builtin::BI__builtin_fmodl: { 643 Value *Arg1 = EmitScalarExpr(E->getArg(0)); 644 Value *Arg2 = EmitScalarExpr(E->getArg(1)); 645 Value *Result = Builder.CreateFRem(Arg1, Arg2, "fmod"); 646 return RValue::get(Result); 647 } 648 case Builtin::BI__builtin_copysign: 649 case Builtin::BI__builtin_copysignf: 650 case Builtin::BI__builtin_copysignl: { 651 return RValue::get(emitBinaryBuiltin(*this, E, Intrinsic::copysign)); 652 } 653 case Builtin::BI__builtin_ceil: 654 case Builtin::BI__builtin_ceilf: 655 case Builtin::BI__builtin_ceill: { 656 return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::ceil)); 657 } 658 case Builtin::BI__builtin_floor: 659 case Builtin::BI__builtin_floorf: 660 case Builtin::BI__builtin_floorl: { 661 return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::floor)); 662 } 663 case Builtin::BI__builtin_trunc: 664 case Builtin::BI__builtin_truncf: 665 case Builtin::BI__builtin_truncl: { 666 return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::trunc)); 667 } 668 case Builtin::BI__builtin_rint: 669 case Builtin::BI__builtin_rintf: 670 case Builtin::BI__builtin_rintl: { 671 return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::rint)); 672 } 673 case Builtin::BI__builtin_nearbyint: 674 case Builtin::BI__builtin_nearbyintf: 675 case Builtin::BI__builtin_nearbyintl: { 676 return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::nearbyint)); 677 } 678 case Builtin::BI__builtin_round: 679 case Builtin::BI__builtin_roundf: 680 case Builtin::BI__builtin_roundl: { 681 return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::round)); 682 } 683 case Builtin::BI__builtin_fmin: 684 case Builtin::BI__builtin_fminf: 685 case Builtin::BI__builtin_fminl: { 686 return RValue::get(emitBinaryBuiltin(*this, E, Intrinsic::minnum)); 687 } 688 case Builtin::BI__builtin_fmax: 689 case Builtin::BI__builtin_fmaxf: 690 case Builtin::BI__builtin_fmaxl: { 691 return RValue::get(emitBinaryBuiltin(*this, E, Intrinsic::maxnum)); 692 } 693 case Builtin::BI__builtin_conj: 694 case Builtin::BI__builtin_conjf: 695 case Builtin::BI__builtin_conjl: { 696 ComplexPairTy ComplexVal = EmitComplexExpr(E->getArg(0)); 697 Value *Real = ComplexVal.first; 698 Value *Imag = ComplexVal.second; 699 Value *Zero = 700 Imag->getType()->isFPOrFPVectorTy() 701 ? llvm::ConstantFP::getZeroValueForNegation(Imag->getType()) 702 : llvm::Constant::getNullValue(Imag->getType()); 703 704 Imag = Builder.CreateFSub(Zero, Imag, "sub"); 705 return RValue::getComplex(std::make_pair(Real, Imag)); 706 } 707 case Builtin::BI__builtin_creal: 708 case Builtin::BI__builtin_crealf: 709 case Builtin::BI__builtin_creall: 710 case Builtin::BIcreal: 711 case Builtin::BIcrealf: 712 case Builtin::BIcreall: { 713 ComplexPairTy ComplexVal = EmitComplexExpr(E->getArg(0)); 714 return RValue::get(ComplexVal.first); 715 } 716 717 case Builtin::BI__builtin_cimag: 718 case Builtin::BI__builtin_cimagf: 719 case Builtin::BI__builtin_cimagl: 720 case Builtin::BIcimag: 721 case Builtin::BIcimagf: 722 case Builtin::BIcimagl: { 723 ComplexPairTy ComplexVal = EmitComplexExpr(E->getArg(0)); 724 return RValue::get(ComplexVal.second); 725 } 726 727 case Builtin::BI__builtin_ctzs: 728 case Builtin::BI__builtin_ctz: 729 case Builtin::BI__builtin_ctzl: 730 case Builtin::BI__builtin_ctzll: { 731 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 732 733 llvm::Type *ArgType = ArgValue->getType(); 734 Value *F = CGM.getIntrinsic(Intrinsic::cttz, ArgType); 735 736 llvm::Type *ResultType = ConvertType(E->getType()); 737 Value *ZeroUndef = Builder.getInt1(getTarget().isCLZForZeroUndef()); 738 Value *Result = Builder.CreateCall(F, {ArgValue, ZeroUndef}); 739 if (Result->getType() != ResultType) 740 Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true, 741 "cast"); 742 return RValue::get(Result); 743 } 744 case Builtin::BI__builtin_clzs: 745 case Builtin::BI__builtin_clz: 746 case Builtin::BI__builtin_clzl: 747 case Builtin::BI__builtin_clzll: { 748 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 749 750 llvm::Type *ArgType = ArgValue->getType(); 751 Value *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType); 752 753 llvm::Type *ResultType = ConvertType(E->getType()); 754 Value *ZeroUndef = Builder.getInt1(getTarget().isCLZForZeroUndef()); 755 Value *Result = Builder.CreateCall(F, {ArgValue, ZeroUndef}); 756 if (Result->getType() != ResultType) 757 Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true, 758 "cast"); 759 return RValue::get(Result); 760 } 761 case Builtin::BI__builtin_ffs: 762 case Builtin::BI__builtin_ffsl: 763 case Builtin::BI__builtin_ffsll: { 764 // ffs(x) -> x ? cttz(x) + 1 : 0 765 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 766 767 llvm::Type *ArgType = ArgValue->getType(); 768 Value *F = CGM.getIntrinsic(Intrinsic::cttz, ArgType); 769 770 llvm::Type *ResultType = ConvertType(E->getType()); 771 Value *Tmp = 772 Builder.CreateAdd(Builder.CreateCall(F, {ArgValue, Builder.getTrue()}), 773 llvm::ConstantInt::get(ArgType, 1)); 774 Value *Zero = llvm::Constant::getNullValue(ArgType); 775 Value *IsZero = Builder.CreateICmpEQ(ArgValue, Zero, "iszero"); 776 Value *Result = Builder.CreateSelect(IsZero, Zero, Tmp, "ffs"); 777 if (Result->getType() != ResultType) 778 Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true, 779 "cast"); 780 return RValue::get(Result); 781 } 782 case Builtin::BI__builtin_parity: 783 case Builtin::BI__builtin_parityl: 784 case Builtin::BI__builtin_parityll: { 785 // parity(x) -> ctpop(x) & 1 786 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 787 788 llvm::Type *ArgType = ArgValue->getType(); 789 Value *F = CGM.getIntrinsic(Intrinsic::ctpop, ArgType); 790 791 llvm::Type *ResultType = ConvertType(E->getType()); 792 Value *Tmp = Builder.CreateCall(F, ArgValue); 793 Value *Result = Builder.CreateAnd(Tmp, llvm::ConstantInt::get(ArgType, 1)); 794 if (Result->getType() != ResultType) 795 Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true, 796 "cast"); 797 return RValue::get(Result); 798 } 799 case Builtin::BI__popcnt16: 800 case Builtin::BI__popcnt: 801 case Builtin::BI__popcnt64: 802 case Builtin::BI__builtin_popcount: 803 case Builtin::BI__builtin_popcountl: 804 case Builtin::BI__builtin_popcountll: { 805 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 806 807 llvm::Type *ArgType = ArgValue->getType(); 808 Value *F = CGM.getIntrinsic(Intrinsic::ctpop, ArgType); 809 810 llvm::Type *ResultType = ConvertType(E->getType()); 811 Value *Result = Builder.CreateCall(F, ArgValue); 812 if (Result->getType() != ResultType) 813 Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true, 814 "cast"); 815 return RValue::get(Result); 816 } 817 case Builtin::BI_rotr8: 818 case Builtin::BI_rotr16: 819 case Builtin::BI_rotr: 820 case Builtin::BI_lrotr: 821 case Builtin::BI_rotr64: { 822 Value *Val = EmitScalarExpr(E->getArg(0)); 823 Value *Shift = EmitScalarExpr(E->getArg(1)); 824 825 llvm::Type *ArgType = Val->getType(); 826 Shift = Builder.CreateIntCast(Shift, ArgType, false); 827 unsigned ArgWidth = cast<llvm::IntegerType>(ArgType)->getBitWidth(); 828 Value *ArgTypeSize = llvm::ConstantInt::get(ArgType, ArgWidth); 829 Value *ArgZero = llvm::Constant::getNullValue(ArgType); 830 831 Value *Mask = llvm::ConstantInt::get(ArgType, ArgWidth - 1); 832 Shift = Builder.CreateAnd(Shift, Mask); 833 Value *LeftShift = Builder.CreateSub(ArgTypeSize, Shift); 834 835 Value *RightShifted = Builder.CreateLShr(Val, Shift); 836 Value *LeftShifted = Builder.CreateShl(Val, LeftShift); 837 Value *Rotated = Builder.CreateOr(LeftShifted, RightShifted); 838 839 Value *ShiftIsZero = Builder.CreateICmpEQ(Shift, ArgZero); 840 Value *Result = Builder.CreateSelect(ShiftIsZero, Val, Rotated); 841 return RValue::get(Result); 842 } 843 case Builtin::BI_rotl8: 844 case Builtin::BI_rotl16: 845 case Builtin::BI_rotl: 846 case Builtin::BI_lrotl: 847 case Builtin::BI_rotl64: { 848 Value *Val = EmitScalarExpr(E->getArg(0)); 849 Value *Shift = EmitScalarExpr(E->getArg(1)); 850 851 llvm::Type *ArgType = Val->getType(); 852 Shift = Builder.CreateIntCast(Shift, ArgType, false); 853 unsigned ArgWidth = cast<llvm::IntegerType>(ArgType)->getBitWidth(); 854 Value *ArgTypeSize = llvm::ConstantInt::get(ArgType, ArgWidth); 855 Value *ArgZero = llvm::Constant::getNullValue(ArgType); 856 857 Value *Mask = llvm::ConstantInt::get(ArgType, ArgWidth - 1); 858 Shift = Builder.CreateAnd(Shift, Mask); 859 Value *RightShift = Builder.CreateSub(ArgTypeSize, Shift); 860 861 Value *LeftShifted = Builder.CreateShl(Val, Shift); 862 Value *RightShifted = Builder.CreateLShr(Val, RightShift); 863 Value *Rotated = Builder.CreateOr(LeftShifted, RightShifted); 864 865 Value *ShiftIsZero = Builder.CreateICmpEQ(Shift, ArgZero); 866 Value *Result = Builder.CreateSelect(ShiftIsZero, Val, Rotated); 867 return RValue::get(Result); 868 } 869 case Builtin::BI__builtin_unpredictable: { 870 // Always return the argument of __builtin_unpredictable. LLVM does not 871 // handle this builtin. Metadata for this builtin should be added directly 872 // to instructions such as branches or switches that use it. 873 return RValue::get(EmitScalarExpr(E->getArg(0))); 874 } 875 case Builtin::BI__builtin_expect: { 876 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 877 llvm::Type *ArgType = ArgValue->getType(); 878 879 Value *ExpectedValue = EmitScalarExpr(E->getArg(1)); 880 // Don't generate llvm.expect on -O0 as the backend won't use it for 881 // anything. 882 // Note, we still IRGen ExpectedValue because it could have side-effects. 883 if (CGM.getCodeGenOpts().OptimizationLevel == 0) 884 return RValue::get(ArgValue); 885 886 Value *FnExpect = CGM.getIntrinsic(Intrinsic::expect, ArgType); 887 Value *Result = 888 Builder.CreateCall(FnExpect, {ArgValue, ExpectedValue}, "expval"); 889 return RValue::get(Result); 890 } 891 case Builtin::BI__builtin_assume_aligned: { 892 Value *PtrValue = EmitScalarExpr(E->getArg(0)); 893 Value *OffsetValue = 894 (E->getNumArgs() > 2) ? EmitScalarExpr(E->getArg(2)) : nullptr; 895 896 Value *AlignmentValue = EmitScalarExpr(E->getArg(1)); 897 ConstantInt *AlignmentCI = cast<ConstantInt>(AlignmentValue); 898 unsigned Alignment = (unsigned) AlignmentCI->getZExtValue(); 899 900 EmitAlignmentAssumption(PtrValue, Alignment, OffsetValue); 901 return RValue::get(PtrValue); 902 } 903 case Builtin::BI__assume: 904 case Builtin::BI__builtin_assume: { 905 if (E->getArg(0)->HasSideEffects(getContext())) 906 return RValue::get(nullptr); 907 908 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 909 Value *FnAssume = CGM.getIntrinsic(Intrinsic::assume); 910 return RValue::get(Builder.CreateCall(FnAssume, ArgValue)); 911 } 912 case Builtin::BI__builtin_bswap16: 913 case Builtin::BI__builtin_bswap32: 914 case Builtin::BI__builtin_bswap64: { 915 return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::bswap)); 916 } 917 case Builtin::BI__builtin_bitreverse8: 918 case Builtin::BI__builtin_bitreverse16: 919 case Builtin::BI__builtin_bitreverse32: 920 case Builtin::BI__builtin_bitreverse64: { 921 return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::bitreverse)); 922 } 923 case Builtin::BI__builtin_object_size: { 924 unsigned Type = 925 E->getArg(1)->EvaluateKnownConstInt(getContext()).getZExtValue(); 926 auto *ResType = cast<llvm::IntegerType>(ConvertType(E->getType())); 927 928 // We pass this builtin onto the optimizer so that it can figure out the 929 // object size in more complex cases. 930 return RValue::get(emitBuiltinObjectSize(E->getArg(0), Type, ResType)); 931 } 932 case Builtin::BI__builtin_prefetch: { 933 Value *Locality, *RW, *Address = EmitScalarExpr(E->getArg(0)); 934 // FIXME: Technically these constants should of type 'int', yes? 935 RW = (E->getNumArgs() > 1) ? EmitScalarExpr(E->getArg(1)) : 936 llvm::ConstantInt::get(Int32Ty, 0); 937 Locality = (E->getNumArgs() > 2) ? EmitScalarExpr(E->getArg(2)) : 938 llvm::ConstantInt::get(Int32Ty, 3); 939 Value *Data = llvm::ConstantInt::get(Int32Ty, 1); 940 Value *F = CGM.getIntrinsic(Intrinsic::prefetch); 941 return RValue::get(Builder.CreateCall(F, {Address, RW, Locality, Data})); 942 } 943 case Builtin::BI__builtin_readcyclecounter: { 944 Value *F = CGM.getIntrinsic(Intrinsic::readcyclecounter); 945 return RValue::get(Builder.CreateCall(F)); 946 } 947 case Builtin::BI__builtin___clear_cache: { 948 Value *Begin = EmitScalarExpr(E->getArg(0)); 949 Value *End = EmitScalarExpr(E->getArg(1)); 950 Value *F = CGM.getIntrinsic(Intrinsic::clear_cache); 951 return RValue::get(Builder.CreateCall(F, {Begin, End})); 952 } 953 case Builtin::BI__builtin_trap: 954 return RValue::get(EmitTrapCall(Intrinsic::trap)); 955 case Builtin::BI__debugbreak: 956 return RValue::get(EmitTrapCall(Intrinsic::debugtrap)); 957 case Builtin::BI__builtin_unreachable: { 958 if (SanOpts.has(SanitizerKind::Unreachable)) { 959 SanitizerScope SanScope(this); 960 EmitCheck(std::make_pair(static_cast<llvm::Value *>(Builder.getFalse()), 961 SanitizerKind::Unreachable), 962 "builtin_unreachable", EmitCheckSourceLocation(E->getExprLoc()), 963 None); 964 } else 965 Builder.CreateUnreachable(); 966 967 // We do need to preserve an insertion point. 968 EmitBlock(createBasicBlock("unreachable.cont")); 969 970 return RValue::get(nullptr); 971 } 972 973 case Builtin::BI__builtin_powi: 974 case Builtin::BI__builtin_powif: 975 case Builtin::BI__builtin_powil: { 976 Value *Base = EmitScalarExpr(E->getArg(0)); 977 Value *Exponent = EmitScalarExpr(E->getArg(1)); 978 llvm::Type *ArgType = Base->getType(); 979 Value *F = CGM.getIntrinsic(Intrinsic::powi, ArgType); 980 return RValue::get(Builder.CreateCall(F, {Base, Exponent})); 981 } 982 983 case Builtin::BI__builtin_isgreater: 984 case Builtin::BI__builtin_isgreaterequal: 985 case Builtin::BI__builtin_isless: 986 case Builtin::BI__builtin_islessequal: 987 case Builtin::BI__builtin_islessgreater: 988 case Builtin::BI__builtin_isunordered: { 989 // Ordered comparisons: we know the arguments to these are matching scalar 990 // floating point values. 991 Value *LHS = EmitScalarExpr(E->getArg(0)); 992 Value *RHS = EmitScalarExpr(E->getArg(1)); 993 994 switch (BuiltinID) { 995 default: llvm_unreachable("Unknown ordered comparison"); 996 case Builtin::BI__builtin_isgreater: 997 LHS = Builder.CreateFCmpOGT(LHS, RHS, "cmp"); 998 break; 999 case Builtin::BI__builtin_isgreaterequal: 1000 LHS = Builder.CreateFCmpOGE(LHS, RHS, "cmp"); 1001 break; 1002 case Builtin::BI__builtin_isless: 1003 LHS = Builder.CreateFCmpOLT(LHS, RHS, "cmp"); 1004 break; 1005 case Builtin::BI__builtin_islessequal: 1006 LHS = Builder.CreateFCmpOLE(LHS, RHS, "cmp"); 1007 break; 1008 case Builtin::BI__builtin_islessgreater: 1009 LHS = Builder.CreateFCmpONE(LHS, RHS, "cmp"); 1010 break; 1011 case Builtin::BI__builtin_isunordered: 1012 LHS = Builder.CreateFCmpUNO(LHS, RHS, "cmp"); 1013 break; 1014 } 1015 // ZExt bool to int type. 1016 return RValue::get(Builder.CreateZExt(LHS, ConvertType(E->getType()))); 1017 } 1018 case Builtin::BI__builtin_isnan: { 1019 Value *V = EmitScalarExpr(E->getArg(0)); 1020 V = Builder.CreateFCmpUNO(V, V, "cmp"); 1021 return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType()))); 1022 } 1023 1024 case Builtin::BIfinite: 1025 case Builtin::BI__finite: 1026 case Builtin::BIfinitef: 1027 case Builtin::BI__finitef: 1028 case Builtin::BIfinitel: 1029 case Builtin::BI__finitel: 1030 case Builtin::BI__builtin_isinf: 1031 case Builtin::BI__builtin_isfinite: { 1032 // isinf(x) --> fabs(x) == infinity 1033 // isfinite(x) --> fabs(x) != infinity 1034 // x != NaN via the ordered compare in either case. 1035 Value *V = EmitScalarExpr(E->getArg(0)); 1036 Value *Fabs = EmitFAbs(*this, V); 1037 Constant *Infinity = ConstantFP::getInfinity(V->getType()); 1038 CmpInst::Predicate Pred = (BuiltinID == Builtin::BI__builtin_isinf) 1039 ? CmpInst::FCMP_OEQ 1040 : CmpInst::FCMP_ONE; 1041 Value *FCmp = Builder.CreateFCmp(Pred, Fabs, Infinity, "cmpinf"); 1042 return RValue::get(Builder.CreateZExt(FCmp, ConvertType(E->getType()))); 1043 } 1044 1045 case Builtin::BI__builtin_isinf_sign: { 1046 // isinf_sign(x) -> fabs(x) == infinity ? (signbit(x) ? -1 : 1) : 0 1047 Value *Arg = EmitScalarExpr(E->getArg(0)); 1048 Value *AbsArg = EmitFAbs(*this, Arg); 1049 Value *IsInf = Builder.CreateFCmpOEQ( 1050 AbsArg, ConstantFP::getInfinity(Arg->getType()), "isinf"); 1051 Value *IsNeg = EmitSignBit(*this, Arg); 1052 1053 llvm::Type *IntTy = ConvertType(E->getType()); 1054 Value *Zero = Constant::getNullValue(IntTy); 1055 Value *One = ConstantInt::get(IntTy, 1); 1056 Value *NegativeOne = ConstantInt::get(IntTy, -1); 1057 Value *SignResult = Builder.CreateSelect(IsNeg, NegativeOne, One); 1058 Value *Result = Builder.CreateSelect(IsInf, SignResult, Zero); 1059 return RValue::get(Result); 1060 } 1061 1062 case Builtin::BI__builtin_isnormal: { 1063 // isnormal(x) --> x == x && fabsf(x) < infinity && fabsf(x) >= float_min 1064 Value *V = EmitScalarExpr(E->getArg(0)); 1065 Value *Eq = Builder.CreateFCmpOEQ(V, V, "iseq"); 1066 1067 Value *Abs = EmitFAbs(*this, V); 1068 Value *IsLessThanInf = 1069 Builder.CreateFCmpULT(Abs, ConstantFP::getInfinity(V->getType()),"isinf"); 1070 APFloat Smallest = APFloat::getSmallestNormalized( 1071 getContext().getFloatTypeSemantics(E->getArg(0)->getType())); 1072 Value *IsNormal = 1073 Builder.CreateFCmpUGE(Abs, ConstantFP::get(V->getContext(), Smallest), 1074 "isnormal"); 1075 V = Builder.CreateAnd(Eq, IsLessThanInf, "and"); 1076 V = Builder.CreateAnd(V, IsNormal, "and"); 1077 return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType()))); 1078 } 1079 1080 case Builtin::BI__builtin_fpclassify: { 1081 Value *V = EmitScalarExpr(E->getArg(5)); 1082 llvm::Type *Ty = ConvertType(E->getArg(5)->getType()); 1083 1084 // Create Result 1085 BasicBlock *Begin = Builder.GetInsertBlock(); 1086 BasicBlock *End = createBasicBlock("fpclassify_end", this->CurFn); 1087 Builder.SetInsertPoint(End); 1088 PHINode *Result = 1089 Builder.CreatePHI(ConvertType(E->getArg(0)->getType()), 4, 1090 "fpclassify_result"); 1091 1092 // if (V==0) return FP_ZERO 1093 Builder.SetInsertPoint(Begin); 1094 Value *IsZero = Builder.CreateFCmpOEQ(V, Constant::getNullValue(Ty), 1095 "iszero"); 1096 Value *ZeroLiteral = EmitScalarExpr(E->getArg(4)); 1097 BasicBlock *NotZero = createBasicBlock("fpclassify_not_zero", this->CurFn); 1098 Builder.CreateCondBr(IsZero, End, NotZero); 1099 Result->addIncoming(ZeroLiteral, Begin); 1100 1101 // if (V != V) return FP_NAN 1102 Builder.SetInsertPoint(NotZero); 1103 Value *IsNan = Builder.CreateFCmpUNO(V, V, "cmp"); 1104 Value *NanLiteral = EmitScalarExpr(E->getArg(0)); 1105 BasicBlock *NotNan = createBasicBlock("fpclassify_not_nan", this->CurFn); 1106 Builder.CreateCondBr(IsNan, End, NotNan); 1107 Result->addIncoming(NanLiteral, NotZero); 1108 1109 // if (fabs(V) == infinity) return FP_INFINITY 1110 Builder.SetInsertPoint(NotNan); 1111 Value *VAbs = EmitFAbs(*this, V); 1112 Value *IsInf = 1113 Builder.CreateFCmpOEQ(VAbs, ConstantFP::getInfinity(V->getType()), 1114 "isinf"); 1115 Value *InfLiteral = EmitScalarExpr(E->getArg(1)); 1116 BasicBlock *NotInf = createBasicBlock("fpclassify_not_inf", this->CurFn); 1117 Builder.CreateCondBr(IsInf, End, NotInf); 1118 Result->addIncoming(InfLiteral, NotNan); 1119 1120 // if (fabs(V) >= MIN_NORMAL) return FP_NORMAL else FP_SUBNORMAL 1121 Builder.SetInsertPoint(NotInf); 1122 APFloat Smallest = APFloat::getSmallestNormalized( 1123 getContext().getFloatTypeSemantics(E->getArg(5)->getType())); 1124 Value *IsNormal = 1125 Builder.CreateFCmpUGE(VAbs, ConstantFP::get(V->getContext(), Smallest), 1126 "isnormal"); 1127 Value *NormalResult = 1128 Builder.CreateSelect(IsNormal, EmitScalarExpr(E->getArg(2)), 1129 EmitScalarExpr(E->getArg(3))); 1130 Builder.CreateBr(End); 1131 Result->addIncoming(NormalResult, NotInf); 1132 1133 // return Result 1134 Builder.SetInsertPoint(End); 1135 return RValue::get(Result); 1136 } 1137 1138 case Builtin::BIalloca: 1139 case Builtin::BI_alloca: 1140 case Builtin::BI__builtin_alloca: { 1141 Value *Size = EmitScalarExpr(E->getArg(0)); 1142 const TargetInfo &TI = getContext().getTargetInfo(); 1143 // The alignment of the alloca should correspond to __BIGGEST_ALIGNMENT__. 1144 unsigned SuitableAlignmentInBytes = 1145 CGM.getContext() 1146 .toCharUnitsFromBits(TI.getSuitableAlign()) 1147 .getQuantity(); 1148 AllocaInst *AI = Builder.CreateAlloca(Builder.getInt8Ty(), Size); 1149 AI->setAlignment(SuitableAlignmentInBytes); 1150 return RValue::get(AI); 1151 } 1152 1153 case Builtin::BI__builtin_alloca_with_align: { 1154 Value *Size = EmitScalarExpr(E->getArg(0)); 1155 Value *AlignmentInBitsValue = EmitScalarExpr(E->getArg(1)); 1156 auto *AlignmentInBitsCI = cast<ConstantInt>(AlignmentInBitsValue); 1157 unsigned AlignmentInBits = AlignmentInBitsCI->getZExtValue(); 1158 unsigned AlignmentInBytes = 1159 CGM.getContext().toCharUnitsFromBits(AlignmentInBits).getQuantity(); 1160 AllocaInst *AI = Builder.CreateAlloca(Builder.getInt8Ty(), Size); 1161 AI->setAlignment(AlignmentInBytes); 1162 return RValue::get(AI); 1163 } 1164 1165 case Builtin::BIbzero: 1166 case Builtin::BI__builtin_bzero: { 1167 Address Dest = EmitPointerWithAlignment(E->getArg(0)); 1168 Value *SizeVal = EmitScalarExpr(E->getArg(1)); 1169 EmitNonNullArgCheck(RValue::get(Dest.getPointer()), E->getArg(0)->getType(), 1170 E->getArg(0)->getExprLoc(), FD, 0); 1171 Builder.CreateMemSet(Dest, Builder.getInt8(0), SizeVal, false); 1172 return RValue::get(Dest.getPointer()); 1173 } 1174 case Builtin::BImemcpy: 1175 case Builtin::BI__builtin_memcpy: { 1176 Address Dest = EmitPointerWithAlignment(E->getArg(0)); 1177 Address Src = EmitPointerWithAlignment(E->getArg(1)); 1178 Value *SizeVal = EmitScalarExpr(E->getArg(2)); 1179 EmitNonNullArgCheck(RValue::get(Dest.getPointer()), E->getArg(0)->getType(), 1180 E->getArg(0)->getExprLoc(), FD, 0); 1181 EmitNonNullArgCheck(RValue::get(Src.getPointer()), E->getArg(1)->getType(), 1182 E->getArg(1)->getExprLoc(), FD, 1); 1183 Builder.CreateMemCpy(Dest, Src, SizeVal, false); 1184 return RValue::get(Dest.getPointer()); 1185 } 1186 1187 case Builtin::BI__builtin___memcpy_chk: { 1188 // fold __builtin_memcpy_chk(x, y, cst1, cst2) to memcpy iff cst1<=cst2. 1189 llvm::APSInt Size, DstSize; 1190 if (!E->getArg(2)->EvaluateAsInt(Size, CGM.getContext()) || 1191 !E->getArg(3)->EvaluateAsInt(DstSize, CGM.getContext())) 1192 break; 1193 if (Size.ugt(DstSize)) 1194 break; 1195 Address Dest = EmitPointerWithAlignment(E->getArg(0)); 1196 Address Src = EmitPointerWithAlignment(E->getArg(1)); 1197 Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size); 1198 Builder.CreateMemCpy(Dest, Src, SizeVal, false); 1199 return RValue::get(Dest.getPointer()); 1200 } 1201 1202 case Builtin::BI__builtin_objc_memmove_collectable: { 1203 Address DestAddr = EmitPointerWithAlignment(E->getArg(0)); 1204 Address SrcAddr = EmitPointerWithAlignment(E->getArg(1)); 1205 Value *SizeVal = EmitScalarExpr(E->getArg(2)); 1206 CGM.getObjCRuntime().EmitGCMemmoveCollectable(*this, 1207 DestAddr, SrcAddr, SizeVal); 1208 return RValue::get(DestAddr.getPointer()); 1209 } 1210 1211 case Builtin::BI__builtin___memmove_chk: { 1212 // fold __builtin_memmove_chk(x, y, cst1, cst2) to memmove iff cst1<=cst2. 1213 llvm::APSInt Size, DstSize; 1214 if (!E->getArg(2)->EvaluateAsInt(Size, CGM.getContext()) || 1215 !E->getArg(3)->EvaluateAsInt(DstSize, CGM.getContext())) 1216 break; 1217 if (Size.ugt(DstSize)) 1218 break; 1219 Address Dest = EmitPointerWithAlignment(E->getArg(0)); 1220 Address Src = EmitPointerWithAlignment(E->getArg(1)); 1221 Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size); 1222 Builder.CreateMemMove(Dest, Src, SizeVal, false); 1223 return RValue::get(Dest.getPointer()); 1224 } 1225 1226 case Builtin::BImemmove: 1227 case Builtin::BI__builtin_memmove: { 1228 Address Dest = EmitPointerWithAlignment(E->getArg(0)); 1229 Address Src = EmitPointerWithAlignment(E->getArg(1)); 1230 Value *SizeVal = EmitScalarExpr(E->getArg(2)); 1231 EmitNonNullArgCheck(RValue::get(Dest.getPointer()), E->getArg(0)->getType(), 1232 E->getArg(0)->getExprLoc(), FD, 0); 1233 EmitNonNullArgCheck(RValue::get(Src.getPointer()), E->getArg(1)->getType(), 1234 E->getArg(1)->getExprLoc(), FD, 1); 1235 Builder.CreateMemMove(Dest, Src, SizeVal, false); 1236 return RValue::get(Dest.getPointer()); 1237 } 1238 case Builtin::BImemset: 1239 case Builtin::BI__builtin_memset: { 1240 Address Dest = EmitPointerWithAlignment(E->getArg(0)); 1241 Value *ByteVal = Builder.CreateTrunc(EmitScalarExpr(E->getArg(1)), 1242 Builder.getInt8Ty()); 1243 Value *SizeVal = EmitScalarExpr(E->getArg(2)); 1244 EmitNonNullArgCheck(RValue::get(Dest.getPointer()), E->getArg(0)->getType(), 1245 E->getArg(0)->getExprLoc(), FD, 0); 1246 Builder.CreateMemSet(Dest, ByteVal, SizeVal, false); 1247 return RValue::get(Dest.getPointer()); 1248 } 1249 case Builtin::BI__builtin___memset_chk: { 1250 // fold __builtin_memset_chk(x, y, cst1, cst2) to memset iff cst1<=cst2. 1251 llvm::APSInt Size, DstSize; 1252 if (!E->getArg(2)->EvaluateAsInt(Size, CGM.getContext()) || 1253 !E->getArg(3)->EvaluateAsInt(DstSize, CGM.getContext())) 1254 break; 1255 if (Size.ugt(DstSize)) 1256 break; 1257 Address Dest = EmitPointerWithAlignment(E->getArg(0)); 1258 Value *ByteVal = Builder.CreateTrunc(EmitScalarExpr(E->getArg(1)), 1259 Builder.getInt8Ty()); 1260 Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size); 1261 Builder.CreateMemSet(Dest, ByteVal, SizeVal, false); 1262 return RValue::get(Dest.getPointer()); 1263 } 1264 case Builtin::BI__builtin_dwarf_cfa: { 1265 // The offset in bytes from the first argument to the CFA. 1266 // 1267 // Why on earth is this in the frontend? Is there any reason at 1268 // all that the backend can't reasonably determine this while 1269 // lowering llvm.eh.dwarf.cfa()? 1270 // 1271 // TODO: If there's a satisfactory reason, add a target hook for 1272 // this instead of hard-coding 0, which is correct for most targets. 1273 int32_t Offset = 0; 1274 1275 Value *F = CGM.getIntrinsic(Intrinsic::eh_dwarf_cfa); 1276 return RValue::get(Builder.CreateCall(F, 1277 llvm::ConstantInt::get(Int32Ty, Offset))); 1278 } 1279 case Builtin::BI__builtin_return_address: { 1280 Value *Depth = 1281 CGM.EmitConstantExpr(E->getArg(0), getContext().UnsignedIntTy, this); 1282 Value *F = CGM.getIntrinsic(Intrinsic::returnaddress); 1283 return RValue::get(Builder.CreateCall(F, Depth)); 1284 } 1285 case Builtin::BI_ReturnAddress: { 1286 Value *F = CGM.getIntrinsic(Intrinsic::returnaddress); 1287 return RValue::get(Builder.CreateCall(F, Builder.getInt32(0))); 1288 } 1289 case Builtin::BI__builtin_frame_address: { 1290 Value *Depth = 1291 CGM.EmitConstantExpr(E->getArg(0), getContext().UnsignedIntTy, this); 1292 Value *F = CGM.getIntrinsic(Intrinsic::frameaddress); 1293 return RValue::get(Builder.CreateCall(F, Depth)); 1294 } 1295 case Builtin::BI__builtin_extract_return_addr: { 1296 Value *Address = EmitScalarExpr(E->getArg(0)); 1297 Value *Result = getTargetHooks().decodeReturnAddress(*this, Address); 1298 return RValue::get(Result); 1299 } 1300 case Builtin::BI__builtin_frob_return_addr: { 1301 Value *Address = EmitScalarExpr(E->getArg(0)); 1302 Value *Result = getTargetHooks().encodeReturnAddress(*this, Address); 1303 return RValue::get(Result); 1304 } 1305 case Builtin::BI__builtin_dwarf_sp_column: { 1306 llvm::IntegerType *Ty 1307 = cast<llvm::IntegerType>(ConvertType(E->getType())); 1308 int Column = getTargetHooks().getDwarfEHStackPointer(CGM); 1309 if (Column == -1) { 1310 CGM.ErrorUnsupported(E, "__builtin_dwarf_sp_column"); 1311 return RValue::get(llvm::UndefValue::get(Ty)); 1312 } 1313 return RValue::get(llvm::ConstantInt::get(Ty, Column, true)); 1314 } 1315 case Builtin::BI__builtin_init_dwarf_reg_size_table: { 1316 Value *Address = EmitScalarExpr(E->getArg(0)); 1317 if (getTargetHooks().initDwarfEHRegSizeTable(*this, Address)) 1318 CGM.ErrorUnsupported(E, "__builtin_init_dwarf_reg_size_table"); 1319 return RValue::get(llvm::UndefValue::get(ConvertType(E->getType()))); 1320 } 1321 case Builtin::BI__builtin_eh_return: { 1322 Value *Int = EmitScalarExpr(E->getArg(0)); 1323 Value *Ptr = EmitScalarExpr(E->getArg(1)); 1324 1325 llvm::IntegerType *IntTy = cast<llvm::IntegerType>(Int->getType()); 1326 assert((IntTy->getBitWidth() == 32 || IntTy->getBitWidth() == 64) && 1327 "LLVM's __builtin_eh_return only supports 32- and 64-bit variants"); 1328 Value *F = CGM.getIntrinsic(IntTy->getBitWidth() == 32 1329 ? Intrinsic::eh_return_i32 1330 : Intrinsic::eh_return_i64); 1331 Builder.CreateCall(F, {Int, Ptr}); 1332 Builder.CreateUnreachable(); 1333 1334 // We do need to preserve an insertion point. 1335 EmitBlock(createBasicBlock("builtin_eh_return.cont")); 1336 1337 return RValue::get(nullptr); 1338 } 1339 case Builtin::BI__builtin_unwind_init: { 1340 Value *F = CGM.getIntrinsic(Intrinsic::eh_unwind_init); 1341 return RValue::get(Builder.CreateCall(F)); 1342 } 1343 case Builtin::BI__builtin_extend_pointer: { 1344 // Extends a pointer to the size of an _Unwind_Word, which is 1345 // uint64_t on all platforms. Generally this gets poked into a 1346 // register and eventually used as an address, so if the 1347 // addressing registers are wider than pointers and the platform 1348 // doesn't implicitly ignore high-order bits when doing 1349 // addressing, we need to make sure we zext / sext based on 1350 // the platform's expectations. 1351 // 1352 // See: http://gcc.gnu.org/ml/gcc-bugs/2002-02/msg00237.html 1353 1354 // Cast the pointer to intptr_t. 1355 Value *Ptr = EmitScalarExpr(E->getArg(0)); 1356 Value *Result = Builder.CreatePtrToInt(Ptr, IntPtrTy, "extend.cast"); 1357 1358 // If that's 64 bits, we're done. 1359 if (IntPtrTy->getBitWidth() == 64) 1360 return RValue::get(Result); 1361 1362 // Otherwise, ask the codegen data what to do. 1363 if (getTargetHooks().extendPointerWithSExt()) 1364 return RValue::get(Builder.CreateSExt(Result, Int64Ty, "extend.sext")); 1365 else 1366 return RValue::get(Builder.CreateZExt(Result, Int64Ty, "extend.zext")); 1367 } 1368 case Builtin::BI__builtin_setjmp: { 1369 // Buffer is a void**. 1370 Address Buf = EmitPointerWithAlignment(E->getArg(0)); 1371 1372 // Store the frame pointer to the setjmp buffer. 1373 Value *FrameAddr = 1374 Builder.CreateCall(CGM.getIntrinsic(Intrinsic::frameaddress), 1375 ConstantInt::get(Int32Ty, 0)); 1376 Builder.CreateStore(FrameAddr, Buf); 1377 1378 // Store the stack pointer to the setjmp buffer. 1379 Value *StackAddr = 1380 Builder.CreateCall(CGM.getIntrinsic(Intrinsic::stacksave)); 1381 Address StackSaveSlot = 1382 Builder.CreateConstInBoundsGEP(Buf, 2, getPointerSize()); 1383 Builder.CreateStore(StackAddr, StackSaveSlot); 1384 1385 // Call LLVM's EH setjmp, which is lightweight. 1386 Value *F = CGM.getIntrinsic(Intrinsic::eh_sjlj_setjmp); 1387 Buf = Builder.CreateBitCast(Buf, Int8PtrTy); 1388 return RValue::get(Builder.CreateCall(F, Buf.getPointer())); 1389 } 1390 case Builtin::BI__builtin_longjmp: { 1391 Value *Buf = EmitScalarExpr(E->getArg(0)); 1392 Buf = Builder.CreateBitCast(Buf, Int8PtrTy); 1393 1394 // Call LLVM's EH longjmp, which is lightweight. 1395 Builder.CreateCall(CGM.getIntrinsic(Intrinsic::eh_sjlj_longjmp), Buf); 1396 1397 // longjmp doesn't return; mark this as unreachable. 1398 Builder.CreateUnreachable(); 1399 1400 // We do need to preserve an insertion point. 1401 EmitBlock(createBasicBlock("longjmp.cont")); 1402 1403 return RValue::get(nullptr); 1404 } 1405 case Builtin::BI__sync_fetch_and_add: 1406 case Builtin::BI__sync_fetch_and_sub: 1407 case Builtin::BI__sync_fetch_and_or: 1408 case Builtin::BI__sync_fetch_and_and: 1409 case Builtin::BI__sync_fetch_and_xor: 1410 case Builtin::BI__sync_fetch_and_nand: 1411 case Builtin::BI__sync_add_and_fetch: 1412 case Builtin::BI__sync_sub_and_fetch: 1413 case Builtin::BI__sync_and_and_fetch: 1414 case Builtin::BI__sync_or_and_fetch: 1415 case Builtin::BI__sync_xor_and_fetch: 1416 case Builtin::BI__sync_nand_and_fetch: 1417 case Builtin::BI__sync_val_compare_and_swap: 1418 case Builtin::BI__sync_bool_compare_and_swap: 1419 case Builtin::BI__sync_lock_test_and_set: 1420 case Builtin::BI__sync_lock_release: 1421 case Builtin::BI__sync_swap: 1422 llvm_unreachable("Shouldn't make it through sema"); 1423 case Builtin::BI__sync_fetch_and_add_1: 1424 case Builtin::BI__sync_fetch_and_add_2: 1425 case Builtin::BI__sync_fetch_and_add_4: 1426 case Builtin::BI__sync_fetch_and_add_8: 1427 case Builtin::BI__sync_fetch_and_add_16: 1428 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Add, E); 1429 case Builtin::BI__sync_fetch_and_sub_1: 1430 case Builtin::BI__sync_fetch_and_sub_2: 1431 case Builtin::BI__sync_fetch_and_sub_4: 1432 case Builtin::BI__sync_fetch_and_sub_8: 1433 case Builtin::BI__sync_fetch_and_sub_16: 1434 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Sub, E); 1435 case Builtin::BI__sync_fetch_and_or_1: 1436 case Builtin::BI__sync_fetch_and_or_2: 1437 case Builtin::BI__sync_fetch_and_or_4: 1438 case Builtin::BI__sync_fetch_and_or_8: 1439 case Builtin::BI__sync_fetch_and_or_16: 1440 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Or, E); 1441 case Builtin::BI__sync_fetch_and_and_1: 1442 case Builtin::BI__sync_fetch_and_and_2: 1443 case Builtin::BI__sync_fetch_and_and_4: 1444 case Builtin::BI__sync_fetch_and_and_8: 1445 case Builtin::BI__sync_fetch_and_and_16: 1446 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::And, E); 1447 case Builtin::BI__sync_fetch_and_xor_1: 1448 case Builtin::BI__sync_fetch_and_xor_2: 1449 case Builtin::BI__sync_fetch_and_xor_4: 1450 case Builtin::BI__sync_fetch_and_xor_8: 1451 case Builtin::BI__sync_fetch_and_xor_16: 1452 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Xor, E); 1453 case Builtin::BI__sync_fetch_and_nand_1: 1454 case Builtin::BI__sync_fetch_and_nand_2: 1455 case Builtin::BI__sync_fetch_and_nand_4: 1456 case Builtin::BI__sync_fetch_and_nand_8: 1457 case Builtin::BI__sync_fetch_and_nand_16: 1458 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Nand, E); 1459 1460 // Clang extensions: not overloaded yet. 1461 case Builtin::BI__sync_fetch_and_min: 1462 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Min, E); 1463 case Builtin::BI__sync_fetch_and_max: 1464 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Max, E); 1465 case Builtin::BI__sync_fetch_and_umin: 1466 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::UMin, E); 1467 case Builtin::BI__sync_fetch_and_umax: 1468 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::UMax, E); 1469 1470 case Builtin::BI__sync_add_and_fetch_1: 1471 case Builtin::BI__sync_add_and_fetch_2: 1472 case Builtin::BI__sync_add_and_fetch_4: 1473 case Builtin::BI__sync_add_and_fetch_8: 1474 case Builtin::BI__sync_add_and_fetch_16: 1475 return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Add, E, 1476 llvm::Instruction::Add); 1477 case Builtin::BI__sync_sub_and_fetch_1: 1478 case Builtin::BI__sync_sub_and_fetch_2: 1479 case Builtin::BI__sync_sub_and_fetch_4: 1480 case Builtin::BI__sync_sub_and_fetch_8: 1481 case Builtin::BI__sync_sub_and_fetch_16: 1482 return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Sub, E, 1483 llvm::Instruction::Sub); 1484 case Builtin::BI__sync_and_and_fetch_1: 1485 case Builtin::BI__sync_and_and_fetch_2: 1486 case Builtin::BI__sync_and_and_fetch_4: 1487 case Builtin::BI__sync_and_and_fetch_8: 1488 case Builtin::BI__sync_and_and_fetch_16: 1489 return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::And, E, 1490 llvm::Instruction::And); 1491 case Builtin::BI__sync_or_and_fetch_1: 1492 case Builtin::BI__sync_or_and_fetch_2: 1493 case Builtin::BI__sync_or_and_fetch_4: 1494 case Builtin::BI__sync_or_and_fetch_8: 1495 case Builtin::BI__sync_or_and_fetch_16: 1496 return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Or, E, 1497 llvm::Instruction::Or); 1498 case Builtin::BI__sync_xor_and_fetch_1: 1499 case Builtin::BI__sync_xor_and_fetch_2: 1500 case Builtin::BI__sync_xor_and_fetch_4: 1501 case Builtin::BI__sync_xor_and_fetch_8: 1502 case Builtin::BI__sync_xor_and_fetch_16: 1503 return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Xor, E, 1504 llvm::Instruction::Xor); 1505 case Builtin::BI__sync_nand_and_fetch_1: 1506 case Builtin::BI__sync_nand_and_fetch_2: 1507 case Builtin::BI__sync_nand_and_fetch_4: 1508 case Builtin::BI__sync_nand_and_fetch_8: 1509 case Builtin::BI__sync_nand_and_fetch_16: 1510 return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Nand, E, 1511 llvm::Instruction::And, true); 1512 1513 case Builtin::BI__sync_val_compare_and_swap_1: 1514 case Builtin::BI__sync_val_compare_and_swap_2: 1515 case Builtin::BI__sync_val_compare_and_swap_4: 1516 case Builtin::BI__sync_val_compare_and_swap_8: 1517 case Builtin::BI__sync_val_compare_and_swap_16: 1518 return RValue::get(MakeAtomicCmpXchgValue(*this, E, false)); 1519 1520 case Builtin::BI__sync_bool_compare_and_swap_1: 1521 case Builtin::BI__sync_bool_compare_and_swap_2: 1522 case Builtin::BI__sync_bool_compare_and_swap_4: 1523 case Builtin::BI__sync_bool_compare_and_swap_8: 1524 case Builtin::BI__sync_bool_compare_and_swap_16: 1525 return RValue::get(MakeAtomicCmpXchgValue(*this, E, true)); 1526 1527 case Builtin::BI__sync_swap_1: 1528 case Builtin::BI__sync_swap_2: 1529 case Builtin::BI__sync_swap_4: 1530 case Builtin::BI__sync_swap_8: 1531 case Builtin::BI__sync_swap_16: 1532 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Xchg, E); 1533 1534 case Builtin::BI__sync_lock_test_and_set_1: 1535 case Builtin::BI__sync_lock_test_and_set_2: 1536 case Builtin::BI__sync_lock_test_and_set_4: 1537 case Builtin::BI__sync_lock_test_and_set_8: 1538 case Builtin::BI__sync_lock_test_and_set_16: 1539 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Xchg, E); 1540 1541 case Builtin::BI__sync_lock_release_1: 1542 case Builtin::BI__sync_lock_release_2: 1543 case Builtin::BI__sync_lock_release_4: 1544 case Builtin::BI__sync_lock_release_8: 1545 case Builtin::BI__sync_lock_release_16: { 1546 Value *Ptr = EmitScalarExpr(E->getArg(0)); 1547 QualType ElTy = E->getArg(0)->getType()->getPointeeType(); 1548 CharUnits StoreSize = getContext().getTypeSizeInChars(ElTy); 1549 llvm::Type *ITy = llvm::IntegerType::get(getLLVMContext(), 1550 StoreSize.getQuantity() * 8); 1551 Ptr = Builder.CreateBitCast(Ptr, ITy->getPointerTo()); 1552 llvm::StoreInst *Store = 1553 Builder.CreateAlignedStore(llvm::Constant::getNullValue(ITy), Ptr, 1554 StoreSize); 1555 Store->setAtomic(llvm::AtomicOrdering::Release); 1556 return RValue::get(nullptr); 1557 } 1558 1559 case Builtin::BI__sync_synchronize: { 1560 // We assume this is supposed to correspond to a C++0x-style 1561 // sequentially-consistent fence (i.e. this is only usable for 1562 // synchonization, not device I/O or anything like that). This intrinsic 1563 // is really badly designed in the sense that in theory, there isn't 1564 // any way to safely use it... but in practice, it mostly works 1565 // to use it with non-atomic loads and stores to get acquire/release 1566 // semantics. 1567 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent); 1568 return RValue::get(nullptr); 1569 } 1570 1571 case Builtin::BI__builtin_nontemporal_load: 1572 return RValue::get(EmitNontemporalLoad(*this, E)); 1573 case Builtin::BI__builtin_nontemporal_store: 1574 return RValue::get(EmitNontemporalStore(*this, E)); 1575 case Builtin::BI__c11_atomic_is_lock_free: 1576 case Builtin::BI__atomic_is_lock_free: { 1577 // Call "bool __atomic_is_lock_free(size_t size, void *ptr)". For the 1578 // __c11 builtin, ptr is 0 (indicating a properly-aligned object), since 1579 // _Atomic(T) is always properly-aligned. 1580 const char *LibCallName = "__atomic_is_lock_free"; 1581 CallArgList Args; 1582 Args.add(RValue::get(EmitScalarExpr(E->getArg(0))), 1583 getContext().getSizeType()); 1584 if (BuiltinID == Builtin::BI__atomic_is_lock_free) 1585 Args.add(RValue::get(EmitScalarExpr(E->getArg(1))), 1586 getContext().VoidPtrTy); 1587 else 1588 Args.add(RValue::get(llvm::Constant::getNullValue(VoidPtrTy)), 1589 getContext().VoidPtrTy); 1590 const CGFunctionInfo &FuncInfo = 1591 CGM.getTypes().arrangeBuiltinFunctionCall(E->getType(), Args); 1592 llvm::FunctionType *FTy = CGM.getTypes().GetFunctionType(FuncInfo); 1593 llvm::Constant *Func = CGM.CreateRuntimeFunction(FTy, LibCallName); 1594 return EmitCall(FuncInfo, CGCallee::forDirect(Func), 1595 ReturnValueSlot(), Args); 1596 } 1597 1598 case Builtin::BI__atomic_test_and_set: { 1599 // Look at the argument type to determine whether this is a volatile 1600 // operation. The parameter type is always volatile. 1601 QualType PtrTy = E->getArg(0)->IgnoreImpCasts()->getType(); 1602 bool Volatile = 1603 PtrTy->castAs<PointerType>()->getPointeeType().isVolatileQualified(); 1604 1605 Value *Ptr = EmitScalarExpr(E->getArg(0)); 1606 unsigned AddrSpace = Ptr->getType()->getPointerAddressSpace(); 1607 Ptr = Builder.CreateBitCast(Ptr, Int8Ty->getPointerTo(AddrSpace)); 1608 Value *NewVal = Builder.getInt8(1); 1609 Value *Order = EmitScalarExpr(E->getArg(1)); 1610 if (isa<llvm::ConstantInt>(Order)) { 1611 int ord = cast<llvm::ConstantInt>(Order)->getZExtValue(); 1612 AtomicRMWInst *Result = nullptr; 1613 switch (ord) { 1614 case 0: // memory_order_relaxed 1615 default: // invalid order 1616 Result = Builder.CreateAtomicRMW(llvm::AtomicRMWInst::Xchg, Ptr, NewVal, 1617 llvm::AtomicOrdering::Monotonic); 1618 break; 1619 case 1: // memory_order_consume 1620 case 2: // memory_order_acquire 1621 Result = Builder.CreateAtomicRMW(llvm::AtomicRMWInst::Xchg, Ptr, NewVal, 1622 llvm::AtomicOrdering::Acquire); 1623 break; 1624 case 3: // memory_order_release 1625 Result = Builder.CreateAtomicRMW(llvm::AtomicRMWInst::Xchg, Ptr, NewVal, 1626 llvm::AtomicOrdering::Release); 1627 break; 1628 case 4: // memory_order_acq_rel 1629 1630 Result = Builder.CreateAtomicRMW(llvm::AtomicRMWInst::Xchg, Ptr, NewVal, 1631 llvm::AtomicOrdering::AcquireRelease); 1632 break; 1633 case 5: // memory_order_seq_cst 1634 Result = Builder.CreateAtomicRMW( 1635 llvm::AtomicRMWInst::Xchg, Ptr, NewVal, 1636 llvm::AtomicOrdering::SequentiallyConsistent); 1637 break; 1638 } 1639 Result->setVolatile(Volatile); 1640 return RValue::get(Builder.CreateIsNotNull(Result, "tobool")); 1641 } 1642 1643 llvm::BasicBlock *ContBB = createBasicBlock("atomic.continue", CurFn); 1644 1645 llvm::BasicBlock *BBs[5] = { 1646 createBasicBlock("monotonic", CurFn), 1647 createBasicBlock("acquire", CurFn), 1648 createBasicBlock("release", CurFn), 1649 createBasicBlock("acqrel", CurFn), 1650 createBasicBlock("seqcst", CurFn) 1651 }; 1652 llvm::AtomicOrdering Orders[5] = { 1653 llvm::AtomicOrdering::Monotonic, llvm::AtomicOrdering::Acquire, 1654 llvm::AtomicOrdering::Release, llvm::AtomicOrdering::AcquireRelease, 1655 llvm::AtomicOrdering::SequentiallyConsistent}; 1656 1657 Order = Builder.CreateIntCast(Order, Builder.getInt32Ty(), false); 1658 llvm::SwitchInst *SI = Builder.CreateSwitch(Order, BBs[0]); 1659 1660 Builder.SetInsertPoint(ContBB); 1661 PHINode *Result = Builder.CreatePHI(Int8Ty, 5, "was_set"); 1662 1663 for (unsigned i = 0; i < 5; ++i) { 1664 Builder.SetInsertPoint(BBs[i]); 1665 AtomicRMWInst *RMW = Builder.CreateAtomicRMW(llvm::AtomicRMWInst::Xchg, 1666 Ptr, NewVal, Orders[i]); 1667 RMW->setVolatile(Volatile); 1668 Result->addIncoming(RMW, BBs[i]); 1669 Builder.CreateBr(ContBB); 1670 } 1671 1672 SI->addCase(Builder.getInt32(0), BBs[0]); 1673 SI->addCase(Builder.getInt32(1), BBs[1]); 1674 SI->addCase(Builder.getInt32(2), BBs[1]); 1675 SI->addCase(Builder.getInt32(3), BBs[2]); 1676 SI->addCase(Builder.getInt32(4), BBs[3]); 1677 SI->addCase(Builder.getInt32(5), BBs[4]); 1678 1679 Builder.SetInsertPoint(ContBB); 1680 return RValue::get(Builder.CreateIsNotNull(Result, "tobool")); 1681 } 1682 1683 case Builtin::BI__atomic_clear: { 1684 QualType PtrTy = E->getArg(0)->IgnoreImpCasts()->getType(); 1685 bool Volatile = 1686 PtrTy->castAs<PointerType>()->getPointeeType().isVolatileQualified(); 1687 1688 Address Ptr = EmitPointerWithAlignment(E->getArg(0)); 1689 unsigned AddrSpace = Ptr.getPointer()->getType()->getPointerAddressSpace(); 1690 Ptr = Builder.CreateBitCast(Ptr, Int8Ty->getPointerTo(AddrSpace)); 1691 Value *NewVal = Builder.getInt8(0); 1692 Value *Order = EmitScalarExpr(E->getArg(1)); 1693 if (isa<llvm::ConstantInt>(Order)) { 1694 int ord = cast<llvm::ConstantInt>(Order)->getZExtValue(); 1695 StoreInst *Store = Builder.CreateStore(NewVal, Ptr, Volatile); 1696 switch (ord) { 1697 case 0: // memory_order_relaxed 1698 default: // invalid order 1699 Store->setOrdering(llvm::AtomicOrdering::Monotonic); 1700 break; 1701 case 3: // memory_order_release 1702 Store->setOrdering(llvm::AtomicOrdering::Release); 1703 break; 1704 case 5: // memory_order_seq_cst 1705 Store->setOrdering(llvm::AtomicOrdering::SequentiallyConsistent); 1706 break; 1707 } 1708 return RValue::get(nullptr); 1709 } 1710 1711 llvm::BasicBlock *ContBB = createBasicBlock("atomic.continue", CurFn); 1712 1713 llvm::BasicBlock *BBs[3] = { 1714 createBasicBlock("monotonic", CurFn), 1715 createBasicBlock("release", CurFn), 1716 createBasicBlock("seqcst", CurFn) 1717 }; 1718 llvm::AtomicOrdering Orders[3] = { 1719 llvm::AtomicOrdering::Monotonic, llvm::AtomicOrdering::Release, 1720 llvm::AtomicOrdering::SequentiallyConsistent}; 1721 1722 Order = Builder.CreateIntCast(Order, Builder.getInt32Ty(), false); 1723 llvm::SwitchInst *SI = Builder.CreateSwitch(Order, BBs[0]); 1724 1725 for (unsigned i = 0; i < 3; ++i) { 1726 Builder.SetInsertPoint(BBs[i]); 1727 StoreInst *Store = Builder.CreateStore(NewVal, Ptr, Volatile); 1728 Store->setOrdering(Orders[i]); 1729 Builder.CreateBr(ContBB); 1730 } 1731 1732 SI->addCase(Builder.getInt32(0), BBs[0]); 1733 SI->addCase(Builder.getInt32(3), BBs[1]); 1734 SI->addCase(Builder.getInt32(5), BBs[2]); 1735 1736 Builder.SetInsertPoint(ContBB); 1737 return RValue::get(nullptr); 1738 } 1739 1740 case Builtin::BI__atomic_thread_fence: 1741 case Builtin::BI__atomic_signal_fence: 1742 case Builtin::BI__c11_atomic_thread_fence: 1743 case Builtin::BI__c11_atomic_signal_fence: { 1744 llvm::SynchronizationScope Scope; 1745 if (BuiltinID == Builtin::BI__atomic_signal_fence || 1746 BuiltinID == Builtin::BI__c11_atomic_signal_fence) 1747 Scope = llvm::SingleThread; 1748 else 1749 Scope = llvm::CrossThread; 1750 Value *Order = EmitScalarExpr(E->getArg(0)); 1751 if (isa<llvm::ConstantInt>(Order)) { 1752 int ord = cast<llvm::ConstantInt>(Order)->getZExtValue(); 1753 switch (ord) { 1754 case 0: // memory_order_relaxed 1755 default: // invalid order 1756 break; 1757 case 1: // memory_order_consume 1758 case 2: // memory_order_acquire 1759 Builder.CreateFence(llvm::AtomicOrdering::Acquire, Scope); 1760 break; 1761 case 3: // memory_order_release 1762 Builder.CreateFence(llvm::AtomicOrdering::Release, Scope); 1763 break; 1764 case 4: // memory_order_acq_rel 1765 Builder.CreateFence(llvm::AtomicOrdering::AcquireRelease, Scope); 1766 break; 1767 case 5: // memory_order_seq_cst 1768 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent, 1769 Scope); 1770 break; 1771 } 1772 return RValue::get(nullptr); 1773 } 1774 1775 llvm::BasicBlock *AcquireBB, *ReleaseBB, *AcqRelBB, *SeqCstBB; 1776 AcquireBB = createBasicBlock("acquire", CurFn); 1777 ReleaseBB = createBasicBlock("release", CurFn); 1778 AcqRelBB = createBasicBlock("acqrel", CurFn); 1779 SeqCstBB = createBasicBlock("seqcst", CurFn); 1780 llvm::BasicBlock *ContBB = createBasicBlock("atomic.continue", CurFn); 1781 1782 Order = Builder.CreateIntCast(Order, Builder.getInt32Ty(), false); 1783 llvm::SwitchInst *SI = Builder.CreateSwitch(Order, ContBB); 1784 1785 Builder.SetInsertPoint(AcquireBB); 1786 Builder.CreateFence(llvm::AtomicOrdering::Acquire, Scope); 1787 Builder.CreateBr(ContBB); 1788 SI->addCase(Builder.getInt32(1), AcquireBB); 1789 SI->addCase(Builder.getInt32(2), AcquireBB); 1790 1791 Builder.SetInsertPoint(ReleaseBB); 1792 Builder.CreateFence(llvm::AtomicOrdering::Release, Scope); 1793 Builder.CreateBr(ContBB); 1794 SI->addCase(Builder.getInt32(3), ReleaseBB); 1795 1796 Builder.SetInsertPoint(AcqRelBB); 1797 Builder.CreateFence(llvm::AtomicOrdering::AcquireRelease, Scope); 1798 Builder.CreateBr(ContBB); 1799 SI->addCase(Builder.getInt32(4), AcqRelBB); 1800 1801 Builder.SetInsertPoint(SeqCstBB); 1802 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent, Scope); 1803 Builder.CreateBr(ContBB); 1804 SI->addCase(Builder.getInt32(5), SeqCstBB); 1805 1806 Builder.SetInsertPoint(ContBB); 1807 return RValue::get(nullptr); 1808 } 1809 1810 // Library functions with special handling. 1811 case Builtin::BIsqrt: 1812 case Builtin::BIsqrtf: 1813 case Builtin::BIsqrtl: { 1814 // Transform a call to sqrt* into a @llvm.sqrt.* intrinsic call, but only 1815 // in finite- or unsafe-math mode (the intrinsic has different semantics 1816 // for handling negative numbers compared to the library function, so 1817 // -fmath-errno=0 is not enough). 1818 if (!FD->hasAttr<ConstAttr>()) 1819 break; 1820 if (!(CGM.getCodeGenOpts().UnsafeFPMath || 1821 CGM.getCodeGenOpts().NoNaNsFPMath)) 1822 break; 1823 Value *Arg0 = EmitScalarExpr(E->getArg(0)); 1824 llvm::Type *ArgType = Arg0->getType(); 1825 Value *F = CGM.getIntrinsic(Intrinsic::sqrt, ArgType); 1826 return RValue::get(Builder.CreateCall(F, Arg0)); 1827 } 1828 1829 case Builtin::BI__builtin_pow: 1830 case Builtin::BI__builtin_powf: 1831 case Builtin::BI__builtin_powl: 1832 case Builtin::BIpow: 1833 case Builtin::BIpowf: 1834 case Builtin::BIpowl: { 1835 // Transform a call to pow* into a @llvm.pow.* intrinsic call. 1836 if (!FD->hasAttr<ConstAttr>()) 1837 break; 1838 Value *Base = EmitScalarExpr(E->getArg(0)); 1839 Value *Exponent = EmitScalarExpr(E->getArg(1)); 1840 llvm::Type *ArgType = Base->getType(); 1841 Value *F = CGM.getIntrinsic(Intrinsic::pow, ArgType); 1842 return RValue::get(Builder.CreateCall(F, {Base, Exponent})); 1843 } 1844 1845 case Builtin::BIfma: 1846 case Builtin::BIfmaf: 1847 case Builtin::BIfmal: 1848 case Builtin::BI__builtin_fma: 1849 case Builtin::BI__builtin_fmaf: 1850 case Builtin::BI__builtin_fmal: { 1851 // Rewrite fma to intrinsic. 1852 Value *FirstArg = EmitScalarExpr(E->getArg(0)); 1853 llvm::Type *ArgType = FirstArg->getType(); 1854 Value *F = CGM.getIntrinsic(Intrinsic::fma, ArgType); 1855 return RValue::get( 1856 Builder.CreateCall(F, {FirstArg, EmitScalarExpr(E->getArg(1)), 1857 EmitScalarExpr(E->getArg(2))})); 1858 } 1859 1860 case Builtin::BI__builtin_signbit: 1861 case Builtin::BI__builtin_signbitf: 1862 case Builtin::BI__builtin_signbitl: { 1863 return RValue::get( 1864 Builder.CreateZExt(EmitSignBit(*this, EmitScalarExpr(E->getArg(0))), 1865 ConvertType(E->getType()))); 1866 } 1867 case Builtin::BI__builtin_annotation: { 1868 llvm::Value *AnnVal = EmitScalarExpr(E->getArg(0)); 1869 llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::annotation, 1870 AnnVal->getType()); 1871 1872 // Get the annotation string, go through casts. Sema requires this to be a 1873 // non-wide string literal, potentially casted, so the cast<> is safe. 1874 const Expr *AnnotationStrExpr = E->getArg(1)->IgnoreParenCasts(); 1875 StringRef Str = cast<StringLiteral>(AnnotationStrExpr)->getString(); 1876 return RValue::get(EmitAnnotationCall(F, AnnVal, Str, E->getExprLoc())); 1877 } 1878 case Builtin::BI__builtin_addcb: 1879 case Builtin::BI__builtin_addcs: 1880 case Builtin::BI__builtin_addc: 1881 case Builtin::BI__builtin_addcl: 1882 case Builtin::BI__builtin_addcll: 1883 case Builtin::BI__builtin_subcb: 1884 case Builtin::BI__builtin_subcs: 1885 case Builtin::BI__builtin_subc: 1886 case Builtin::BI__builtin_subcl: 1887 case Builtin::BI__builtin_subcll: { 1888 1889 // We translate all of these builtins from expressions of the form: 1890 // int x = ..., y = ..., carryin = ..., carryout, result; 1891 // result = __builtin_addc(x, y, carryin, &carryout); 1892 // 1893 // to LLVM IR of the form: 1894 // 1895 // %tmp1 = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %x, i32 %y) 1896 // %tmpsum1 = extractvalue {i32, i1} %tmp1, 0 1897 // %carry1 = extractvalue {i32, i1} %tmp1, 1 1898 // %tmp2 = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %tmpsum1, 1899 // i32 %carryin) 1900 // %result = extractvalue {i32, i1} %tmp2, 0 1901 // %carry2 = extractvalue {i32, i1} %tmp2, 1 1902 // %tmp3 = or i1 %carry1, %carry2 1903 // %tmp4 = zext i1 %tmp3 to i32 1904 // store i32 %tmp4, i32* %carryout 1905 1906 // Scalarize our inputs. 1907 llvm::Value *X = EmitScalarExpr(E->getArg(0)); 1908 llvm::Value *Y = EmitScalarExpr(E->getArg(1)); 1909 llvm::Value *Carryin = EmitScalarExpr(E->getArg(2)); 1910 Address CarryOutPtr = EmitPointerWithAlignment(E->getArg(3)); 1911 1912 // Decide if we are lowering to a uadd.with.overflow or usub.with.overflow. 1913 llvm::Intrinsic::ID IntrinsicId; 1914 switch (BuiltinID) { 1915 default: llvm_unreachable("Unknown multiprecision builtin id."); 1916 case Builtin::BI__builtin_addcb: 1917 case Builtin::BI__builtin_addcs: 1918 case Builtin::BI__builtin_addc: 1919 case Builtin::BI__builtin_addcl: 1920 case Builtin::BI__builtin_addcll: 1921 IntrinsicId = llvm::Intrinsic::uadd_with_overflow; 1922 break; 1923 case Builtin::BI__builtin_subcb: 1924 case Builtin::BI__builtin_subcs: 1925 case Builtin::BI__builtin_subc: 1926 case Builtin::BI__builtin_subcl: 1927 case Builtin::BI__builtin_subcll: 1928 IntrinsicId = llvm::Intrinsic::usub_with_overflow; 1929 break; 1930 } 1931 1932 // Construct our resulting LLVM IR expression. 1933 llvm::Value *Carry1; 1934 llvm::Value *Sum1 = EmitOverflowIntrinsic(*this, IntrinsicId, 1935 X, Y, Carry1); 1936 llvm::Value *Carry2; 1937 llvm::Value *Sum2 = EmitOverflowIntrinsic(*this, IntrinsicId, 1938 Sum1, Carryin, Carry2); 1939 llvm::Value *CarryOut = Builder.CreateZExt(Builder.CreateOr(Carry1, Carry2), 1940 X->getType()); 1941 Builder.CreateStore(CarryOut, CarryOutPtr); 1942 return RValue::get(Sum2); 1943 } 1944 1945 case Builtin::BI__builtin_add_overflow: 1946 case Builtin::BI__builtin_sub_overflow: 1947 case Builtin::BI__builtin_mul_overflow: { 1948 const clang::Expr *LeftArg = E->getArg(0); 1949 const clang::Expr *RightArg = E->getArg(1); 1950 const clang::Expr *ResultArg = E->getArg(2); 1951 1952 clang::QualType ResultQTy = 1953 ResultArg->getType()->castAs<PointerType>()->getPointeeType(); 1954 1955 WidthAndSignedness LeftInfo = 1956 getIntegerWidthAndSignedness(CGM.getContext(), LeftArg->getType()); 1957 WidthAndSignedness RightInfo = 1958 getIntegerWidthAndSignedness(CGM.getContext(), RightArg->getType()); 1959 WidthAndSignedness ResultInfo = 1960 getIntegerWidthAndSignedness(CGM.getContext(), ResultQTy); 1961 WidthAndSignedness EncompassingInfo = 1962 EncompassingIntegerType({LeftInfo, RightInfo, ResultInfo}); 1963 1964 llvm::Type *EncompassingLLVMTy = 1965 llvm::IntegerType::get(CGM.getLLVMContext(), EncompassingInfo.Width); 1966 1967 llvm::Type *ResultLLVMTy = CGM.getTypes().ConvertType(ResultQTy); 1968 1969 llvm::Intrinsic::ID IntrinsicId; 1970 switch (BuiltinID) { 1971 default: 1972 llvm_unreachable("Unknown overflow builtin id."); 1973 case Builtin::BI__builtin_add_overflow: 1974 IntrinsicId = EncompassingInfo.Signed 1975 ? llvm::Intrinsic::sadd_with_overflow 1976 : llvm::Intrinsic::uadd_with_overflow; 1977 break; 1978 case Builtin::BI__builtin_sub_overflow: 1979 IntrinsicId = EncompassingInfo.Signed 1980 ? llvm::Intrinsic::ssub_with_overflow 1981 : llvm::Intrinsic::usub_with_overflow; 1982 break; 1983 case Builtin::BI__builtin_mul_overflow: 1984 IntrinsicId = EncompassingInfo.Signed 1985 ? llvm::Intrinsic::smul_with_overflow 1986 : llvm::Intrinsic::umul_with_overflow; 1987 break; 1988 } 1989 1990 llvm::Value *Left = EmitScalarExpr(LeftArg); 1991 llvm::Value *Right = EmitScalarExpr(RightArg); 1992 Address ResultPtr = EmitPointerWithAlignment(ResultArg); 1993 1994 // Extend each operand to the encompassing type. 1995 Left = Builder.CreateIntCast(Left, EncompassingLLVMTy, LeftInfo.Signed); 1996 Right = Builder.CreateIntCast(Right, EncompassingLLVMTy, RightInfo.Signed); 1997 1998 // Perform the operation on the extended values. 1999 llvm::Value *Overflow, *Result; 2000 Result = EmitOverflowIntrinsic(*this, IntrinsicId, Left, Right, Overflow); 2001 2002 if (EncompassingInfo.Width > ResultInfo.Width) { 2003 // The encompassing type is wider than the result type, so we need to 2004 // truncate it. 2005 llvm::Value *ResultTrunc = Builder.CreateTrunc(Result, ResultLLVMTy); 2006 2007 // To see if the truncation caused an overflow, we will extend 2008 // the result and then compare it to the original result. 2009 llvm::Value *ResultTruncExt = Builder.CreateIntCast( 2010 ResultTrunc, EncompassingLLVMTy, ResultInfo.Signed); 2011 llvm::Value *TruncationOverflow = 2012 Builder.CreateICmpNE(Result, ResultTruncExt); 2013 2014 Overflow = Builder.CreateOr(Overflow, TruncationOverflow); 2015 Result = ResultTrunc; 2016 } 2017 2018 // Finally, store the result using the pointer. 2019 bool isVolatile = 2020 ResultArg->getType()->getPointeeType().isVolatileQualified(); 2021 Builder.CreateStore(EmitToMemory(Result, ResultQTy), ResultPtr, isVolatile); 2022 2023 return RValue::get(Overflow); 2024 } 2025 2026 case Builtin::BI__builtin_uadd_overflow: 2027 case Builtin::BI__builtin_uaddl_overflow: 2028 case Builtin::BI__builtin_uaddll_overflow: 2029 case Builtin::BI__builtin_usub_overflow: 2030 case Builtin::BI__builtin_usubl_overflow: 2031 case Builtin::BI__builtin_usubll_overflow: 2032 case Builtin::BI__builtin_umul_overflow: 2033 case Builtin::BI__builtin_umull_overflow: 2034 case Builtin::BI__builtin_umulll_overflow: 2035 case Builtin::BI__builtin_sadd_overflow: 2036 case Builtin::BI__builtin_saddl_overflow: 2037 case Builtin::BI__builtin_saddll_overflow: 2038 case Builtin::BI__builtin_ssub_overflow: 2039 case Builtin::BI__builtin_ssubl_overflow: 2040 case Builtin::BI__builtin_ssubll_overflow: 2041 case Builtin::BI__builtin_smul_overflow: 2042 case Builtin::BI__builtin_smull_overflow: 2043 case Builtin::BI__builtin_smulll_overflow: { 2044 2045 // We translate all of these builtins directly to the relevant llvm IR node. 2046 2047 // Scalarize our inputs. 2048 llvm::Value *X = EmitScalarExpr(E->getArg(0)); 2049 llvm::Value *Y = EmitScalarExpr(E->getArg(1)); 2050 Address SumOutPtr = EmitPointerWithAlignment(E->getArg(2)); 2051 2052 // Decide which of the overflow intrinsics we are lowering to: 2053 llvm::Intrinsic::ID IntrinsicId; 2054 switch (BuiltinID) { 2055 default: llvm_unreachable("Unknown overflow builtin id."); 2056 case Builtin::BI__builtin_uadd_overflow: 2057 case Builtin::BI__builtin_uaddl_overflow: 2058 case Builtin::BI__builtin_uaddll_overflow: 2059 IntrinsicId = llvm::Intrinsic::uadd_with_overflow; 2060 break; 2061 case Builtin::BI__builtin_usub_overflow: 2062 case Builtin::BI__builtin_usubl_overflow: 2063 case Builtin::BI__builtin_usubll_overflow: 2064 IntrinsicId = llvm::Intrinsic::usub_with_overflow; 2065 break; 2066 case Builtin::BI__builtin_umul_overflow: 2067 case Builtin::BI__builtin_umull_overflow: 2068 case Builtin::BI__builtin_umulll_overflow: 2069 IntrinsicId = llvm::Intrinsic::umul_with_overflow; 2070 break; 2071 case Builtin::BI__builtin_sadd_overflow: 2072 case Builtin::BI__builtin_saddl_overflow: 2073 case Builtin::BI__builtin_saddll_overflow: 2074 IntrinsicId = llvm::Intrinsic::sadd_with_overflow; 2075 break; 2076 case Builtin::BI__builtin_ssub_overflow: 2077 case Builtin::BI__builtin_ssubl_overflow: 2078 case Builtin::BI__builtin_ssubll_overflow: 2079 IntrinsicId = llvm::Intrinsic::ssub_with_overflow; 2080 break; 2081 case Builtin::BI__builtin_smul_overflow: 2082 case Builtin::BI__builtin_smull_overflow: 2083 case Builtin::BI__builtin_smulll_overflow: 2084 IntrinsicId = llvm::Intrinsic::smul_with_overflow; 2085 break; 2086 } 2087 2088 2089 llvm::Value *Carry; 2090 llvm::Value *Sum = EmitOverflowIntrinsic(*this, IntrinsicId, X, Y, Carry); 2091 Builder.CreateStore(Sum, SumOutPtr); 2092 2093 return RValue::get(Carry); 2094 } 2095 case Builtin::BI__builtin_addressof: 2096 return RValue::get(EmitLValue(E->getArg(0)).getPointer()); 2097 case Builtin::BI__builtin_operator_new: 2098 return EmitBuiltinNewDeleteCall(FD->getType()->castAs<FunctionProtoType>(), 2099 E->getArg(0), false); 2100 case Builtin::BI__builtin_operator_delete: 2101 return EmitBuiltinNewDeleteCall(FD->getType()->castAs<FunctionProtoType>(), 2102 E->getArg(0), true); 2103 case Builtin::BI__noop: 2104 // __noop always evaluates to an integer literal zero. 2105 return RValue::get(ConstantInt::get(IntTy, 0)); 2106 case Builtin::BI__builtin_call_with_static_chain: { 2107 const CallExpr *Call = cast<CallExpr>(E->getArg(0)); 2108 const Expr *Chain = E->getArg(1); 2109 return EmitCall(Call->getCallee()->getType(), 2110 EmitCallee(Call->getCallee()), Call, ReturnValue, 2111 EmitScalarExpr(Chain)); 2112 } 2113 case Builtin::BI_InterlockedExchange8: 2114 case Builtin::BI_InterlockedExchange16: 2115 case Builtin::BI_InterlockedExchange: 2116 case Builtin::BI_InterlockedExchangePointer: 2117 return RValue::get( 2118 EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchange, E)); 2119 case Builtin::BI_InterlockedCompareExchangePointer: { 2120 llvm::Type *RTy; 2121 llvm::IntegerType *IntType = 2122 IntegerType::get(getLLVMContext(), 2123 getContext().getTypeSize(E->getType())); 2124 llvm::Type *IntPtrType = IntType->getPointerTo(); 2125 2126 llvm::Value *Destination = 2127 Builder.CreateBitCast(EmitScalarExpr(E->getArg(0)), IntPtrType); 2128 2129 llvm::Value *Exchange = EmitScalarExpr(E->getArg(1)); 2130 RTy = Exchange->getType(); 2131 Exchange = Builder.CreatePtrToInt(Exchange, IntType); 2132 2133 llvm::Value *Comparand = 2134 Builder.CreatePtrToInt(EmitScalarExpr(E->getArg(2)), IntType); 2135 2136 auto Result = 2137 Builder.CreateAtomicCmpXchg(Destination, Comparand, Exchange, 2138 AtomicOrdering::SequentiallyConsistent, 2139 AtomicOrdering::SequentiallyConsistent); 2140 Result->setVolatile(true); 2141 2142 return RValue::get(Builder.CreateIntToPtr(Builder.CreateExtractValue(Result, 2143 0), 2144 RTy)); 2145 } 2146 case Builtin::BI_InterlockedCompareExchange8: 2147 case Builtin::BI_InterlockedCompareExchange16: 2148 case Builtin::BI_InterlockedCompareExchange: 2149 case Builtin::BI_InterlockedCompareExchange64: { 2150 AtomicCmpXchgInst *CXI = Builder.CreateAtomicCmpXchg( 2151 EmitScalarExpr(E->getArg(0)), 2152 EmitScalarExpr(E->getArg(2)), 2153 EmitScalarExpr(E->getArg(1)), 2154 AtomicOrdering::SequentiallyConsistent, 2155 AtomicOrdering::SequentiallyConsistent); 2156 CXI->setVolatile(true); 2157 return RValue::get(Builder.CreateExtractValue(CXI, 0)); 2158 } 2159 case Builtin::BI_InterlockedIncrement16: 2160 case Builtin::BI_InterlockedIncrement: 2161 return RValue::get( 2162 EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedIncrement, E)); 2163 case Builtin::BI_InterlockedDecrement16: 2164 case Builtin::BI_InterlockedDecrement: 2165 return RValue::get( 2166 EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedDecrement, E)); 2167 case Builtin::BI_InterlockedAnd8: 2168 case Builtin::BI_InterlockedAnd16: 2169 case Builtin::BI_InterlockedAnd: 2170 return RValue::get(EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedAnd, E)); 2171 case Builtin::BI_InterlockedExchangeAdd8: 2172 case Builtin::BI_InterlockedExchangeAdd16: 2173 case Builtin::BI_InterlockedExchangeAdd: 2174 return RValue::get( 2175 EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeAdd, E)); 2176 case Builtin::BI_InterlockedExchangeSub8: 2177 case Builtin::BI_InterlockedExchangeSub16: 2178 case Builtin::BI_InterlockedExchangeSub: 2179 return RValue::get( 2180 EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeSub, E)); 2181 case Builtin::BI_InterlockedOr8: 2182 case Builtin::BI_InterlockedOr16: 2183 case Builtin::BI_InterlockedOr: 2184 return RValue::get(EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedOr, E)); 2185 case Builtin::BI_InterlockedXor8: 2186 case Builtin::BI_InterlockedXor16: 2187 case Builtin::BI_InterlockedXor: 2188 return RValue::get(EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedXor, E)); 2189 case Builtin::BI__readfsdword: { 2190 llvm::Type *IntTy = ConvertType(E->getType()); 2191 Value *IntToPtr = 2192 Builder.CreateIntToPtr(EmitScalarExpr(E->getArg(0)), 2193 llvm::PointerType::get(IntTy, 257)); 2194 LoadInst *Load = 2195 Builder.CreateDefaultAlignedLoad(IntToPtr, /*isVolatile=*/true); 2196 return RValue::get(Load); 2197 } 2198 2199 case Builtin::BI__exception_code: 2200 case Builtin::BI_exception_code: 2201 return RValue::get(EmitSEHExceptionCode()); 2202 case Builtin::BI__exception_info: 2203 case Builtin::BI_exception_info: 2204 return RValue::get(EmitSEHExceptionInfo()); 2205 case Builtin::BI__abnormal_termination: 2206 case Builtin::BI_abnormal_termination: 2207 return RValue::get(EmitSEHAbnormalTermination()); 2208 case Builtin::BI_setjmpex: { 2209 if (getTarget().getTriple().isOSMSVCRT()) { 2210 llvm::Type *ArgTypes[] = {Int8PtrTy, Int8PtrTy}; 2211 llvm::AttributeSet ReturnsTwiceAttr = 2212 AttributeSet::get(getLLVMContext(), llvm::AttributeSet::FunctionIndex, 2213 llvm::Attribute::ReturnsTwice); 2214 llvm::Constant *SetJmpEx = CGM.CreateRuntimeFunction( 2215 llvm::FunctionType::get(IntTy, ArgTypes, /*isVarArg=*/false), 2216 "_setjmpex", ReturnsTwiceAttr); 2217 llvm::Value *Buf = Builder.CreateBitOrPointerCast( 2218 EmitScalarExpr(E->getArg(0)), Int8PtrTy); 2219 llvm::Value *FrameAddr = 2220 Builder.CreateCall(CGM.getIntrinsic(Intrinsic::frameaddress), 2221 ConstantInt::get(Int32Ty, 0)); 2222 llvm::Value *Args[] = {Buf, FrameAddr}; 2223 llvm::CallSite CS = EmitRuntimeCallOrInvoke(SetJmpEx, Args); 2224 CS.setAttributes(ReturnsTwiceAttr); 2225 return RValue::get(CS.getInstruction()); 2226 } 2227 break; 2228 } 2229 case Builtin::BI_setjmp: { 2230 if (getTarget().getTriple().isOSMSVCRT()) { 2231 llvm::AttributeSet ReturnsTwiceAttr = 2232 AttributeSet::get(getLLVMContext(), llvm::AttributeSet::FunctionIndex, 2233 llvm::Attribute::ReturnsTwice); 2234 llvm::Value *Buf = Builder.CreateBitOrPointerCast( 2235 EmitScalarExpr(E->getArg(0)), Int8PtrTy); 2236 llvm::CallSite CS; 2237 if (getTarget().getTriple().getArch() == llvm::Triple::x86) { 2238 llvm::Type *ArgTypes[] = {Int8PtrTy, IntTy}; 2239 llvm::Constant *SetJmp3 = CGM.CreateRuntimeFunction( 2240 llvm::FunctionType::get(IntTy, ArgTypes, /*isVarArg=*/true), 2241 "_setjmp3", ReturnsTwiceAttr); 2242 llvm::Value *Count = ConstantInt::get(IntTy, 0); 2243 llvm::Value *Args[] = {Buf, Count}; 2244 CS = EmitRuntimeCallOrInvoke(SetJmp3, Args); 2245 } else { 2246 llvm::Type *ArgTypes[] = {Int8PtrTy, Int8PtrTy}; 2247 llvm::Constant *SetJmp = CGM.CreateRuntimeFunction( 2248 llvm::FunctionType::get(IntTy, ArgTypes, /*isVarArg=*/false), 2249 "_setjmp", ReturnsTwiceAttr); 2250 llvm::Value *FrameAddr = 2251 Builder.CreateCall(CGM.getIntrinsic(Intrinsic::frameaddress), 2252 ConstantInt::get(Int32Ty, 0)); 2253 llvm::Value *Args[] = {Buf, FrameAddr}; 2254 CS = EmitRuntimeCallOrInvoke(SetJmp, Args); 2255 } 2256 CS.setAttributes(ReturnsTwiceAttr); 2257 return RValue::get(CS.getInstruction()); 2258 } 2259 break; 2260 } 2261 2262 case Builtin::BI__GetExceptionInfo: { 2263 if (llvm::GlobalVariable *GV = 2264 CGM.getCXXABI().getThrowInfo(FD->getParamDecl(0)->getType())) 2265 return RValue::get(llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy)); 2266 break; 2267 } 2268 2269 case Builtin::BI__builtin_coro_size: { 2270 auto & Context = getContext(); 2271 auto SizeTy = Context.getSizeType(); 2272 auto T = Builder.getIntNTy(Context.getTypeSize(SizeTy)); 2273 Value *F = CGM.getIntrinsic(Intrinsic::coro_size, T); 2274 return RValue::get(Builder.CreateCall(F)); 2275 } 2276 2277 case Builtin::BI__builtin_coro_id: 2278 return EmitCoroutineIntrinsic(E, Intrinsic::coro_id); 2279 case Builtin::BI__builtin_coro_promise: 2280 return EmitCoroutineIntrinsic(E, Intrinsic::coro_promise); 2281 case Builtin::BI__builtin_coro_resume: 2282 return EmitCoroutineIntrinsic(E, Intrinsic::coro_resume); 2283 case Builtin::BI__builtin_coro_frame: 2284 return EmitCoroutineIntrinsic(E, Intrinsic::coro_frame); 2285 case Builtin::BI__builtin_coro_free: 2286 return EmitCoroutineIntrinsic(E, Intrinsic::coro_free); 2287 case Builtin::BI__builtin_coro_destroy: 2288 return EmitCoroutineIntrinsic(E, Intrinsic::coro_destroy); 2289 case Builtin::BI__builtin_coro_done: 2290 return EmitCoroutineIntrinsic(E, Intrinsic::coro_done); 2291 case Builtin::BI__builtin_coro_alloc: 2292 return EmitCoroutineIntrinsic(E, Intrinsic::coro_alloc); 2293 case Builtin::BI__builtin_coro_begin: 2294 return EmitCoroutineIntrinsic(E, Intrinsic::coro_begin); 2295 case Builtin::BI__builtin_coro_end: 2296 return EmitCoroutineIntrinsic(E, Intrinsic::coro_end); 2297 case Builtin::BI__builtin_coro_suspend: 2298 return EmitCoroutineIntrinsic(E, Intrinsic::coro_suspend); 2299 case Builtin::BI__builtin_coro_param: 2300 return EmitCoroutineIntrinsic(E, Intrinsic::coro_param); 2301 2302 // OpenCL v2.0 s6.13.16.2, Built-in pipe read and write functions 2303 case Builtin::BIread_pipe: 2304 case Builtin::BIwrite_pipe: { 2305 Value *Arg0 = EmitScalarExpr(E->getArg(0)), 2306 *Arg1 = EmitScalarExpr(E->getArg(1)); 2307 CGOpenCLRuntime OpenCLRT(CGM); 2308 Value *PacketSize = OpenCLRT.getPipeElemSize(E->getArg(0)); 2309 Value *PacketAlign = OpenCLRT.getPipeElemAlign(E->getArg(0)); 2310 2311 // Type of the generic packet parameter. 2312 unsigned GenericAS = 2313 getContext().getTargetAddressSpace(LangAS::opencl_generic); 2314 llvm::Type *I8PTy = llvm::PointerType::get( 2315 llvm::Type::getInt8Ty(getLLVMContext()), GenericAS); 2316 2317 // Testing which overloaded version we should generate the call for. 2318 if (2U == E->getNumArgs()) { 2319 const char *Name = (BuiltinID == Builtin::BIread_pipe) ? "__read_pipe_2" 2320 : "__write_pipe_2"; 2321 // Creating a generic function type to be able to call with any builtin or 2322 // user defined type. 2323 llvm::Type *ArgTys[] = {Arg0->getType(), I8PTy, Int32Ty, Int32Ty}; 2324 llvm::FunctionType *FTy = llvm::FunctionType::get( 2325 Int32Ty, llvm::ArrayRef<llvm::Type *>(ArgTys), false); 2326 Value *BCast = Builder.CreatePointerCast(Arg1, I8PTy); 2327 return RValue::get( 2328 Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, Name), 2329 {Arg0, BCast, PacketSize, PacketAlign})); 2330 } else { 2331 assert(4 == E->getNumArgs() && 2332 "Illegal number of parameters to pipe function"); 2333 const char *Name = (BuiltinID == Builtin::BIread_pipe) ? "__read_pipe_4" 2334 : "__write_pipe_4"; 2335 2336 llvm::Type *ArgTys[] = {Arg0->getType(), Arg1->getType(), Int32Ty, I8PTy, 2337 Int32Ty, Int32Ty}; 2338 Value *Arg2 = EmitScalarExpr(E->getArg(2)), 2339 *Arg3 = EmitScalarExpr(E->getArg(3)); 2340 llvm::FunctionType *FTy = llvm::FunctionType::get( 2341 Int32Ty, llvm::ArrayRef<llvm::Type *>(ArgTys), false); 2342 Value *BCast = Builder.CreatePointerCast(Arg3, I8PTy); 2343 // We know the third argument is an integer type, but we may need to cast 2344 // it to i32. 2345 if (Arg2->getType() != Int32Ty) 2346 Arg2 = Builder.CreateZExtOrTrunc(Arg2, Int32Ty); 2347 return RValue::get(Builder.CreateCall( 2348 CGM.CreateRuntimeFunction(FTy, Name), 2349 {Arg0, Arg1, Arg2, BCast, PacketSize, PacketAlign})); 2350 } 2351 } 2352 // OpenCL v2.0 s6.13.16 ,s9.17.3.5 - Built-in pipe reserve read and write 2353 // functions 2354 case Builtin::BIreserve_read_pipe: 2355 case Builtin::BIreserve_write_pipe: 2356 case Builtin::BIwork_group_reserve_read_pipe: 2357 case Builtin::BIwork_group_reserve_write_pipe: 2358 case Builtin::BIsub_group_reserve_read_pipe: 2359 case Builtin::BIsub_group_reserve_write_pipe: { 2360 // Composing the mangled name for the function. 2361 const char *Name; 2362 if (BuiltinID == Builtin::BIreserve_read_pipe) 2363 Name = "__reserve_read_pipe"; 2364 else if (BuiltinID == Builtin::BIreserve_write_pipe) 2365 Name = "__reserve_write_pipe"; 2366 else if (BuiltinID == Builtin::BIwork_group_reserve_read_pipe) 2367 Name = "__work_group_reserve_read_pipe"; 2368 else if (BuiltinID == Builtin::BIwork_group_reserve_write_pipe) 2369 Name = "__work_group_reserve_write_pipe"; 2370 else if (BuiltinID == Builtin::BIsub_group_reserve_read_pipe) 2371 Name = "__sub_group_reserve_read_pipe"; 2372 else 2373 Name = "__sub_group_reserve_write_pipe"; 2374 2375 Value *Arg0 = EmitScalarExpr(E->getArg(0)), 2376 *Arg1 = EmitScalarExpr(E->getArg(1)); 2377 llvm::Type *ReservedIDTy = ConvertType(getContext().OCLReserveIDTy); 2378 CGOpenCLRuntime OpenCLRT(CGM); 2379 Value *PacketSize = OpenCLRT.getPipeElemSize(E->getArg(0)); 2380 Value *PacketAlign = OpenCLRT.getPipeElemAlign(E->getArg(0)); 2381 2382 // Building the generic function prototype. 2383 llvm::Type *ArgTys[] = {Arg0->getType(), Int32Ty, Int32Ty, Int32Ty}; 2384 llvm::FunctionType *FTy = llvm::FunctionType::get( 2385 ReservedIDTy, llvm::ArrayRef<llvm::Type *>(ArgTys), false); 2386 // We know the second argument is an integer type, but we may need to cast 2387 // it to i32. 2388 if (Arg1->getType() != Int32Ty) 2389 Arg1 = Builder.CreateZExtOrTrunc(Arg1, Int32Ty); 2390 return RValue::get( 2391 Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, Name), 2392 {Arg0, Arg1, PacketSize, PacketAlign})); 2393 } 2394 // OpenCL v2.0 s6.13.16, s9.17.3.5 - Built-in pipe commit read and write 2395 // functions 2396 case Builtin::BIcommit_read_pipe: 2397 case Builtin::BIcommit_write_pipe: 2398 case Builtin::BIwork_group_commit_read_pipe: 2399 case Builtin::BIwork_group_commit_write_pipe: 2400 case Builtin::BIsub_group_commit_read_pipe: 2401 case Builtin::BIsub_group_commit_write_pipe: { 2402 const char *Name; 2403 if (BuiltinID == Builtin::BIcommit_read_pipe) 2404 Name = "__commit_read_pipe"; 2405 else if (BuiltinID == Builtin::BIcommit_write_pipe) 2406 Name = "__commit_write_pipe"; 2407 else if (BuiltinID == Builtin::BIwork_group_commit_read_pipe) 2408 Name = "__work_group_commit_read_pipe"; 2409 else if (BuiltinID == Builtin::BIwork_group_commit_write_pipe) 2410 Name = "__work_group_commit_write_pipe"; 2411 else if (BuiltinID == Builtin::BIsub_group_commit_read_pipe) 2412 Name = "__sub_group_commit_read_pipe"; 2413 else 2414 Name = "__sub_group_commit_write_pipe"; 2415 2416 Value *Arg0 = EmitScalarExpr(E->getArg(0)), 2417 *Arg1 = EmitScalarExpr(E->getArg(1)); 2418 CGOpenCLRuntime OpenCLRT(CGM); 2419 Value *PacketSize = OpenCLRT.getPipeElemSize(E->getArg(0)); 2420 Value *PacketAlign = OpenCLRT.getPipeElemAlign(E->getArg(0)); 2421 2422 // Building the generic function prototype. 2423 llvm::Type *ArgTys[] = {Arg0->getType(), Arg1->getType(), Int32Ty, Int32Ty}; 2424 llvm::FunctionType *FTy = 2425 llvm::FunctionType::get(llvm::Type::getVoidTy(getLLVMContext()), 2426 llvm::ArrayRef<llvm::Type *>(ArgTys), false); 2427 2428 return RValue::get( 2429 Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, Name), 2430 {Arg0, Arg1, PacketSize, PacketAlign})); 2431 } 2432 // OpenCL v2.0 s6.13.16.4 Built-in pipe query functions 2433 case Builtin::BIget_pipe_num_packets: 2434 case Builtin::BIget_pipe_max_packets: { 2435 const char *Name; 2436 if (BuiltinID == Builtin::BIget_pipe_num_packets) 2437 Name = "__get_pipe_num_packets"; 2438 else 2439 Name = "__get_pipe_max_packets"; 2440 2441 // Building the generic function prototype. 2442 Value *Arg0 = EmitScalarExpr(E->getArg(0)); 2443 CGOpenCLRuntime OpenCLRT(CGM); 2444 Value *PacketSize = OpenCLRT.getPipeElemSize(E->getArg(0)); 2445 Value *PacketAlign = OpenCLRT.getPipeElemAlign(E->getArg(0)); 2446 llvm::Type *ArgTys[] = {Arg0->getType(), Int32Ty, Int32Ty}; 2447 llvm::FunctionType *FTy = llvm::FunctionType::get( 2448 Int32Ty, llvm::ArrayRef<llvm::Type *>(ArgTys), false); 2449 2450 return RValue::get(Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, Name), 2451 {Arg0, PacketSize, PacketAlign})); 2452 } 2453 2454 // OpenCL v2.0 s6.13.9 - Address space qualifier functions. 2455 case Builtin::BIto_global: 2456 case Builtin::BIto_local: 2457 case Builtin::BIto_private: { 2458 auto Arg0 = EmitScalarExpr(E->getArg(0)); 2459 auto NewArgT = llvm::PointerType::get(Int8Ty, 2460 CGM.getContext().getTargetAddressSpace(LangAS::opencl_generic)); 2461 auto NewRetT = llvm::PointerType::get(Int8Ty, 2462 CGM.getContext().getTargetAddressSpace( 2463 E->getType()->getPointeeType().getAddressSpace())); 2464 auto FTy = llvm::FunctionType::get(NewRetT, {NewArgT}, false); 2465 llvm::Value *NewArg; 2466 if (Arg0->getType()->getPointerAddressSpace() != 2467 NewArgT->getPointerAddressSpace()) 2468 NewArg = Builder.CreateAddrSpaceCast(Arg0, NewArgT); 2469 else 2470 NewArg = Builder.CreateBitOrPointerCast(Arg0, NewArgT); 2471 auto NewName = std::string("__") + E->getDirectCallee()->getName().str(); 2472 auto NewCall = 2473 Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, NewName), {NewArg}); 2474 return RValue::get(Builder.CreateBitOrPointerCast(NewCall, 2475 ConvertType(E->getType()))); 2476 } 2477 2478 // OpenCL v2.0, s6.13.17 - Enqueue kernel function. 2479 // It contains four different overload formats specified in Table 6.13.17.1. 2480 case Builtin::BIenqueue_kernel: { 2481 StringRef Name; // Generated function call name 2482 unsigned NumArgs = E->getNumArgs(); 2483 2484 llvm::Type *QueueTy = ConvertType(getContext().OCLQueueTy); 2485 llvm::Type *RangeTy = ConvertType(getContext().OCLNDRangeTy); 2486 2487 llvm::Value *Queue = EmitScalarExpr(E->getArg(0)); 2488 llvm::Value *Flags = EmitScalarExpr(E->getArg(1)); 2489 llvm::Value *Range = EmitScalarExpr(E->getArg(2)); 2490 2491 if (NumArgs == 4) { 2492 // The most basic form of the call with parameters: 2493 // queue_t, kernel_enqueue_flags_t, ndrange_t, block(void) 2494 Name = "__enqueue_kernel_basic"; 2495 llvm::Type *ArgTys[] = {QueueTy, Int32Ty, RangeTy, Int8PtrTy}; 2496 llvm::FunctionType *FTy = llvm::FunctionType::get( 2497 Int32Ty, llvm::ArrayRef<llvm::Type *>(ArgTys, 4), false); 2498 2499 llvm::Value *Block = 2500 Builder.CreateBitCast(EmitScalarExpr(E->getArg(3)), Int8PtrTy); 2501 2502 return RValue::get(Builder.CreateCall( 2503 CGM.CreateRuntimeFunction(FTy, Name), {Queue, Flags, Range, Block})); 2504 } 2505 assert(NumArgs >= 5 && "Invalid enqueue_kernel signature"); 2506 2507 // Could have events and/or vaargs. 2508 if (E->getArg(3)->getType()->isBlockPointerType()) { 2509 // No events passed, but has variadic arguments. 2510 Name = "__enqueue_kernel_vaargs"; 2511 llvm::Value *Block = 2512 Builder.CreateBitCast(EmitScalarExpr(E->getArg(3)), Int8PtrTy); 2513 // Create a vector of the arguments, as well as a constant value to 2514 // express to the runtime the number of variadic arguments. 2515 std::vector<llvm::Value *> Args = {Queue, Flags, Range, Block, 2516 ConstantInt::get(IntTy, NumArgs - 4)}; 2517 std::vector<llvm::Type *> ArgTys = {QueueTy, IntTy, RangeTy, Int8PtrTy, 2518 IntTy}; 2519 2520 // Add the variadics. 2521 for (unsigned I = 4; I < NumArgs; ++I) { 2522 llvm::Value *ArgSize = EmitScalarExpr(E->getArg(I)); 2523 unsigned TypeSizeInBytes = 2524 getContext() 2525 .getTypeSizeInChars(E->getArg(I)->getType()) 2526 .getQuantity(); 2527 Args.push_back(TypeSizeInBytes < 4 2528 ? Builder.CreateZExt(ArgSize, Int32Ty) 2529 : ArgSize); 2530 } 2531 2532 llvm::FunctionType *FTy = llvm::FunctionType::get( 2533 Int32Ty, llvm::ArrayRef<llvm::Type *>(ArgTys), true); 2534 return RValue::get( 2535 Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, Name), 2536 llvm::ArrayRef<llvm::Value *>(Args))); 2537 } 2538 // Any calls now have event arguments passed. 2539 if (NumArgs >= 7) { 2540 llvm::Type *EventTy = ConvertType(getContext().OCLClkEventTy); 2541 unsigned AS4 = 2542 E->getArg(4)->getType()->isArrayType() 2543 ? E->getArg(4)->getType().getAddressSpace() 2544 : E->getArg(4)->getType()->getPointeeType().getAddressSpace(); 2545 llvm::Type *EventPtrAS4Ty = 2546 EventTy->getPointerTo(CGM.getContext().getTargetAddressSpace(AS4)); 2547 unsigned AS5 = 2548 E->getArg(5)->getType()->getPointeeType().getAddressSpace(); 2549 llvm::Type *EventPtrAS5Ty = 2550 EventTy->getPointerTo(CGM.getContext().getTargetAddressSpace(AS5)); 2551 2552 llvm::Value *NumEvents = EmitScalarExpr(E->getArg(3)); 2553 llvm::Value *EventList = 2554 E->getArg(4)->getType()->isArrayType() 2555 ? EmitArrayToPointerDecay(E->getArg(4)).getPointer() 2556 : EmitScalarExpr(E->getArg(4)); 2557 llvm::Value *ClkEvent = EmitScalarExpr(E->getArg(5)); 2558 llvm::Value *Block = 2559 Builder.CreateBitCast(EmitScalarExpr(E->getArg(6)), Int8PtrTy); 2560 2561 std::vector<llvm::Type *> ArgTys = { 2562 QueueTy, Int32Ty, RangeTy, Int32Ty, 2563 EventPtrAS4Ty, EventPtrAS5Ty, Int8PtrTy}; 2564 std::vector<llvm::Value *> Args = {Queue, Flags, Range, NumEvents, 2565 EventList, ClkEvent, Block}; 2566 2567 if (NumArgs == 7) { 2568 // Has events but no variadics. 2569 Name = "__enqueue_kernel_basic_events"; 2570 llvm::FunctionType *FTy = llvm::FunctionType::get( 2571 Int32Ty, llvm::ArrayRef<llvm::Type *>(ArgTys), false); 2572 return RValue::get( 2573 Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, Name), 2574 llvm::ArrayRef<llvm::Value *>(Args))); 2575 } 2576 // Has event info and variadics 2577 // Pass the number of variadics to the runtime function too. 2578 Args.push_back(ConstantInt::get(Int32Ty, NumArgs - 7)); 2579 ArgTys.push_back(Int32Ty); 2580 Name = "__enqueue_kernel_events_vaargs"; 2581 2582 // Add the variadics. 2583 for (unsigned I = 7; I < NumArgs; ++I) { 2584 llvm::Value *ArgSize = EmitScalarExpr(E->getArg(I)); 2585 unsigned TypeSizeInBytes = 2586 getContext() 2587 .getTypeSizeInChars(E->getArg(I)->getType()) 2588 .getQuantity(); 2589 Args.push_back(TypeSizeInBytes < 4 2590 ? Builder.CreateZExt(ArgSize, Int32Ty) 2591 : ArgSize); 2592 } 2593 llvm::FunctionType *FTy = llvm::FunctionType::get( 2594 Int32Ty, llvm::ArrayRef<llvm::Type *>(ArgTys), true); 2595 return RValue::get( 2596 Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, Name), 2597 llvm::ArrayRef<llvm::Value *>(Args))); 2598 } 2599 } 2600 // OpenCL v2.0 s6.13.17.6 - Kernel query functions need bitcast of block 2601 // parameter. 2602 case Builtin::BIget_kernel_work_group_size: { 2603 Value *Arg = EmitScalarExpr(E->getArg(0)); 2604 Arg = Builder.CreateBitCast(Arg, Int8PtrTy); 2605 return RValue::get( 2606 Builder.CreateCall(CGM.CreateRuntimeFunction( 2607 llvm::FunctionType::get(IntTy, Int8PtrTy, false), 2608 "__get_kernel_work_group_size_impl"), 2609 Arg)); 2610 } 2611 case Builtin::BIget_kernel_preferred_work_group_size_multiple: { 2612 Value *Arg = EmitScalarExpr(E->getArg(0)); 2613 Arg = Builder.CreateBitCast(Arg, Int8PtrTy); 2614 return RValue::get(Builder.CreateCall( 2615 CGM.CreateRuntimeFunction( 2616 llvm::FunctionType::get(IntTy, Int8PtrTy, false), 2617 "__get_kernel_preferred_work_group_multiple_impl"), 2618 Arg)); 2619 } 2620 case Builtin::BIprintf: 2621 if (getLangOpts().CUDA && getLangOpts().CUDAIsDevice) 2622 return EmitCUDADevicePrintfCallExpr(E, ReturnValue); 2623 break; 2624 case Builtin::BI__builtin_canonicalize: 2625 case Builtin::BI__builtin_canonicalizef: 2626 case Builtin::BI__builtin_canonicalizel: 2627 return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::canonicalize)); 2628 2629 case Builtin::BI__builtin_thread_pointer: { 2630 if (!getContext().getTargetInfo().isTLSSupported()) 2631 CGM.ErrorUnsupported(E, "__builtin_thread_pointer"); 2632 // Fall through - it's already mapped to the intrinsic by GCCBuiltin. 2633 break; 2634 } 2635 case Builtin::BI__builtin_os_log_format: { 2636 assert(E->getNumArgs() >= 2 && 2637 "__builtin_os_log_format takes at least 2 arguments"); 2638 analyze_os_log::OSLogBufferLayout Layout; 2639 analyze_os_log::computeOSLogBufferLayout(CGM.getContext(), E, Layout); 2640 Address BufAddr = EmitPointerWithAlignment(E->getArg(0)); 2641 // Ignore argument 1, the format string. It is not currently used. 2642 CharUnits Offset; 2643 Builder.CreateStore( 2644 Builder.getInt8(Layout.getSummaryByte()), 2645 Builder.CreateConstByteGEP(BufAddr, Offset++, "summary")); 2646 Builder.CreateStore( 2647 Builder.getInt8(Layout.getNumArgsByte()), 2648 Builder.CreateConstByteGEP(BufAddr, Offset++, "numArgs")); 2649 2650 llvm::SmallVector<llvm::Value *, 4> RetainableOperands; 2651 for (const auto &Item : Layout.Items) { 2652 Builder.CreateStore( 2653 Builder.getInt8(Item.getDescriptorByte()), 2654 Builder.CreateConstByteGEP(BufAddr, Offset++, "argDescriptor")); 2655 Builder.CreateStore( 2656 Builder.getInt8(Item.getSizeByte()), 2657 Builder.CreateConstByteGEP(BufAddr, Offset++, "argSize")); 2658 Address Addr = Builder.CreateConstByteGEP(BufAddr, Offset); 2659 if (const Expr *TheExpr = Item.getExpr()) { 2660 Addr = Builder.CreateElementBitCast( 2661 Addr, ConvertTypeForMem(TheExpr->getType())); 2662 // Check if this is a retainable type. 2663 if (TheExpr->getType()->isObjCRetainableType()) { 2664 assert(getEvaluationKind(TheExpr->getType()) == TEK_Scalar && 2665 "Only scalar can be a ObjC retainable type"); 2666 llvm::Value *SV = EmitScalarExpr(TheExpr, /*Ignore*/ false); 2667 RValue RV = RValue::get(SV); 2668 LValue LV = MakeAddrLValue(Addr, TheExpr->getType()); 2669 EmitStoreThroughLValue(RV, LV); 2670 // Check if the object is constant, if not, save it in 2671 // RetainableOperands. 2672 if (!isa<Constant>(SV)) 2673 RetainableOperands.push_back(SV); 2674 } else { 2675 EmitAnyExprToMem(TheExpr, Addr, Qualifiers(), /*isInit*/ true); 2676 } 2677 } else { 2678 Addr = Builder.CreateElementBitCast(Addr, Int32Ty); 2679 Builder.CreateStore( 2680 Builder.getInt32(Item.getConstValue().getQuantity()), Addr); 2681 } 2682 Offset += Item.size(); 2683 } 2684 2685 // Push a clang.arc.use cleanup for each object in RetainableOperands. The 2686 // cleanup will cause the use to appear after the final log call, keeping 2687 // the object valid while it’s held in the log buffer. Note that if there’s 2688 // a release cleanup on the object, it will already be active; since 2689 // cleanups are emitted in reverse order, the use will occur before the 2690 // object is released. 2691 if (!RetainableOperands.empty() && getLangOpts().ObjCAutoRefCount && 2692 CGM.getCodeGenOpts().OptimizationLevel != 0) 2693 for (llvm::Value *object : RetainableOperands) 2694 pushFullExprCleanup<CallObjCArcUse>(getARCCleanupKind(), object); 2695 2696 return RValue::get(BufAddr.getPointer()); 2697 } 2698 2699 case Builtin::BI__builtin_os_log_format_buffer_size: { 2700 analyze_os_log::OSLogBufferLayout Layout; 2701 analyze_os_log::computeOSLogBufferLayout(CGM.getContext(), E, Layout); 2702 return RValue::get(ConstantInt::get(ConvertType(E->getType()), 2703 Layout.size().getQuantity())); 2704 } 2705 } 2706 2707 // If this is an alias for a lib function (e.g. __builtin_sin), emit 2708 // the call using the normal call path, but using the unmangled 2709 // version of the function name. 2710 if (getContext().BuiltinInfo.isLibFunction(BuiltinID)) 2711 return emitLibraryCall(*this, FD, E, 2712 CGM.getBuiltinLibFunction(FD, BuiltinID)); 2713 2714 // If this is a predefined lib function (e.g. malloc), emit the call 2715 // using exactly the normal call path. 2716 if (getContext().BuiltinInfo.isPredefinedLibFunction(BuiltinID)) 2717 return emitLibraryCall(*this, FD, E, 2718 cast<llvm::Constant>(EmitScalarExpr(E->getCallee()))); 2719 2720 // Check that a call to a target specific builtin has the correct target 2721 // features. 2722 // This is down here to avoid non-target specific builtins, however, if 2723 // generic builtins start to require generic target features then we 2724 // can move this up to the beginning of the function. 2725 checkTargetFeatures(E, FD); 2726 2727 // See if we have a target specific intrinsic. 2728 const char *Name = getContext().BuiltinInfo.getName(BuiltinID); 2729 Intrinsic::ID IntrinsicID = Intrinsic::not_intrinsic; 2730 StringRef Prefix = 2731 llvm::Triple::getArchTypePrefix(getTarget().getTriple().getArch()); 2732 if (!Prefix.empty()) { 2733 IntrinsicID = Intrinsic::getIntrinsicForGCCBuiltin(Prefix.data(), Name); 2734 // NOTE we dont need to perform a compatibility flag check here since the 2735 // intrinsics are declared in Builtins*.def via LANGBUILTIN which filter the 2736 // MS builtins via ALL_MS_LANGUAGES and are filtered earlier. 2737 if (IntrinsicID == Intrinsic::not_intrinsic) 2738 IntrinsicID = Intrinsic::getIntrinsicForMSBuiltin(Prefix.data(), Name); 2739 } 2740 2741 if (IntrinsicID != Intrinsic::not_intrinsic) { 2742 SmallVector<Value*, 16> Args; 2743 2744 // Find out if any arguments are required to be integer constant 2745 // expressions. 2746 unsigned ICEArguments = 0; 2747 ASTContext::GetBuiltinTypeError Error; 2748 getContext().GetBuiltinType(BuiltinID, Error, &ICEArguments); 2749 assert(Error == ASTContext::GE_None && "Should not codegen an error"); 2750 2751 Function *F = CGM.getIntrinsic(IntrinsicID); 2752 llvm::FunctionType *FTy = F->getFunctionType(); 2753 2754 for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) { 2755 Value *ArgValue; 2756 // If this is a normal argument, just emit it as a scalar. 2757 if ((ICEArguments & (1 << i)) == 0) { 2758 ArgValue = EmitScalarExpr(E->getArg(i)); 2759 } else { 2760 // If this is required to be a constant, constant fold it so that we 2761 // know that the generated intrinsic gets a ConstantInt. 2762 llvm::APSInt Result; 2763 bool IsConst = E->getArg(i)->isIntegerConstantExpr(Result,getContext()); 2764 assert(IsConst && "Constant arg isn't actually constant?"); 2765 (void)IsConst; 2766 ArgValue = llvm::ConstantInt::get(getLLVMContext(), Result); 2767 } 2768 2769 // If the intrinsic arg type is different from the builtin arg type 2770 // we need to do a bit cast. 2771 llvm::Type *PTy = FTy->getParamType(i); 2772 if (PTy != ArgValue->getType()) { 2773 assert(PTy->canLosslesslyBitCastTo(FTy->getParamType(i)) && 2774 "Must be able to losslessly bit cast to param"); 2775 ArgValue = Builder.CreateBitCast(ArgValue, PTy); 2776 } 2777 2778 Args.push_back(ArgValue); 2779 } 2780 2781 Value *V = Builder.CreateCall(F, Args); 2782 QualType BuiltinRetType = E->getType(); 2783 2784 llvm::Type *RetTy = VoidTy; 2785 if (!BuiltinRetType->isVoidType()) 2786 RetTy = ConvertType(BuiltinRetType); 2787 2788 if (RetTy != V->getType()) { 2789 assert(V->getType()->canLosslesslyBitCastTo(RetTy) && 2790 "Must be able to losslessly bit cast result type"); 2791 V = Builder.CreateBitCast(V, RetTy); 2792 } 2793 2794 return RValue::get(V); 2795 } 2796 2797 // See if we have a target specific builtin that needs to be lowered. 2798 if (Value *V = EmitTargetBuiltinExpr(BuiltinID, E)) 2799 return RValue::get(V); 2800 2801 ErrorUnsupported(E, "builtin function"); 2802 2803 // Unknown builtin, for now just dump it out and return undef. 2804 return GetUndefRValue(E->getType()); 2805 } 2806 2807 static Value *EmitTargetArchBuiltinExpr(CodeGenFunction *CGF, 2808 unsigned BuiltinID, const CallExpr *E, 2809 llvm::Triple::ArchType Arch) { 2810 switch (Arch) { 2811 case llvm::Triple::arm: 2812 case llvm::Triple::armeb: 2813 case llvm::Triple::thumb: 2814 case llvm::Triple::thumbeb: 2815 return CGF->EmitARMBuiltinExpr(BuiltinID, E); 2816 case llvm::Triple::aarch64: 2817 case llvm::Triple::aarch64_be: 2818 return CGF->EmitAArch64BuiltinExpr(BuiltinID, E); 2819 case llvm::Triple::x86: 2820 case llvm::Triple::x86_64: 2821 return CGF->EmitX86BuiltinExpr(BuiltinID, E); 2822 case llvm::Triple::ppc: 2823 case llvm::Triple::ppc64: 2824 case llvm::Triple::ppc64le: 2825 return CGF->EmitPPCBuiltinExpr(BuiltinID, E); 2826 case llvm::Triple::r600: 2827 case llvm::Triple::amdgcn: 2828 return CGF->EmitAMDGPUBuiltinExpr(BuiltinID, E); 2829 case llvm::Triple::systemz: 2830 return CGF->EmitSystemZBuiltinExpr(BuiltinID, E); 2831 case llvm::Triple::nvptx: 2832 case llvm::Triple::nvptx64: 2833 return CGF->EmitNVPTXBuiltinExpr(BuiltinID, E); 2834 case llvm::Triple::wasm32: 2835 case llvm::Triple::wasm64: 2836 return CGF->EmitWebAssemblyBuiltinExpr(BuiltinID, E); 2837 default: 2838 return nullptr; 2839 } 2840 } 2841 2842 Value *CodeGenFunction::EmitTargetBuiltinExpr(unsigned BuiltinID, 2843 const CallExpr *E) { 2844 if (getContext().BuiltinInfo.isAuxBuiltinID(BuiltinID)) { 2845 assert(getContext().getAuxTargetInfo() && "Missing aux target info"); 2846 return EmitTargetArchBuiltinExpr( 2847 this, getContext().BuiltinInfo.getAuxBuiltinID(BuiltinID), E, 2848 getContext().getAuxTargetInfo()->getTriple().getArch()); 2849 } 2850 2851 return EmitTargetArchBuiltinExpr(this, BuiltinID, E, 2852 getTarget().getTriple().getArch()); 2853 } 2854 2855 static llvm::VectorType *GetNeonType(CodeGenFunction *CGF, 2856 NeonTypeFlags TypeFlags, 2857 bool V1Ty=false) { 2858 int IsQuad = TypeFlags.isQuad(); 2859 switch (TypeFlags.getEltType()) { 2860 case NeonTypeFlags::Int8: 2861 case NeonTypeFlags::Poly8: 2862 return llvm::VectorType::get(CGF->Int8Ty, V1Ty ? 1 : (8 << IsQuad)); 2863 case NeonTypeFlags::Int16: 2864 case NeonTypeFlags::Poly16: 2865 case NeonTypeFlags::Float16: 2866 return llvm::VectorType::get(CGF->Int16Ty, V1Ty ? 1 : (4 << IsQuad)); 2867 case NeonTypeFlags::Int32: 2868 return llvm::VectorType::get(CGF->Int32Ty, V1Ty ? 1 : (2 << IsQuad)); 2869 case NeonTypeFlags::Int64: 2870 case NeonTypeFlags::Poly64: 2871 return llvm::VectorType::get(CGF->Int64Ty, V1Ty ? 1 : (1 << IsQuad)); 2872 case NeonTypeFlags::Poly128: 2873 // FIXME: i128 and f128 doesn't get fully support in Clang and llvm. 2874 // There is a lot of i128 and f128 API missing. 2875 // so we use v16i8 to represent poly128 and get pattern matched. 2876 return llvm::VectorType::get(CGF->Int8Ty, 16); 2877 case NeonTypeFlags::Float32: 2878 return llvm::VectorType::get(CGF->FloatTy, V1Ty ? 1 : (2 << IsQuad)); 2879 case NeonTypeFlags::Float64: 2880 return llvm::VectorType::get(CGF->DoubleTy, V1Ty ? 1 : (1 << IsQuad)); 2881 } 2882 llvm_unreachable("Unknown vector element type!"); 2883 } 2884 2885 static llvm::VectorType *GetFloatNeonType(CodeGenFunction *CGF, 2886 NeonTypeFlags IntTypeFlags) { 2887 int IsQuad = IntTypeFlags.isQuad(); 2888 switch (IntTypeFlags.getEltType()) { 2889 case NeonTypeFlags::Int32: 2890 return llvm::VectorType::get(CGF->FloatTy, (2 << IsQuad)); 2891 case NeonTypeFlags::Int64: 2892 return llvm::VectorType::get(CGF->DoubleTy, (1 << IsQuad)); 2893 default: 2894 llvm_unreachable("Type can't be converted to floating-point!"); 2895 } 2896 } 2897 2898 Value *CodeGenFunction::EmitNeonSplat(Value *V, Constant *C) { 2899 unsigned nElts = V->getType()->getVectorNumElements(); 2900 Value* SV = llvm::ConstantVector::getSplat(nElts, C); 2901 return Builder.CreateShuffleVector(V, V, SV, "lane"); 2902 } 2903 2904 Value *CodeGenFunction::EmitNeonCall(Function *F, SmallVectorImpl<Value*> &Ops, 2905 const char *name, 2906 unsigned shift, bool rightshift) { 2907 unsigned j = 0; 2908 for (Function::const_arg_iterator ai = F->arg_begin(), ae = F->arg_end(); 2909 ai != ae; ++ai, ++j) 2910 if (shift > 0 && shift == j) 2911 Ops[j] = EmitNeonShiftVector(Ops[j], ai->getType(), rightshift); 2912 else 2913 Ops[j] = Builder.CreateBitCast(Ops[j], ai->getType(), name); 2914 2915 return Builder.CreateCall(F, Ops, name); 2916 } 2917 2918 Value *CodeGenFunction::EmitNeonShiftVector(Value *V, llvm::Type *Ty, 2919 bool neg) { 2920 int SV = cast<ConstantInt>(V)->getSExtValue(); 2921 return ConstantInt::get(Ty, neg ? -SV : SV); 2922 } 2923 2924 // \brief Right-shift a vector by a constant. 2925 Value *CodeGenFunction::EmitNeonRShiftImm(Value *Vec, Value *Shift, 2926 llvm::Type *Ty, bool usgn, 2927 const char *name) { 2928 llvm::VectorType *VTy = cast<llvm::VectorType>(Ty); 2929 2930 int ShiftAmt = cast<ConstantInt>(Shift)->getSExtValue(); 2931 int EltSize = VTy->getScalarSizeInBits(); 2932 2933 Vec = Builder.CreateBitCast(Vec, Ty); 2934 2935 // lshr/ashr are undefined when the shift amount is equal to the vector 2936 // element size. 2937 if (ShiftAmt == EltSize) { 2938 if (usgn) { 2939 // Right-shifting an unsigned value by its size yields 0. 2940 return llvm::ConstantAggregateZero::get(VTy); 2941 } else { 2942 // Right-shifting a signed value by its size is equivalent 2943 // to a shift of size-1. 2944 --ShiftAmt; 2945 Shift = ConstantInt::get(VTy->getElementType(), ShiftAmt); 2946 } 2947 } 2948 2949 Shift = EmitNeonShiftVector(Shift, Ty, false); 2950 if (usgn) 2951 return Builder.CreateLShr(Vec, Shift, name); 2952 else 2953 return Builder.CreateAShr(Vec, Shift, name); 2954 } 2955 2956 enum { 2957 AddRetType = (1 << 0), 2958 Add1ArgType = (1 << 1), 2959 Add2ArgTypes = (1 << 2), 2960 2961 VectorizeRetType = (1 << 3), 2962 VectorizeArgTypes = (1 << 4), 2963 2964 InventFloatType = (1 << 5), 2965 UnsignedAlts = (1 << 6), 2966 2967 Use64BitVectors = (1 << 7), 2968 Use128BitVectors = (1 << 8), 2969 2970 Vectorize1ArgType = Add1ArgType | VectorizeArgTypes, 2971 VectorRet = AddRetType | VectorizeRetType, 2972 VectorRetGetArgs01 = 2973 AddRetType | Add2ArgTypes | VectorizeRetType | VectorizeArgTypes, 2974 FpCmpzModifiers = 2975 AddRetType | VectorizeRetType | Add1ArgType | InventFloatType 2976 }; 2977 2978 namespace { 2979 struct NeonIntrinsicInfo { 2980 const char *NameHint; 2981 unsigned BuiltinID; 2982 unsigned LLVMIntrinsic; 2983 unsigned AltLLVMIntrinsic; 2984 unsigned TypeModifier; 2985 2986 bool operator<(unsigned RHSBuiltinID) const { 2987 return BuiltinID < RHSBuiltinID; 2988 } 2989 bool operator<(const NeonIntrinsicInfo &TE) const { 2990 return BuiltinID < TE.BuiltinID; 2991 } 2992 }; 2993 } // end anonymous namespace 2994 2995 #define NEONMAP0(NameBase) \ 2996 { #NameBase, NEON::BI__builtin_neon_ ## NameBase, 0, 0, 0 } 2997 2998 #define NEONMAP1(NameBase, LLVMIntrinsic, TypeModifier) \ 2999 { #NameBase, NEON:: BI__builtin_neon_ ## NameBase, \ 3000 Intrinsic::LLVMIntrinsic, 0, TypeModifier } 3001 3002 #define NEONMAP2(NameBase, LLVMIntrinsic, AltLLVMIntrinsic, TypeModifier) \ 3003 { #NameBase, NEON:: BI__builtin_neon_ ## NameBase, \ 3004 Intrinsic::LLVMIntrinsic, Intrinsic::AltLLVMIntrinsic, \ 3005 TypeModifier } 3006 3007 static const NeonIntrinsicInfo ARMSIMDIntrinsicMap [] = { 3008 NEONMAP2(vabd_v, arm_neon_vabdu, arm_neon_vabds, Add1ArgType | UnsignedAlts), 3009 NEONMAP2(vabdq_v, arm_neon_vabdu, arm_neon_vabds, Add1ArgType | UnsignedAlts), 3010 NEONMAP1(vabs_v, arm_neon_vabs, 0), 3011 NEONMAP1(vabsq_v, arm_neon_vabs, 0), 3012 NEONMAP0(vaddhn_v), 3013 NEONMAP1(vaesdq_v, arm_neon_aesd, 0), 3014 NEONMAP1(vaeseq_v, arm_neon_aese, 0), 3015 NEONMAP1(vaesimcq_v, arm_neon_aesimc, 0), 3016 NEONMAP1(vaesmcq_v, arm_neon_aesmc, 0), 3017 NEONMAP1(vbsl_v, arm_neon_vbsl, AddRetType), 3018 NEONMAP1(vbslq_v, arm_neon_vbsl, AddRetType), 3019 NEONMAP1(vcage_v, arm_neon_vacge, 0), 3020 NEONMAP1(vcageq_v, arm_neon_vacge, 0), 3021 NEONMAP1(vcagt_v, arm_neon_vacgt, 0), 3022 NEONMAP1(vcagtq_v, arm_neon_vacgt, 0), 3023 NEONMAP1(vcale_v, arm_neon_vacge, 0), 3024 NEONMAP1(vcaleq_v, arm_neon_vacge, 0), 3025 NEONMAP1(vcalt_v, arm_neon_vacgt, 0), 3026 NEONMAP1(vcaltq_v, arm_neon_vacgt, 0), 3027 NEONMAP1(vcls_v, arm_neon_vcls, Add1ArgType), 3028 NEONMAP1(vclsq_v, arm_neon_vcls, Add1ArgType), 3029 NEONMAP1(vclz_v, ctlz, Add1ArgType), 3030 NEONMAP1(vclzq_v, ctlz, Add1ArgType), 3031 NEONMAP1(vcnt_v, ctpop, Add1ArgType), 3032 NEONMAP1(vcntq_v, ctpop, Add1ArgType), 3033 NEONMAP1(vcvt_f16_f32, arm_neon_vcvtfp2hf, 0), 3034 NEONMAP1(vcvt_f32_f16, arm_neon_vcvthf2fp, 0), 3035 NEONMAP0(vcvt_f32_v), 3036 NEONMAP2(vcvt_n_f32_v, arm_neon_vcvtfxu2fp, arm_neon_vcvtfxs2fp, 0), 3037 NEONMAP1(vcvt_n_s32_v, arm_neon_vcvtfp2fxs, 0), 3038 NEONMAP1(vcvt_n_s64_v, arm_neon_vcvtfp2fxs, 0), 3039 NEONMAP1(vcvt_n_u32_v, arm_neon_vcvtfp2fxu, 0), 3040 NEONMAP1(vcvt_n_u64_v, arm_neon_vcvtfp2fxu, 0), 3041 NEONMAP0(vcvt_s32_v), 3042 NEONMAP0(vcvt_s64_v), 3043 NEONMAP0(vcvt_u32_v), 3044 NEONMAP0(vcvt_u64_v), 3045 NEONMAP1(vcvta_s32_v, arm_neon_vcvtas, 0), 3046 NEONMAP1(vcvta_s64_v, arm_neon_vcvtas, 0), 3047 NEONMAP1(vcvta_u32_v, arm_neon_vcvtau, 0), 3048 NEONMAP1(vcvta_u64_v, arm_neon_vcvtau, 0), 3049 NEONMAP1(vcvtaq_s32_v, arm_neon_vcvtas, 0), 3050 NEONMAP1(vcvtaq_s64_v, arm_neon_vcvtas, 0), 3051 NEONMAP1(vcvtaq_u32_v, arm_neon_vcvtau, 0), 3052 NEONMAP1(vcvtaq_u64_v, arm_neon_vcvtau, 0), 3053 NEONMAP1(vcvtm_s32_v, arm_neon_vcvtms, 0), 3054 NEONMAP1(vcvtm_s64_v, arm_neon_vcvtms, 0), 3055 NEONMAP1(vcvtm_u32_v, arm_neon_vcvtmu, 0), 3056 NEONMAP1(vcvtm_u64_v, arm_neon_vcvtmu, 0), 3057 NEONMAP1(vcvtmq_s32_v, arm_neon_vcvtms, 0), 3058 NEONMAP1(vcvtmq_s64_v, arm_neon_vcvtms, 0), 3059 NEONMAP1(vcvtmq_u32_v, arm_neon_vcvtmu, 0), 3060 NEONMAP1(vcvtmq_u64_v, arm_neon_vcvtmu, 0), 3061 NEONMAP1(vcvtn_s32_v, arm_neon_vcvtns, 0), 3062 NEONMAP1(vcvtn_s64_v, arm_neon_vcvtns, 0), 3063 NEONMAP1(vcvtn_u32_v, arm_neon_vcvtnu, 0), 3064 NEONMAP1(vcvtn_u64_v, arm_neon_vcvtnu, 0), 3065 NEONMAP1(vcvtnq_s32_v, arm_neon_vcvtns, 0), 3066 NEONMAP1(vcvtnq_s64_v, arm_neon_vcvtns, 0), 3067 NEONMAP1(vcvtnq_u32_v, arm_neon_vcvtnu, 0), 3068 NEONMAP1(vcvtnq_u64_v, arm_neon_vcvtnu, 0), 3069 NEONMAP1(vcvtp_s32_v, arm_neon_vcvtps, 0), 3070 NEONMAP1(vcvtp_s64_v, arm_neon_vcvtps, 0), 3071 NEONMAP1(vcvtp_u32_v, arm_neon_vcvtpu, 0), 3072 NEONMAP1(vcvtp_u64_v, arm_neon_vcvtpu, 0), 3073 NEONMAP1(vcvtpq_s32_v, arm_neon_vcvtps, 0), 3074 NEONMAP1(vcvtpq_s64_v, arm_neon_vcvtps, 0), 3075 NEONMAP1(vcvtpq_u32_v, arm_neon_vcvtpu, 0), 3076 NEONMAP1(vcvtpq_u64_v, arm_neon_vcvtpu, 0), 3077 NEONMAP0(vcvtq_f32_v), 3078 NEONMAP2(vcvtq_n_f32_v, arm_neon_vcvtfxu2fp, arm_neon_vcvtfxs2fp, 0), 3079 NEONMAP1(vcvtq_n_s32_v, arm_neon_vcvtfp2fxs, 0), 3080 NEONMAP1(vcvtq_n_s64_v, arm_neon_vcvtfp2fxs, 0), 3081 NEONMAP1(vcvtq_n_u32_v, arm_neon_vcvtfp2fxu, 0), 3082 NEONMAP1(vcvtq_n_u64_v, arm_neon_vcvtfp2fxu, 0), 3083 NEONMAP0(vcvtq_s32_v), 3084 NEONMAP0(vcvtq_s64_v), 3085 NEONMAP0(vcvtq_u32_v), 3086 NEONMAP0(vcvtq_u64_v), 3087 NEONMAP0(vext_v), 3088 NEONMAP0(vextq_v), 3089 NEONMAP0(vfma_v), 3090 NEONMAP0(vfmaq_v), 3091 NEONMAP2(vhadd_v, arm_neon_vhaddu, arm_neon_vhadds, Add1ArgType | UnsignedAlts), 3092 NEONMAP2(vhaddq_v, arm_neon_vhaddu, arm_neon_vhadds, Add1ArgType | UnsignedAlts), 3093 NEONMAP2(vhsub_v, arm_neon_vhsubu, arm_neon_vhsubs, Add1ArgType | UnsignedAlts), 3094 NEONMAP2(vhsubq_v, arm_neon_vhsubu, arm_neon_vhsubs, Add1ArgType | UnsignedAlts), 3095 NEONMAP0(vld1_dup_v), 3096 NEONMAP1(vld1_v, arm_neon_vld1, 0), 3097 NEONMAP0(vld1q_dup_v), 3098 NEONMAP1(vld1q_v, arm_neon_vld1, 0), 3099 NEONMAP1(vld2_lane_v, arm_neon_vld2lane, 0), 3100 NEONMAP1(vld2_v, arm_neon_vld2, 0), 3101 NEONMAP1(vld2q_lane_v, arm_neon_vld2lane, 0), 3102 NEONMAP1(vld2q_v, arm_neon_vld2, 0), 3103 NEONMAP1(vld3_lane_v, arm_neon_vld3lane, 0), 3104 NEONMAP1(vld3_v, arm_neon_vld3, 0), 3105 NEONMAP1(vld3q_lane_v, arm_neon_vld3lane, 0), 3106 NEONMAP1(vld3q_v, arm_neon_vld3, 0), 3107 NEONMAP1(vld4_lane_v, arm_neon_vld4lane, 0), 3108 NEONMAP1(vld4_v, arm_neon_vld4, 0), 3109 NEONMAP1(vld4q_lane_v, arm_neon_vld4lane, 0), 3110 NEONMAP1(vld4q_v, arm_neon_vld4, 0), 3111 NEONMAP2(vmax_v, arm_neon_vmaxu, arm_neon_vmaxs, Add1ArgType | UnsignedAlts), 3112 NEONMAP1(vmaxnm_v, arm_neon_vmaxnm, Add1ArgType), 3113 NEONMAP1(vmaxnmq_v, arm_neon_vmaxnm, Add1ArgType), 3114 NEONMAP2(vmaxq_v, arm_neon_vmaxu, arm_neon_vmaxs, Add1ArgType | UnsignedAlts), 3115 NEONMAP2(vmin_v, arm_neon_vminu, arm_neon_vmins, Add1ArgType | UnsignedAlts), 3116 NEONMAP1(vminnm_v, arm_neon_vminnm, Add1ArgType), 3117 NEONMAP1(vminnmq_v, arm_neon_vminnm, Add1ArgType), 3118 NEONMAP2(vminq_v, arm_neon_vminu, arm_neon_vmins, Add1ArgType | UnsignedAlts), 3119 NEONMAP0(vmovl_v), 3120 NEONMAP0(vmovn_v), 3121 NEONMAP1(vmul_v, arm_neon_vmulp, Add1ArgType), 3122 NEONMAP0(vmull_v), 3123 NEONMAP1(vmulq_v, arm_neon_vmulp, Add1ArgType), 3124 NEONMAP2(vpadal_v, arm_neon_vpadalu, arm_neon_vpadals, UnsignedAlts), 3125 NEONMAP2(vpadalq_v, arm_neon_vpadalu, arm_neon_vpadals, UnsignedAlts), 3126 NEONMAP1(vpadd_v, arm_neon_vpadd, Add1ArgType), 3127 NEONMAP2(vpaddl_v, arm_neon_vpaddlu, arm_neon_vpaddls, UnsignedAlts), 3128 NEONMAP2(vpaddlq_v, arm_neon_vpaddlu, arm_neon_vpaddls, UnsignedAlts), 3129 NEONMAP1(vpaddq_v, arm_neon_vpadd, Add1ArgType), 3130 NEONMAP2(vpmax_v, arm_neon_vpmaxu, arm_neon_vpmaxs, Add1ArgType | UnsignedAlts), 3131 NEONMAP2(vpmin_v, arm_neon_vpminu, arm_neon_vpmins, Add1ArgType | UnsignedAlts), 3132 NEONMAP1(vqabs_v, arm_neon_vqabs, Add1ArgType), 3133 NEONMAP1(vqabsq_v, arm_neon_vqabs, Add1ArgType), 3134 NEONMAP2(vqadd_v, arm_neon_vqaddu, arm_neon_vqadds, Add1ArgType | UnsignedAlts), 3135 NEONMAP2(vqaddq_v, arm_neon_vqaddu, arm_neon_vqadds, Add1ArgType | UnsignedAlts), 3136 NEONMAP2(vqdmlal_v, arm_neon_vqdmull, arm_neon_vqadds, 0), 3137 NEONMAP2(vqdmlsl_v, arm_neon_vqdmull, arm_neon_vqsubs, 0), 3138 NEONMAP1(vqdmulh_v, arm_neon_vqdmulh, Add1ArgType), 3139 NEONMAP1(vqdmulhq_v, arm_neon_vqdmulh, Add1ArgType), 3140 NEONMAP1(vqdmull_v, arm_neon_vqdmull, Add1ArgType), 3141 NEONMAP2(vqmovn_v, arm_neon_vqmovnu, arm_neon_vqmovns, Add1ArgType | UnsignedAlts), 3142 NEONMAP1(vqmovun_v, arm_neon_vqmovnsu, Add1ArgType), 3143 NEONMAP1(vqneg_v, arm_neon_vqneg, Add1ArgType), 3144 NEONMAP1(vqnegq_v, arm_neon_vqneg, Add1ArgType), 3145 NEONMAP1(vqrdmulh_v, arm_neon_vqrdmulh, Add1ArgType), 3146 NEONMAP1(vqrdmulhq_v, arm_neon_vqrdmulh, Add1ArgType), 3147 NEONMAP2(vqrshl_v, arm_neon_vqrshiftu, arm_neon_vqrshifts, Add1ArgType | UnsignedAlts), 3148 NEONMAP2(vqrshlq_v, arm_neon_vqrshiftu, arm_neon_vqrshifts, Add1ArgType | UnsignedAlts), 3149 NEONMAP2(vqshl_n_v, arm_neon_vqshiftu, arm_neon_vqshifts, UnsignedAlts), 3150 NEONMAP2(vqshl_v, arm_neon_vqshiftu, arm_neon_vqshifts, Add1ArgType | UnsignedAlts), 3151 NEONMAP2(vqshlq_n_v, arm_neon_vqshiftu, arm_neon_vqshifts, UnsignedAlts), 3152 NEONMAP2(vqshlq_v, arm_neon_vqshiftu, arm_neon_vqshifts, Add1ArgType | UnsignedAlts), 3153 NEONMAP1(vqshlu_n_v, arm_neon_vqshiftsu, 0), 3154 NEONMAP1(vqshluq_n_v, arm_neon_vqshiftsu, 0), 3155 NEONMAP2(vqsub_v, arm_neon_vqsubu, arm_neon_vqsubs, Add1ArgType | UnsignedAlts), 3156 NEONMAP2(vqsubq_v, arm_neon_vqsubu, arm_neon_vqsubs, Add1ArgType | UnsignedAlts), 3157 NEONMAP1(vraddhn_v, arm_neon_vraddhn, Add1ArgType), 3158 NEONMAP2(vrecpe_v, arm_neon_vrecpe, arm_neon_vrecpe, 0), 3159 NEONMAP2(vrecpeq_v, arm_neon_vrecpe, arm_neon_vrecpe, 0), 3160 NEONMAP1(vrecps_v, arm_neon_vrecps, Add1ArgType), 3161 NEONMAP1(vrecpsq_v, arm_neon_vrecps, Add1ArgType), 3162 NEONMAP2(vrhadd_v, arm_neon_vrhaddu, arm_neon_vrhadds, Add1ArgType | UnsignedAlts), 3163 NEONMAP2(vrhaddq_v, arm_neon_vrhaddu, arm_neon_vrhadds, Add1ArgType | UnsignedAlts), 3164 NEONMAP1(vrnd_v, arm_neon_vrintz, Add1ArgType), 3165 NEONMAP1(vrnda_v, arm_neon_vrinta, Add1ArgType), 3166 NEONMAP1(vrndaq_v, arm_neon_vrinta, Add1ArgType), 3167 NEONMAP1(vrndm_v, arm_neon_vrintm, Add1ArgType), 3168 NEONMAP1(vrndmq_v, arm_neon_vrintm, Add1ArgType), 3169 NEONMAP1(vrndn_v, arm_neon_vrintn, Add1ArgType), 3170 NEONMAP1(vrndnq_v, arm_neon_vrintn, Add1ArgType), 3171 NEONMAP1(vrndp_v, arm_neon_vrintp, Add1ArgType), 3172 NEONMAP1(vrndpq_v, arm_neon_vrintp, Add1ArgType), 3173 NEONMAP1(vrndq_v, arm_neon_vrintz, Add1ArgType), 3174 NEONMAP1(vrndx_v, arm_neon_vrintx, Add1ArgType), 3175 NEONMAP1(vrndxq_v, arm_neon_vrintx, Add1ArgType), 3176 NEONMAP2(vrshl_v, arm_neon_vrshiftu, arm_neon_vrshifts, Add1ArgType | UnsignedAlts), 3177 NEONMAP2(vrshlq_v, arm_neon_vrshiftu, arm_neon_vrshifts, Add1ArgType | UnsignedAlts), 3178 NEONMAP2(vrshr_n_v, arm_neon_vrshiftu, arm_neon_vrshifts, UnsignedAlts), 3179 NEONMAP2(vrshrq_n_v, arm_neon_vrshiftu, arm_neon_vrshifts, UnsignedAlts), 3180 NEONMAP2(vrsqrte_v, arm_neon_vrsqrte, arm_neon_vrsqrte, 0), 3181 NEONMAP2(vrsqrteq_v, arm_neon_vrsqrte, arm_neon_vrsqrte, 0), 3182 NEONMAP1(vrsqrts_v, arm_neon_vrsqrts, Add1ArgType), 3183 NEONMAP1(vrsqrtsq_v, arm_neon_vrsqrts, Add1ArgType), 3184 NEONMAP1(vrsubhn_v, arm_neon_vrsubhn, Add1ArgType), 3185 NEONMAP1(vsha1su0q_v, arm_neon_sha1su0, 0), 3186 NEONMAP1(vsha1su1q_v, arm_neon_sha1su1, 0), 3187 NEONMAP1(vsha256h2q_v, arm_neon_sha256h2, 0), 3188 NEONMAP1(vsha256hq_v, arm_neon_sha256h, 0), 3189 NEONMAP1(vsha256su0q_v, arm_neon_sha256su0, 0), 3190 NEONMAP1(vsha256su1q_v, arm_neon_sha256su1, 0), 3191 NEONMAP0(vshl_n_v), 3192 NEONMAP2(vshl_v, arm_neon_vshiftu, arm_neon_vshifts, Add1ArgType | UnsignedAlts), 3193 NEONMAP0(vshll_n_v), 3194 NEONMAP0(vshlq_n_v), 3195 NEONMAP2(vshlq_v, arm_neon_vshiftu, arm_neon_vshifts, Add1ArgType | UnsignedAlts), 3196 NEONMAP0(vshr_n_v), 3197 NEONMAP0(vshrn_n_v), 3198 NEONMAP0(vshrq_n_v), 3199 NEONMAP1(vst1_v, arm_neon_vst1, 0), 3200 NEONMAP1(vst1q_v, arm_neon_vst1, 0), 3201 NEONMAP1(vst2_lane_v, arm_neon_vst2lane, 0), 3202 NEONMAP1(vst2_v, arm_neon_vst2, 0), 3203 NEONMAP1(vst2q_lane_v, arm_neon_vst2lane, 0), 3204 NEONMAP1(vst2q_v, arm_neon_vst2, 0), 3205 NEONMAP1(vst3_lane_v, arm_neon_vst3lane, 0), 3206 NEONMAP1(vst3_v, arm_neon_vst3, 0), 3207 NEONMAP1(vst3q_lane_v, arm_neon_vst3lane, 0), 3208 NEONMAP1(vst3q_v, arm_neon_vst3, 0), 3209 NEONMAP1(vst4_lane_v, arm_neon_vst4lane, 0), 3210 NEONMAP1(vst4_v, arm_neon_vst4, 0), 3211 NEONMAP1(vst4q_lane_v, arm_neon_vst4lane, 0), 3212 NEONMAP1(vst4q_v, arm_neon_vst4, 0), 3213 NEONMAP0(vsubhn_v), 3214 NEONMAP0(vtrn_v), 3215 NEONMAP0(vtrnq_v), 3216 NEONMAP0(vtst_v), 3217 NEONMAP0(vtstq_v), 3218 NEONMAP0(vuzp_v), 3219 NEONMAP0(vuzpq_v), 3220 NEONMAP0(vzip_v), 3221 NEONMAP0(vzipq_v) 3222 }; 3223 3224 static const NeonIntrinsicInfo AArch64SIMDIntrinsicMap[] = { 3225 NEONMAP1(vabs_v, aarch64_neon_abs, 0), 3226 NEONMAP1(vabsq_v, aarch64_neon_abs, 0), 3227 NEONMAP0(vaddhn_v), 3228 NEONMAP1(vaesdq_v, aarch64_crypto_aesd, 0), 3229 NEONMAP1(vaeseq_v, aarch64_crypto_aese, 0), 3230 NEONMAP1(vaesimcq_v, aarch64_crypto_aesimc, 0), 3231 NEONMAP1(vaesmcq_v, aarch64_crypto_aesmc, 0), 3232 NEONMAP1(vcage_v, aarch64_neon_facge, 0), 3233 NEONMAP1(vcageq_v, aarch64_neon_facge, 0), 3234 NEONMAP1(vcagt_v, aarch64_neon_facgt, 0), 3235 NEONMAP1(vcagtq_v, aarch64_neon_facgt, 0), 3236 NEONMAP1(vcale_v, aarch64_neon_facge, 0), 3237 NEONMAP1(vcaleq_v, aarch64_neon_facge, 0), 3238 NEONMAP1(vcalt_v, aarch64_neon_facgt, 0), 3239 NEONMAP1(vcaltq_v, aarch64_neon_facgt, 0), 3240 NEONMAP1(vcls_v, aarch64_neon_cls, Add1ArgType), 3241 NEONMAP1(vclsq_v, aarch64_neon_cls, Add1ArgType), 3242 NEONMAP1(vclz_v, ctlz, Add1ArgType), 3243 NEONMAP1(vclzq_v, ctlz, Add1ArgType), 3244 NEONMAP1(vcnt_v, ctpop, Add1ArgType), 3245 NEONMAP1(vcntq_v, ctpop, Add1ArgType), 3246 NEONMAP1(vcvt_f16_f32, aarch64_neon_vcvtfp2hf, 0), 3247 NEONMAP1(vcvt_f32_f16, aarch64_neon_vcvthf2fp, 0), 3248 NEONMAP0(vcvt_f32_v), 3249 NEONMAP2(vcvt_n_f32_v, aarch64_neon_vcvtfxu2fp, aarch64_neon_vcvtfxs2fp, 0), 3250 NEONMAP2(vcvt_n_f64_v, aarch64_neon_vcvtfxu2fp, aarch64_neon_vcvtfxs2fp, 0), 3251 NEONMAP1(vcvt_n_s32_v, aarch64_neon_vcvtfp2fxs, 0), 3252 NEONMAP1(vcvt_n_s64_v, aarch64_neon_vcvtfp2fxs, 0), 3253 NEONMAP1(vcvt_n_u32_v, aarch64_neon_vcvtfp2fxu, 0), 3254 NEONMAP1(vcvt_n_u64_v, aarch64_neon_vcvtfp2fxu, 0), 3255 NEONMAP0(vcvtq_f32_v), 3256 NEONMAP2(vcvtq_n_f32_v, aarch64_neon_vcvtfxu2fp, aarch64_neon_vcvtfxs2fp, 0), 3257 NEONMAP2(vcvtq_n_f64_v, aarch64_neon_vcvtfxu2fp, aarch64_neon_vcvtfxs2fp, 0), 3258 NEONMAP1(vcvtq_n_s32_v, aarch64_neon_vcvtfp2fxs, 0), 3259 NEONMAP1(vcvtq_n_s64_v, aarch64_neon_vcvtfp2fxs, 0), 3260 NEONMAP1(vcvtq_n_u32_v, aarch64_neon_vcvtfp2fxu, 0), 3261 NEONMAP1(vcvtq_n_u64_v, aarch64_neon_vcvtfp2fxu, 0), 3262 NEONMAP1(vcvtx_f32_v, aarch64_neon_fcvtxn, AddRetType | Add1ArgType), 3263 NEONMAP0(vext_v), 3264 NEONMAP0(vextq_v), 3265 NEONMAP0(vfma_v), 3266 NEONMAP0(vfmaq_v), 3267 NEONMAP2(vhadd_v, aarch64_neon_uhadd, aarch64_neon_shadd, Add1ArgType | UnsignedAlts), 3268 NEONMAP2(vhaddq_v, aarch64_neon_uhadd, aarch64_neon_shadd, Add1ArgType | UnsignedAlts), 3269 NEONMAP2(vhsub_v, aarch64_neon_uhsub, aarch64_neon_shsub, Add1ArgType | UnsignedAlts), 3270 NEONMAP2(vhsubq_v, aarch64_neon_uhsub, aarch64_neon_shsub, Add1ArgType | UnsignedAlts), 3271 NEONMAP0(vmovl_v), 3272 NEONMAP0(vmovn_v), 3273 NEONMAP1(vmul_v, aarch64_neon_pmul, Add1ArgType), 3274 NEONMAP1(vmulq_v, aarch64_neon_pmul, Add1ArgType), 3275 NEONMAP1(vpadd_v, aarch64_neon_addp, Add1ArgType), 3276 NEONMAP2(vpaddl_v, aarch64_neon_uaddlp, aarch64_neon_saddlp, UnsignedAlts), 3277 NEONMAP2(vpaddlq_v, aarch64_neon_uaddlp, aarch64_neon_saddlp, UnsignedAlts), 3278 NEONMAP1(vpaddq_v, aarch64_neon_addp, Add1ArgType), 3279 NEONMAP1(vqabs_v, aarch64_neon_sqabs, Add1ArgType), 3280 NEONMAP1(vqabsq_v, aarch64_neon_sqabs, Add1ArgType), 3281 NEONMAP2(vqadd_v, aarch64_neon_uqadd, aarch64_neon_sqadd, Add1ArgType | UnsignedAlts), 3282 NEONMAP2(vqaddq_v, aarch64_neon_uqadd, aarch64_neon_sqadd, Add1ArgType | UnsignedAlts), 3283 NEONMAP2(vqdmlal_v, aarch64_neon_sqdmull, aarch64_neon_sqadd, 0), 3284 NEONMAP2(vqdmlsl_v, aarch64_neon_sqdmull, aarch64_neon_sqsub, 0), 3285 NEONMAP1(vqdmulh_v, aarch64_neon_sqdmulh, Add1ArgType), 3286 NEONMAP1(vqdmulhq_v, aarch64_neon_sqdmulh, Add1ArgType), 3287 NEONMAP1(vqdmull_v, aarch64_neon_sqdmull, Add1ArgType), 3288 NEONMAP2(vqmovn_v, aarch64_neon_uqxtn, aarch64_neon_sqxtn, Add1ArgType | UnsignedAlts), 3289 NEONMAP1(vqmovun_v, aarch64_neon_sqxtun, Add1ArgType), 3290 NEONMAP1(vqneg_v, aarch64_neon_sqneg, Add1ArgType), 3291 NEONMAP1(vqnegq_v, aarch64_neon_sqneg, Add1ArgType), 3292 NEONMAP1(vqrdmulh_v, aarch64_neon_sqrdmulh, Add1ArgType), 3293 NEONMAP1(vqrdmulhq_v, aarch64_neon_sqrdmulh, Add1ArgType), 3294 NEONMAP2(vqrshl_v, aarch64_neon_uqrshl, aarch64_neon_sqrshl, Add1ArgType | UnsignedAlts), 3295 NEONMAP2(vqrshlq_v, aarch64_neon_uqrshl, aarch64_neon_sqrshl, Add1ArgType | UnsignedAlts), 3296 NEONMAP2(vqshl_n_v, aarch64_neon_uqshl, aarch64_neon_sqshl, UnsignedAlts), 3297 NEONMAP2(vqshl_v, aarch64_neon_uqshl, aarch64_neon_sqshl, Add1ArgType | UnsignedAlts), 3298 NEONMAP2(vqshlq_n_v, aarch64_neon_uqshl, aarch64_neon_sqshl,UnsignedAlts), 3299 NEONMAP2(vqshlq_v, aarch64_neon_uqshl, aarch64_neon_sqshl, Add1ArgType | UnsignedAlts), 3300 NEONMAP1(vqshlu_n_v, aarch64_neon_sqshlu, 0), 3301 NEONMAP1(vqshluq_n_v, aarch64_neon_sqshlu, 0), 3302 NEONMAP2(vqsub_v, aarch64_neon_uqsub, aarch64_neon_sqsub, Add1ArgType | UnsignedAlts), 3303 NEONMAP2(vqsubq_v, aarch64_neon_uqsub, aarch64_neon_sqsub, Add1ArgType | UnsignedAlts), 3304 NEONMAP1(vraddhn_v, aarch64_neon_raddhn, Add1ArgType), 3305 NEONMAP2(vrecpe_v, aarch64_neon_frecpe, aarch64_neon_urecpe, 0), 3306 NEONMAP2(vrecpeq_v, aarch64_neon_frecpe, aarch64_neon_urecpe, 0), 3307 NEONMAP1(vrecps_v, aarch64_neon_frecps, Add1ArgType), 3308 NEONMAP1(vrecpsq_v, aarch64_neon_frecps, Add1ArgType), 3309 NEONMAP2(vrhadd_v, aarch64_neon_urhadd, aarch64_neon_srhadd, Add1ArgType | UnsignedAlts), 3310 NEONMAP2(vrhaddq_v, aarch64_neon_urhadd, aarch64_neon_srhadd, Add1ArgType | UnsignedAlts), 3311 NEONMAP2(vrshl_v, aarch64_neon_urshl, aarch64_neon_srshl, Add1ArgType | UnsignedAlts), 3312 NEONMAP2(vrshlq_v, aarch64_neon_urshl, aarch64_neon_srshl, Add1ArgType | UnsignedAlts), 3313 NEONMAP2(vrshr_n_v, aarch64_neon_urshl, aarch64_neon_srshl, UnsignedAlts), 3314 NEONMAP2(vrshrq_n_v, aarch64_neon_urshl, aarch64_neon_srshl, UnsignedAlts), 3315 NEONMAP2(vrsqrte_v, aarch64_neon_frsqrte, aarch64_neon_ursqrte, 0), 3316 NEONMAP2(vrsqrteq_v, aarch64_neon_frsqrte, aarch64_neon_ursqrte, 0), 3317 NEONMAP1(vrsqrts_v, aarch64_neon_frsqrts, Add1ArgType), 3318 NEONMAP1(vrsqrtsq_v, aarch64_neon_frsqrts, Add1ArgType), 3319 NEONMAP1(vrsubhn_v, aarch64_neon_rsubhn, Add1ArgType), 3320 NEONMAP1(vsha1su0q_v, aarch64_crypto_sha1su0, 0), 3321 NEONMAP1(vsha1su1q_v, aarch64_crypto_sha1su1, 0), 3322 NEONMAP1(vsha256h2q_v, aarch64_crypto_sha256h2, 0), 3323 NEONMAP1(vsha256hq_v, aarch64_crypto_sha256h, 0), 3324 NEONMAP1(vsha256su0q_v, aarch64_crypto_sha256su0, 0), 3325 NEONMAP1(vsha256su1q_v, aarch64_crypto_sha256su1, 0), 3326 NEONMAP0(vshl_n_v), 3327 NEONMAP2(vshl_v, aarch64_neon_ushl, aarch64_neon_sshl, Add1ArgType | UnsignedAlts), 3328 NEONMAP0(vshll_n_v), 3329 NEONMAP0(vshlq_n_v), 3330 NEONMAP2(vshlq_v, aarch64_neon_ushl, aarch64_neon_sshl, Add1ArgType | UnsignedAlts), 3331 NEONMAP0(vshr_n_v), 3332 NEONMAP0(vshrn_n_v), 3333 NEONMAP0(vshrq_n_v), 3334 NEONMAP0(vsubhn_v), 3335 NEONMAP0(vtst_v), 3336 NEONMAP0(vtstq_v), 3337 }; 3338 3339 static const NeonIntrinsicInfo AArch64SISDIntrinsicMap[] = { 3340 NEONMAP1(vabdd_f64, aarch64_sisd_fabd, Add1ArgType), 3341 NEONMAP1(vabds_f32, aarch64_sisd_fabd, Add1ArgType), 3342 NEONMAP1(vabsd_s64, aarch64_neon_abs, Add1ArgType), 3343 NEONMAP1(vaddlv_s32, aarch64_neon_saddlv, AddRetType | Add1ArgType), 3344 NEONMAP1(vaddlv_u32, aarch64_neon_uaddlv, AddRetType | Add1ArgType), 3345 NEONMAP1(vaddlvq_s32, aarch64_neon_saddlv, AddRetType | Add1ArgType), 3346 NEONMAP1(vaddlvq_u32, aarch64_neon_uaddlv, AddRetType | Add1ArgType), 3347 NEONMAP1(vaddv_f32, aarch64_neon_faddv, AddRetType | Add1ArgType), 3348 NEONMAP1(vaddv_s32, aarch64_neon_saddv, AddRetType | Add1ArgType), 3349 NEONMAP1(vaddv_u32, aarch64_neon_uaddv, AddRetType | Add1ArgType), 3350 NEONMAP1(vaddvq_f32, aarch64_neon_faddv, AddRetType | Add1ArgType), 3351 NEONMAP1(vaddvq_f64, aarch64_neon_faddv, AddRetType | Add1ArgType), 3352 NEONMAP1(vaddvq_s32, aarch64_neon_saddv, AddRetType | Add1ArgType), 3353 NEONMAP1(vaddvq_s64, aarch64_neon_saddv, AddRetType | Add1ArgType), 3354 NEONMAP1(vaddvq_u32, aarch64_neon_uaddv, AddRetType | Add1ArgType), 3355 NEONMAP1(vaddvq_u64, aarch64_neon_uaddv, AddRetType | Add1ArgType), 3356 NEONMAP1(vcaged_f64, aarch64_neon_facge, AddRetType | Add1ArgType), 3357 NEONMAP1(vcages_f32, aarch64_neon_facge, AddRetType | Add1ArgType), 3358 NEONMAP1(vcagtd_f64, aarch64_neon_facgt, AddRetType | Add1ArgType), 3359 NEONMAP1(vcagts_f32, aarch64_neon_facgt, AddRetType | Add1ArgType), 3360 NEONMAP1(vcaled_f64, aarch64_neon_facge, AddRetType | Add1ArgType), 3361 NEONMAP1(vcales_f32, aarch64_neon_facge, AddRetType | Add1ArgType), 3362 NEONMAP1(vcaltd_f64, aarch64_neon_facgt, AddRetType | Add1ArgType), 3363 NEONMAP1(vcalts_f32, aarch64_neon_facgt, AddRetType | Add1ArgType), 3364 NEONMAP1(vcvtad_s64_f64, aarch64_neon_fcvtas, AddRetType | Add1ArgType), 3365 NEONMAP1(vcvtad_u64_f64, aarch64_neon_fcvtau, AddRetType | Add1ArgType), 3366 NEONMAP1(vcvtas_s32_f32, aarch64_neon_fcvtas, AddRetType | Add1ArgType), 3367 NEONMAP1(vcvtas_u32_f32, aarch64_neon_fcvtau, AddRetType | Add1ArgType), 3368 NEONMAP1(vcvtd_n_f64_s64, aarch64_neon_vcvtfxs2fp, AddRetType | Add1ArgType), 3369 NEONMAP1(vcvtd_n_f64_u64, aarch64_neon_vcvtfxu2fp, AddRetType | Add1ArgType), 3370 NEONMAP1(vcvtd_n_s64_f64, aarch64_neon_vcvtfp2fxs, AddRetType | Add1ArgType), 3371 NEONMAP1(vcvtd_n_u64_f64, aarch64_neon_vcvtfp2fxu, AddRetType | Add1ArgType), 3372 NEONMAP1(vcvtmd_s64_f64, aarch64_neon_fcvtms, AddRetType | Add1ArgType), 3373 NEONMAP1(vcvtmd_u64_f64, aarch64_neon_fcvtmu, AddRetType | Add1ArgType), 3374 NEONMAP1(vcvtms_s32_f32, aarch64_neon_fcvtms, AddRetType | Add1ArgType), 3375 NEONMAP1(vcvtms_u32_f32, aarch64_neon_fcvtmu, AddRetType | Add1ArgType), 3376 NEONMAP1(vcvtnd_s64_f64, aarch64_neon_fcvtns, AddRetType | Add1ArgType), 3377 NEONMAP1(vcvtnd_u64_f64, aarch64_neon_fcvtnu, AddRetType | Add1ArgType), 3378 NEONMAP1(vcvtns_s32_f32, aarch64_neon_fcvtns, AddRetType | Add1ArgType), 3379 NEONMAP1(vcvtns_u32_f32, aarch64_neon_fcvtnu, AddRetType | Add1ArgType), 3380 NEONMAP1(vcvtpd_s64_f64, aarch64_neon_fcvtps, AddRetType | Add1ArgType), 3381 NEONMAP1(vcvtpd_u64_f64, aarch64_neon_fcvtpu, AddRetType | Add1ArgType), 3382 NEONMAP1(vcvtps_s32_f32, aarch64_neon_fcvtps, AddRetType | Add1ArgType), 3383 NEONMAP1(vcvtps_u32_f32, aarch64_neon_fcvtpu, AddRetType | Add1ArgType), 3384 NEONMAP1(vcvts_n_f32_s32, aarch64_neon_vcvtfxs2fp, AddRetType | Add1ArgType), 3385 NEONMAP1(vcvts_n_f32_u32, aarch64_neon_vcvtfxu2fp, AddRetType | Add1ArgType), 3386 NEONMAP1(vcvts_n_s32_f32, aarch64_neon_vcvtfp2fxs, AddRetType | Add1ArgType), 3387 NEONMAP1(vcvts_n_u32_f32, aarch64_neon_vcvtfp2fxu, AddRetType | Add1ArgType), 3388 NEONMAP1(vcvtxd_f32_f64, aarch64_sisd_fcvtxn, 0), 3389 NEONMAP1(vmaxnmv_f32, aarch64_neon_fmaxnmv, AddRetType | Add1ArgType), 3390 NEONMAP1(vmaxnmvq_f32, aarch64_neon_fmaxnmv, AddRetType | Add1ArgType), 3391 NEONMAP1(vmaxnmvq_f64, aarch64_neon_fmaxnmv, AddRetType | Add1ArgType), 3392 NEONMAP1(vmaxv_f32, aarch64_neon_fmaxv, AddRetType | Add1ArgType), 3393 NEONMAP1(vmaxv_s32, aarch64_neon_smaxv, AddRetType | Add1ArgType), 3394 NEONMAP1(vmaxv_u32, aarch64_neon_umaxv, AddRetType | Add1ArgType), 3395 NEONMAP1(vmaxvq_f32, aarch64_neon_fmaxv, AddRetType | Add1ArgType), 3396 NEONMAP1(vmaxvq_f64, aarch64_neon_fmaxv, AddRetType | Add1ArgType), 3397 NEONMAP1(vmaxvq_s32, aarch64_neon_smaxv, AddRetType | Add1ArgType), 3398 NEONMAP1(vmaxvq_u32, aarch64_neon_umaxv, AddRetType | Add1ArgType), 3399 NEONMAP1(vminnmv_f32, aarch64_neon_fminnmv, AddRetType | Add1ArgType), 3400 NEONMAP1(vminnmvq_f32, aarch64_neon_fminnmv, AddRetType | Add1ArgType), 3401 NEONMAP1(vminnmvq_f64, aarch64_neon_fminnmv, AddRetType | Add1ArgType), 3402 NEONMAP1(vminv_f32, aarch64_neon_fminv, AddRetType | Add1ArgType), 3403 NEONMAP1(vminv_s32, aarch64_neon_sminv, AddRetType | Add1ArgType), 3404 NEONMAP1(vminv_u32, aarch64_neon_uminv, AddRetType | Add1ArgType), 3405 NEONMAP1(vminvq_f32, aarch64_neon_fminv, AddRetType | Add1ArgType), 3406 NEONMAP1(vminvq_f64, aarch64_neon_fminv, AddRetType | Add1ArgType), 3407 NEONMAP1(vminvq_s32, aarch64_neon_sminv, AddRetType | Add1ArgType), 3408 NEONMAP1(vminvq_u32, aarch64_neon_uminv, AddRetType | Add1ArgType), 3409 NEONMAP1(vmull_p64, aarch64_neon_pmull64, 0), 3410 NEONMAP1(vmulxd_f64, aarch64_neon_fmulx, Add1ArgType), 3411 NEONMAP1(vmulxs_f32, aarch64_neon_fmulx, Add1ArgType), 3412 NEONMAP1(vpaddd_s64, aarch64_neon_uaddv, AddRetType | Add1ArgType), 3413 NEONMAP1(vpaddd_u64, aarch64_neon_uaddv, AddRetType | Add1ArgType), 3414 NEONMAP1(vpmaxnmqd_f64, aarch64_neon_fmaxnmv, AddRetType | Add1ArgType), 3415 NEONMAP1(vpmaxnms_f32, aarch64_neon_fmaxnmv, AddRetType | Add1ArgType), 3416 NEONMAP1(vpmaxqd_f64, aarch64_neon_fmaxv, AddRetType | Add1ArgType), 3417 NEONMAP1(vpmaxs_f32, aarch64_neon_fmaxv, AddRetType | Add1ArgType), 3418 NEONMAP1(vpminnmqd_f64, aarch64_neon_fminnmv, AddRetType | Add1ArgType), 3419 NEONMAP1(vpminnms_f32, aarch64_neon_fminnmv, AddRetType | Add1ArgType), 3420 NEONMAP1(vpminqd_f64, aarch64_neon_fminv, AddRetType | Add1ArgType), 3421 NEONMAP1(vpmins_f32, aarch64_neon_fminv, AddRetType | Add1ArgType), 3422 NEONMAP1(vqabsb_s8, aarch64_neon_sqabs, Vectorize1ArgType | Use64BitVectors), 3423 NEONMAP1(vqabsd_s64, aarch64_neon_sqabs, Add1ArgType), 3424 NEONMAP1(vqabsh_s16, aarch64_neon_sqabs, Vectorize1ArgType | Use64BitVectors), 3425 NEONMAP1(vqabss_s32, aarch64_neon_sqabs, Add1ArgType), 3426 NEONMAP1(vqaddb_s8, aarch64_neon_sqadd, Vectorize1ArgType | Use64BitVectors), 3427 NEONMAP1(vqaddb_u8, aarch64_neon_uqadd, Vectorize1ArgType | Use64BitVectors), 3428 NEONMAP1(vqaddd_s64, aarch64_neon_sqadd, Add1ArgType), 3429 NEONMAP1(vqaddd_u64, aarch64_neon_uqadd, Add1ArgType), 3430 NEONMAP1(vqaddh_s16, aarch64_neon_sqadd, Vectorize1ArgType | Use64BitVectors), 3431 NEONMAP1(vqaddh_u16, aarch64_neon_uqadd, Vectorize1ArgType | Use64BitVectors), 3432 NEONMAP1(vqadds_s32, aarch64_neon_sqadd, Add1ArgType), 3433 NEONMAP1(vqadds_u32, aarch64_neon_uqadd, Add1ArgType), 3434 NEONMAP1(vqdmulhh_s16, aarch64_neon_sqdmulh, Vectorize1ArgType | Use64BitVectors), 3435 NEONMAP1(vqdmulhs_s32, aarch64_neon_sqdmulh, Add1ArgType), 3436 NEONMAP1(vqdmullh_s16, aarch64_neon_sqdmull, VectorRet | Use128BitVectors), 3437 NEONMAP1(vqdmulls_s32, aarch64_neon_sqdmulls_scalar, 0), 3438 NEONMAP1(vqmovnd_s64, aarch64_neon_scalar_sqxtn, AddRetType | Add1ArgType), 3439 NEONMAP1(vqmovnd_u64, aarch64_neon_scalar_uqxtn, AddRetType | Add1ArgType), 3440 NEONMAP1(vqmovnh_s16, aarch64_neon_sqxtn, VectorRet | Use64BitVectors), 3441 NEONMAP1(vqmovnh_u16, aarch64_neon_uqxtn, VectorRet | Use64BitVectors), 3442 NEONMAP1(vqmovns_s32, aarch64_neon_sqxtn, VectorRet | Use64BitVectors), 3443 NEONMAP1(vqmovns_u32, aarch64_neon_uqxtn, VectorRet | Use64BitVectors), 3444 NEONMAP1(vqmovund_s64, aarch64_neon_scalar_sqxtun, AddRetType | Add1ArgType), 3445 NEONMAP1(vqmovunh_s16, aarch64_neon_sqxtun, VectorRet | Use64BitVectors), 3446 NEONMAP1(vqmovuns_s32, aarch64_neon_sqxtun, VectorRet | Use64BitVectors), 3447 NEONMAP1(vqnegb_s8, aarch64_neon_sqneg, Vectorize1ArgType | Use64BitVectors), 3448 NEONMAP1(vqnegd_s64, aarch64_neon_sqneg, Add1ArgType), 3449 NEONMAP1(vqnegh_s16, aarch64_neon_sqneg, Vectorize1ArgType | Use64BitVectors), 3450 NEONMAP1(vqnegs_s32, aarch64_neon_sqneg, Add1ArgType), 3451 NEONMAP1(vqrdmulhh_s16, aarch64_neon_sqrdmulh, Vectorize1ArgType | Use64BitVectors), 3452 NEONMAP1(vqrdmulhs_s32, aarch64_neon_sqrdmulh, Add1ArgType), 3453 NEONMAP1(vqrshlb_s8, aarch64_neon_sqrshl, Vectorize1ArgType | Use64BitVectors), 3454 NEONMAP1(vqrshlb_u8, aarch64_neon_uqrshl, Vectorize1ArgType | Use64BitVectors), 3455 NEONMAP1(vqrshld_s64, aarch64_neon_sqrshl, Add1ArgType), 3456 NEONMAP1(vqrshld_u64, aarch64_neon_uqrshl, Add1ArgType), 3457 NEONMAP1(vqrshlh_s16, aarch64_neon_sqrshl, Vectorize1ArgType | Use64BitVectors), 3458 NEONMAP1(vqrshlh_u16, aarch64_neon_uqrshl, Vectorize1ArgType | Use64BitVectors), 3459 NEONMAP1(vqrshls_s32, aarch64_neon_sqrshl, Add1ArgType), 3460 NEONMAP1(vqrshls_u32, aarch64_neon_uqrshl, Add1ArgType), 3461 NEONMAP1(vqrshrnd_n_s64, aarch64_neon_sqrshrn, AddRetType), 3462 NEONMAP1(vqrshrnd_n_u64, aarch64_neon_uqrshrn, AddRetType), 3463 NEONMAP1(vqrshrnh_n_s16, aarch64_neon_sqrshrn, VectorRet | Use64BitVectors), 3464 NEONMAP1(vqrshrnh_n_u16, aarch64_neon_uqrshrn, VectorRet | Use64BitVectors), 3465 NEONMAP1(vqrshrns_n_s32, aarch64_neon_sqrshrn, VectorRet | Use64BitVectors), 3466 NEONMAP1(vqrshrns_n_u32, aarch64_neon_uqrshrn, VectorRet | Use64BitVectors), 3467 NEONMAP1(vqrshrund_n_s64, aarch64_neon_sqrshrun, AddRetType), 3468 NEONMAP1(vqrshrunh_n_s16, aarch64_neon_sqrshrun, VectorRet | Use64BitVectors), 3469 NEONMAP1(vqrshruns_n_s32, aarch64_neon_sqrshrun, VectorRet | Use64BitVectors), 3470 NEONMAP1(vqshlb_n_s8, aarch64_neon_sqshl, Vectorize1ArgType | Use64BitVectors), 3471 NEONMAP1(vqshlb_n_u8, aarch64_neon_uqshl, Vectorize1ArgType | Use64BitVectors), 3472 NEONMAP1(vqshlb_s8, aarch64_neon_sqshl, Vectorize1ArgType | Use64BitVectors), 3473 NEONMAP1(vqshlb_u8, aarch64_neon_uqshl, Vectorize1ArgType | Use64BitVectors), 3474 NEONMAP1(vqshld_s64, aarch64_neon_sqshl, Add1ArgType), 3475 NEONMAP1(vqshld_u64, aarch64_neon_uqshl, Add1ArgType), 3476 NEONMAP1(vqshlh_n_s16, aarch64_neon_sqshl, Vectorize1ArgType | Use64BitVectors), 3477 NEONMAP1(vqshlh_n_u16, aarch64_neon_uqshl, Vectorize1ArgType | Use64BitVectors), 3478 NEONMAP1(vqshlh_s16, aarch64_neon_sqshl, Vectorize1ArgType | Use64BitVectors), 3479 NEONMAP1(vqshlh_u16, aarch64_neon_uqshl, Vectorize1ArgType | Use64BitVectors), 3480 NEONMAP1(vqshls_n_s32, aarch64_neon_sqshl, Add1ArgType), 3481 NEONMAP1(vqshls_n_u32, aarch64_neon_uqshl, Add1ArgType), 3482 NEONMAP1(vqshls_s32, aarch64_neon_sqshl, Add1ArgType), 3483 NEONMAP1(vqshls_u32, aarch64_neon_uqshl, Add1ArgType), 3484 NEONMAP1(vqshlub_n_s8, aarch64_neon_sqshlu, Vectorize1ArgType | Use64BitVectors), 3485 NEONMAP1(vqshluh_n_s16, aarch64_neon_sqshlu, Vectorize1ArgType | Use64BitVectors), 3486 NEONMAP1(vqshlus_n_s32, aarch64_neon_sqshlu, Add1ArgType), 3487 NEONMAP1(vqshrnd_n_s64, aarch64_neon_sqshrn, AddRetType), 3488 NEONMAP1(vqshrnd_n_u64, aarch64_neon_uqshrn, AddRetType), 3489 NEONMAP1(vqshrnh_n_s16, aarch64_neon_sqshrn, VectorRet | Use64BitVectors), 3490 NEONMAP1(vqshrnh_n_u16, aarch64_neon_uqshrn, VectorRet | Use64BitVectors), 3491 NEONMAP1(vqshrns_n_s32, aarch64_neon_sqshrn, VectorRet | Use64BitVectors), 3492 NEONMAP1(vqshrns_n_u32, aarch64_neon_uqshrn, VectorRet | Use64BitVectors), 3493 NEONMAP1(vqshrund_n_s64, aarch64_neon_sqshrun, AddRetType), 3494 NEONMAP1(vqshrunh_n_s16, aarch64_neon_sqshrun, VectorRet | Use64BitVectors), 3495 NEONMAP1(vqshruns_n_s32, aarch64_neon_sqshrun, VectorRet | Use64BitVectors), 3496 NEONMAP1(vqsubb_s8, aarch64_neon_sqsub, Vectorize1ArgType | Use64BitVectors), 3497 NEONMAP1(vqsubb_u8, aarch64_neon_uqsub, Vectorize1ArgType | Use64BitVectors), 3498 NEONMAP1(vqsubd_s64, aarch64_neon_sqsub, Add1ArgType), 3499 NEONMAP1(vqsubd_u64, aarch64_neon_uqsub, Add1ArgType), 3500 NEONMAP1(vqsubh_s16, aarch64_neon_sqsub, Vectorize1ArgType | Use64BitVectors), 3501 NEONMAP1(vqsubh_u16, aarch64_neon_uqsub, Vectorize1ArgType | Use64BitVectors), 3502 NEONMAP1(vqsubs_s32, aarch64_neon_sqsub, Add1ArgType), 3503 NEONMAP1(vqsubs_u32, aarch64_neon_uqsub, Add1ArgType), 3504 NEONMAP1(vrecped_f64, aarch64_neon_frecpe, Add1ArgType), 3505 NEONMAP1(vrecpes_f32, aarch64_neon_frecpe, Add1ArgType), 3506 NEONMAP1(vrecpxd_f64, aarch64_neon_frecpx, Add1ArgType), 3507 NEONMAP1(vrecpxs_f32, aarch64_neon_frecpx, Add1ArgType), 3508 NEONMAP1(vrshld_s64, aarch64_neon_srshl, Add1ArgType), 3509 NEONMAP1(vrshld_u64, aarch64_neon_urshl, Add1ArgType), 3510 NEONMAP1(vrsqrted_f64, aarch64_neon_frsqrte, Add1ArgType), 3511 NEONMAP1(vrsqrtes_f32, aarch64_neon_frsqrte, Add1ArgType), 3512 NEONMAP1(vrsqrtsd_f64, aarch64_neon_frsqrts, Add1ArgType), 3513 NEONMAP1(vrsqrtss_f32, aarch64_neon_frsqrts, Add1ArgType), 3514 NEONMAP1(vsha1cq_u32, aarch64_crypto_sha1c, 0), 3515 NEONMAP1(vsha1h_u32, aarch64_crypto_sha1h, 0), 3516 NEONMAP1(vsha1mq_u32, aarch64_crypto_sha1m, 0), 3517 NEONMAP1(vsha1pq_u32, aarch64_crypto_sha1p, 0), 3518 NEONMAP1(vshld_s64, aarch64_neon_sshl, Add1ArgType), 3519 NEONMAP1(vshld_u64, aarch64_neon_ushl, Add1ArgType), 3520 NEONMAP1(vslid_n_s64, aarch64_neon_vsli, Vectorize1ArgType), 3521 NEONMAP1(vslid_n_u64, aarch64_neon_vsli, Vectorize1ArgType), 3522 NEONMAP1(vsqaddb_u8, aarch64_neon_usqadd, Vectorize1ArgType | Use64BitVectors), 3523 NEONMAP1(vsqaddd_u64, aarch64_neon_usqadd, Add1ArgType), 3524 NEONMAP1(vsqaddh_u16, aarch64_neon_usqadd, Vectorize1ArgType | Use64BitVectors), 3525 NEONMAP1(vsqadds_u32, aarch64_neon_usqadd, Add1ArgType), 3526 NEONMAP1(vsrid_n_s64, aarch64_neon_vsri, Vectorize1ArgType), 3527 NEONMAP1(vsrid_n_u64, aarch64_neon_vsri, Vectorize1ArgType), 3528 NEONMAP1(vuqaddb_s8, aarch64_neon_suqadd, Vectorize1ArgType | Use64BitVectors), 3529 NEONMAP1(vuqaddd_s64, aarch64_neon_suqadd, Add1ArgType), 3530 NEONMAP1(vuqaddh_s16, aarch64_neon_suqadd, Vectorize1ArgType | Use64BitVectors), 3531 NEONMAP1(vuqadds_s32, aarch64_neon_suqadd, Add1ArgType), 3532 }; 3533 3534 #undef NEONMAP0 3535 #undef NEONMAP1 3536 #undef NEONMAP2 3537 3538 static bool NEONSIMDIntrinsicsProvenSorted = false; 3539 3540 static bool AArch64SIMDIntrinsicsProvenSorted = false; 3541 static bool AArch64SISDIntrinsicsProvenSorted = false; 3542 3543 3544 static const NeonIntrinsicInfo * 3545 findNeonIntrinsicInMap(ArrayRef<NeonIntrinsicInfo> IntrinsicMap, 3546 unsigned BuiltinID, bool &MapProvenSorted) { 3547 3548 #ifndef NDEBUG 3549 if (!MapProvenSorted) { 3550 assert(std::is_sorted(std::begin(IntrinsicMap), std::end(IntrinsicMap))); 3551 MapProvenSorted = true; 3552 } 3553 #endif 3554 3555 const NeonIntrinsicInfo *Builtin = 3556 std::lower_bound(IntrinsicMap.begin(), IntrinsicMap.end(), BuiltinID); 3557 3558 if (Builtin != IntrinsicMap.end() && Builtin->BuiltinID == BuiltinID) 3559 return Builtin; 3560 3561 return nullptr; 3562 } 3563 3564 Function *CodeGenFunction::LookupNeonLLVMIntrinsic(unsigned IntrinsicID, 3565 unsigned Modifier, 3566 llvm::Type *ArgType, 3567 const CallExpr *E) { 3568 int VectorSize = 0; 3569 if (Modifier & Use64BitVectors) 3570 VectorSize = 64; 3571 else if (Modifier & Use128BitVectors) 3572 VectorSize = 128; 3573 3574 // Return type. 3575 SmallVector<llvm::Type *, 3> Tys; 3576 if (Modifier & AddRetType) { 3577 llvm::Type *Ty = ConvertType(E->getCallReturnType(getContext())); 3578 if (Modifier & VectorizeRetType) 3579 Ty = llvm::VectorType::get( 3580 Ty, VectorSize ? VectorSize / Ty->getPrimitiveSizeInBits() : 1); 3581 3582 Tys.push_back(Ty); 3583 } 3584 3585 // Arguments. 3586 if (Modifier & VectorizeArgTypes) { 3587 int Elts = VectorSize ? VectorSize / ArgType->getPrimitiveSizeInBits() : 1; 3588 ArgType = llvm::VectorType::get(ArgType, Elts); 3589 } 3590 3591 if (Modifier & (Add1ArgType | Add2ArgTypes)) 3592 Tys.push_back(ArgType); 3593 3594 if (Modifier & Add2ArgTypes) 3595 Tys.push_back(ArgType); 3596 3597 if (Modifier & InventFloatType) 3598 Tys.push_back(FloatTy); 3599 3600 return CGM.getIntrinsic(IntrinsicID, Tys); 3601 } 3602 3603 static Value *EmitCommonNeonSISDBuiltinExpr(CodeGenFunction &CGF, 3604 const NeonIntrinsicInfo &SISDInfo, 3605 SmallVectorImpl<Value *> &Ops, 3606 const CallExpr *E) { 3607 unsigned BuiltinID = SISDInfo.BuiltinID; 3608 unsigned int Int = SISDInfo.LLVMIntrinsic; 3609 unsigned Modifier = SISDInfo.TypeModifier; 3610 const char *s = SISDInfo.NameHint; 3611 3612 switch (BuiltinID) { 3613 case NEON::BI__builtin_neon_vcled_s64: 3614 case NEON::BI__builtin_neon_vcled_u64: 3615 case NEON::BI__builtin_neon_vcles_f32: 3616 case NEON::BI__builtin_neon_vcled_f64: 3617 case NEON::BI__builtin_neon_vcltd_s64: 3618 case NEON::BI__builtin_neon_vcltd_u64: 3619 case NEON::BI__builtin_neon_vclts_f32: 3620 case NEON::BI__builtin_neon_vcltd_f64: 3621 case NEON::BI__builtin_neon_vcales_f32: 3622 case NEON::BI__builtin_neon_vcaled_f64: 3623 case NEON::BI__builtin_neon_vcalts_f32: 3624 case NEON::BI__builtin_neon_vcaltd_f64: 3625 // Only one direction of comparisons actually exist, cmle is actually a cmge 3626 // with swapped operands. The table gives us the right intrinsic but we 3627 // still need to do the swap. 3628 std::swap(Ops[0], Ops[1]); 3629 break; 3630 } 3631 3632 assert(Int && "Generic code assumes a valid intrinsic"); 3633 3634 // Determine the type(s) of this overloaded AArch64 intrinsic. 3635 const Expr *Arg = E->getArg(0); 3636 llvm::Type *ArgTy = CGF.ConvertType(Arg->getType()); 3637 Function *F = CGF.LookupNeonLLVMIntrinsic(Int, Modifier, ArgTy, E); 3638 3639 int j = 0; 3640 ConstantInt *C0 = ConstantInt::get(CGF.SizeTy, 0); 3641 for (Function::const_arg_iterator ai = F->arg_begin(), ae = F->arg_end(); 3642 ai != ae; ++ai, ++j) { 3643 llvm::Type *ArgTy = ai->getType(); 3644 if (Ops[j]->getType()->getPrimitiveSizeInBits() == 3645 ArgTy->getPrimitiveSizeInBits()) 3646 continue; 3647 3648 assert(ArgTy->isVectorTy() && !Ops[j]->getType()->isVectorTy()); 3649 // The constant argument to an _n_ intrinsic always has Int32Ty, so truncate 3650 // it before inserting. 3651 Ops[j] = 3652 CGF.Builder.CreateTruncOrBitCast(Ops[j], ArgTy->getVectorElementType()); 3653 Ops[j] = 3654 CGF.Builder.CreateInsertElement(UndefValue::get(ArgTy), Ops[j], C0); 3655 } 3656 3657 Value *Result = CGF.EmitNeonCall(F, Ops, s); 3658 llvm::Type *ResultType = CGF.ConvertType(E->getType()); 3659 if (ResultType->getPrimitiveSizeInBits() < 3660 Result->getType()->getPrimitiveSizeInBits()) 3661 return CGF.Builder.CreateExtractElement(Result, C0); 3662 3663 return CGF.Builder.CreateBitCast(Result, ResultType, s); 3664 } 3665 3666 Value *CodeGenFunction::EmitCommonNeonBuiltinExpr( 3667 unsigned BuiltinID, unsigned LLVMIntrinsic, unsigned AltLLVMIntrinsic, 3668 const char *NameHint, unsigned Modifier, const CallExpr *E, 3669 SmallVectorImpl<llvm::Value *> &Ops, Address PtrOp0, Address PtrOp1) { 3670 // Get the last argument, which specifies the vector type. 3671 llvm::APSInt NeonTypeConst; 3672 const Expr *Arg = E->getArg(E->getNumArgs() - 1); 3673 if (!Arg->isIntegerConstantExpr(NeonTypeConst, getContext())) 3674 return nullptr; 3675 3676 // Determine the type of this overloaded NEON intrinsic. 3677 NeonTypeFlags Type(NeonTypeConst.getZExtValue()); 3678 bool Usgn = Type.isUnsigned(); 3679 bool Quad = Type.isQuad(); 3680 3681 llvm::VectorType *VTy = GetNeonType(this, Type); 3682 llvm::Type *Ty = VTy; 3683 if (!Ty) 3684 return nullptr; 3685 3686 auto getAlignmentValue32 = [&](Address addr) -> Value* { 3687 return Builder.getInt32(addr.getAlignment().getQuantity()); 3688 }; 3689 3690 unsigned Int = LLVMIntrinsic; 3691 if ((Modifier & UnsignedAlts) && !Usgn) 3692 Int = AltLLVMIntrinsic; 3693 3694 switch (BuiltinID) { 3695 default: break; 3696 case NEON::BI__builtin_neon_vabs_v: 3697 case NEON::BI__builtin_neon_vabsq_v: 3698 if (VTy->getElementType()->isFloatingPointTy()) 3699 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::fabs, Ty), Ops, "vabs"); 3700 return EmitNeonCall(CGM.getIntrinsic(LLVMIntrinsic, Ty), Ops, "vabs"); 3701 case NEON::BI__builtin_neon_vaddhn_v: { 3702 llvm::VectorType *SrcTy = 3703 llvm::VectorType::getExtendedElementVectorType(VTy); 3704 3705 // %sum = add <4 x i32> %lhs, %rhs 3706 Ops[0] = Builder.CreateBitCast(Ops[0], SrcTy); 3707 Ops[1] = Builder.CreateBitCast(Ops[1], SrcTy); 3708 Ops[0] = Builder.CreateAdd(Ops[0], Ops[1], "vaddhn"); 3709 3710 // %high = lshr <4 x i32> %sum, <i32 16, i32 16, i32 16, i32 16> 3711 Constant *ShiftAmt = 3712 ConstantInt::get(SrcTy, SrcTy->getScalarSizeInBits() / 2); 3713 Ops[0] = Builder.CreateLShr(Ops[0], ShiftAmt, "vaddhn"); 3714 3715 // %res = trunc <4 x i32> %high to <4 x i16> 3716 return Builder.CreateTrunc(Ops[0], VTy, "vaddhn"); 3717 } 3718 case NEON::BI__builtin_neon_vcale_v: 3719 case NEON::BI__builtin_neon_vcaleq_v: 3720 case NEON::BI__builtin_neon_vcalt_v: 3721 case NEON::BI__builtin_neon_vcaltq_v: 3722 std::swap(Ops[0], Ops[1]); 3723 case NEON::BI__builtin_neon_vcage_v: 3724 case NEON::BI__builtin_neon_vcageq_v: 3725 case NEON::BI__builtin_neon_vcagt_v: 3726 case NEON::BI__builtin_neon_vcagtq_v: { 3727 llvm::Type *VecFlt = llvm::VectorType::get( 3728 VTy->getScalarSizeInBits() == 32 ? FloatTy : DoubleTy, 3729 VTy->getNumElements()); 3730 llvm::Type *Tys[] = { VTy, VecFlt }; 3731 Function *F = CGM.getIntrinsic(LLVMIntrinsic, Tys); 3732 return EmitNeonCall(F, Ops, NameHint); 3733 } 3734 case NEON::BI__builtin_neon_vclz_v: 3735 case NEON::BI__builtin_neon_vclzq_v: 3736 // We generate target-independent intrinsic, which needs a second argument 3737 // for whether or not clz of zero is undefined; on ARM it isn't. 3738 Ops.push_back(Builder.getInt1(getTarget().isCLZForZeroUndef())); 3739 break; 3740 case NEON::BI__builtin_neon_vcvt_f32_v: 3741 case NEON::BI__builtin_neon_vcvtq_f32_v: 3742 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 3743 Ty = GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float32, false, Quad)); 3744 return Usgn ? Builder.CreateUIToFP(Ops[0], Ty, "vcvt") 3745 : Builder.CreateSIToFP(Ops[0], Ty, "vcvt"); 3746 case NEON::BI__builtin_neon_vcvt_n_f32_v: 3747 case NEON::BI__builtin_neon_vcvt_n_f64_v: 3748 case NEON::BI__builtin_neon_vcvtq_n_f32_v: 3749 case NEON::BI__builtin_neon_vcvtq_n_f64_v: { 3750 llvm::Type *Tys[2] = { GetFloatNeonType(this, Type), Ty }; 3751 Int = Usgn ? LLVMIntrinsic : AltLLVMIntrinsic; 3752 Function *F = CGM.getIntrinsic(Int, Tys); 3753 return EmitNeonCall(F, Ops, "vcvt_n"); 3754 } 3755 case NEON::BI__builtin_neon_vcvt_n_s32_v: 3756 case NEON::BI__builtin_neon_vcvt_n_u32_v: 3757 case NEON::BI__builtin_neon_vcvt_n_s64_v: 3758 case NEON::BI__builtin_neon_vcvt_n_u64_v: 3759 case NEON::BI__builtin_neon_vcvtq_n_s32_v: 3760 case NEON::BI__builtin_neon_vcvtq_n_u32_v: 3761 case NEON::BI__builtin_neon_vcvtq_n_s64_v: 3762 case NEON::BI__builtin_neon_vcvtq_n_u64_v: { 3763 llvm::Type *Tys[2] = { Ty, GetFloatNeonType(this, Type) }; 3764 Function *F = CGM.getIntrinsic(LLVMIntrinsic, Tys); 3765 return EmitNeonCall(F, Ops, "vcvt_n"); 3766 } 3767 case NEON::BI__builtin_neon_vcvt_s32_v: 3768 case NEON::BI__builtin_neon_vcvt_u32_v: 3769 case NEON::BI__builtin_neon_vcvt_s64_v: 3770 case NEON::BI__builtin_neon_vcvt_u64_v: 3771 case NEON::BI__builtin_neon_vcvtq_s32_v: 3772 case NEON::BI__builtin_neon_vcvtq_u32_v: 3773 case NEON::BI__builtin_neon_vcvtq_s64_v: 3774 case NEON::BI__builtin_neon_vcvtq_u64_v: { 3775 Ops[0] = Builder.CreateBitCast(Ops[0], GetFloatNeonType(this, Type)); 3776 return Usgn ? Builder.CreateFPToUI(Ops[0], Ty, "vcvt") 3777 : Builder.CreateFPToSI(Ops[0], Ty, "vcvt"); 3778 } 3779 case NEON::BI__builtin_neon_vcvta_s32_v: 3780 case NEON::BI__builtin_neon_vcvta_s64_v: 3781 case NEON::BI__builtin_neon_vcvta_u32_v: 3782 case NEON::BI__builtin_neon_vcvta_u64_v: 3783 case NEON::BI__builtin_neon_vcvtaq_s32_v: 3784 case NEON::BI__builtin_neon_vcvtaq_s64_v: 3785 case NEON::BI__builtin_neon_vcvtaq_u32_v: 3786 case NEON::BI__builtin_neon_vcvtaq_u64_v: 3787 case NEON::BI__builtin_neon_vcvtn_s32_v: 3788 case NEON::BI__builtin_neon_vcvtn_s64_v: 3789 case NEON::BI__builtin_neon_vcvtn_u32_v: 3790 case NEON::BI__builtin_neon_vcvtn_u64_v: 3791 case NEON::BI__builtin_neon_vcvtnq_s32_v: 3792 case NEON::BI__builtin_neon_vcvtnq_s64_v: 3793 case NEON::BI__builtin_neon_vcvtnq_u32_v: 3794 case NEON::BI__builtin_neon_vcvtnq_u64_v: 3795 case NEON::BI__builtin_neon_vcvtp_s32_v: 3796 case NEON::BI__builtin_neon_vcvtp_s64_v: 3797 case NEON::BI__builtin_neon_vcvtp_u32_v: 3798 case NEON::BI__builtin_neon_vcvtp_u64_v: 3799 case NEON::BI__builtin_neon_vcvtpq_s32_v: 3800 case NEON::BI__builtin_neon_vcvtpq_s64_v: 3801 case NEON::BI__builtin_neon_vcvtpq_u32_v: 3802 case NEON::BI__builtin_neon_vcvtpq_u64_v: 3803 case NEON::BI__builtin_neon_vcvtm_s32_v: 3804 case NEON::BI__builtin_neon_vcvtm_s64_v: 3805 case NEON::BI__builtin_neon_vcvtm_u32_v: 3806 case NEON::BI__builtin_neon_vcvtm_u64_v: 3807 case NEON::BI__builtin_neon_vcvtmq_s32_v: 3808 case NEON::BI__builtin_neon_vcvtmq_s64_v: 3809 case NEON::BI__builtin_neon_vcvtmq_u32_v: 3810 case NEON::BI__builtin_neon_vcvtmq_u64_v: { 3811 llvm::Type *Tys[2] = { Ty, GetFloatNeonType(this, Type) }; 3812 return EmitNeonCall(CGM.getIntrinsic(LLVMIntrinsic, Tys), Ops, NameHint); 3813 } 3814 case NEON::BI__builtin_neon_vext_v: 3815 case NEON::BI__builtin_neon_vextq_v: { 3816 int CV = cast<ConstantInt>(Ops[2])->getSExtValue(); 3817 SmallVector<uint32_t, 16> Indices; 3818 for (unsigned i = 0, e = VTy->getNumElements(); i != e; ++i) 3819 Indices.push_back(i+CV); 3820 3821 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 3822 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 3823 return Builder.CreateShuffleVector(Ops[0], Ops[1], Indices, "vext"); 3824 } 3825 case NEON::BI__builtin_neon_vfma_v: 3826 case NEON::BI__builtin_neon_vfmaq_v: { 3827 Value *F = CGM.getIntrinsic(Intrinsic::fma, Ty); 3828 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 3829 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 3830 Ops[2] = Builder.CreateBitCast(Ops[2], Ty); 3831 3832 // NEON intrinsic puts accumulator first, unlike the LLVM fma. 3833 return Builder.CreateCall(F, {Ops[1], Ops[2], Ops[0]}); 3834 } 3835 case NEON::BI__builtin_neon_vld1_v: 3836 case NEON::BI__builtin_neon_vld1q_v: { 3837 llvm::Type *Tys[] = {Ty, Int8PtrTy}; 3838 Ops.push_back(getAlignmentValue32(PtrOp0)); 3839 return EmitNeonCall(CGM.getIntrinsic(LLVMIntrinsic, Tys), Ops, "vld1"); 3840 } 3841 case NEON::BI__builtin_neon_vld2_v: 3842 case NEON::BI__builtin_neon_vld2q_v: 3843 case NEON::BI__builtin_neon_vld3_v: 3844 case NEON::BI__builtin_neon_vld3q_v: 3845 case NEON::BI__builtin_neon_vld4_v: 3846 case NEON::BI__builtin_neon_vld4q_v: { 3847 llvm::Type *Tys[] = {Ty, Int8PtrTy}; 3848 Function *F = CGM.getIntrinsic(LLVMIntrinsic, Tys); 3849 Value *Align = getAlignmentValue32(PtrOp1); 3850 Ops[1] = Builder.CreateCall(F, {Ops[1], Align}, NameHint); 3851 Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); 3852 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 3853 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 3854 } 3855 case NEON::BI__builtin_neon_vld1_dup_v: 3856 case NEON::BI__builtin_neon_vld1q_dup_v: { 3857 Value *V = UndefValue::get(Ty); 3858 Ty = llvm::PointerType::getUnqual(VTy->getElementType()); 3859 PtrOp0 = Builder.CreateBitCast(PtrOp0, Ty); 3860 LoadInst *Ld = Builder.CreateLoad(PtrOp0); 3861 llvm::Constant *CI = ConstantInt::get(SizeTy, 0); 3862 Ops[0] = Builder.CreateInsertElement(V, Ld, CI); 3863 return EmitNeonSplat(Ops[0], CI); 3864 } 3865 case NEON::BI__builtin_neon_vld2_lane_v: 3866 case NEON::BI__builtin_neon_vld2q_lane_v: 3867 case NEON::BI__builtin_neon_vld3_lane_v: 3868 case NEON::BI__builtin_neon_vld3q_lane_v: 3869 case NEON::BI__builtin_neon_vld4_lane_v: 3870 case NEON::BI__builtin_neon_vld4q_lane_v: { 3871 llvm::Type *Tys[] = {Ty, Int8PtrTy}; 3872 Function *F = CGM.getIntrinsic(LLVMIntrinsic, Tys); 3873 for (unsigned I = 2; I < Ops.size() - 1; ++I) 3874 Ops[I] = Builder.CreateBitCast(Ops[I], Ty); 3875 Ops.push_back(getAlignmentValue32(PtrOp1)); 3876 Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), NameHint); 3877 Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); 3878 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 3879 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 3880 } 3881 case NEON::BI__builtin_neon_vmovl_v: { 3882 llvm::Type *DTy =llvm::VectorType::getTruncatedElementVectorType(VTy); 3883 Ops[0] = Builder.CreateBitCast(Ops[0], DTy); 3884 if (Usgn) 3885 return Builder.CreateZExt(Ops[0], Ty, "vmovl"); 3886 return Builder.CreateSExt(Ops[0], Ty, "vmovl"); 3887 } 3888 case NEON::BI__builtin_neon_vmovn_v: { 3889 llvm::Type *QTy = llvm::VectorType::getExtendedElementVectorType(VTy); 3890 Ops[0] = Builder.CreateBitCast(Ops[0], QTy); 3891 return Builder.CreateTrunc(Ops[0], Ty, "vmovn"); 3892 } 3893 case NEON::BI__builtin_neon_vmull_v: 3894 // FIXME: the integer vmull operations could be emitted in terms of pure 3895 // LLVM IR (2 exts followed by a mul). Unfortunately LLVM has a habit of 3896 // hoisting the exts outside loops. Until global ISel comes along that can 3897 // see through such movement this leads to bad CodeGen. So we need an 3898 // intrinsic for now. 3899 Int = Usgn ? Intrinsic::arm_neon_vmullu : Intrinsic::arm_neon_vmulls; 3900 Int = Type.isPoly() ? (unsigned)Intrinsic::arm_neon_vmullp : Int; 3901 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmull"); 3902 case NEON::BI__builtin_neon_vpadal_v: 3903 case NEON::BI__builtin_neon_vpadalq_v: { 3904 // The source operand type has twice as many elements of half the size. 3905 unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits(); 3906 llvm::Type *EltTy = 3907 llvm::IntegerType::get(getLLVMContext(), EltBits / 2); 3908 llvm::Type *NarrowTy = 3909 llvm::VectorType::get(EltTy, VTy->getNumElements() * 2); 3910 llvm::Type *Tys[2] = { Ty, NarrowTy }; 3911 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, NameHint); 3912 } 3913 case NEON::BI__builtin_neon_vpaddl_v: 3914 case NEON::BI__builtin_neon_vpaddlq_v: { 3915 // The source operand type has twice as many elements of half the size. 3916 unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits(); 3917 llvm::Type *EltTy = llvm::IntegerType::get(getLLVMContext(), EltBits / 2); 3918 llvm::Type *NarrowTy = 3919 llvm::VectorType::get(EltTy, VTy->getNumElements() * 2); 3920 llvm::Type *Tys[2] = { Ty, NarrowTy }; 3921 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vpaddl"); 3922 } 3923 case NEON::BI__builtin_neon_vqdmlal_v: 3924 case NEON::BI__builtin_neon_vqdmlsl_v: { 3925 SmallVector<Value *, 2> MulOps(Ops.begin() + 1, Ops.end()); 3926 Ops[1] = 3927 EmitNeonCall(CGM.getIntrinsic(LLVMIntrinsic, Ty), MulOps, "vqdmlal"); 3928 Ops.resize(2); 3929 return EmitNeonCall(CGM.getIntrinsic(AltLLVMIntrinsic, Ty), Ops, NameHint); 3930 } 3931 case NEON::BI__builtin_neon_vqshl_n_v: 3932 case NEON::BI__builtin_neon_vqshlq_n_v: 3933 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshl_n", 3934 1, false); 3935 case NEON::BI__builtin_neon_vqshlu_n_v: 3936 case NEON::BI__builtin_neon_vqshluq_n_v: 3937 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshlu_n", 3938 1, false); 3939 case NEON::BI__builtin_neon_vrecpe_v: 3940 case NEON::BI__builtin_neon_vrecpeq_v: 3941 case NEON::BI__builtin_neon_vrsqrte_v: 3942 case NEON::BI__builtin_neon_vrsqrteq_v: 3943 Int = Ty->isFPOrFPVectorTy() ? LLVMIntrinsic : AltLLVMIntrinsic; 3944 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, NameHint); 3945 3946 case NEON::BI__builtin_neon_vrshr_n_v: 3947 case NEON::BI__builtin_neon_vrshrq_n_v: 3948 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrshr_n", 3949 1, true); 3950 case NEON::BI__builtin_neon_vshl_n_v: 3951 case NEON::BI__builtin_neon_vshlq_n_v: 3952 Ops[1] = EmitNeonShiftVector(Ops[1], Ty, false); 3953 return Builder.CreateShl(Builder.CreateBitCast(Ops[0],Ty), Ops[1], 3954 "vshl_n"); 3955 case NEON::BI__builtin_neon_vshll_n_v: { 3956 llvm::Type *SrcTy = llvm::VectorType::getTruncatedElementVectorType(VTy); 3957 Ops[0] = Builder.CreateBitCast(Ops[0], SrcTy); 3958 if (Usgn) 3959 Ops[0] = Builder.CreateZExt(Ops[0], VTy); 3960 else 3961 Ops[0] = Builder.CreateSExt(Ops[0], VTy); 3962 Ops[1] = EmitNeonShiftVector(Ops[1], VTy, false); 3963 return Builder.CreateShl(Ops[0], Ops[1], "vshll_n"); 3964 } 3965 case NEON::BI__builtin_neon_vshrn_n_v: { 3966 llvm::Type *SrcTy = llvm::VectorType::getExtendedElementVectorType(VTy); 3967 Ops[0] = Builder.CreateBitCast(Ops[0], SrcTy); 3968 Ops[1] = EmitNeonShiftVector(Ops[1], SrcTy, false); 3969 if (Usgn) 3970 Ops[0] = Builder.CreateLShr(Ops[0], Ops[1]); 3971 else 3972 Ops[0] = Builder.CreateAShr(Ops[0], Ops[1]); 3973 return Builder.CreateTrunc(Ops[0], Ty, "vshrn_n"); 3974 } 3975 case NEON::BI__builtin_neon_vshr_n_v: 3976 case NEON::BI__builtin_neon_vshrq_n_v: 3977 return EmitNeonRShiftImm(Ops[0], Ops[1], Ty, Usgn, "vshr_n"); 3978 case NEON::BI__builtin_neon_vst1_v: 3979 case NEON::BI__builtin_neon_vst1q_v: 3980 case NEON::BI__builtin_neon_vst2_v: 3981 case NEON::BI__builtin_neon_vst2q_v: 3982 case NEON::BI__builtin_neon_vst3_v: 3983 case NEON::BI__builtin_neon_vst3q_v: 3984 case NEON::BI__builtin_neon_vst4_v: 3985 case NEON::BI__builtin_neon_vst4q_v: 3986 case NEON::BI__builtin_neon_vst2_lane_v: 3987 case NEON::BI__builtin_neon_vst2q_lane_v: 3988 case NEON::BI__builtin_neon_vst3_lane_v: 3989 case NEON::BI__builtin_neon_vst3q_lane_v: 3990 case NEON::BI__builtin_neon_vst4_lane_v: 3991 case NEON::BI__builtin_neon_vst4q_lane_v: { 3992 llvm::Type *Tys[] = {Int8PtrTy, Ty}; 3993 Ops.push_back(getAlignmentValue32(PtrOp0)); 3994 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, ""); 3995 } 3996 case NEON::BI__builtin_neon_vsubhn_v: { 3997 llvm::VectorType *SrcTy = 3998 llvm::VectorType::getExtendedElementVectorType(VTy); 3999 4000 // %sum = add <4 x i32> %lhs, %rhs 4001 Ops[0] = Builder.CreateBitCast(Ops[0], SrcTy); 4002 Ops[1] = Builder.CreateBitCast(Ops[1], SrcTy); 4003 Ops[0] = Builder.CreateSub(Ops[0], Ops[1], "vsubhn"); 4004 4005 // %high = lshr <4 x i32> %sum, <i32 16, i32 16, i32 16, i32 16> 4006 Constant *ShiftAmt = 4007 ConstantInt::get(SrcTy, SrcTy->getScalarSizeInBits() / 2); 4008 Ops[0] = Builder.CreateLShr(Ops[0], ShiftAmt, "vsubhn"); 4009 4010 // %res = trunc <4 x i32> %high to <4 x i16> 4011 return Builder.CreateTrunc(Ops[0], VTy, "vsubhn"); 4012 } 4013 case NEON::BI__builtin_neon_vtrn_v: 4014 case NEON::BI__builtin_neon_vtrnq_v: { 4015 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty)); 4016 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 4017 Ops[2] = Builder.CreateBitCast(Ops[2], Ty); 4018 Value *SV = nullptr; 4019 4020 for (unsigned vi = 0; vi != 2; ++vi) { 4021 SmallVector<uint32_t, 16> Indices; 4022 for (unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) { 4023 Indices.push_back(i+vi); 4024 Indices.push_back(i+e+vi); 4025 } 4026 Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi); 4027 SV = Builder.CreateShuffleVector(Ops[1], Ops[2], Indices, "vtrn"); 4028 SV = Builder.CreateDefaultAlignedStore(SV, Addr); 4029 } 4030 return SV; 4031 } 4032 case NEON::BI__builtin_neon_vtst_v: 4033 case NEON::BI__builtin_neon_vtstq_v: { 4034 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 4035 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 4036 Ops[0] = Builder.CreateAnd(Ops[0], Ops[1]); 4037 Ops[0] = Builder.CreateICmp(ICmpInst::ICMP_NE, Ops[0], 4038 ConstantAggregateZero::get(Ty)); 4039 return Builder.CreateSExt(Ops[0], Ty, "vtst"); 4040 } 4041 case NEON::BI__builtin_neon_vuzp_v: 4042 case NEON::BI__builtin_neon_vuzpq_v: { 4043 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty)); 4044 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 4045 Ops[2] = Builder.CreateBitCast(Ops[2], Ty); 4046 Value *SV = nullptr; 4047 4048 for (unsigned vi = 0; vi != 2; ++vi) { 4049 SmallVector<uint32_t, 16> Indices; 4050 for (unsigned i = 0, e = VTy->getNumElements(); i != e; ++i) 4051 Indices.push_back(2*i+vi); 4052 4053 Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi); 4054 SV = Builder.CreateShuffleVector(Ops[1], Ops[2], Indices, "vuzp"); 4055 SV = Builder.CreateDefaultAlignedStore(SV, Addr); 4056 } 4057 return SV; 4058 } 4059 case NEON::BI__builtin_neon_vzip_v: 4060 case NEON::BI__builtin_neon_vzipq_v: { 4061 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty)); 4062 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 4063 Ops[2] = Builder.CreateBitCast(Ops[2], Ty); 4064 Value *SV = nullptr; 4065 4066 for (unsigned vi = 0; vi != 2; ++vi) { 4067 SmallVector<uint32_t, 16> Indices; 4068 for (unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) { 4069 Indices.push_back((i + vi*e) >> 1); 4070 Indices.push_back(((i + vi*e) >> 1)+e); 4071 } 4072 Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi); 4073 SV = Builder.CreateShuffleVector(Ops[1], Ops[2], Indices, "vzip"); 4074 SV = Builder.CreateDefaultAlignedStore(SV, Addr); 4075 } 4076 return SV; 4077 } 4078 } 4079 4080 assert(Int && "Expected valid intrinsic number"); 4081 4082 // Determine the type(s) of this overloaded AArch64 intrinsic. 4083 Function *F = LookupNeonLLVMIntrinsic(Int, Modifier, Ty, E); 4084 4085 Value *Result = EmitNeonCall(F, Ops, NameHint); 4086 llvm::Type *ResultType = ConvertType(E->getType()); 4087 // AArch64 intrinsic one-element vector type cast to 4088 // scalar type expected by the builtin 4089 return Builder.CreateBitCast(Result, ResultType, NameHint); 4090 } 4091 4092 Value *CodeGenFunction::EmitAArch64CompareBuiltinExpr( 4093 Value *Op, llvm::Type *Ty, const CmpInst::Predicate Fp, 4094 const CmpInst::Predicate Ip, const Twine &Name) { 4095 llvm::Type *OTy = Op->getType(); 4096 4097 // FIXME: this is utterly horrific. We should not be looking at previous 4098 // codegen context to find out what needs doing. Unfortunately TableGen 4099 // currently gives us exactly the same calls for vceqz_f32 and vceqz_s32 4100 // (etc). 4101 if (BitCastInst *BI = dyn_cast<BitCastInst>(Op)) 4102 OTy = BI->getOperand(0)->getType(); 4103 4104 Op = Builder.CreateBitCast(Op, OTy); 4105 if (OTy->getScalarType()->isFloatingPointTy()) { 4106 Op = Builder.CreateFCmp(Fp, Op, Constant::getNullValue(OTy)); 4107 } else { 4108 Op = Builder.CreateICmp(Ip, Op, Constant::getNullValue(OTy)); 4109 } 4110 return Builder.CreateSExt(Op, Ty, Name); 4111 } 4112 4113 static Value *packTBLDVectorList(CodeGenFunction &CGF, ArrayRef<Value *> Ops, 4114 Value *ExtOp, Value *IndexOp, 4115 llvm::Type *ResTy, unsigned IntID, 4116 const char *Name) { 4117 SmallVector<Value *, 2> TblOps; 4118 if (ExtOp) 4119 TblOps.push_back(ExtOp); 4120 4121 // Build a vector containing sequential number like (0, 1, 2, ..., 15) 4122 SmallVector<uint32_t, 16> Indices; 4123 llvm::VectorType *TblTy = cast<llvm::VectorType>(Ops[0]->getType()); 4124 for (unsigned i = 0, e = TblTy->getNumElements(); i != e; ++i) { 4125 Indices.push_back(2*i); 4126 Indices.push_back(2*i+1); 4127 } 4128 4129 int PairPos = 0, End = Ops.size() - 1; 4130 while (PairPos < End) { 4131 TblOps.push_back(CGF.Builder.CreateShuffleVector(Ops[PairPos], 4132 Ops[PairPos+1], Indices, 4133 Name)); 4134 PairPos += 2; 4135 } 4136 4137 // If there's an odd number of 64-bit lookup table, fill the high 64-bit 4138 // of the 128-bit lookup table with zero. 4139 if (PairPos == End) { 4140 Value *ZeroTbl = ConstantAggregateZero::get(TblTy); 4141 TblOps.push_back(CGF.Builder.CreateShuffleVector(Ops[PairPos], 4142 ZeroTbl, Indices, Name)); 4143 } 4144 4145 Function *TblF; 4146 TblOps.push_back(IndexOp); 4147 TblF = CGF.CGM.getIntrinsic(IntID, ResTy); 4148 4149 return CGF.EmitNeonCall(TblF, TblOps, Name); 4150 } 4151 4152 Value *CodeGenFunction::GetValueForARMHint(unsigned BuiltinID) { 4153 unsigned Value; 4154 switch (BuiltinID) { 4155 default: 4156 return nullptr; 4157 case ARM::BI__builtin_arm_nop: 4158 Value = 0; 4159 break; 4160 case ARM::BI__builtin_arm_yield: 4161 case ARM::BI__yield: 4162 Value = 1; 4163 break; 4164 case ARM::BI__builtin_arm_wfe: 4165 case ARM::BI__wfe: 4166 Value = 2; 4167 break; 4168 case ARM::BI__builtin_arm_wfi: 4169 case ARM::BI__wfi: 4170 Value = 3; 4171 break; 4172 case ARM::BI__builtin_arm_sev: 4173 case ARM::BI__sev: 4174 Value = 4; 4175 break; 4176 case ARM::BI__builtin_arm_sevl: 4177 case ARM::BI__sevl: 4178 Value = 5; 4179 break; 4180 } 4181 4182 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_hint), 4183 llvm::ConstantInt::get(Int32Ty, Value)); 4184 } 4185 4186 // Generates the IR for the read/write special register builtin, 4187 // ValueType is the type of the value that is to be written or read, 4188 // RegisterType is the type of the register being written to or read from. 4189 static Value *EmitSpecialRegisterBuiltin(CodeGenFunction &CGF, 4190 const CallExpr *E, 4191 llvm::Type *RegisterType, 4192 llvm::Type *ValueType, 4193 bool IsRead, 4194 StringRef SysReg = "") { 4195 // write and register intrinsics only support 32 and 64 bit operations. 4196 assert((RegisterType->isIntegerTy(32) || RegisterType->isIntegerTy(64)) 4197 && "Unsupported size for register."); 4198 4199 CodeGen::CGBuilderTy &Builder = CGF.Builder; 4200 CodeGen::CodeGenModule &CGM = CGF.CGM; 4201 LLVMContext &Context = CGM.getLLVMContext(); 4202 4203 if (SysReg.empty()) { 4204 const Expr *SysRegStrExpr = E->getArg(0)->IgnoreParenCasts(); 4205 SysReg = cast<StringLiteral>(SysRegStrExpr)->getString(); 4206 } 4207 4208 llvm::Metadata *Ops[] = { llvm::MDString::get(Context, SysReg) }; 4209 llvm::MDNode *RegName = llvm::MDNode::get(Context, Ops); 4210 llvm::Value *Metadata = llvm::MetadataAsValue::get(Context, RegName); 4211 4212 llvm::Type *Types[] = { RegisterType }; 4213 4214 bool MixedTypes = RegisterType->isIntegerTy(64) && ValueType->isIntegerTy(32); 4215 assert(!(RegisterType->isIntegerTy(32) && ValueType->isIntegerTy(64)) 4216 && "Can't fit 64-bit value in 32-bit register"); 4217 4218 if (IsRead) { 4219 llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::read_register, Types); 4220 llvm::Value *Call = Builder.CreateCall(F, Metadata); 4221 4222 if (MixedTypes) 4223 // Read into 64 bit register and then truncate result to 32 bit. 4224 return Builder.CreateTrunc(Call, ValueType); 4225 4226 if (ValueType->isPointerTy()) 4227 // Have i32/i64 result (Call) but want to return a VoidPtrTy (i8*). 4228 return Builder.CreateIntToPtr(Call, ValueType); 4229 4230 return Call; 4231 } 4232 4233 llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::write_register, Types); 4234 llvm::Value *ArgValue = CGF.EmitScalarExpr(E->getArg(1)); 4235 if (MixedTypes) { 4236 // Extend 32 bit write value to 64 bit to pass to write. 4237 ArgValue = Builder.CreateZExt(ArgValue, RegisterType); 4238 return Builder.CreateCall(F, { Metadata, ArgValue }); 4239 } 4240 4241 if (ValueType->isPointerTy()) { 4242 // Have VoidPtrTy ArgValue but want to return an i32/i64. 4243 ArgValue = Builder.CreatePtrToInt(ArgValue, RegisterType); 4244 return Builder.CreateCall(F, { Metadata, ArgValue }); 4245 } 4246 4247 return Builder.CreateCall(F, { Metadata, ArgValue }); 4248 } 4249 4250 /// Return true if BuiltinID is an overloaded Neon intrinsic with an extra 4251 /// argument that specifies the vector type. 4252 static bool HasExtraNeonArgument(unsigned BuiltinID) { 4253 switch (BuiltinID) { 4254 default: break; 4255 case NEON::BI__builtin_neon_vget_lane_i8: 4256 case NEON::BI__builtin_neon_vget_lane_i16: 4257 case NEON::BI__builtin_neon_vget_lane_i32: 4258 case NEON::BI__builtin_neon_vget_lane_i64: 4259 case NEON::BI__builtin_neon_vget_lane_f32: 4260 case NEON::BI__builtin_neon_vgetq_lane_i8: 4261 case NEON::BI__builtin_neon_vgetq_lane_i16: 4262 case NEON::BI__builtin_neon_vgetq_lane_i32: 4263 case NEON::BI__builtin_neon_vgetq_lane_i64: 4264 case NEON::BI__builtin_neon_vgetq_lane_f32: 4265 case NEON::BI__builtin_neon_vset_lane_i8: 4266 case NEON::BI__builtin_neon_vset_lane_i16: 4267 case NEON::BI__builtin_neon_vset_lane_i32: 4268 case NEON::BI__builtin_neon_vset_lane_i64: 4269 case NEON::BI__builtin_neon_vset_lane_f32: 4270 case NEON::BI__builtin_neon_vsetq_lane_i8: 4271 case NEON::BI__builtin_neon_vsetq_lane_i16: 4272 case NEON::BI__builtin_neon_vsetq_lane_i32: 4273 case NEON::BI__builtin_neon_vsetq_lane_i64: 4274 case NEON::BI__builtin_neon_vsetq_lane_f32: 4275 case NEON::BI__builtin_neon_vsha1h_u32: 4276 case NEON::BI__builtin_neon_vsha1cq_u32: 4277 case NEON::BI__builtin_neon_vsha1pq_u32: 4278 case NEON::BI__builtin_neon_vsha1mq_u32: 4279 case ARM::BI_MoveToCoprocessor: 4280 case ARM::BI_MoveToCoprocessor2: 4281 return false; 4282 } 4283 return true; 4284 } 4285 4286 Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, 4287 const CallExpr *E) { 4288 if (auto Hint = GetValueForARMHint(BuiltinID)) 4289 return Hint; 4290 4291 if (BuiltinID == ARM::BI__emit) { 4292 bool IsThumb = getTarget().getTriple().getArch() == llvm::Triple::thumb; 4293 llvm::FunctionType *FTy = 4294 llvm::FunctionType::get(VoidTy, /*Variadic=*/false); 4295 4296 APSInt Value; 4297 if (!E->getArg(0)->EvaluateAsInt(Value, CGM.getContext())) 4298 llvm_unreachable("Sema will ensure that the parameter is constant"); 4299 4300 uint64_t ZExtValue = Value.zextOrTrunc(IsThumb ? 16 : 32).getZExtValue(); 4301 4302 llvm::InlineAsm *Emit = 4303 IsThumb ? InlineAsm::get(FTy, ".inst.n 0x" + utohexstr(ZExtValue), "", 4304 /*SideEffects=*/true) 4305 : InlineAsm::get(FTy, ".inst 0x" + utohexstr(ZExtValue), "", 4306 /*SideEffects=*/true); 4307 4308 return Builder.CreateCall(Emit); 4309 } 4310 4311 if (BuiltinID == ARM::BI__builtin_arm_dbg) { 4312 Value *Option = EmitScalarExpr(E->getArg(0)); 4313 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_dbg), Option); 4314 } 4315 4316 if (BuiltinID == ARM::BI__builtin_arm_prefetch) { 4317 Value *Address = EmitScalarExpr(E->getArg(0)); 4318 Value *RW = EmitScalarExpr(E->getArg(1)); 4319 Value *IsData = EmitScalarExpr(E->getArg(2)); 4320 4321 // Locality is not supported on ARM target 4322 Value *Locality = llvm::ConstantInt::get(Int32Ty, 3); 4323 4324 Value *F = CGM.getIntrinsic(Intrinsic::prefetch); 4325 return Builder.CreateCall(F, {Address, RW, Locality, IsData}); 4326 } 4327 4328 if (BuiltinID == ARM::BI__builtin_arm_rbit) { 4329 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_rbit), 4330 EmitScalarExpr(E->getArg(0)), 4331 "rbit"); 4332 } 4333 4334 if (BuiltinID == ARM::BI__clear_cache) { 4335 assert(E->getNumArgs() == 2 && "__clear_cache takes 2 arguments"); 4336 const FunctionDecl *FD = E->getDirectCallee(); 4337 Value *Ops[2]; 4338 for (unsigned i = 0; i < 2; i++) 4339 Ops[i] = EmitScalarExpr(E->getArg(i)); 4340 llvm::Type *Ty = CGM.getTypes().ConvertType(FD->getType()); 4341 llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty); 4342 StringRef Name = FD->getName(); 4343 return EmitNounwindRuntimeCall(CGM.CreateRuntimeFunction(FTy, Name), Ops); 4344 } 4345 4346 if (BuiltinID == ARM::BI__builtin_arm_mcrr || 4347 BuiltinID == ARM::BI__builtin_arm_mcrr2) { 4348 Function *F; 4349 4350 switch (BuiltinID) { 4351 default: llvm_unreachable("unexpected builtin"); 4352 case ARM::BI__builtin_arm_mcrr: 4353 F = CGM.getIntrinsic(Intrinsic::arm_mcrr); 4354 break; 4355 case ARM::BI__builtin_arm_mcrr2: 4356 F = CGM.getIntrinsic(Intrinsic::arm_mcrr2); 4357 break; 4358 } 4359 4360 // MCRR{2} instruction has 5 operands but 4361 // the intrinsic has 4 because Rt and Rt2 4362 // are represented as a single unsigned 64 4363 // bit integer in the intrinsic definition 4364 // but internally it's represented as 2 32 4365 // bit integers. 4366 4367 Value *Coproc = EmitScalarExpr(E->getArg(0)); 4368 Value *Opc1 = EmitScalarExpr(E->getArg(1)); 4369 Value *RtAndRt2 = EmitScalarExpr(E->getArg(2)); 4370 Value *CRm = EmitScalarExpr(E->getArg(3)); 4371 4372 Value *C1 = llvm::ConstantInt::get(Int64Ty, 32); 4373 Value *Rt = Builder.CreateTruncOrBitCast(RtAndRt2, Int32Ty); 4374 Value *Rt2 = Builder.CreateLShr(RtAndRt2, C1); 4375 Rt2 = Builder.CreateTruncOrBitCast(Rt2, Int32Ty); 4376 4377 return Builder.CreateCall(F, {Coproc, Opc1, Rt, Rt2, CRm}); 4378 } 4379 4380 if (BuiltinID == ARM::BI__builtin_arm_mrrc || 4381 BuiltinID == ARM::BI__builtin_arm_mrrc2) { 4382 Function *F; 4383 4384 switch (BuiltinID) { 4385 default: llvm_unreachable("unexpected builtin"); 4386 case ARM::BI__builtin_arm_mrrc: 4387 F = CGM.getIntrinsic(Intrinsic::arm_mrrc); 4388 break; 4389 case ARM::BI__builtin_arm_mrrc2: 4390 F = CGM.getIntrinsic(Intrinsic::arm_mrrc2); 4391 break; 4392 } 4393 4394 Value *Coproc = EmitScalarExpr(E->getArg(0)); 4395 Value *Opc1 = EmitScalarExpr(E->getArg(1)); 4396 Value *CRm = EmitScalarExpr(E->getArg(2)); 4397 Value *RtAndRt2 = Builder.CreateCall(F, {Coproc, Opc1, CRm}); 4398 4399 // Returns an unsigned 64 bit integer, represented 4400 // as two 32 bit integers. 4401 4402 Value *Rt = Builder.CreateExtractValue(RtAndRt2, 1); 4403 Value *Rt1 = Builder.CreateExtractValue(RtAndRt2, 0); 4404 Rt = Builder.CreateZExt(Rt, Int64Ty); 4405 Rt1 = Builder.CreateZExt(Rt1, Int64Ty); 4406 4407 Value *ShiftCast = llvm::ConstantInt::get(Int64Ty, 32); 4408 RtAndRt2 = Builder.CreateShl(Rt, ShiftCast, "shl", true); 4409 RtAndRt2 = Builder.CreateOr(RtAndRt2, Rt1); 4410 4411 return Builder.CreateBitCast(RtAndRt2, ConvertType(E->getType())); 4412 } 4413 4414 if (BuiltinID == ARM::BI__builtin_arm_ldrexd || 4415 ((BuiltinID == ARM::BI__builtin_arm_ldrex || 4416 BuiltinID == ARM::BI__builtin_arm_ldaex) && 4417 getContext().getTypeSize(E->getType()) == 64) || 4418 BuiltinID == ARM::BI__ldrexd) { 4419 Function *F; 4420 4421 switch (BuiltinID) { 4422 default: llvm_unreachable("unexpected builtin"); 4423 case ARM::BI__builtin_arm_ldaex: 4424 F = CGM.getIntrinsic(Intrinsic::arm_ldaexd); 4425 break; 4426 case ARM::BI__builtin_arm_ldrexd: 4427 case ARM::BI__builtin_arm_ldrex: 4428 case ARM::BI__ldrexd: 4429 F = CGM.getIntrinsic(Intrinsic::arm_ldrexd); 4430 break; 4431 } 4432 4433 Value *LdPtr = EmitScalarExpr(E->getArg(0)); 4434 Value *Val = Builder.CreateCall(F, Builder.CreateBitCast(LdPtr, Int8PtrTy), 4435 "ldrexd"); 4436 4437 Value *Val0 = Builder.CreateExtractValue(Val, 1); 4438 Value *Val1 = Builder.CreateExtractValue(Val, 0); 4439 Val0 = Builder.CreateZExt(Val0, Int64Ty); 4440 Val1 = Builder.CreateZExt(Val1, Int64Ty); 4441 4442 Value *ShiftCst = llvm::ConstantInt::get(Int64Ty, 32); 4443 Val = Builder.CreateShl(Val0, ShiftCst, "shl", true /* nuw */); 4444 Val = Builder.CreateOr(Val, Val1); 4445 return Builder.CreateBitCast(Val, ConvertType(E->getType())); 4446 } 4447 4448 if (BuiltinID == ARM::BI__builtin_arm_ldrex || 4449 BuiltinID == ARM::BI__builtin_arm_ldaex) { 4450 Value *LoadAddr = EmitScalarExpr(E->getArg(0)); 4451 4452 QualType Ty = E->getType(); 4453 llvm::Type *RealResTy = ConvertType(Ty); 4454 llvm::Type *IntResTy = llvm::IntegerType::get(getLLVMContext(), 4455 getContext().getTypeSize(Ty)); 4456 LoadAddr = Builder.CreateBitCast(LoadAddr, IntResTy->getPointerTo()); 4457 4458 Function *F = CGM.getIntrinsic(BuiltinID == ARM::BI__builtin_arm_ldaex 4459 ? Intrinsic::arm_ldaex 4460 : Intrinsic::arm_ldrex, 4461 LoadAddr->getType()); 4462 Value *Val = Builder.CreateCall(F, LoadAddr, "ldrex"); 4463 4464 if (RealResTy->isPointerTy()) 4465 return Builder.CreateIntToPtr(Val, RealResTy); 4466 else { 4467 Val = Builder.CreateTruncOrBitCast(Val, IntResTy); 4468 return Builder.CreateBitCast(Val, RealResTy); 4469 } 4470 } 4471 4472 if (BuiltinID == ARM::BI__builtin_arm_strexd || 4473 ((BuiltinID == ARM::BI__builtin_arm_stlex || 4474 BuiltinID == ARM::BI__builtin_arm_strex) && 4475 getContext().getTypeSize(E->getArg(0)->getType()) == 64)) { 4476 Function *F = CGM.getIntrinsic(BuiltinID == ARM::BI__builtin_arm_stlex 4477 ? Intrinsic::arm_stlexd 4478 : Intrinsic::arm_strexd); 4479 llvm::Type *STy = llvm::StructType::get(Int32Ty, Int32Ty, nullptr); 4480 4481 Address Tmp = CreateMemTemp(E->getArg(0)->getType()); 4482 Value *Val = EmitScalarExpr(E->getArg(0)); 4483 Builder.CreateStore(Val, Tmp); 4484 4485 Address LdPtr = Builder.CreateBitCast(Tmp,llvm::PointerType::getUnqual(STy)); 4486 Val = Builder.CreateLoad(LdPtr); 4487 4488 Value *Arg0 = Builder.CreateExtractValue(Val, 0); 4489 Value *Arg1 = Builder.CreateExtractValue(Val, 1); 4490 Value *StPtr = Builder.CreateBitCast(EmitScalarExpr(E->getArg(1)), Int8PtrTy); 4491 return Builder.CreateCall(F, {Arg0, Arg1, StPtr}, "strexd"); 4492 } 4493 4494 if (BuiltinID == ARM::BI__builtin_arm_strex || 4495 BuiltinID == ARM::BI__builtin_arm_stlex) { 4496 Value *StoreVal = EmitScalarExpr(E->getArg(0)); 4497 Value *StoreAddr = EmitScalarExpr(E->getArg(1)); 4498 4499 QualType Ty = E->getArg(0)->getType(); 4500 llvm::Type *StoreTy = llvm::IntegerType::get(getLLVMContext(), 4501 getContext().getTypeSize(Ty)); 4502 StoreAddr = Builder.CreateBitCast(StoreAddr, StoreTy->getPointerTo()); 4503 4504 if (StoreVal->getType()->isPointerTy()) 4505 StoreVal = Builder.CreatePtrToInt(StoreVal, Int32Ty); 4506 else { 4507 StoreVal = Builder.CreateBitCast(StoreVal, StoreTy); 4508 StoreVal = Builder.CreateZExtOrBitCast(StoreVal, Int32Ty); 4509 } 4510 4511 Function *F = CGM.getIntrinsic(BuiltinID == ARM::BI__builtin_arm_stlex 4512 ? Intrinsic::arm_stlex 4513 : Intrinsic::arm_strex, 4514 StoreAddr->getType()); 4515 return Builder.CreateCall(F, {StoreVal, StoreAddr}, "strex"); 4516 } 4517 4518 switch (BuiltinID) { 4519 case ARM::BI__iso_volatile_load8: 4520 case ARM::BI__iso_volatile_load16: 4521 case ARM::BI__iso_volatile_load32: 4522 case ARM::BI__iso_volatile_load64: { 4523 Value *Ptr = EmitScalarExpr(E->getArg(0)); 4524 QualType ElTy = E->getArg(0)->getType()->getPointeeType(); 4525 CharUnits LoadSize = getContext().getTypeSizeInChars(ElTy); 4526 llvm::Type *ITy = llvm::IntegerType::get(getLLVMContext(), 4527 LoadSize.getQuantity() * 8); 4528 Ptr = Builder.CreateBitCast(Ptr, ITy->getPointerTo()); 4529 llvm::LoadInst *Load = 4530 Builder.CreateAlignedLoad(Ptr, LoadSize); 4531 Load->setVolatile(true); 4532 return Load; 4533 } 4534 case ARM::BI__iso_volatile_store8: 4535 case ARM::BI__iso_volatile_store16: 4536 case ARM::BI__iso_volatile_store32: 4537 case ARM::BI__iso_volatile_store64: { 4538 Value *Ptr = EmitScalarExpr(E->getArg(0)); 4539 Value *Value = EmitScalarExpr(E->getArg(1)); 4540 QualType ElTy = E->getArg(0)->getType()->getPointeeType(); 4541 CharUnits StoreSize = getContext().getTypeSizeInChars(ElTy); 4542 llvm::Type *ITy = llvm::IntegerType::get(getLLVMContext(), 4543 StoreSize.getQuantity() * 8); 4544 Ptr = Builder.CreateBitCast(Ptr, ITy->getPointerTo()); 4545 llvm::StoreInst *Store = 4546 Builder.CreateAlignedStore(Value, Ptr, 4547 StoreSize); 4548 Store->setVolatile(true); 4549 return Store; 4550 } 4551 } 4552 4553 if (BuiltinID == ARM::BI__builtin_arm_clrex) { 4554 Function *F = CGM.getIntrinsic(Intrinsic::arm_clrex); 4555 return Builder.CreateCall(F); 4556 } 4557 4558 // CRC32 4559 Intrinsic::ID CRCIntrinsicID = Intrinsic::not_intrinsic; 4560 switch (BuiltinID) { 4561 case ARM::BI__builtin_arm_crc32b: 4562 CRCIntrinsicID = Intrinsic::arm_crc32b; break; 4563 case ARM::BI__builtin_arm_crc32cb: 4564 CRCIntrinsicID = Intrinsic::arm_crc32cb; break; 4565 case ARM::BI__builtin_arm_crc32h: 4566 CRCIntrinsicID = Intrinsic::arm_crc32h; break; 4567 case ARM::BI__builtin_arm_crc32ch: 4568 CRCIntrinsicID = Intrinsic::arm_crc32ch; break; 4569 case ARM::BI__builtin_arm_crc32w: 4570 case ARM::BI__builtin_arm_crc32d: 4571 CRCIntrinsicID = Intrinsic::arm_crc32w; break; 4572 case ARM::BI__builtin_arm_crc32cw: 4573 case ARM::BI__builtin_arm_crc32cd: 4574 CRCIntrinsicID = Intrinsic::arm_crc32cw; break; 4575 } 4576 4577 if (CRCIntrinsicID != Intrinsic::not_intrinsic) { 4578 Value *Arg0 = EmitScalarExpr(E->getArg(0)); 4579 Value *Arg1 = EmitScalarExpr(E->getArg(1)); 4580 4581 // crc32{c,}d intrinsics are implemnted as two calls to crc32{c,}w 4582 // intrinsics, hence we need different codegen for these cases. 4583 if (BuiltinID == ARM::BI__builtin_arm_crc32d || 4584 BuiltinID == ARM::BI__builtin_arm_crc32cd) { 4585 Value *C1 = llvm::ConstantInt::get(Int64Ty, 32); 4586 Value *Arg1a = Builder.CreateTruncOrBitCast(Arg1, Int32Ty); 4587 Value *Arg1b = Builder.CreateLShr(Arg1, C1); 4588 Arg1b = Builder.CreateTruncOrBitCast(Arg1b, Int32Ty); 4589 4590 Function *F = CGM.getIntrinsic(CRCIntrinsicID); 4591 Value *Res = Builder.CreateCall(F, {Arg0, Arg1a}); 4592 return Builder.CreateCall(F, {Res, Arg1b}); 4593 } else { 4594 Arg1 = Builder.CreateZExtOrBitCast(Arg1, Int32Ty); 4595 4596 Function *F = CGM.getIntrinsic(CRCIntrinsicID); 4597 return Builder.CreateCall(F, {Arg0, Arg1}); 4598 } 4599 } 4600 4601 if (BuiltinID == ARM::BI__builtin_arm_rsr || 4602 BuiltinID == ARM::BI__builtin_arm_rsr64 || 4603 BuiltinID == ARM::BI__builtin_arm_rsrp || 4604 BuiltinID == ARM::BI__builtin_arm_wsr || 4605 BuiltinID == ARM::BI__builtin_arm_wsr64 || 4606 BuiltinID == ARM::BI__builtin_arm_wsrp) { 4607 4608 bool IsRead = BuiltinID == ARM::BI__builtin_arm_rsr || 4609 BuiltinID == ARM::BI__builtin_arm_rsr64 || 4610 BuiltinID == ARM::BI__builtin_arm_rsrp; 4611 4612 bool IsPointerBuiltin = BuiltinID == ARM::BI__builtin_arm_rsrp || 4613 BuiltinID == ARM::BI__builtin_arm_wsrp; 4614 4615 bool Is64Bit = BuiltinID == ARM::BI__builtin_arm_rsr64 || 4616 BuiltinID == ARM::BI__builtin_arm_wsr64; 4617 4618 llvm::Type *ValueType; 4619 llvm::Type *RegisterType; 4620 if (IsPointerBuiltin) { 4621 ValueType = VoidPtrTy; 4622 RegisterType = Int32Ty; 4623 } else if (Is64Bit) { 4624 ValueType = RegisterType = Int64Ty; 4625 } else { 4626 ValueType = RegisterType = Int32Ty; 4627 } 4628 4629 return EmitSpecialRegisterBuiltin(*this, E, RegisterType, ValueType, IsRead); 4630 } 4631 4632 // Find out if any arguments are required to be integer constant 4633 // expressions. 4634 unsigned ICEArguments = 0; 4635 ASTContext::GetBuiltinTypeError Error; 4636 getContext().GetBuiltinType(BuiltinID, Error, &ICEArguments); 4637 assert(Error == ASTContext::GE_None && "Should not codegen an error"); 4638 4639 auto getAlignmentValue32 = [&](Address addr) -> Value* { 4640 return Builder.getInt32(addr.getAlignment().getQuantity()); 4641 }; 4642 4643 Address PtrOp0 = Address::invalid(); 4644 Address PtrOp1 = Address::invalid(); 4645 SmallVector<Value*, 4> Ops; 4646 bool HasExtraArg = HasExtraNeonArgument(BuiltinID); 4647 unsigned NumArgs = E->getNumArgs() - (HasExtraArg ? 1 : 0); 4648 for (unsigned i = 0, e = NumArgs; i != e; i++) { 4649 if (i == 0) { 4650 switch (BuiltinID) { 4651 case NEON::BI__builtin_neon_vld1_v: 4652 case NEON::BI__builtin_neon_vld1q_v: 4653 case NEON::BI__builtin_neon_vld1q_lane_v: 4654 case NEON::BI__builtin_neon_vld1_lane_v: 4655 case NEON::BI__builtin_neon_vld1_dup_v: 4656 case NEON::BI__builtin_neon_vld1q_dup_v: 4657 case NEON::BI__builtin_neon_vst1_v: 4658 case NEON::BI__builtin_neon_vst1q_v: 4659 case NEON::BI__builtin_neon_vst1q_lane_v: 4660 case NEON::BI__builtin_neon_vst1_lane_v: 4661 case NEON::BI__builtin_neon_vst2_v: 4662 case NEON::BI__builtin_neon_vst2q_v: 4663 case NEON::BI__builtin_neon_vst2_lane_v: 4664 case NEON::BI__builtin_neon_vst2q_lane_v: 4665 case NEON::BI__builtin_neon_vst3_v: 4666 case NEON::BI__builtin_neon_vst3q_v: 4667 case NEON::BI__builtin_neon_vst3_lane_v: 4668 case NEON::BI__builtin_neon_vst3q_lane_v: 4669 case NEON::BI__builtin_neon_vst4_v: 4670 case NEON::BI__builtin_neon_vst4q_v: 4671 case NEON::BI__builtin_neon_vst4_lane_v: 4672 case NEON::BI__builtin_neon_vst4q_lane_v: 4673 // Get the alignment for the argument in addition to the value; 4674 // we'll use it later. 4675 PtrOp0 = EmitPointerWithAlignment(E->getArg(0)); 4676 Ops.push_back(PtrOp0.getPointer()); 4677 continue; 4678 } 4679 } 4680 if (i == 1) { 4681 switch (BuiltinID) { 4682 case NEON::BI__builtin_neon_vld2_v: 4683 case NEON::BI__builtin_neon_vld2q_v: 4684 case NEON::BI__builtin_neon_vld3_v: 4685 case NEON::BI__builtin_neon_vld3q_v: 4686 case NEON::BI__builtin_neon_vld4_v: 4687 case NEON::BI__builtin_neon_vld4q_v: 4688 case NEON::BI__builtin_neon_vld2_lane_v: 4689 case NEON::BI__builtin_neon_vld2q_lane_v: 4690 case NEON::BI__builtin_neon_vld3_lane_v: 4691 case NEON::BI__builtin_neon_vld3q_lane_v: 4692 case NEON::BI__builtin_neon_vld4_lane_v: 4693 case NEON::BI__builtin_neon_vld4q_lane_v: 4694 case NEON::BI__builtin_neon_vld2_dup_v: 4695 case NEON::BI__builtin_neon_vld3_dup_v: 4696 case NEON::BI__builtin_neon_vld4_dup_v: 4697 // Get the alignment for the argument in addition to the value; 4698 // we'll use it later. 4699 PtrOp1 = EmitPointerWithAlignment(E->getArg(1)); 4700 Ops.push_back(PtrOp1.getPointer()); 4701 continue; 4702 } 4703 } 4704 4705 if ((ICEArguments & (1 << i)) == 0) { 4706 Ops.push_back(EmitScalarExpr(E->getArg(i))); 4707 } else { 4708 // If this is required to be a constant, constant fold it so that we know 4709 // that the generated intrinsic gets a ConstantInt. 4710 llvm::APSInt Result; 4711 bool IsConst = E->getArg(i)->isIntegerConstantExpr(Result, getContext()); 4712 assert(IsConst && "Constant arg isn't actually constant?"); (void)IsConst; 4713 Ops.push_back(llvm::ConstantInt::get(getLLVMContext(), Result)); 4714 } 4715 } 4716 4717 switch (BuiltinID) { 4718 default: break; 4719 4720 case NEON::BI__builtin_neon_vget_lane_i8: 4721 case NEON::BI__builtin_neon_vget_lane_i16: 4722 case NEON::BI__builtin_neon_vget_lane_i32: 4723 case NEON::BI__builtin_neon_vget_lane_i64: 4724 case NEON::BI__builtin_neon_vget_lane_f32: 4725 case NEON::BI__builtin_neon_vgetq_lane_i8: 4726 case NEON::BI__builtin_neon_vgetq_lane_i16: 4727 case NEON::BI__builtin_neon_vgetq_lane_i32: 4728 case NEON::BI__builtin_neon_vgetq_lane_i64: 4729 case NEON::BI__builtin_neon_vgetq_lane_f32: 4730 return Builder.CreateExtractElement(Ops[0], Ops[1], "vget_lane"); 4731 4732 case NEON::BI__builtin_neon_vset_lane_i8: 4733 case NEON::BI__builtin_neon_vset_lane_i16: 4734 case NEON::BI__builtin_neon_vset_lane_i32: 4735 case NEON::BI__builtin_neon_vset_lane_i64: 4736 case NEON::BI__builtin_neon_vset_lane_f32: 4737 case NEON::BI__builtin_neon_vsetq_lane_i8: 4738 case NEON::BI__builtin_neon_vsetq_lane_i16: 4739 case NEON::BI__builtin_neon_vsetq_lane_i32: 4740 case NEON::BI__builtin_neon_vsetq_lane_i64: 4741 case NEON::BI__builtin_neon_vsetq_lane_f32: 4742 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vset_lane"); 4743 4744 case NEON::BI__builtin_neon_vsha1h_u32: 4745 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_sha1h), Ops, 4746 "vsha1h"); 4747 case NEON::BI__builtin_neon_vsha1cq_u32: 4748 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_sha1c), Ops, 4749 "vsha1h"); 4750 case NEON::BI__builtin_neon_vsha1pq_u32: 4751 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_sha1p), Ops, 4752 "vsha1h"); 4753 case NEON::BI__builtin_neon_vsha1mq_u32: 4754 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_sha1m), Ops, 4755 "vsha1h"); 4756 4757 // The ARM _MoveToCoprocessor builtins put the input register value as 4758 // the first argument, but the LLVM intrinsic expects it as the third one. 4759 case ARM::BI_MoveToCoprocessor: 4760 case ARM::BI_MoveToCoprocessor2: { 4761 Function *F = CGM.getIntrinsic(BuiltinID == ARM::BI_MoveToCoprocessor ? 4762 Intrinsic::arm_mcr : Intrinsic::arm_mcr2); 4763 return Builder.CreateCall(F, {Ops[1], Ops[2], Ops[0], 4764 Ops[3], Ops[4], Ops[5]}); 4765 } 4766 case ARM::BI_BitScanForward: 4767 case ARM::BI_BitScanForward64: 4768 return EmitMSVCBuiltinExpr(MSVCIntrin::_BitScanForward, E); 4769 case ARM::BI_BitScanReverse: 4770 case ARM::BI_BitScanReverse64: 4771 return EmitMSVCBuiltinExpr(MSVCIntrin::_BitScanReverse, E); 4772 4773 case ARM::BI_InterlockedAnd64: 4774 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedAnd, E); 4775 case ARM::BI_InterlockedExchange64: 4776 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchange, E); 4777 case ARM::BI_InterlockedExchangeAdd64: 4778 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeAdd, E); 4779 case ARM::BI_InterlockedExchangeSub64: 4780 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeSub, E); 4781 case ARM::BI_InterlockedOr64: 4782 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedOr, E); 4783 case ARM::BI_InterlockedXor64: 4784 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedXor, E); 4785 case ARM::BI_InterlockedDecrement64: 4786 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedDecrement, E); 4787 case ARM::BI_InterlockedIncrement64: 4788 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedIncrement, E); 4789 } 4790 4791 // Get the last argument, which specifies the vector type. 4792 assert(HasExtraArg); 4793 llvm::APSInt Result; 4794 const Expr *Arg = E->getArg(E->getNumArgs()-1); 4795 if (!Arg->isIntegerConstantExpr(Result, getContext())) 4796 return nullptr; 4797 4798 if (BuiltinID == ARM::BI__builtin_arm_vcvtr_f || 4799 BuiltinID == ARM::BI__builtin_arm_vcvtr_d) { 4800 // Determine the overloaded type of this builtin. 4801 llvm::Type *Ty; 4802 if (BuiltinID == ARM::BI__builtin_arm_vcvtr_f) 4803 Ty = FloatTy; 4804 else 4805 Ty = DoubleTy; 4806 4807 // Determine whether this is an unsigned conversion or not. 4808 bool usgn = Result.getZExtValue() == 1; 4809 unsigned Int = usgn ? Intrinsic::arm_vcvtru : Intrinsic::arm_vcvtr; 4810 4811 // Call the appropriate intrinsic. 4812 Function *F = CGM.getIntrinsic(Int, Ty); 4813 return Builder.CreateCall(F, Ops, "vcvtr"); 4814 } 4815 4816 // Determine the type of this overloaded NEON intrinsic. 4817 NeonTypeFlags Type(Result.getZExtValue()); 4818 bool usgn = Type.isUnsigned(); 4819 bool rightShift = false; 4820 4821 llvm::VectorType *VTy = GetNeonType(this, Type); 4822 llvm::Type *Ty = VTy; 4823 if (!Ty) 4824 return nullptr; 4825 4826 // Many NEON builtins have identical semantics and uses in ARM and 4827 // AArch64. Emit these in a single function. 4828 auto IntrinsicMap = makeArrayRef(ARMSIMDIntrinsicMap); 4829 const NeonIntrinsicInfo *Builtin = findNeonIntrinsicInMap( 4830 IntrinsicMap, BuiltinID, NEONSIMDIntrinsicsProvenSorted); 4831 if (Builtin) 4832 return EmitCommonNeonBuiltinExpr( 4833 Builtin->BuiltinID, Builtin->LLVMIntrinsic, Builtin->AltLLVMIntrinsic, 4834 Builtin->NameHint, Builtin->TypeModifier, E, Ops, PtrOp0, PtrOp1); 4835 4836 unsigned Int; 4837 switch (BuiltinID) { 4838 default: return nullptr; 4839 case NEON::BI__builtin_neon_vld1q_lane_v: 4840 // Handle 64-bit integer elements as a special case. Use shuffles of 4841 // one-element vectors to avoid poor code for i64 in the backend. 4842 if (VTy->getElementType()->isIntegerTy(64)) { 4843 // Extract the other lane. 4844 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 4845 uint32_t Lane = cast<ConstantInt>(Ops[2])->getZExtValue(); 4846 Value *SV = llvm::ConstantVector::get(ConstantInt::get(Int32Ty, 1-Lane)); 4847 Ops[1] = Builder.CreateShuffleVector(Ops[1], Ops[1], SV); 4848 // Load the value as a one-element vector. 4849 Ty = llvm::VectorType::get(VTy->getElementType(), 1); 4850 llvm::Type *Tys[] = {Ty, Int8PtrTy}; 4851 Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld1, Tys); 4852 Value *Align = getAlignmentValue32(PtrOp0); 4853 Value *Ld = Builder.CreateCall(F, {Ops[0], Align}); 4854 // Combine them. 4855 uint32_t Indices[] = {1 - Lane, Lane}; 4856 SV = llvm::ConstantDataVector::get(getLLVMContext(), Indices); 4857 return Builder.CreateShuffleVector(Ops[1], Ld, SV, "vld1q_lane"); 4858 } 4859 // fall through 4860 case NEON::BI__builtin_neon_vld1_lane_v: { 4861 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 4862 PtrOp0 = Builder.CreateElementBitCast(PtrOp0, VTy->getElementType()); 4863 Value *Ld = Builder.CreateLoad(PtrOp0); 4864 return Builder.CreateInsertElement(Ops[1], Ld, Ops[2], "vld1_lane"); 4865 } 4866 case NEON::BI__builtin_neon_vld2_dup_v: 4867 case NEON::BI__builtin_neon_vld3_dup_v: 4868 case NEON::BI__builtin_neon_vld4_dup_v: { 4869 // Handle 64-bit elements as a special-case. There is no "dup" needed. 4870 if (VTy->getElementType()->getPrimitiveSizeInBits() == 64) { 4871 switch (BuiltinID) { 4872 case NEON::BI__builtin_neon_vld2_dup_v: 4873 Int = Intrinsic::arm_neon_vld2; 4874 break; 4875 case NEON::BI__builtin_neon_vld3_dup_v: 4876 Int = Intrinsic::arm_neon_vld3; 4877 break; 4878 case NEON::BI__builtin_neon_vld4_dup_v: 4879 Int = Intrinsic::arm_neon_vld4; 4880 break; 4881 default: llvm_unreachable("unknown vld_dup intrinsic?"); 4882 } 4883 llvm::Type *Tys[] = {Ty, Int8PtrTy}; 4884 Function *F = CGM.getIntrinsic(Int, Tys); 4885 llvm::Value *Align = getAlignmentValue32(PtrOp1); 4886 Ops[1] = Builder.CreateCall(F, {Ops[1], Align}, "vld_dup"); 4887 Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); 4888 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 4889 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 4890 } 4891 switch (BuiltinID) { 4892 case NEON::BI__builtin_neon_vld2_dup_v: 4893 Int = Intrinsic::arm_neon_vld2lane; 4894 break; 4895 case NEON::BI__builtin_neon_vld3_dup_v: 4896 Int = Intrinsic::arm_neon_vld3lane; 4897 break; 4898 case NEON::BI__builtin_neon_vld4_dup_v: 4899 Int = Intrinsic::arm_neon_vld4lane; 4900 break; 4901 default: llvm_unreachable("unknown vld_dup intrinsic?"); 4902 } 4903 llvm::Type *Tys[] = {Ty, Int8PtrTy}; 4904 Function *F = CGM.getIntrinsic(Int, Tys); 4905 llvm::StructType *STy = cast<llvm::StructType>(F->getReturnType()); 4906 4907 SmallVector<Value*, 6> Args; 4908 Args.push_back(Ops[1]); 4909 Args.append(STy->getNumElements(), UndefValue::get(Ty)); 4910 4911 llvm::Constant *CI = ConstantInt::get(Int32Ty, 0); 4912 Args.push_back(CI); 4913 Args.push_back(getAlignmentValue32(PtrOp1)); 4914 4915 Ops[1] = Builder.CreateCall(F, Args, "vld_dup"); 4916 // splat lane 0 to all elts in each vector of the result. 4917 for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) { 4918 Value *Val = Builder.CreateExtractValue(Ops[1], i); 4919 Value *Elt = Builder.CreateBitCast(Val, Ty); 4920 Elt = EmitNeonSplat(Elt, CI); 4921 Elt = Builder.CreateBitCast(Elt, Val->getType()); 4922 Ops[1] = Builder.CreateInsertValue(Ops[1], Elt, i); 4923 } 4924 Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); 4925 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 4926 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 4927 } 4928 case NEON::BI__builtin_neon_vqrshrn_n_v: 4929 Int = 4930 usgn ? Intrinsic::arm_neon_vqrshiftnu : Intrinsic::arm_neon_vqrshiftns; 4931 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqrshrn_n", 4932 1, true); 4933 case NEON::BI__builtin_neon_vqrshrun_n_v: 4934 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqrshiftnsu, Ty), 4935 Ops, "vqrshrun_n", 1, true); 4936 case NEON::BI__builtin_neon_vqshrn_n_v: 4937 Int = usgn ? Intrinsic::arm_neon_vqshiftnu : Intrinsic::arm_neon_vqshiftns; 4938 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshrn_n", 4939 1, true); 4940 case NEON::BI__builtin_neon_vqshrun_n_v: 4941 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqshiftnsu, Ty), 4942 Ops, "vqshrun_n", 1, true); 4943 case NEON::BI__builtin_neon_vrecpe_v: 4944 case NEON::BI__builtin_neon_vrecpeq_v: 4945 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrecpe, Ty), 4946 Ops, "vrecpe"); 4947 case NEON::BI__builtin_neon_vrshrn_n_v: 4948 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrshiftn, Ty), 4949 Ops, "vrshrn_n", 1, true); 4950 case NEON::BI__builtin_neon_vrsra_n_v: 4951 case NEON::BI__builtin_neon_vrsraq_n_v: 4952 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 4953 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 4954 Ops[2] = EmitNeonShiftVector(Ops[2], Ty, true); 4955 Int = usgn ? Intrinsic::arm_neon_vrshiftu : Intrinsic::arm_neon_vrshifts; 4956 Ops[1] = Builder.CreateCall(CGM.getIntrinsic(Int, Ty), {Ops[1], Ops[2]}); 4957 return Builder.CreateAdd(Ops[0], Ops[1], "vrsra_n"); 4958 case NEON::BI__builtin_neon_vsri_n_v: 4959 case NEON::BI__builtin_neon_vsriq_n_v: 4960 rightShift = true; 4961 case NEON::BI__builtin_neon_vsli_n_v: 4962 case NEON::BI__builtin_neon_vsliq_n_v: 4963 Ops[2] = EmitNeonShiftVector(Ops[2], Ty, rightShift); 4964 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vshiftins, Ty), 4965 Ops, "vsli_n"); 4966 case NEON::BI__builtin_neon_vsra_n_v: 4967 case NEON::BI__builtin_neon_vsraq_n_v: 4968 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 4969 Ops[1] = EmitNeonRShiftImm(Ops[1], Ops[2], Ty, usgn, "vsra_n"); 4970 return Builder.CreateAdd(Ops[0], Ops[1]); 4971 case NEON::BI__builtin_neon_vst1q_lane_v: 4972 // Handle 64-bit integer elements as a special case. Use a shuffle to get 4973 // a one-element vector and avoid poor code for i64 in the backend. 4974 if (VTy->getElementType()->isIntegerTy(64)) { 4975 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 4976 Value *SV = llvm::ConstantVector::get(cast<llvm::Constant>(Ops[2])); 4977 Ops[1] = Builder.CreateShuffleVector(Ops[1], Ops[1], SV); 4978 Ops[2] = getAlignmentValue32(PtrOp0); 4979 llvm::Type *Tys[] = {Int8PtrTy, Ops[1]->getType()}; 4980 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst1, 4981 Tys), Ops); 4982 } 4983 // fall through 4984 case NEON::BI__builtin_neon_vst1_lane_v: { 4985 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 4986 Ops[1] = Builder.CreateExtractElement(Ops[1], Ops[2]); 4987 Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); 4988 auto St = Builder.CreateStore(Ops[1], Builder.CreateBitCast(PtrOp0, Ty)); 4989 return St; 4990 } 4991 case NEON::BI__builtin_neon_vtbl1_v: 4992 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl1), 4993 Ops, "vtbl1"); 4994 case NEON::BI__builtin_neon_vtbl2_v: 4995 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl2), 4996 Ops, "vtbl2"); 4997 case NEON::BI__builtin_neon_vtbl3_v: 4998 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl3), 4999 Ops, "vtbl3"); 5000 case NEON::BI__builtin_neon_vtbl4_v: 5001 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl4), 5002 Ops, "vtbl4"); 5003 case NEON::BI__builtin_neon_vtbx1_v: 5004 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx1), 5005 Ops, "vtbx1"); 5006 case NEON::BI__builtin_neon_vtbx2_v: 5007 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx2), 5008 Ops, "vtbx2"); 5009 case NEON::BI__builtin_neon_vtbx3_v: 5010 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx3), 5011 Ops, "vtbx3"); 5012 case NEON::BI__builtin_neon_vtbx4_v: 5013 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx4), 5014 Ops, "vtbx4"); 5015 } 5016 } 5017 5018 static Value *EmitAArch64TblBuiltinExpr(CodeGenFunction &CGF, unsigned BuiltinID, 5019 const CallExpr *E, 5020 SmallVectorImpl<Value *> &Ops) { 5021 unsigned int Int = 0; 5022 const char *s = nullptr; 5023 5024 switch (BuiltinID) { 5025 default: 5026 return nullptr; 5027 case NEON::BI__builtin_neon_vtbl1_v: 5028 case NEON::BI__builtin_neon_vqtbl1_v: 5029 case NEON::BI__builtin_neon_vqtbl1q_v: 5030 case NEON::BI__builtin_neon_vtbl2_v: 5031 case NEON::BI__builtin_neon_vqtbl2_v: 5032 case NEON::BI__builtin_neon_vqtbl2q_v: 5033 case NEON::BI__builtin_neon_vtbl3_v: 5034 case NEON::BI__builtin_neon_vqtbl3_v: 5035 case NEON::BI__builtin_neon_vqtbl3q_v: 5036 case NEON::BI__builtin_neon_vtbl4_v: 5037 case NEON::BI__builtin_neon_vqtbl4_v: 5038 case NEON::BI__builtin_neon_vqtbl4q_v: 5039 break; 5040 case NEON::BI__builtin_neon_vtbx1_v: 5041 case NEON::BI__builtin_neon_vqtbx1_v: 5042 case NEON::BI__builtin_neon_vqtbx1q_v: 5043 case NEON::BI__builtin_neon_vtbx2_v: 5044 case NEON::BI__builtin_neon_vqtbx2_v: 5045 case NEON::BI__builtin_neon_vqtbx2q_v: 5046 case NEON::BI__builtin_neon_vtbx3_v: 5047 case NEON::BI__builtin_neon_vqtbx3_v: 5048 case NEON::BI__builtin_neon_vqtbx3q_v: 5049 case NEON::BI__builtin_neon_vtbx4_v: 5050 case NEON::BI__builtin_neon_vqtbx4_v: 5051 case NEON::BI__builtin_neon_vqtbx4q_v: 5052 break; 5053 } 5054 5055 assert(E->getNumArgs() >= 3); 5056 5057 // Get the last argument, which specifies the vector type. 5058 llvm::APSInt Result; 5059 const Expr *Arg = E->getArg(E->getNumArgs() - 1); 5060 if (!Arg->isIntegerConstantExpr(Result, CGF.getContext())) 5061 return nullptr; 5062 5063 // Determine the type of this overloaded NEON intrinsic. 5064 NeonTypeFlags Type(Result.getZExtValue()); 5065 llvm::VectorType *Ty = GetNeonType(&CGF, Type); 5066 if (!Ty) 5067 return nullptr; 5068 5069 CodeGen::CGBuilderTy &Builder = CGF.Builder; 5070 5071 // AArch64 scalar builtins are not overloaded, they do not have an extra 5072 // argument that specifies the vector type, need to handle each case. 5073 switch (BuiltinID) { 5074 case NEON::BI__builtin_neon_vtbl1_v: { 5075 return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 1), nullptr, 5076 Ops[1], Ty, Intrinsic::aarch64_neon_tbl1, 5077 "vtbl1"); 5078 } 5079 case NEON::BI__builtin_neon_vtbl2_v: { 5080 return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 2), nullptr, 5081 Ops[2], Ty, Intrinsic::aarch64_neon_tbl1, 5082 "vtbl1"); 5083 } 5084 case NEON::BI__builtin_neon_vtbl3_v: { 5085 return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 3), nullptr, 5086 Ops[3], Ty, Intrinsic::aarch64_neon_tbl2, 5087 "vtbl2"); 5088 } 5089 case NEON::BI__builtin_neon_vtbl4_v: { 5090 return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 4), nullptr, 5091 Ops[4], Ty, Intrinsic::aarch64_neon_tbl2, 5092 "vtbl2"); 5093 } 5094 case NEON::BI__builtin_neon_vtbx1_v: { 5095 Value *TblRes = 5096 packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 1), nullptr, Ops[2], 5097 Ty, Intrinsic::aarch64_neon_tbl1, "vtbl1"); 5098 5099 llvm::Constant *EightV = ConstantInt::get(Ty, 8); 5100 Value *CmpRes = Builder.CreateICmp(ICmpInst::ICMP_UGE, Ops[2], EightV); 5101 CmpRes = Builder.CreateSExt(CmpRes, Ty); 5102 5103 Value *EltsFromInput = Builder.CreateAnd(CmpRes, Ops[0]); 5104 Value *EltsFromTbl = Builder.CreateAnd(Builder.CreateNot(CmpRes), TblRes); 5105 return Builder.CreateOr(EltsFromInput, EltsFromTbl, "vtbx"); 5106 } 5107 case NEON::BI__builtin_neon_vtbx2_v: { 5108 return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 2), Ops[0], 5109 Ops[3], Ty, Intrinsic::aarch64_neon_tbx1, 5110 "vtbx1"); 5111 } 5112 case NEON::BI__builtin_neon_vtbx3_v: { 5113 Value *TblRes = 5114 packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 3), nullptr, Ops[4], 5115 Ty, Intrinsic::aarch64_neon_tbl2, "vtbl2"); 5116 5117 llvm::Constant *TwentyFourV = ConstantInt::get(Ty, 24); 5118 Value *CmpRes = Builder.CreateICmp(ICmpInst::ICMP_UGE, Ops[4], 5119 TwentyFourV); 5120 CmpRes = Builder.CreateSExt(CmpRes, Ty); 5121 5122 Value *EltsFromInput = Builder.CreateAnd(CmpRes, Ops[0]); 5123 Value *EltsFromTbl = Builder.CreateAnd(Builder.CreateNot(CmpRes), TblRes); 5124 return Builder.CreateOr(EltsFromInput, EltsFromTbl, "vtbx"); 5125 } 5126 case NEON::BI__builtin_neon_vtbx4_v: { 5127 return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 4), Ops[0], 5128 Ops[5], Ty, Intrinsic::aarch64_neon_tbx2, 5129 "vtbx2"); 5130 } 5131 case NEON::BI__builtin_neon_vqtbl1_v: 5132 case NEON::BI__builtin_neon_vqtbl1q_v: 5133 Int = Intrinsic::aarch64_neon_tbl1; s = "vtbl1"; break; 5134 case NEON::BI__builtin_neon_vqtbl2_v: 5135 case NEON::BI__builtin_neon_vqtbl2q_v: { 5136 Int = Intrinsic::aarch64_neon_tbl2; s = "vtbl2"; break; 5137 case NEON::BI__builtin_neon_vqtbl3_v: 5138 case NEON::BI__builtin_neon_vqtbl3q_v: 5139 Int = Intrinsic::aarch64_neon_tbl3; s = "vtbl3"; break; 5140 case NEON::BI__builtin_neon_vqtbl4_v: 5141 case NEON::BI__builtin_neon_vqtbl4q_v: 5142 Int = Intrinsic::aarch64_neon_tbl4; s = "vtbl4"; break; 5143 case NEON::BI__builtin_neon_vqtbx1_v: 5144 case NEON::BI__builtin_neon_vqtbx1q_v: 5145 Int = Intrinsic::aarch64_neon_tbx1; s = "vtbx1"; break; 5146 case NEON::BI__builtin_neon_vqtbx2_v: 5147 case NEON::BI__builtin_neon_vqtbx2q_v: 5148 Int = Intrinsic::aarch64_neon_tbx2; s = "vtbx2"; break; 5149 case NEON::BI__builtin_neon_vqtbx3_v: 5150 case NEON::BI__builtin_neon_vqtbx3q_v: 5151 Int = Intrinsic::aarch64_neon_tbx3; s = "vtbx3"; break; 5152 case NEON::BI__builtin_neon_vqtbx4_v: 5153 case NEON::BI__builtin_neon_vqtbx4q_v: 5154 Int = Intrinsic::aarch64_neon_tbx4; s = "vtbx4"; break; 5155 } 5156 } 5157 5158 if (!Int) 5159 return nullptr; 5160 5161 Function *F = CGF.CGM.getIntrinsic(Int, Ty); 5162 return CGF.EmitNeonCall(F, Ops, s); 5163 } 5164 5165 Value *CodeGenFunction::vectorWrapScalar16(Value *Op) { 5166 llvm::Type *VTy = llvm::VectorType::get(Int16Ty, 4); 5167 Op = Builder.CreateBitCast(Op, Int16Ty); 5168 Value *V = UndefValue::get(VTy); 5169 llvm::Constant *CI = ConstantInt::get(SizeTy, 0); 5170 Op = Builder.CreateInsertElement(V, Op, CI); 5171 return Op; 5172 } 5173 5174 Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, 5175 const CallExpr *E) { 5176 unsigned HintID = static_cast<unsigned>(-1); 5177 switch (BuiltinID) { 5178 default: break; 5179 case AArch64::BI__builtin_arm_nop: 5180 HintID = 0; 5181 break; 5182 case AArch64::BI__builtin_arm_yield: 5183 HintID = 1; 5184 break; 5185 case AArch64::BI__builtin_arm_wfe: 5186 HintID = 2; 5187 break; 5188 case AArch64::BI__builtin_arm_wfi: 5189 HintID = 3; 5190 break; 5191 case AArch64::BI__builtin_arm_sev: 5192 HintID = 4; 5193 break; 5194 case AArch64::BI__builtin_arm_sevl: 5195 HintID = 5; 5196 break; 5197 } 5198 5199 if (HintID != static_cast<unsigned>(-1)) { 5200 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_hint); 5201 return Builder.CreateCall(F, llvm::ConstantInt::get(Int32Ty, HintID)); 5202 } 5203 5204 if (BuiltinID == AArch64::BI__builtin_arm_prefetch) { 5205 Value *Address = EmitScalarExpr(E->getArg(0)); 5206 Value *RW = EmitScalarExpr(E->getArg(1)); 5207 Value *CacheLevel = EmitScalarExpr(E->getArg(2)); 5208 Value *RetentionPolicy = EmitScalarExpr(E->getArg(3)); 5209 Value *IsData = EmitScalarExpr(E->getArg(4)); 5210 5211 Value *Locality = nullptr; 5212 if (cast<llvm::ConstantInt>(RetentionPolicy)->isZero()) { 5213 // Temporal fetch, needs to convert cache level to locality. 5214 Locality = llvm::ConstantInt::get(Int32Ty, 5215 -cast<llvm::ConstantInt>(CacheLevel)->getValue() + 3); 5216 } else { 5217 // Streaming fetch. 5218 Locality = llvm::ConstantInt::get(Int32Ty, 0); 5219 } 5220 5221 // FIXME: We need AArch64 specific LLVM intrinsic if we want to specify 5222 // PLDL3STRM or PLDL2STRM. 5223 Value *F = CGM.getIntrinsic(Intrinsic::prefetch); 5224 return Builder.CreateCall(F, {Address, RW, Locality, IsData}); 5225 } 5226 5227 if (BuiltinID == AArch64::BI__builtin_arm_rbit) { 5228 assert((getContext().getTypeSize(E->getType()) == 32) && 5229 "rbit of unusual size!"); 5230 llvm::Value *Arg = EmitScalarExpr(E->getArg(0)); 5231 return Builder.CreateCall( 5232 CGM.getIntrinsic(Intrinsic::aarch64_rbit, Arg->getType()), Arg, "rbit"); 5233 } 5234 if (BuiltinID == AArch64::BI__builtin_arm_rbit64) { 5235 assert((getContext().getTypeSize(E->getType()) == 64) && 5236 "rbit of unusual size!"); 5237 llvm::Value *Arg = EmitScalarExpr(E->getArg(0)); 5238 return Builder.CreateCall( 5239 CGM.getIntrinsic(Intrinsic::aarch64_rbit, Arg->getType()), Arg, "rbit"); 5240 } 5241 5242 if (BuiltinID == AArch64::BI__clear_cache) { 5243 assert(E->getNumArgs() == 2 && "__clear_cache takes 2 arguments"); 5244 const FunctionDecl *FD = E->getDirectCallee(); 5245 Value *Ops[2]; 5246 for (unsigned i = 0; i < 2; i++) 5247 Ops[i] = EmitScalarExpr(E->getArg(i)); 5248 llvm::Type *Ty = CGM.getTypes().ConvertType(FD->getType()); 5249 llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty); 5250 StringRef Name = FD->getName(); 5251 return EmitNounwindRuntimeCall(CGM.CreateRuntimeFunction(FTy, Name), Ops); 5252 } 5253 5254 if ((BuiltinID == AArch64::BI__builtin_arm_ldrex || 5255 BuiltinID == AArch64::BI__builtin_arm_ldaex) && 5256 getContext().getTypeSize(E->getType()) == 128) { 5257 Function *F = CGM.getIntrinsic(BuiltinID == AArch64::BI__builtin_arm_ldaex 5258 ? Intrinsic::aarch64_ldaxp 5259 : Intrinsic::aarch64_ldxp); 5260 5261 Value *LdPtr = EmitScalarExpr(E->getArg(0)); 5262 Value *Val = Builder.CreateCall(F, Builder.CreateBitCast(LdPtr, Int8PtrTy), 5263 "ldxp"); 5264 5265 Value *Val0 = Builder.CreateExtractValue(Val, 1); 5266 Value *Val1 = Builder.CreateExtractValue(Val, 0); 5267 llvm::Type *Int128Ty = llvm::IntegerType::get(getLLVMContext(), 128); 5268 Val0 = Builder.CreateZExt(Val0, Int128Ty); 5269 Val1 = Builder.CreateZExt(Val1, Int128Ty); 5270 5271 Value *ShiftCst = llvm::ConstantInt::get(Int128Ty, 64); 5272 Val = Builder.CreateShl(Val0, ShiftCst, "shl", true /* nuw */); 5273 Val = Builder.CreateOr(Val, Val1); 5274 return Builder.CreateBitCast(Val, ConvertType(E->getType())); 5275 } else if (BuiltinID == AArch64::BI__builtin_arm_ldrex || 5276 BuiltinID == AArch64::BI__builtin_arm_ldaex) { 5277 Value *LoadAddr = EmitScalarExpr(E->getArg(0)); 5278 5279 QualType Ty = E->getType(); 5280 llvm::Type *RealResTy = ConvertType(Ty); 5281 llvm::Type *IntResTy = llvm::IntegerType::get(getLLVMContext(), 5282 getContext().getTypeSize(Ty)); 5283 LoadAddr = Builder.CreateBitCast(LoadAddr, IntResTy->getPointerTo()); 5284 5285 Function *F = CGM.getIntrinsic(BuiltinID == AArch64::BI__builtin_arm_ldaex 5286 ? Intrinsic::aarch64_ldaxr 5287 : Intrinsic::aarch64_ldxr, 5288 LoadAddr->getType()); 5289 Value *Val = Builder.CreateCall(F, LoadAddr, "ldxr"); 5290 5291 if (RealResTy->isPointerTy()) 5292 return Builder.CreateIntToPtr(Val, RealResTy); 5293 5294 Val = Builder.CreateTruncOrBitCast(Val, IntResTy); 5295 return Builder.CreateBitCast(Val, RealResTy); 5296 } 5297 5298 if ((BuiltinID == AArch64::BI__builtin_arm_strex || 5299 BuiltinID == AArch64::BI__builtin_arm_stlex) && 5300 getContext().getTypeSize(E->getArg(0)->getType()) == 128) { 5301 Function *F = CGM.getIntrinsic(BuiltinID == AArch64::BI__builtin_arm_stlex 5302 ? Intrinsic::aarch64_stlxp 5303 : Intrinsic::aarch64_stxp); 5304 llvm::Type *STy = llvm::StructType::get(Int64Ty, Int64Ty, nullptr); 5305 5306 Address Tmp = CreateMemTemp(E->getArg(0)->getType()); 5307 EmitAnyExprToMem(E->getArg(0), Tmp, Qualifiers(), /*init*/ true); 5308 5309 Tmp = Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(STy)); 5310 llvm::Value *Val = Builder.CreateLoad(Tmp); 5311 5312 Value *Arg0 = Builder.CreateExtractValue(Val, 0); 5313 Value *Arg1 = Builder.CreateExtractValue(Val, 1); 5314 Value *StPtr = Builder.CreateBitCast(EmitScalarExpr(E->getArg(1)), 5315 Int8PtrTy); 5316 return Builder.CreateCall(F, {Arg0, Arg1, StPtr}, "stxp"); 5317 } 5318 5319 if (BuiltinID == AArch64::BI__builtin_arm_strex || 5320 BuiltinID == AArch64::BI__builtin_arm_stlex) { 5321 Value *StoreVal = EmitScalarExpr(E->getArg(0)); 5322 Value *StoreAddr = EmitScalarExpr(E->getArg(1)); 5323 5324 QualType Ty = E->getArg(0)->getType(); 5325 llvm::Type *StoreTy = llvm::IntegerType::get(getLLVMContext(), 5326 getContext().getTypeSize(Ty)); 5327 StoreAddr = Builder.CreateBitCast(StoreAddr, StoreTy->getPointerTo()); 5328 5329 if (StoreVal->getType()->isPointerTy()) 5330 StoreVal = Builder.CreatePtrToInt(StoreVal, Int64Ty); 5331 else { 5332 StoreVal = Builder.CreateBitCast(StoreVal, StoreTy); 5333 StoreVal = Builder.CreateZExtOrBitCast(StoreVal, Int64Ty); 5334 } 5335 5336 Function *F = CGM.getIntrinsic(BuiltinID == AArch64::BI__builtin_arm_stlex 5337 ? Intrinsic::aarch64_stlxr 5338 : Intrinsic::aarch64_stxr, 5339 StoreAddr->getType()); 5340 return Builder.CreateCall(F, {StoreVal, StoreAddr}, "stxr"); 5341 } 5342 5343 if (BuiltinID == AArch64::BI__builtin_arm_clrex) { 5344 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_clrex); 5345 return Builder.CreateCall(F); 5346 } 5347 5348 // CRC32 5349 Intrinsic::ID CRCIntrinsicID = Intrinsic::not_intrinsic; 5350 switch (BuiltinID) { 5351 case AArch64::BI__builtin_arm_crc32b: 5352 CRCIntrinsicID = Intrinsic::aarch64_crc32b; break; 5353 case AArch64::BI__builtin_arm_crc32cb: 5354 CRCIntrinsicID = Intrinsic::aarch64_crc32cb; break; 5355 case AArch64::BI__builtin_arm_crc32h: 5356 CRCIntrinsicID = Intrinsic::aarch64_crc32h; break; 5357 case AArch64::BI__builtin_arm_crc32ch: 5358 CRCIntrinsicID = Intrinsic::aarch64_crc32ch; break; 5359 case AArch64::BI__builtin_arm_crc32w: 5360 CRCIntrinsicID = Intrinsic::aarch64_crc32w; break; 5361 case AArch64::BI__builtin_arm_crc32cw: 5362 CRCIntrinsicID = Intrinsic::aarch64_crc32cw; break; 5363 case AArch64::BI__builtin_arm_crc32d: 5364 CRCIntrinsicID = Intrinsic::aarch64_crc32x; break; 5365 case AArch64::BI__builtin_arm_crc32cd: 5366 CRCIntrinsicID = Intrinsic::aarch64_crc32cx; break; 5367 } 5368 5369 if (CRCIntrinsicID != Intrinsic::not_intrinsic) { 5370 Value *Arg0 = EmitScalarExpr(E->getArg(0)); 5371 Value *Arg1 = EmitScalarExpr(E->getArg(1)); 5372 Function *F = CGM.getIntrinsic(CRCIntrinsicID); 5373 5374 llvm::Type *DataTy = F->getFunctionType()->getParamType(1); 5375 Arg1 = Builder.CreateZExtOrBitCast(Arg1, DataTy); 5376 5377 return Builder.CreateCall(F, {Arg0, Arg1}); 5378 } 5379 5380 if (BuiltinID == AArch64::BI__builtin_arm_rsr || 5381 BuiltinID == AArch64::BI__builtin_arm_rsr64 || 5382 BuiltinID == AArch64::BI__builtin_arm_rsrp || 5383 BuiltinID == AArch64::BI__builtin_arm_wsr || 5384 BuiltinID == AArch64::BI__builtin_arm_wsr64 || 5385 BuiltinID == AArch64::BI__builtin_arm_wsrp) { 5386 5387 bool IsRead = BuiltinID == AArch64::BI__builtin_arm_rsr || 5388 BuiltinID == AArch64::BI__builtin_arm_rsr64 || 5389 BuiltinID == AArch64::BI__builtin_arm_rsrp; 5390 5391 bool IsPointerBuiltin = BuiltinID == AArch64::BI__builtin_arm_rsrp || 5392 BuiltinID == AArch64::BI__builtin_arm_wsrp; 5393 5394 bool Is64Bit = BuiltinID != AArch64::BI__builtin_arm_rsr && 5395 BuiltinID != AArch64::BI__builtin_arm_wsr; 5396 5397 llvm::Type *ValueType; 5398 llvm::Type *RegisterType = Int64Ty; 5399 if (IsPointerBuiltin) { 5400 ValueType = VoidPtrTy; 5401 } else if (Is64Bit) { 5402 ValueType = Int64Ty; 5403 } else { 5404 ValueType = Int32Ty; 5405 } 5406 5407 return EmitSpecialRegisterBuiltin(*this, E, RegisterType, ValueType, IsRead); 5408 } 5409 5410 // Find out if any arguments are required to be integer constant 5411 // expressions. 5412 unsigned ICEArguments = 0; 5413 ASTContext::GetBuiltinTypeError Error; 5414 getContext().GetBuiltinType(BuiltinID, Error, &ICEArguments); 5415 assert(Error == ASTContext::GE_None && "Should not codegen an error"); 5416 5417 llvm::SmallVector<Value*, 4> Ops; 5418 for (unsigned i = 0, e = E->getNumArgs() - 1; i != e; i++) { 5419 if ((ICEArguments & (1 << i)) == 0) { 5420 Ops.push_back(EmitScalarExpr(E->getArg(i))); 5421 } else { 5422 // If this is required to be a constant, constant fold it so that we know 5423 // that the generated intrinsic gets a ConstantInt. 5424 llvm::APSInt Result; 5425 bool IsConst = E->getArg(i)->isIntegerConstantExpr(Result, getContext()); 5426 assert(IsConst && "Constant arg isn't actually constant?"); 5427 (void)IsConst; 5428 Ops.push_back(llvm::ConstantInt::get(getLLVMContext(), Result)); 5429 } 5430 } 5431 5432 auto SISDMap = makeArrayRef(AArch64SISDIntrinsicMap); 5433 const NeonIntrinsicInfo *Builtin = findNeonIntrinsicInMap( 5434 SISDMap, BuiltinID, AArch64SISDIntrinsicsProvenSorted); 5435 5436 if (Builtin) { 5437 Ops.push_back(EmitScalarExpr(E->getArg(E->getNumArgs() - 1))); 5438 Value *Result = EmitCommonNeonSISDBuiltinExpr(*this, *Builtin, Ops, E); 5439 assert(Result && "SISD intrinsic should have been handled"); 5440 return Result; 5441 } 5442 5443 llvm::APSInt Result; 5444 const Expr *Arg = E->getArg(E->getNumArgs()-1); 5445 NeonTypeFlags Type(0); 5446 if (Arg->isIntegerConstantExpr(Result, getContext())) 5447 // Determine the type of this overloaded NEON intrinsic. 5448 Type = NeonTypeFlags(Result.getZExtValue()); 5449 5450 bool usgn = Type.isUnsigned(); 5451 bool quad = Type.isQuad(); 5452 5453 // Handle non-overloaded intrinsics first. 5454 switch (BuiltinID) { 5455 default: break; 5456 case NEON::BI__builtin_neon_vldrq_p128: { 5457 llvm::Type *Int128PTy = llvm::Type::getIntNPtrTy(getLLVMContext(), 128); 5458 Value *Ptr = Builder.CreateBitCast(EmitScalarExpr(E->getArg(0)), Int128PTy); 5459 return Builder.CreateDefaultAlignedLoad(Ptr); 5460 } 5461 case NEON::BI__builtin_neon_vstrq_p128: { 5462 llvm::Type *Int128PTy = llvm::Type::getIntNPtrTy(getLLVMContext(), 128); 5463 Value *Ptr = Builder.CreateBitCast(Ops[0], Int128PTy); 5464 return Builder.CreateDefaultAlignedStore(EmitScalarExpr(E->getArg(1)), Ptr); 5465 } 5466 case NEON::BI__builtin_neon_vcvts_u32_f32: 5467 case NEON::BI__builtin_neon_vcvtd_u64_f64: 5468 usgn = true; 5469 // FALL THROUGH 5470 case NEON::BI__builtin_neon_vcvts_s32_f32: 5471 case NEON::BI__builtin_neon_vcvtd_s64_f64: { 5472 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5473 bool Is64 = Ops[0]->getType()->getPrimitiveSizeInBits() == 64; 5474 llvm::Type *InTy = Is64 ? Int64Ty : Int32Ty; 5475 llvm::Type *FTy = Is64 ? DoubleTy : FloatTy; 5476 Ops[0] = Builder.CreateBitCast(Ops[0], FTy); 5477 if (usgn) 5478 return Builder.CreateFPToUI(Ops[0], InTy); 5479 return Builder.CreateFPToSI(Ops[0], InTy); 5480 } 5481 case NEON::BI__builtin_neon_vcvts_f32_u32: 5482 case NEON::BI__builtin_neon_vcvtd_f64_u64: 5483 usgn = true; 5484 // FALL THROUGH 5485 case NEON::BI__builtin_neon_vcvts_f32_s32: 5486 case NEON::BI__builtin_neon_vcvtd_f64_s64: { 5487 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5488 bool Is64 = Ops[0]->getType()->getPrimitiveSizeInBits() == 64; 5489 llvm::Type *InTy = Is64 ? Int64Ty : Int32Ty; 5490 llvm::Type *FTy = Is64 ? DoubleTy : FloatTy; 5491 Ops[0] = Builder.CreateBitCast(Ops[0], InTy); 5492 if (usgn) 5493 return Builder.CreateUIToFP(Ops[0], FTy); 5494 return Builder.CreateSIToFP(Ops[0], FTy); 5495 } 5496 case NEON::BI__builtin_neon_vpaddd_s64: { 5497 llvm::Type *Ty = llvm::VectorType::get(Int64Ty, 2); 5498 Value *Vec = EmitScalarExpr(E->getArg(0)); 5499 // The vector is v2f64, so make sure it's bitcast to that. 5500 Vec = Builder.CreateBitCast(Vec, Ty, "v2i64"); 5501 llvm::Value *Idx0 = llvm::ConstantInt::get(SizeTy, 0); 5502 llvm::Value *Idx1 = llvm::ConstantInt::get(SizeTy, 1); 5503 Value *Op0 = Builder.CreateExtractElement(Vec, Idx0, "lane0"); 5504 Value *Op1 = Builder.CreateExtractElement(Vec, Idx1, "lane1"); 5505 // Pairwise addition of a v2f64 into a scalar f64. 5506 return Builder.CreateAdd(Op0, Op1, "vpaddd"); 5507 } 5508 case NEON::BI__builtin_neon_vpaddd_f64: { 5509 llvm::Type *Ty = 5510 llvm::VectorType::get(DoubleTy, 2); 5511 Value *Vec = EmitScalarExpr(E->getArg(0)); 5512 // The vector is v2f64, so make sure it's bitcast to that. 5513 Vec = Builder.CreateBitCast(Vec, Ty, "v2f64"); 5514 llvm::Value *Idx0 = llvm::ConstantInt::get(SizeTy, 0); 5515 llvm::Value *Idx1 = llvm::ConstantInt::get(SizeTy, 1); 5516 Value *Op0 = Builder.CreateExtractElement(Vec, Idx0, "lane0"); 5517 Value *Op1 = Builder.CreateExtractElement(Vec, Idx1, "lane1"); 5518 // Pairwise addition of a v2f64 into a scalar f64. 5519 return Builder.CreateFAdd(Op0, Op1, "vpaddd"); 5520 } 5521 case NEON::BI__builtin_neon_vpadds_f32: { 5522 llvm::Type *Ty = 5523 llvm::VectorType::get(FloatTy, 2); 5524 Value *Vec = EmitScalarExpr(E->getArg(0)); 5525 // The vector is v2f32, so make sure it's bitcast to that. 5526 Vec = Builder.CreateBitCast(Vec, Ty, "v2f32"); 5527 llvm::Value *Idx0 = llvm::ConstantInt::get(SizeTy, 0); 5528 llvm::Value *Idx1 = llvm::ConstantInt::get(SizeTy, 1); 5529 Value *Op0 = Builder.CreateExtractElement(Vec, Idx0, "lane0"); 5530 Value *Op1 = Builder.CreateExtractElement(Vec, Idx1, "lane1"); 5531 // Pairwise addition of a v2f32 into a scalar f32. 5532 return Builder.CreateFAdd(Op0, Op1, "vpaddd"); 5533 } 5534 case NEON::BI__builtin_neon_vceqzd_s64: 5535 case NEON::BI__builtin_neon_vceqzd_f64: 5536 case NEON::BI__builtin_neon_vceqzs_f32: 5537 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5538 return EmitAArch64CompareBuiltinExpr( 5539 Ops[0], ConvertType(E->getCallReturnType(getContext())), 5540 ICmpInst::FCMP_OEQ, ICmpInst::ICMP_EQ, "vceqz"); 5541 case NEON::BI__builtin_neon_vcgezd_s64: 5542 case NEON::BI__builtin_neon_vcgezd_f64: 5543 case NEON::BI__builtin_neon_vcgezs_f32: 5544 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5545 return EmitAArch64CompareBuiltinExpr( 5546 Ops[0], ConvertType(E->getCallReturnType(getContext())), 5547 ICmpInst::FCMP_OGE, ICmpInst::ICMP_SGE, "vcgez"); 5548 case NEON::BI__builtin_neon_vclezd_s64: 5549 case NEON::BI__builtin_neon_vclezd_f64: 5550 case NEON::BI__builtin_neon_vclezs_f32: 5551 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5552 return EmitAArch64CompareBuiltinExpr( 5553 Ops[0], ConvertType(E->getCallReturnType(getContext())), 5554 ICmpInst::FCMP_OLE, ICmpInst::ICMP_SLE, "vclez"); 5555 case NEON::BI__builtin_neon_vcgtzd_s64: 5556 case NEON::BI__builtin_neon_vcgtzd_f64: 5557 case NEON::BI__builtin_neon_vcgtzs_f32: 5558 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5559 return EmitAArch64CompareBuiltinExpr( 5560 Ops[0], ConvertType(E->getCallReturnType(getContext())), 5561 ICmpInst::FCMP_OGT, ICmpInst::ICMP_SGT, "vcgtz"); 5562 case NEON::BI__builtin_neon_vcltzd_s64: 5563 case NEON::BI__builtin_neon_vcltzd_f64: 5564 case NEON::BI__builtin_neon_vcltzs_f32: 5565 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5566 return EmitAArch64CompareBuiltinExpr( 5567 Ops[0], ConvertType(E->getCallReturnType(getContext())), 5568 ICmpInst::FCMP_OLT, ICmpInst::ICMP_SLT, "vcltz"); 5569 5570 case NEON::BI__builtin_neon_vceqzd_u64: { 5571 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5572 Ops[0] = Builder.CreateBitCast(Ops[0], Int64Ty); 5573 Ops[0] = 5574 Builder.CreateICmpEQ(Ops[0], llvm::Constant::getNullValue(Int64Ty)); 5575 return Builder.CreateSExt(Ops[0], Int64Ty, "vceqzd"); 5576 } 5577 case NEON::BI__builtin_neon_vceqd_f64: 5578 case NEON::BI__builtin_neon_vcled_f64: 5579 case NEON::BI__builtin_neon_vcltd_f64: 5580 case NEON::BI__builtin_neon_vcged_f64: 5581 case NEON::BI__builtin_neon_vcgtd_f64: { 5582 llvm::CmpInst::Predicate P; 5583 switch (BuiltinID) { 5584 default: llvm_unreachable("missing builtin ID in switch!"); 5585 case NEON::BI__builtin_neon_vceqd_f64: P = llvm::FCmpInst::FCMP_OEQ; break; 5586 case NEON::BI__builtin_neon_vcled_f64: P = llvm::FCmpInst::FCMP_OLE; break; 5587 case NEON::BI__builtin_neon_vcltd_f64: P = llvm::FCmpInst::FCMP_OLT; break; 5588 case NEON::BI__builtin_neon_vcged_f64: P = llvm::FCmpInst::FCMP_OGE; break; 5589 case NEON::BI__builtin_neon_vcgtd_f64: P = llvm::FCmpInst::FCMP_OGT; break; 5590 } 5591 Ops.push_back(EmitScalarExpr(E->getArg(1))); 5592 Ops[0] = Builder.CreateBitCast(Ops[0], DoubleTy); 5593 Ops[1] = Builder.CreateBitCast(Ops[1], DoubleTy); 5594 Ops[0] = Builder.CreateFCmp(P, Ops[0], Ops[1]); 5595 return Builder.CreateSExt(Ops[0], Int64Ty, "vcmpd"); 5596 } 5597 case NEON::BI__builtin_neon_vceqs_f32: 5598 case NEON::BI__builtin_neon_vcles_f32: 5599 case NEON::BI__builtin_neon_vclts_f32: 5600 case NEON::BI__builtin_neon_vcges_f32: 5601 case NEON::BI__builtin_neon_vcgts_f32: { 5602 llvm::CmpInst::Predicate P; 5603 switch (BuiltinID) { 5604 default: llvm_unreachable("missing builtin ID in switch!"); 5605 case NEON::BI__builtin_neon_vceqs_f32: P = llvm::FCmpInst::FCMP_OEQ; break; 5606 case NEON::BI__builtin_neon_vcles_f32: P = llvm::FCmpInst::FCMP_OLE; break; 5607 case NEON::BI__builtin_neon_vclts_f32: P = llvm::FCmpInst::FCMP_OLT; break; 5608 case NEON::BI__builtin_neon_vcges_f32: P = llvm::FCmpInst::FCMP_OGE; break; 5609 case NEON::BI__builtin_neon_vcgts_f32: P = llvm::FCmpInst::FCMP_OGT; break; 5610 } 5611 Ops.push_back(EmitScalarExpr(E->getArg(1))); 5612 Ops[0] = Builder.CreateBitCast(Ops[0], FloatTy); 5613 Ops[1] = Builder.CreateBitCast(Ops[1], FloatTy); 5614 Ops[0] = Builder.CreateFCmp(P, Ops[0], Ops[1]); 5615 return Builder.CreateSExt(Ops[0], Int32Ty, "vcmpd"); 5616 } 5617 case NEON::BI__builtin_neon_vceqd_s64: 5618 case NEON::BI__builtin_neon_vceqd_u64: 5619 case NEON::BI__builtin_neon_vcgtd_s64: 5620 case NEON::BI__builtin_neon_vcgtd_u64: 5621 case NEON::BI__builtin_neon_vcltd_s64: 5622 case NEON::BI__builtin_neon_vcltd_u64: 5623 case NEON::BI__builtin_neon_vcged_u64: 5624 case NEON::BI__builtin_neon_vcged_s64: 5625 case NEON::BI__builtin_neon_vcled_u64: 5626 case NEON::BI__builtin_neon_vcled_s64: { 5627 llvm::CmpInst::Predicate P; 5628 switch (BuiltinID) { 5629 default: llvm_unreachable("missing builtin ID in switch!"); 5630 case NEON::BI__builtin_neon_vceqd_s64: 5631 case NEON::BI__builtin_neon_vceqd_u64:P = llvm::ICmpInst::ICMP_EQ;break; 5632 case NEON::BI__builtin_neon_vcgtd_s64:P = llvm::ICmpInst::ICMP_SGT;break; 5633 case NEON::BI__builtin_neon_vcgtd_u64:P = llvm::ICmpInst::ICMP_UGT;break; 5634 case NEON::BI__builtin_neon_vcltd_s64:P = llvm::ICmpInst::ICMP_SLT;break; 5635 case NEON::BI__builtin_neon_vcltd_u64:P = llvm::ICmpInst::ICMP_ULT;break; 5636 case NEON::BI__builtin_neon_vcged_u64:P = llvm::ICmpInst::ICMP_UGE;break; 5637 case NEON::BI__builtin_neon_vcged_s64:P = llvm::ICmpInst::ICMP_SGE;break; 5638 case NEON::BI__builtin_neon_vcled_u64:P = llvm::ICmpInst::ICMP_ULE;break; 5639 case NEON::BI__builtin_neon_vcled_s64:P = llvm::ICmpInst::ICMP_SLE;break; 5640 } 5641 Ops.push_back(EmitScalarExpr(E->getArg(1))); 5642 Ops[0] = Builder.CreateBitCast(Ops[0], Int64Ty); 5643 Ops[1] = Builder.CreateBitCast(Ops[1], Int64Ty); 5644 Ops[0] = Builder.CreateICmp(P, Ops[0], Ops[1]); 5645 return Builder.CreateSExt(Ops[0], Int64Ty, "vceqd"); 5646 } 5647 case NEON::BI__builtin_neon_vtstd_s64: 5648 case NEON::BI__builtin_neon_vtstd_u64: { 5649 Ops.push_back(EmitScalarExpr(E->getArg(1))); 5650 Ops[0] = Builder.CreateBitCast(Ops[0], Int64Ty); 5651 Ops[1] = Builder.CreateBitCast(Ops[1], Int64Ty); 5652 Ops[0] = Builder.CreateAnd(Ops[0], Ops[1]); 5653 Ops[0] = Builder.CreateICmp(ICmpInst::ICMP_NE, Ops[0], 5654 llvm::Constant::getNullValue(Int64Ty)); 5655 return Builder.CreateSExt(Ops[0], Int64Ty, "vtstd"); 5656 } 5657 case NEON::BI__builtin_neon_vset_lane_i8: 5658 case NEON::BI__builtin_neon_vset_lane_i16: 5659 case NEON::BI__builtin_neon_vset_lane_i32: 5660 case NEON::BI__builtin_neon_vset_lane_i64: 5661 case NEON::BI__builtin_neon_vset_lane_f32: 5662 case NEON::BI__builtin_neon_vsetq_lane_i8: 5663 case NEON::BI__builtin_neon_vsetq_lane_i16: 5664 case NEON::BI__builtin_neon_vsetq_lane_i32: 5665 case NEON::BI__builtin_neon_vsetq_lane_i64: 5666 case NEON::BI__builtin_neon_vsetq_lane_f32: 5667 Ops.push_back(EmitScalarExpr(E->getArg(2))); 5668 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vset_lane"); 5669 case NEON::BI__builtin_neon_vset_lane_f64: 5670 // The vector type needs a cast for the v1f64 variant. 5671 Ops[1] = Builder.CreateBitCast(Ops[1], 5672 llvm::VectorType::get(DoubleTy, 1)); 5673 Ops.push_back(EmitScalarExpr(E->getArg(2))); 5674 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vset_lane"); 5675 case NEON::BI__builtin_neon_vsetq_lane_f64: 5676 // The vector type needs a cast for the v2f64 variant. 5677 Ops[1] = Builder.CreateBitCast(Ops[1], 5678 llvm::VectorType::get(DoubleTy, 2)); 5679 Ops.push_back(EmitScalarExpr(E->getArg(2))); 5680 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vset_lane"); 5681 5682 case NEON::BI__builtin_neon_vget_lane_i8: 5683 case NEON::BI__builtin_neon_vdupb_lane_i8: 5684 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int8Ty, 8)); 5685 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5686 "vget_lane"); 5687 case NEON::BI__builtin_neon_vgetq_lane_i8: 5688 case NEON::BI__builtin_neon_vdupb_laneq_i8: 5689 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int8Ty, 16)); 5690 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5691 "vgetq_lane"); 5692 case NEON::BI__builtin_neon_vget_lane_i16: 5693 case NEON::BI__builtin_neon_vduph_lane_i16: 5694 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int16Ty, 4)); 5695 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5696 "vget_lane"); 5697 case NEON::BI__builtin_neon_vgetq_lane_i16: 5698 case NEON::BI__builtin_neon_vduph_laneq_i16: 5699 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int16Ty, 8)); 5700 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5701 "vgetq_lane"); 5702 case NEON::BI__builtin_neon_vget_lane_i32: 5703 case NEON::BI__builtin_neon_vdups_lane_i32: 5704 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int32Ty, 2)); 5705 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5706 "vget_lane"); 5707 case NEON::BI__builtin_neon_vdups_lane_f32: 5708 Ops[0] = Builder.CreateBitCast(Ops[0], 5709 llvm::VectorType::get(FloatTy, 2)); 5710 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5711 "vdups_lane"); 5712 case NEON::BI__builtin_neon_vgetq_lane_i32: 5713 case NEON::BI__builtin_neon_vdups_laneq_i32: 5714 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int32Ty, 4)); 5715 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5716 "vgetq_lane"); 5717 case NEON::BI__builtin_neon_vget_lane_i64: 5718 case NEON::BI__builtin_neon_vdupd_lane_i64: 5719 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int64Ty, 1)); 5720 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5721 "vget_lane"); 5722 case NEON::BI__builtin_neon_vdupd_lane_f64: 5723 Ops[0] = Builder.CreateBitCast(Ops[0], 5724 llvm::VectorType::get(DoubleTy, 1)); 5725 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5726 "vdupd_lane"); 5727 case NEON::BI__builtin_neon_vgetq_lane_i64: 5728 case NEON::BI__builtin_neon_vdupd_laneq_i64: 5729 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int64Ty, 2)); 5730 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5731 "vgetq_lane"); 5732 case NEON::BI__builtin_neon_vget_lane_f32: 5733 Ops[0] = Builder.CreateBitCast(Ops[0], 5734 llvm::VectorType::get(FloatTy, 2)); 5735 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5736 "vget_lane"); 5737 case NEON::BI__builtin_neon_vget_lane_f64: 5738 Ops[0] = Builder.CreateBitCast(Ops[0], 5739 llvm::VectorType::get(DoubleTy, 1)); 5740 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5741 "vget_lane"); 5742 case NEON::BI__builtin_neon_vgetq_lane_f32: 5743 case NEON::BI__builtin_neon_vdups_laneq_f32: 5744 Ops[0] = Builder.CreateBitCast(Ops[0], 5745 llvm::VectorType::get(FloatTy, 4)); 5746 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5747 "vgetq_lane"); 5748 case NEON::BI__builtin_neon_vgetq_lane_f64: 5749 case NEON::BI__builtin_neon_vdupd_laneq_f64: 5750 Ops[0] = Builder.CreateBitCast(Ops[0], 5751 llvm::VectorType::get(DoubleTy, 2)); 5752 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5753 "vgetq_lane"); 5754 case NEON::BI__builtin_neon_vaddd_s64: 5755 case NEON::BI__builtin_neon_vaddd_u64: 5756 return Builder.CreateAdd(Ops[0], EmitScalarExpr(E->getArg(1)), "vaddd"); 5757 case NEON::BI__builtin_neon_vsubd_s64: 5758 case NEON::BI__builtin_neon_vsubd_u64: 5759 return Builder.CreateSub(Ops[0], EmitScalarExpr(E->getArg(1)), "vsubd"); 5760 case NEON::BI__builtin_neon_vqdmlalh_s16: 5761 case NEON::BI__builtin_neon_vqdmlslh_s16: { 5762 SmallVector<Value *, 2> ProductOps; 5763 ProductOps.push_back(vectorWrapScalar16(Ops[1])); 5764 ProductOps.push_back(vectorWrapScalar16(EmitScalarExpr(E->getArg(2)))); 5765 llvm::Type *VTy = llvm::VectorType::get(Int32Ty, 4); 5766 Ops[1] = EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_sqdmull, VTy), 5767 ProductOps, "vqdmlXl"); 5768 Constant *CI = ConstantInt::get(SizeTy, 0); 5769 Ops[1] = Builder.CreateExtractElement(Ops[1], CI, "lane0"); 5770 5771 unsigned AccumInt = BuiltinID == NEON::BI__builtin_neon_vqdmlalh_s16 5772 ? Intrinsic::aarch64_neon_sqadd 5773 : Intrinsic::aarch64_neon_sqsub; 5774 return EmitNeonCall(CGM.getIntrinsic(AccumInt, Int32Ty), Ops, "vqdmlXl"); 5775 } 5776 case NEON::BI__builtin_neon_vqshlud_n_s64: { 5777 Ops.push_back(EmitScalarExpr(E->getArg(1))); 5778 Ops[1] = Builder.CreateZExt(Ops[1], Int64Ty); 5779 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_sqshlu, Int64Ty), 5780 Ops, "vqshlu_n"); 5781 } 5782 case NEON::BI__builtin_neon_vqshld_n_u64: 5783 case NEON::BI__builtin_neon_vqshld_n_s64: { 5784 unsigned Int = BuiltinID == NEON::BI__builtin_neon_vqshld_n_u64 5785 ? Intrinsic::aarch64_neon_uqshl 5786 : Intrinsic::aarch64_neon_sqshl; 5787 Ops.push_back(EmitScalarExpr(E->getArg(1))); 5788 Ops[1] = Builder.CreateZExt(Ops[1], Int64Ty); 5789 return EmitNeonCall(CGM.getIntrinsic(Int, Int64Ty), Ops, "vqshl_n"); 5790 } 5791 case NEON::BI__builtin_neon_vrshrd_n_u64: 5792 case NEON::BI__builtin_neon_vrshrd_n_s64: { 5793 unsigned Int = BuiltinID == NEON::BI__builtin_neon_vrshrd_n_u64 5794 ? Intrinsic::aarch64_neon_urshl 5795 : Intrinsic::aarch64_neon_srshl; 5796 Ops.push_back(EmitScalarExpr(E->getArg(1))); 5797 int SV = cast<ConstantInt>(Ops[1])->getSExtValue(); 5798 Ops[1] = ConstantInt::get(Int64Ty, -SV); 5799 return EmitNeonCall(CGM.getIntrinsic(Int, Int64Ty), Ops, "vrshr_n"); 5800 } 5801 case NEON::BI__builtin_neon_vrsrad_n_u64: 5802 case NEON::BI__builtin_neon_vrsrad_n_s64: { 5803 unsigned Int = BuiltinID == NEON::BI__builtin_neon_vrsrad_n_u64 5804 ? Intrinsic::aarch64_neon_urshl 5805 : Intrinsic::aarch64_neon_srshl; 5806 Ops[1] = Builder.CreateBitCast(Ops[1], Int64Ty); 5807 Ops.push_back(Builder.CreateNeg(EmitScalarExpr(E->getArg(2)))); 5808 Ops[1] = Builder.CreateCall(CGM.getIntrinsic(Int, Int64Ty), 5809 {Ops[1], Builder.CreateSExt(Ops[2], Int64Ty)}); 5810 return Builder.CreateAdd(Ops[0], Builder.CreateBitCast(Ops[1], Int64Ty)); 5811 } 5812 case NEON::BI__builtin_neon_vshld_n_s64: 5813 case NEON::BI__builtin_neon_vshld_n_u64: { 5814 llvm::ConstantInt *Amt = cast<ConstantInt>(EmitScalarExpr(E->getArg(1))); 5815 return Builder.CreateShl( 5816 Ops[0], ConstantInt::get(Int64Ty, Amt->getZExtValue()), "shld_n"); 5817 } 5818 case NEON::BI__builtin_neon_vshrd_n_s64: { 5819 llvm::ConstantInt *Amt = cast<ConstantInt>(EmitScalarExpr(E->getArg(1))); 5820 return Builder.CreateAShr( 5821 Ops[0], ConstantInt::get(Int64Ty, std::min(static_cast<uint64_t>(63), 5822 Amt->getZExtValue())), 5823 "shrd_n"); 5824 } 5825 case NEON::BI__builtin_neon_vshrd_n_u64: { 5826 llvm::ConstantInt *Amt = cast<ConstantInt>(EmitScalarExpr(E->getArg(1))); 5827 uint64_t ShiftAmt = Amt->getZExtValue(); 5828 // Right-shifting an unsigned value by its size yields 0. 5829 if (ShiftAmt == 64) 5830 return ConstantInt::get(Int64Ty, 0); 5831 return Builder.CreateLShr(Ops[0], ConstantInt::get(Int64Ty, ShiftAmt), 5832 "shrd_n"); 5833 } 5834 case NEON::BI__builtin_neon_vsrad_n_s64: { 5835 llvm::ConstantInt *Amt = cast<ConstantInt>(EmitScalarExpr(E->getArg(2))); 5836 Ops[1] = Builder.CreateAShr( 5837 Ops[1], ConstantInt::get(Int64Ty, std::min(static_cast<uint64_t>(63), 5838 Amt->getZExtValue())), 5839 "shrd_n"); 5840 return Builder.CreateAdd(Ops[0], Ops[1]); 5841 } 5842 case NEON::BI__builtin_neon_vsrad_n_u64: { 5843 llvm::ConstantInt *Amt = cast<ConstantInt>(EmitScalarExpr(E->getArg(2))); 5844 uint64_t ShiftAmt = Amt->getZExtValue(); 5845 // Right-shifting an unsigned value by its size yields 0. 5846 // As Op + 0 = Op, return Ops[0] directly. 5847 if (ShiftAmt == 64) 5848 return Ops[0]; 5849 Ops[1] = Builder.CreateLShr(Ops[1], ConstantInt::get(Int64Ty, ShiftAmt), 5850 "shrd_n"); 5851 return Builder.CreateAdd(Ops[0], Ops[1]); 5852 } 5853 case NEON::BI__builtin_neon_vqdmlalh_lane_s16: 5854 case NEON::BI__builtin_neon_vqdmlalh_laneq_s16: 5855 case NEON::BI__builtin_neon_vqdmlslh_lane_s16: 5856 case NEON::BI__builtin_neon_vqdmlslh_laneq_s16: { 5857 Ops[2] = Builder.CreateExtractElement(Ops[2], EmitScalarExpr(E->getArg(3)), 5858 "lane"); 5859 SmallVector<Value *, 2> ProductOps; 5860 ProductOps.push_back(vectorWrapScalar16(Ops[1])); 5861 ProductOps.push_back(vectorWrapScalar16(Ops[2])); 5862 llvm::Type *VTy = llvm::VectorType::get(Int32Ty, 4); 5863 Ops[1] = EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_sqdmull, VTy), 5864 ProductOps, "vqdmlXl"); 5865 Constant *CI = ConstantInt::get(SizeTy, 0); 5866 Ops[1] = Builder.CreateExtractElement(Ops[1], CI, "lane0"); 5867 Ops.pop_back(); 5868 5869 unsigned AccInt = (BuiltinID == NEON::BI__builtin_neon_vqdmlalh_lane_s16 || 5870 BuiltinID == NEON::BI__builtin_neon_vqdmlalh_laneq_s16) 5871 ? Intrinsic::aarch64_neon_sqadd 5872 : Intrinsic::aarch64_neon_sqsub; 5873 return EmitNeonCall(CGM.getIntrinsic(AccInt, Int32Ty), Ops, "vqdmlXl"); 5874 } 5875 case NEON::BI__builtin_neon_vqdmlals_s32: 5876 case NEON::BI__builtin_neon_vqdmlsls_s32: { 5877 SmallVector<Value *, 2> ProductOps; 5878 ProductOps.push_back(Ops[1]); 5879 ProductOps.push_back(EmitScalarExpr(E->getArg(2))); 5880 Ops[1] = 5881 EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_sqdmulls_scalar), 5882 ProductOps, "vqdmlXl"); 5883 5884 unsigned AccumInt = BuiltinID == NEON::BI__builtin_neon_vqdmlals_s32 5885 ? Intrinsic::aarch64_neon_sqadd 5886 : Intrinsic::aarch64_neon_sqsub; 5887 return EmitNeonCall(CGM.getIntrinsic(AccumInt, Int64Ty), Ops, "vqdmlXl"); 5888 } 5889 case NEON::BI__builtin_neon_vqdmlals_lane_s32: 5890 case NEON::BI__builtin_neon_vqdmlals_laneq_s32: 5891 case NEON::BI__builtin_neon_vqdmlsls_lane_s32: 5892 case NEON::BI__builtin_neon_vqdmlsls_laneq_s32: { 5893 Ops[2] = Builder.CreateExtractElement(Ops[2], EmitScalarExpr(E->getArg(3)), 5894 "lane"); 5895 SmallVector<Value *, 2> ProductOps; 5896 ProductOps.push_back(Ops[1]); 5897 ProductOps.push_back(Ops[2]); 5898 Ops[1] = 5899 EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_sqdmulls_scalar), 5900 ProductOps, "vqdmlXl"); 5901 Ops.pop_back(); 5902 5903 unsigned AccInt = (BuiltinID == NEON::BI__builtin_neon_vqdmlals_lane_s32 || 5904 BuiltinID == NEON::BI__builtin_neon_vqdmlals_laneq_s32) 5905 ? Intrinsic::aarch64_neon_sqadd 5906 : Intrinsic::aarch64_neon_sqsub; 5907 return EmitNeonCall(CGM.getIntrinsic(AccInt, Int64Ty), Ops, "vqdmlXl"); 5908 } 5909 } 5910 5911 llvm::VectorType *VTy = GetNeonType(this, Type); 5912 llvm::Type *Ty = VTy; 5913 if (!Ty) 5914 return nullptr; 5915 5916 // Not all intrinsics handled by the common case work for AArch64 yet, so only 5917 // defer to common code if it's been added to our special map. 5918 Builtin = findNeonIntrinsicInMap(AArch64SIMDIntrinsicMap, BuiltinID, 5919 AArch64SIMDIntrinsicsProvenSorted); 5920 5921 if (Builtin) 5922 return EmitCommonNeonBuiltinExpr( 5923 Builtin->BuiltinID, Builtin->LLVMIntrinsic, Builtin->AltLLVMIntrinsic, 5924 Builtin->NameHint, Builtin->TypeModifier, E, Ops, 5925 /*never use addresses*/ Address::invalid(), Address::invalid()); 5926 5927 if (Value *V = EmitAArch64TblBuiltinExpr(*this, BuiltinID, E, Ops)) 5928 return V; 5929 5930 unsigned Int; 5931 switch (BuiltinID) { 5932 default: return nullptr; 5933 case NEON::BI__builtin_neon_vbsl_v: 5934 case NEON::BI__builtin_neon_vbslq_v: { 5935 llvm::Type *BitTy = llvm::VectorType::getInteger(VTy); 5936 Ops[0] = Builder.CreateBitCast(Ops[0], BitTy, "vbsl"); 5937 Ops[1] = Builder.CreateBitCast(Ops[1], BitTy, "vbsl"); 5938 Ops[2] = Builder.CreateBitCast(Ops[2], BitTy, "vbsl"); 5939 5940 Ops[1] = Builder.CreateAnd(Ops[0], Ops[1], "vbsl"); 5941 Ops[2] = Builder.CreateAnd(Builder.CreateNot(Ops[0]), Ops[2], "vbsl"); 5942 Ops[0] = Builder.CreateOr(Ops[1], Ops[2], "vbsl"); 5943 return Builder.CreateBitCast(Ops[0], Ty); 5944 } 5945 case NEON::BI__builtin_neon_vfma_lane_v: 5946 case NEON::BI__builtin_neon_vfmaq_lane_v: { // Only used for FP types 5947 // The ARM builtins (and instructions) have the addend as the first 5948 // operand, but the 'fma' intrinsics have it last. Swap it around here. 5949 Value *Addend = Ops[0]; 5950 Value *Multiplicand = Ops[1]; 5951 Value *LaneSource = Ops[2]; 5952 Ops[0] = Multiplicand; 5953 Ops[1] = LaneSource; 5954 Ops[2] = Addend; 5955 5956 // Now adjust things to handle the lane access. 5957 llvm::Type *SourceTy = BuiltinID == NEON::BI__builtin_neon_vfmaq_lane_v ? 5958 llvm::VectorType::get(VTy->getElementType(), VTy->getNumElements() / 2) : 5959 VTy; 5960 llvm::Constant *cst = cast<Constant>(Ops[3]); 5961 Value *SV = llvm::ConstantVector::getSplat(VTy->getNumElements(), cst); 5962 Ops[1] = Builder.CreateBitCast(Ops[1], SourceTy); 5963 Ops[1] = Builder.CreateShuffleVector(Ops[1], Ops[1], SV, "lane"); 5964 5965 Ops.pop_back(); 5966 Int = Intrinsic::fma; 5967 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "fmla"); 5968 } 5969 case NEON::BI__builtin_neon_vfma_laneq_v: { 5970 llvm::VectorType *VTy = cast<llvm::VectorType>(Ty); 5971 // v1f64 fma should be mapped to Neon scalar f64 fma 5972 if (VTy && VTy->getElementType() == DoubleTy) { 5973 Ops[0] = Builder.CreateBitCast(Ops[0], DoubleTy); 5974 Ops[1] = Builder.CreateBitCast(Ops[1], DoubleTy); 5975 llvm::Type *VTy = GetNeonType(this, 5976 NeonTypeFlags(NeonTypeFlags::Float64, false, true)); 5977 Ops[2] = Builder.CreateBitCast(Ops[2], VTy); 5978 Ops[2] = Builder.CreateExtractElement(Ops[2], Ops[3], "extract"); 5979 Value *F = CGM.getIntrinsic(Intrinsic::fma, DoubleTy); 5980 Value *Result = Builder.CreateCall(F, {Ops[1], Ops[2], Ops[0]}); 5981 return Builder.CreateBitCast(Result, Ty); 5982 } 5983 Value *F = CGM.getIntrinsic(Intrinsic::fma, Ty); 5984 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 5985 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 5986 5987 llvm::Type *STy = llvm::VectorType::get(VTy->getElementType(), 5988 VTy->getNumElements() * 2); 5989 Ops[2] = Builder.CreateBitCast(Ops[2], STy); 5990 Value* SV = llvm::ConstantVector::getSplat(VTy->getNumElements(), 5991 cast<ConstantInt>(Ops[3])); 5992 Ops[2] = Builder.CreateShuffleVector(Ops[2], Ops[2], SV, "lane"); 5993 5994 return Builder.CreateCall(F, {Ops[2], Ops[1], Ops[0]}); 5995 } 5996 case NEON::BI__builtin_neon_vfmaq_laneq_v: { 5997 Value *F = CGM.getIntrinsic(Intrinsic::fma, Ty); 5998 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 5999 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 6000 6001 Ops[2] = Builder.CreateBitCast(Ops[2], Ty); 6002 Ops[2] = EmitNeonSplat(Ops[2], cast<ConstantInt>(Ops[3])); 6003 return Builder.CreateCall(F, {Ops[2], Ops[1], Ops[0]}); 6004 } 6005 case NEON::BI__builtin_neon_vfmas_lane_f32: 6006 case NEON::BI__builtin_neon_vfmas_laneq_f32: 6007 case NEON::BI__builtin_neon_vfmad_lane_f64: 6008 case NEON::BI__builtin_neon_vfmad_laneq_f64: { 6009 Ops.push_back(EmitScalarExpr(E->getArg(3))); 6010 llvm::Type *Ty = ConvertType(E->getCallReturnType(getContext())); 6011 Value *F = CGM.getIntrinsic(Intrinsic::fma, Ty); 6012 Ops[2] = Builder.CreateExtractElement(Ops[2], Ops[3], "extract"); 6013 return Builder.CreateCall(F, {Ops[1], Ops[2], Ops[0]}); 6014 } 6015 case NEON::BI__builtin_neon_vmull_v: 6016 // FIXME: improve sharing scheme to cope with 3 alternative LLVM intrinsics. 6017 Int = usgn ? Intrinsic::aarch64_neon_umull : Intrinsic::aarch64_neon_smull; 6018 if (Type.isPoly()) Int = Intrinsic::aarch64_neon_pmull; 6019 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmull"); 6020 case NEON::BI__builtin_neon_vmax_v: 6021 case NEON::BI__builtin_neon_vmaxq_v: 6022 // FIXME: improve sharing scheme to cope with 3 alternative LLVM intrinsics. 6023 Int = usgn ? Intrinsic::aarch64_neon_umax : Intrinsic::aarch64_neon_smax; 6024 if (Ty->isFPOrFPVectorTy()) Int = Intrinsic::aarch64_neon_fmax; 6025 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmax"); 6026 case NEON::BI__builtin_neon_vmin_v: 6027 case NEON::BI__builtin_neon_vminq_v: 6028 // FIXME: improve sharing scheme to cope with 3 alternative LLVM intrinsics. 6029 Int = usgn ? Intrinsic::aarch64_neon_umin : Intrinsic::aarch64_neon_smin; 6030 if (Ty->isFPOrFPVectorTy()) Int = Intrinsic::aarch64_neon_fmin; 6031 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmin"); 6032 case NEON::BI__builtin_neon_vabd_v: 6033 case NEON::BI__builtin_neon_vabdq_v: 6034 // FIXME: improve sharing scheme to cope with 3 alternative LLVM intrinsics. 6035 Int = usgn ? Intrinsic::aarch64_neon_uabd : Intrinsic::aarch64_neon_sabd; 6036 if (Ty->isFPOrFPVectorTy()) Int = Intrinsic::aarch64_neon_fabd; 6037 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vabd"); 6038 case NEON::BI__builtin_neon_vpadal_v: 6039 case NEON::BI__builtin_neon_vpadalq_v: { 6040 unsigned ArgElts = VTy->getNumElements(); 6041 llvm::IntegerType *EltTy = cast<IntegerType>(VTy->getElementType()); 6042 unsigned BitWidth = EltTy->getBitWidth(); 6043 llvm::Type *ArgTy = llvm::VectorType::get( 6044 llvm::IntegerType::get(getLLVMContext(), BitWidth/2), 2*ArgElts); 6045 llvm::Type* Tys[2] = { VTy, ArgTy }; 6046 Int = usgn ? Intrinsic::aarch64_neon_uaddlp : Intrinsic::aarch64_neon_saddlp; 6047 SmallVector<llvm::Value*, 1> TmpOps; 6048 TmpOps.push_back(Ops[1]); 6049 Function *F = CGM.getIntrinsic(Int, Tys); 6050 llvm::Value *tmp = EmitNeonCall(F, TmpOps, "vpadal"); 6051 llvm::Value *addend = Builder.CreateBitCast(Ops[0], tmp->getType()); 6052 return Builder.CreateAdd(tmp, addend); 6053 } 6054 case NEON::BI__builtin_neon_vpmin_v: 6055 case NEON::BI__builtin_neon_vpminq_v: 6056 // FIXME: improve sharing scheme to cope with 3 alternative LLVM intrinsics. 6057 Int = usgn ? Intrinsic::aarch64_neon_uminp : Intrinsic::aarch64_neon_sminp; 6058 if (Ty->isFPOrFPVectorTy()) Int = Intrinsic::aarch64_neon_fminp; 6059 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpmin"); 6060 case NEON::BI__builtin_neon_vpmax_v: 6061 case NEON::BI__builtin_neon_vpmaxq_v: 6062 // FIXME: improve sharing scheme to cope with 3 alternative LLVM intrinsics. 6063 Int = usgn ? Intrinsic::aarch64_neon_umaxp : Intrinsic::aarch64_neon_smaxp; 6064 if (Ty->isFPOrFPVectorTy()) Int = Intrinsic::aarch64_neon_fmaxp; 6065 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpmax"); 6066 case NEON::BI__builtin_neon_vminnm_v: 6067 case NEON::BI__builtin_neon_vminnmq_v: 6068 Int = Intrinsic::aarch64_neon_fminnm; 6069 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vminnm"); 6070 case NEON::BI__builtin_neon_vmaxnm_v: 6071 case NEON::BI__builtin_neon_vmaxnmq_v: 6072 Int = Intrinsic::aarch64_neon_fmaxnm; 6073 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmaxnm"); 6074 case NEON::BI__builtin_neon_vrecpss_f32: { 6075 Ops.push_back(EmitScalarExpr(E->getArg(1))); 6076 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_frecps, FloatTy), 6077 Ops, "vrecps"); 6078 } 6079 case NEON::BI__builtin_neon_vrecpsd_f64: { 6080 Ops.push_back(EmitScalarExpr(E->getArg(1))); 6081 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_frecps, DoubleTy), 6082 Ops, "vrecps"); 6083 } 6084 case NEON::BI__builtin_neon_vqshrun_n_v: 6085 Int = Intrinsic::aarch64_neon_sqshrun; 6086 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshrun_n"); 6087 case NEON::BI__builtin_neon_vqrshrun_n_v: 6088 Int = Intrinsic::aarch64_neon_sqrshrun; 6089 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqrshrun_n"); 6090 case NEON::BI__builtin_neon_vqshrn_n_v: 6091 Int = usgn ? Intrinsic::aarch64_neon_uqshrn : Intrinsic::aarch64_neon_sqshrn; 6092 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshrn_n"); 6093 case NEON::BI__builtin_neon_vrshrn_n_v: 6094 Int = Intrinsic::aarch64_neon_rshrn; 6095 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrshrn_n"); 6096 case NEON::BI__builtin_neon_vqrshrn_n_v: 6097 Int = usgn ? Intrinsic::aarch64_neon_uqrshrn : Intrinsic::aarch64_neon_sqrshrn; 6098 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqrshrn_n"); 6099 case NEON::BI__builtin_neon_vrnda_v: 6100 case NEON::BI__builtin_neon_vrndaq_v: { 6101 Int = Intrinsic::round; 6102 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrnda"); 6103 } 6104 case NEON::BI__builtin_neon_vrndi_v: 6105 case NEON::BI__builtin_neon_vrndiq_v: { 6106 Int = Intrinsic::nearbyint; 6107 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrndi"); 6108 } 6109 case NEON::BI__builtin_neon_vrndm_v: 6110 case NEON::BI__builtin_neon_vrndmq_v: { 6111 Int = Intrinsic::floor; 6112 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrndm"); 6113 } 6114 case NEON::BI__builtin_neon_vrndn_v: 6115 case NEON::BI__builtin_neon_vrndnq_v: { 6116 Int = Intrinsic::aarch64_neon_frintn; 6117 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrndn"); 6118 } 6119 case NEON::BI__builtin_neon_vrndp_v: 6120 case NEON::BI__builtin_neon_vrndpq_v: { 6121 Int = Intrinsic::ceil; 6122 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrndp"); 6123 } 6124 case NEON::BI__builtin_neon_vrndx_v: 6125 case NEON::BI__builtin_neon_vrndxq_v: { 6126 Int = Intrinsic::rint; 6127 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrndx"); 6128 } 6129 case NEON::BI__builtin_neon_vrnd_v: 6130 case NEON::BI__builtin_neon_vrndq_v: { 6131 Int = Intrinsic::trunc; 6132 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrndz"); 6133 } 6134 case NEON::BI__builtin_neon_vceqz_v: 6135 case NEON::BI__builtin_neon_vceqzq_v: 6136 return EmitAArch64CompareBuiltinExpr(Ops[0], Ty, ICmpInst::FCMP_OEQ, 6137 ICmpInst::ICMP_EQ, "vceqz"); 6138 case NEON::BI__builtin_neon_vcgez_v: 6139 case NEON::BI__builtin_neon_vcgezq_v: 6140 return EmitAArch64CompareBuiltinExpr(Ops[0], Ty, ICmpInst::FCMP_OGE, 6141 ICmpInst::ICMP_SGE, "vcgez"); 6142 case NEON::BI__builtin_neon_vclez_v: 6143 case NEON::BI__builtin_neon_vclezq_v: 6144 return EmitAArch64CompareBuiltinExpr(Ops[0], Ty, ICmpInst::FCMP_OLE, 6145 ICmpInst::ICMP_SLE, "vclez"); 6146 case NEON::BI__builtin_neon_vcgtz_v: 6147 case NEON::BI__builtin_neon_vcgtzq_v: 6148 return EmitAArch64CompareBuiltinExpr(Ops[0], Ty, ICmpInst::FCMP_OGT, 6149 ICmpInst::ICMP_SGT, "vcgtz"); 6150 case NEON::BI__builtin_neon_vcltz_v: 6151 case NEON::BI__builtin_neon_vcltzq_v: 6152 return EmitAArch64CompareBuiltinExpr(Ops[0], Ty, ICmpInst::FCMP_OLT, 6153 ICmpInst::ICMP_SLT, "vcltz"); 6154 case NEON::BI__builtin_neon_vcvt_f64_v: 6155 case NEON::BI__builtin_neon_vcvtq_f64_v: 6156 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 6157 Ty = GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float64, false, quad)); 6158 return usgn ? Builder.CreateUIToFP(Ops[0], Ty, "vcvt") 6159 : Builder.CreateSIToFP(Ops[0], Ty, "vcvt"); 6160 case NEON::BI__builtin_neon_vcvt_f64_f32: { 6161 assert(Type.getEltType() == NeonTypeFlags::Float64 && quad && 6162 "unexpected vcvt_f64_f32 builtin"); 6163 NeonTypeFlags SrcFlag = NeonTypeFlags(NeonTypeFlags::Float32, false, false); 6164 Ops[0] = Builder.CreateBitCast(Ops[0], GetNeonType(this, SrcFlag)); 6165 6166 return Builder.CreateFPExt(Ops[0], Ty, "vcvt"); 6167 } 6168 case NEON::BI__builtin_neon_vcvt_f32_f64: { 6169 assert(Type.getEltType() == NeonTypeFlags::Float32 && 6170 "unexpected vcvt_f32_f64 builtin"); 6171 NeonTypeFlags SrcFlag = NeonTypeFlags(NeonTypeFlags::Float64, false, true); 6172 Ops[0] = Builder.CreateBitCast(Ops[0], GetNeonType(this, SrcFlag)); 6173 6174 return Builder.CreateFPTrunc(Ops[0], Ty, "vcvt"); 6175 } 6176 case NEON::BI__builtin_neon_vcvt_s32_v: 6177 case NEON::BI__builtin_neon_vcvt_u32_v: 6178 case NEON::BI__builtin_neon_vcvt_s64_v: 6179 case NEON::BI__builtin_neon_vcvt_u64_v: 6180 case NEON::BI__builtin_neon_vcvtq_s32_v: 6181 case NEON::BI__builtin_neon_vcvtq_u32_v: 6182 case NEON::BI__builtin_neon_vcvtq_s64_v: 6183 case NEON::BI__builtin_neon_vcvtq_u64_v: { 6184 Ops[0] = Builder.CreateBitCast(Ops[0], GetFloatNeonType(this, Type)); 6185 if (usgn) 6186 return Builder.CreateFPToUI(Ops[0], Ty); 6187 return Builder.CreateFPToSI(Ops[0], Ty); 6188 } 6189 case NEON::BI__builtin_neon_vcvta_s32_v: 6190 case NEON::BI__builtin_neon_vcvtaq_s32_v: 6191 case NEON::BI__builtin_neon_vcvta_u32_v: 6192 case NEON::BI__builtin_neon_vcvtaq_u32_v: 6193 case NEON::BI__builtin_neon_vcvta_s64_v: 6194 case NEON::BI__builtin_neon_vcvtaq_s64_v: 6195 case NEON::BI__builtin_neon_vcvta_u64_v: 6196 case NEON::BI__builtin_neon_vcvtaq_u64_v: { 6197 Int = usgn ? Intrinsic::aarch64_neon_fcvtau : Intrinsic::aarch64_neon_fcvtas; 6198 llvm::Type *Tys[2] = { Ty, GetFloatNeonType(this, Type) }; 6199 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvta"); 6200 } 6201 case NEON::BI__builtin_neon_vcvtm_s32_v: 6202 case NEON::BI__builtin_neon_vcvtmq_s32_v: 6203 case NEON::BI__builtin_neon_vcvtm_u32_v: 6204 case NEON::BI__builtin_neon_vcvtmq_u32_v: 6205 case NEON::BI__builtin_neon_vcvtm_s64_v: 6206 case NEON::BI__builtin_neon_vcvtmq_s64_v: 6207 case NEON::BI__builtin_neon_vcvtm_u64_v: 6208 case NEON::BI__builtin_neon_vcvtmq_u64_v: { 6209 Int = usgn ? Intrinsic::aarch64_neon_fcvtmu : Intrinsic::aarch64_neon_fcvtms; 6210 llvm::Type *Tys[2] = { Ty, GetFloatNeonType(this, Type) }; 6211 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvtm"); 6212 } 6213 case NEON::BI__builtin_neon_vcvtn_s32_v: 6214 case NEON::BI__builtin_neon_vcvtnq_s32_v: 6215 case NEON::BI__builtin_neon_vcvtn_u32_v: 6216 case NEON::BI__builtin_neon_vcvtnq_u32_v: 6217 case NEON::BI__builtin_neon_vcvtn_s64_v: 6218 case NEON::BI__builtin_neon_vcvtnq_s64_v: 6219 case NEON::BI__builtin_neon_vcvtn_u64_v: 6220 case NEON::BI__builtin_neon_vcvtnq_u64_v: { 6221 Int = usgn ? Intrinsic::aarch64_neon_fcvtnu : Intrinsic::aarch64_neon_fcvtns; 6222 llvm::Type *Tys[2] = { Ty, GetFloatNeonType(this, Type) }; 6223 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvtn"); 6224 } 6225 case NEON::BI__builtin_neon_vcvtp_s32_v: 6226 case NEON::BI__builtin_neon_vcvtpq_s32_v: 6227 case NEON::BI__builtin_neon_vcvtp_u32_v: 6228 case NEON::BI__builtin_neon_vcvtpq_u32_v: 6229 case NEON::BI__builtin_neon_vcvtp_s64_v: 6230 case NEON::BI__builtin_neon_vcvtpq_s64_v: 6231 case NEON::BI__builtin_neon_vcvtp_u64_v: 6232 case NEON::BI__builtin_neon_vcvtpq_u64_v: { 6233 Int = usgn ? Intrinsic::aarch64_neon_fcvtpu : Intrinsic::aarch64_neon_fcvtps; 6234 llvm::Type *Tys[2] = { Ty, GetFloatNeonType(this, Type) }; 6235 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvtp"); 6236 } 6237 case NEON::BI__builtin_neon_vmulx_v: 6238 case NEON::BI__builtin_neon_vmulxq_v: { 6239 Int = Intrinsic::aarch64_neon_fmulx; 6240 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmulx"); 6241 } 6242 case NEON::BI__builtin_neon_vmul_lane_v: 6243 case NEON::BI__builtin_neon_vmul_laneq_v: { 6244 // v1f64 vmul_lane should be mapped to Neon scalar mul lane 6245 bool Quad = false; 6246 if (BuiltinID == NEON::BI__builtin_neon_vmul_laneq_v) 6247 Quad = true; 6248 Ops[0] = Builder.CreateBitCast(Ops[0], DoubleTy); 6249 llvm::Type *VTy = GetNeonType(this, 6250 NeonTypeFlags(NeonTypeFlags::Float64, false, Quad)); 6251 Ops[1] = Builder.CreateBitCast(Ops[1], VTy); 6252 Ops[1] = Builder.CreateExtractElement(Ops[1], Ops[2], "extract"); 6253 Value *Result = Builder.CreateFMul(Ops[0], Ops[1]); 6254 return Builder.CreateBitCast(Result, Ty); 6255 } 6256 case NEON::BI__builtin_neon_vnegd_s64: 6257 return Builder.CreateNeg(EmitScalarExpr(E->getArg(0)), "vnegd"); 6258 case NEON::BI__builtin_neon_vpmaxnm_v: 6259 case NEON::BI__builtin_neon_vpmaxnmq_v: { 6260 Int = Intrinsic::aarch64_neon_fmaxnmp; 6261 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpmaxnm"); 6262 } 6263 case NEON::BI__builtin_neon_vpminnm_v: 6264 case NEON::BI__builtin_neon_vpminnmq_v: { 6265 Int = Intrinsic::aarch64_neon_fminnmp; 6266 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpminnm"); 6267 } 6268 case NEON::BI__builtin_neon_vsqrt_v: 6269 case NEON::BI__builtin_neon_vsqrtq_v: { 6270 Int = Intrinsic::sqrt; 6271 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 6272 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vsqrt"); 6273 } 6274 case NEON::BI__builtin_neon_vrbit_v: 6275 case NEON::BI__builtin_neon_vrbitq_v: { 6276 Int = Intrinsic::aarch64_neon_rbit; 6277 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrbit"); 6278 } 6279 case NEON::BI__builtin_neon_vaddv_u8: 6280 // FIXME: These are handled by the AArch64 scalar code. 6281 usgn = true; 6282 // FALLTHROUGH 6283 case NEON::BI__builtin_neon_vaddv_s8: { 6284 Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv; 6285 Ty = Int32Ty; 6286 VTy = llvm::VectorType::get(Int8Ty, 8); 6287 llvm::Type *Tys[2] = { Ty, VTy }; 6288 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6289 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv"); 6290 return Builder.CreateTrunc(Ops[0], Int8Ty); 6291 } 6292 case NEON::BI__builtin_neon_vaddv_u16: 6293 usgn = true; 6294 // FALLTHROUGH 6295 case NEON::BI__builtin_neon_vaddv_s16: { 6296 Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv; 6297 Ty = Int32Ty; 6298 VTy = llvm::VectorType::get(Int16Ty, 4); 6299 llvm::Type *Tys[2] = { Ty, VTy }; 6300 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6301 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv"); 6302 return Builder.CreateTrunc(Ops[0], Int16Ty); 6303 } 6304 case NEON::BI__builtin_neon_vaddvq_u8: 6305 usgn = true; 6306 // FALLTHROUGH 6307 case NEON::BI__builtin_neon_vaddvq_s8: { 6308 Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv; 6309 Ty = Int32Ty; 6310 VTy = llvm::VectorType::get(Int8Ty, 16); 6311 llvm::Type *Tys[2] = { Ty, VTy }; 6312 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6313 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv"); 6314 return Builder.CreateTrunc(Ops[0], Int8Ty); 6315 } 6316 case NEON::BI__builtin_neon_vaddvq_u16: 6317 usgn = true; 6318 // FALLTHROUGH 6319 case NEON::BI__builtin_neon_vaddvq_s16: { 6320 Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv; 6321 Ty = Int32Ty; 6322 VTy = llvm::VectorType::get(Int16Ty, 8); 6323 llvm::Type *Tys[2] = { Ty, VTy }; 6324 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6325 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv"); 6326 return Builder.CreateTrunc(Ops[0], Int16Ty); 6327 } 6328 case NEON::BI__builtin_neon_vmaxv_u8: { 6329 Int = Intrinsic::aarch64_neon_umaxv; 6330 Ty = Int32Ty; 6331 VTy = llvm::VectorType::get(Int8Ty, 8); 6332 llvm::Type *Tys[2] = { Ty, VTy }; 6333 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6334 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); 6335 return Builder.CreateTrunc(Ops[0], Int8Ty); 6336 } 6337 case NEON::BI__builtin_neon_vmaxv_u16: { 6338 Int = Intrinsic::aarch64_neon_umaxv; 6339 Ty = Int32Ty; 6340 VTy = llvm::VectorType::get(Int16Ty, 4); 6341 llvm::Type *Tys[2] = { Ty, VTy }; 6342 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6343 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); 6344 return Builder.CreateTrunc(Ops[0], Int16Ty); 6345 } 6346 case NEON::BI__builtin_neon_vmaxvq_u8: { 6347 Int = Intrinsic::aarch64_neon_umaxv; 6348 Ty = Int32Ty; 6349 VTy = llvm::VectorType::get(Int8Ty, 16); 6350 llvm::Type *Tys[2] = { Ty, VTy }; 6351 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6352 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); 6353 return Builder.CreateTrunc(Ops[0], Int8Ty); 6354 } 6355 case NEON::BI__builtin_neon_vmaxvq_u16: { 6356 Int = Intrinsic::aarch64_neon_umaxv; 6357 Ty = Int32Ty; 6358 VTy = llvm::VectorType::get(Int16Ty, 8); 6359 llvm::Type *Tys[2] = { Ty, VTy }; 6360 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6361 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); 6362 return Builder.CreateTrunc(Ops[0], Int16Ty); 6363 } 6364 case NEON::BI__builtin_neon_vmaxv_s8: { 6365 Int = Intrinsic::aarch64_neon_smaxv; 6366 Ty = Int32Ty; 6367 VTy = llvm::VectorType::get(Int8Ty, 8); 6368 llvm::Type *Tys[2] = { Ty, VTy }; 6369 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6370 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); 6371 return Builder.CreateTrunc(Ops[0], Int8Ty); 6372 } 6373 case NEON::BI__builtin_neon_vmaxv_s16: { 6374 Int = Intrinsic::aarch64_neon_smaxv; 6375 Ty = Int32Ty; 6376 VTy = llvm::VectorType::get(Int16Ty, 4); 6377 llvm::Type *Tys[2] = { Ty, VTy }; 6378 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6379 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); 6380 return Builder.CreateTrunc(Ops[0], Int16Ty); 6381 } 6382 case NEON::BI__builtin_neon_vmaxvq_s8: { 6383 Int = Intrinsic::aarch64_neon_smaxv; 6384 Ty = Int32Ty; 6385 VTy = llvm::VectorType::get(Int8Ty, 16); 6386 llvm::Type *Tys[2] = { Ty, VTy }; 6387 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6388 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); 6389 return Builder.CreateTrunc(Ops[0], Int8Ty); 6390 } 6391 case NEON::BI__builtin_neon_vmaxvq_s16: { 6392 Int = Intrinsic::aarch64_neon_smaxv; 6393 Ty = Int32Ty; 6394 VTy = llvm::VectorType::get(Int16Ty, 8); 6395 llvm::Type *Tys[2] = { Ty, VTy }; 6396 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6397 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); 6398 return Builder.CreateTrunc(Ops[0], Int16Ty); 6399 } 6400 case NEON::BI__builtin_neon_vminv_u8: { 6401 Int = Intrinsic::aarch64_neon_uminv; 6402 Ty = Int32Ty; 6403 VTy = llvm::VectorType::get(Int8Ty, 8); 6404 llvm::Type *Tys[2] = { Ty, VTy }; 6405 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6406 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); 6407 return Builder.CreateTrunc(Ops[0], Int8Ty); 6408 } 6409 case NEON::BI__builtin_neon_vminv_u16: { 6410 Int = Intrinsic::aarch64_neon_uminv; 6411 Ty = Int32Ty; 6412 VTy = llvm::VectorType::get(Int16Ty, 4); 6413 llvm::Type *Tys[2] = { Ty, VTy }; 6414 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6415 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); 6416 return Builder.CreateTrunc(Ops[0], Int16Ty); 6417 } 6418 case NEON::BI__builtin_neon_vminvq_u8: { 6419 Int = Intrinsic::aarch64_neon_uminv; 6420 Ty = Int32Ty; 6421 VTy = llvm::VectorType::get(Int8Ty, 16); 6422 llvm::Type *Tys[2] = { Ty, VTy }; 6423 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6424 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); 6425 return Builder.CreateTrunc(Ops[0], Int8Ty); 6426 } 6427 case NEON::BI__builtin_neon_vminvq_u16: { 6428 Int = Intrinsic::aarch64_neon_uminv; 6429 Ty = Int32Ty; 6430 VTy = llvm::VectorType::get(Int16Ty, 8); 6431 llvm::Type *Tys[2] = { Ty, VTy }; 6432 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6433 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); 6434 return Builder.CreateTrunc(Ops[0], Int16Ty); 6435 } 6436 case NEON::BI__builtin_neon_vminv_s8: { 6437 Int = Intrinsic::aarch64_neon_sminv; 6438 Ty = Int32Ty; 6439 VTy = llvm::VectorType::get(Int8Ty, 8); 6440 llvm::Type *Tys[2] = { Ty, VTy }; 6441 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6442 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); 6443 return Builder.CreateTrunc(Ops[0], Int8Ty); 6444 } 6445 case NEON::BI__builtin_neon_vminv_s16: { 6446 Int = Intrinsic::aarch64_neon_sminv; 6447 Ty = Int32Ty; 6448 VTy = llvm::VectorType::get(Int16Ty, 4); 6449 llvm::Type *Tys[2] = { Ty, VTy }; 6450 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6451 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); 6452 return Builder.CreateTrunc(Ops[0], Int16Ty); 6453 } 6454 case NEON::BI__builtin_neon_vminvq_s8: { 6455 Int = Intrinsic::aarch64_neon_sminv; 6456 Ty = Int32Ty; 6457 VTy = llvm::VectorType::get(Int8Ty, 16); 6458 llvm::Type *Tys[2] = { Ty, VTy }; 6459 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6460 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); 6461 return Builder.CreateTrunc(Ops[0], Int8Ty); 6462 } 6463 case NEON::BI__builtin_neon_vminvq_s16: { 6464 Int = Intrinsic::aarch64_neon_sminv; 6465 Ty = Int32Ty; 6466 VTy = llvm::VectorType::get(Int16Ty, 8); 6467 llvm::Type *Tys[2] = { Ty, VTy }; 6468 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6469 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); 6470 return Builder.CreateTrunc(Ops[0], Int16Ty); 6471 } 6472 case NEON::BI__builtin_neon_vmul_n_f64: { 6473 Ops[0] = Builder.CreateBitCast(Ops[0], DoubleTy); 6474 Value *RHS = Builder.CreateBitCast(EmitScalarExpr(E->getArg(1)), DoubleTy); 6475 return Builder.CreateFMul(Ops[0], RHS); 6476 } 6477 case NEON::BI__builtin_neon_vaddlv_u8: { 6478 Int = Intrinsic::aarch64_neon_uaddlv; 6479 Ty = Int32Ty; 6480 VTy = llvm::VectorType::get(Int8Ty, 8); 6481 llvm::Type *Tys[2] = { Ty, VTy }; 6482 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6483 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv"); 6484 return Builder.CreateTrunc(Ops[0], Int16Ty); 6485 } 6486 case NEON::BI__builtin_neon_vaddlv_u16: { 6487 Int = Intrinsic::aarch64_neon_uaddlv; 6488 Ty = Int32Ty; 6489 VTy = llvm::VectorType::get(Int16Ty, 4); 6490 llvm::Type *Tys[2] = { Ty, VTy }; 6491 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6492 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv"); 6493 } 6494 case NEON::BI__builtin_neon_vaddlvq_u8: { 6495 Int = Intrinsic::aarch64_neon_uaddlv; 6496 Ty = Int32Ty; 6497 VTy = llvm::VectorType::get(Int8Ty, 16); 6498 llvm::Type *Tys[2] = { Ty, VTy }; 6499 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6500 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv"); 6501 return Builder.CreateTrunc(Ops[0], Int16Ty); 6502 } 6503 case NEON::BI__builtin_neon_vaddlvq_u16: { 6504 Int = Intrinsic::aarch64_neon_uaddlv; 6505 Ty = Int32Ty; 6506 VTy = llvm::VectorType::get(Int16Ty, 8); 6507 llvm::Type *Tys[2] = { Ty, VTy }; 6508 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6509 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv"); 6510 } 6511 case NEON::BI__builtin_neon_vaddlv_s8: { 6512 Int = Intrinsic::aarch64_neon_saddlv; 6513 Ty = Int32Ty; 6514 VTy = llvm::VectorType::get(Int8Ty, 8); 6515 llvm::Type *Tys[2] = { Ty, VTy }; 6516 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6517 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv"); 6518 return Builder.CreateTrunc(Ops[0], Int16Ty); 6519 } 6520 case NEON::BI__builtin_neon_vaddlv_s16: { 6521 Int = Intrinsic::aarch64_neon_saddlv; 6522 Ty = Int32Ty; 6523 VTy = llvm::VectorType::get(Int16Ty, 4); 6524 llvm::Type *Tys[2] = { Ty, VTy }; 6525 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6526 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv"); 6527 } 6528 case NEON::BI__builtin_neon_vaddlvq_s8: { 6529 Int = Intrinsic::aarch64_neon_saddlv; 6530 Ty = Int32Ty; 6531 VTy = llvm::VectorType::get(Int8Ty, 16); 6532 llvm::Type *Tys[2] = { Ty, VTy }; 6533 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6534 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv"); 6535 return Builder.CreateTrunc(Ops[0], Int16Ty); 6536 } 6537 case NEON::BI__builtin_neon_vaddlvq_s16: { 6538 Int = Intrinsic::aarch64_neon_saddlv; 6539 Ty = Int32Ty; 6540 VTy = llvm::VectorType::get(Int16Ty, 8); 6541 llvm::Type *Tys[2] = { Ty, VTy }; 6542 Ops.push_back(EmitScalarExpr(E->getArg(0))); 6543 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv"); 6544 } 6545 case NEON::BI__builtin_neon_vsri_n_v: 6546 case NEON::BI__builtin_neon_vsriq_n_v: { 6547 Int = Intrinsic::aarch64_neon_vsri; 6548 llvm::Function *Intrin = CGM.getIntrinsic(Int, Ty); 6549 return EmitNeonCall(Intrin, Ops, "vsri_n"); 6550 } 6551 case NEON::BI__builtin_neon_vsli_n_v: 6552 case NEON::BI__builtin_neon_vsliq_n_v: { 6553 Int = Intrinsic::aarch64_neon_vsli; 6554 llvm::Function *Intrin = CGM.getIntrinsic(Int, Ty); 6555 return EmitNeonCall(Intrin, Ops, "vsli_n"); 6556 } 6557 case NEON::BI__builtin_neon_vsra_n_v: 6558 case NEON::BI__builtin_neon_vsraq_n_v: 6559 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 6560 Ops[1] = EmitNeonRShiftImm(Ops[1], Ops[2], Ty, usgn, "vsra_n"); 6561 return Builder.CreateAdd(Ops[0], Ops[1]); 6562 case NEON::BI__builtin_neon_vrsra_n_v: 6563 case NEON::BI__builtin_neon_vrsraq_n_v: { 6564 Int = usgn ? Intrinsic::aarch64_neon_urshl : Intrinsic::aarch64_neon_srshl; 6565 SmallVector<llvm::Value*,2> TmpOps; 6566 TmpOps.push_back(Ops[1]); 6567 TmpOps.push_back(Ops[2]); 6568 Function* F = CGM.getIntrinsic(Int, Ty); 6569 llvm::Value *tmp = EmitNeonCall(F, TmpOps, "vrshr_n", 1, true); 6570 Ops[0] = Builder.CreateBitCast(Ops[0], VTy); 6571 return Builder.CreateAdd(Ops[0], tmp); 6572 } 6573 // FIXME: Sharing loads & stores with 32-bit is complicated by the absence 6574 // of an Align parameter here. 6575 case NEON::BI__builtin_neon_vld1_x2_v: 6576 case NEON::BI__builtin_neon_vld1q_x2_v: 6577 case NEON::BI__builtin_neon_vld1_x3_v: 6578 case NEON::BI__builtin_neon_vld1q_x3_v: 6579 case NEON::BI__builtin_neon_vld1_x4_v: 6580 case NEON::BI__builtin_neon_vld1q_x4_v: { 6581 llvm::Type *PTy = llvm::PointerType::getUnqual(VTy->getVectorElementType()); 6582 Ops[1] = Builder.CreateBitCast(Ops[1], PTy); 6583 llvm::Type *Tys[2] = { VTy, PTy }; 6584 unsigned Int; 6585 switch (BuiltinID) { 6586 case NEON::BI__builtin_neon_vld1_x2_v: 6587 case NEON::BI__builtin_neon_vld1q_x2_v: 6588 Int = Intrinsic::aarch64_neon_ld1x2; 6589 break; 6590 case NEON::BI__builtin_neon_vld1_x3_v: 6591 case NEON::BI__builtin_neon_vld1q_x3_v: 6592 Int = Intrinsic::aarch64_neon_ld1x3; 6593 break; 6594 case NEON::BI__builtin_neon_vld1_x4_v: 6595 case NEON::BI__builtin_neon_vld1q_x4_v: 6596 Int = Intrinsic::aarch64_neon_ld1x4; 6597 break; 6598 } 6599 Function *F = CGM.getIntrinsic(Int, Tys); 6600 Ops[1] = Builder.CreateCall(F, Ops[1], "vld1xN"); 6601 Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); 6602 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 6603 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6604 } 6605 case NEON::BI__builtin_neon_vst1_x2_v: 6606 case NEON::BI__builtin_neon_vst1q_x2_v: 6607 case NEON::BI__builtin_neon_vst1_x3_v: 6608 case NEON::BI__builtin_neon_vst1q_x3_v: 6609 case NEON::BI__builtin_neon_vst1_x4_v: 6610 case NEON::BI__builtin_neon_vst1q_x4_v: { 6611 llvm::Type *PTy = llvm::PointerType::getUnqual(VTy->getVectorElementType()); 6612 llvm::Type *Tys[2] = { VTy, PTy }; 6613 unsigned Int; 6614 switch (BuiltinID) { 6615 case NEON::BI__builtin_neon_vst1_x2_v: 6616 case NEON::BI__builtin_neon_vst1q_x2_v: 6617 Int = Intrinsic::aarch64_neon_st1x2; 6618 break; 6619 case NEON::BI__builtin_neon_vst1_x3_v: 6620 case NEON::BI__builtin_neon_vst1q_x3_v: 6621 Int = Intrinsic::aarch64_neon_st1x3; 6622 break; 6623 case NEON::BI__builtin_neon_vst1_x4_v: 6624 case NEON::BI__builtin_neon_vst1q_x4_v: 6625 Int = Intrinsic::aarch64_neon_st1x4; 6626 break; 6627 } 6628 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end()); 6629 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, ""); 6630 } 6631 case NEON::BI__builtin_neon_vld1_v: 6632 case NEON::BI__builtin_neon_vld1q_v: 6633 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(VTy)); 6634 return Builder.CreateDefaultAlignedLoad(Ops[0]); 6635 case NEON::BI__builtin_neon_vst1_v: 6636 case NEON::BI__builtin_neon_vst1q_v: 6637 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(VTy)); 6638 Ops[1] = Builder.CreateBitCast(Ops[1], VTy); 6639 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6640 case NEON::BI__builtin_neon_vld1_lane_v: 6641 case NEON::BI__builtin_neon_vld1q_lane_v: 6642 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 6643 Ty = llvm::PointerType::getUnqual(VTy->getElementType()); 6644 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 6645 Ops[0] = Builder.CreateDefaultAlignedLoad(Ops[0]); 6646 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vld1_lane"); 6647 case NEON::BI__builtin_neon_vld1_dup_v: 6648 case NEON::BI__builtin_neon_vld1q_dup_v: { 6649 Value *V = UndefValue::get(Ty); 6650 Ty = llvm::PointerType::getUnqual(VTy->getElementType()); 6651 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 6652 Ops[0] = Builder.CreateDefaultAlignedLoad(Ops[0]); 6653 llvm::Constant *CI = ConstantInt::get(Int32Ty, 0); 6654 Ops[0] = Builder.CreateInsertElement(V, Ops[0], CI); 6655 return EmitNeonSplat(Ops[0], CI); 6656 } 6657 case NEON::BI__builtin_neon_vst1_lane_v: 6658 case NEON::BI__builtin_neon_vst1q_lane_v: 6659 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 6660 Ops[1] = Builder.CreateExtractElement(Ops[1], Ops[2]); 6661 Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); 6662 return Builder.CreateDefaultAlignedStore(Ops[1], 6663 Builder.CreateBitCast(Ops[0], Ty)); 6664 case NEON::BI__builtin_neon_vld2_v: 6665 case NEON::BI__builtin_neon_vld2q_v: { 6666 llvm::Type *PTy = llvm::PointerType::getUnqual(VTy); 6667 Ops[1] = Builder.CreateBitCast(Ops[1], PTy); 6668 llvm::Type *Tys[2] = { VTy, PTy }; 6669 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld2, Tys); 6670 Ops[1] = Builder.CreateCall(F, Ops[1], "vld2"); 6671 Ops[0] = Builder.CreateBitCast(Ops[0], 6672 llvm::PointerType::getUnqual(Ops[1]->getType())); 6673 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6674 } 6675 case NEON::BI__builtin_neon_vld3_v: 6676 case NEON::BI__builtin_neon_vld3q_v: { 6677 llvm::Type *PTy = llvm::PointerType::getUnqual(VTy); 6678 Ops[1] = Builder.CreateBitCast(Ops[1], PTy); 6679 llvm::Type *Tys[2] = { VTy, PTy }; 6680 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld3, Tys); 6681 Ops[1] = Builder.CreateCall(F, Ops[1], "vld3"); 6682 Ops[0] = Builder.CreateBitCast(Ops[0], 6683 llvm::PointerType::getUnqual(Ops[1]->getType())); 6684 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6685 } 6686 case NEON::BI__builtin_neon_vld4_v: 6687 case NEON::BI__builtin_neon_vld4q_v: { 6688 llvm::Type *PTy = llvm::PointerType::getUnqual(VTy); 6689 Ops[1] = Builder.CreateBitCast(Ops[1], PTy); 6690 llvm::Type *Tys[2] = { VTy, PTy }; 6691 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld4, Tys); 6692 Ops[1] = Builder.CreateCall(F, Ops[1], "vld4"); 6693 Ops[0] = Builder.CreateBitCast(Ops[0], 6694 llvm::PointerType::getUnqual(Ops[1]->getType())); 6695 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6696 } 6697 case NEON::BI__builtin_neon_vld2_dup_v: 6698 case NEON::BI__builtin_neon_vld2q_dup_v: { 6699 llvm::Type *PTy = 6700 llvm::PointerType::getUnqual(VTy->getElementType()); 6701 Ops[1] = Builder.CreateBitCast(Ops[1], PTy); 6702 llvm::Type *Tys[2] = { VTy, PTy }; 6703 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld2r, Tys); 6704 Ops[1] = Builder.CreateCall(F, Ops[1], "vld2"); 6705 Ops[0] = Builder.CreateBitCast(Ops[0], 6706 llvm::PointerType::getUnqual(Ops[1]->getType())); 6707 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6708 } 6709 case NEON::BI__builtin_neon_vld3_dup_v: 6710 case NEON::BI__builtin_neon_vld3q_dup_v: { 6711 llvm::Type *PTy = 6712 llvm::PointerType::getUnqual(VTy->getElementType()); 6713 Ops[1] = Builder.CreateBitCast(Ops[1], PTy); 6714 llvm::Type *Tys[2] = { VTy, PTy }; 6715 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld3r, Tys); 6716 Ops[1] = Builder.CreateCall(F, Ops[1], "vld3"); 6717 Ops[0] = Builder.CreateBitCast(Ops[0], 6718 llvm::PointerType::getUnqual(Ops[1]->getType())); 6719 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6720 } 6721 case NEON::BI__builtin_neon_vld4_dup_v: 6722 case NEON::BI__builtin_neon_vld4q_dup_v: { 6723 llvm::Type *PTy = 6724 llvm::PointerType::getUnqual(VTy->getElementType()); 6725 Ops[1] = Builder.CreateBitCast(Ops[1], PTy); 6726 llvm::Type *Tys[2] = { VTy, PTy }; 6727 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld4r, Tys); 6728 Ops[1] = Builder.CreateCall(F, Ops[1], "vld4"); 6729 Ops[0] = Builder.CreateBitCast(Ops[0], 6730 llvm::PointerType::getUnqual(Ops[1]->getType())); 6731 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6732 } 6733 case NEON::BI__builtin_neon_vld2_lane_v: 6734 case NEON::BI__builtin_neon_vld2q_lane_v: { 6735 llvm::Type *Tys[2] = { VTy, Ops[1]->getType() }; 6736 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld2lane, Tys); 6737 Ops.push_back(Ops[1]); 6738 Ops.erase(Ops.begin()+1); 6739 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 6740 Ops[2] = Builder.CreateBitCast(Ops[2], Ty); 6741 Ops[3] = Builder.CreateZExt(Ops[3], Int64Ty); 6742 Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld2_lane"); 6743 Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); 6744 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 6745 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6746 } 6747 case NEON::BI__builtin_neon_vld3_lane_v: 6748 case NEON::BI__builtin_neon_vld3q_lane_v: { 6749 llvm::Type *Tys[2] = { VTy, Ops[1]->getType() }; 6750 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld3lane, Tys); 6751 Ops.push_back(Ops[1]); 6752 Ops.erase(Ops.begin()+1); 6753 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 6754 Ops[2] = Builder.CreateBitCast(Ops[2], Ty); 6755 Ops[3] = Builder.CreateBitCast(Ops[3], Ty); 6756 Ops[4] = Builder.CreateZExt(Ops[4], Int64Ty); 6757 Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld3_lane"); 6758 Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); 6759 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 6760 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6761 } 6762 case NEON::BI__builtin_neon_vld4_lane_v: 6763 case NEON::BI__builtin_neon_vld4q_lane_v: { 6764 llvm::Type *Tys[2] = { VTy, Ops[1]->getType() }; 6765 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld4lane, Tys); 6766 Ops.push_back(Ops[1]); 6767 Ops.erase(Ops.begin()+1); 6768 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 6769 Ops[2] = Builder.CreateBitCast(Ops[2], Ty); 6770 Ops[3] = Builder.CreateBitCast(Ops[3], Ty); 6771 Ops[4] = Builder.CreateBitCast(Ops[4], Ty); 6772 Ops[5] = Builder.CreateZExt(Ops[5], Int64Ty); 6773 Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld4_lane"); 6774 Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); 6775 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 6776 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6777 } 6778 case NEON::BI__builtin_neon_vst2_v: 6779 case NEON::BI__builtin_neon_vst2q_v: { 6780 Ops.push_back(Ops[0]); 6781 Ops.erase(Ops.begin()); 6782 llvm::Type *Tys[2] = { VTy, Ops[2]->getType() }; 6783 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st2, Tys), 6784 Ops, ""); 6785 } 6786 case NEON::BI__builtin_neon_vst2_lane_v: 6787 case NEON::BI__builtin_neon_vst2q_lane_v: { 6788 Ops.push_back(Ops[0]); 6789 Ops.erase(Ops.begin()); 6790 Ops[2] = Builder.CreateZExt(Ops[2], Int64Ty); 6791 llvm::Type *Tys[2] = { VTy, Ops[3]->getType() }; 6792 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st2lane, Tys), 6793 Ops, ""); 6794 } 6795 case NEON::BI__builtin_neon_vst3_v: 6796 case NEON::BI__builtin_neon_vst3q_v: { 6797 Ops.push_back(Ops[0]); 6798 Ops.erase(Ops.begin()); 6799 llvm::Type *Tys[2] = { VTy, Ops[3]->getType() }; 6800 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st3, Tys), 6801 Ops, ""); 6802 } 6803 case NEON::BI__builtin_neon_vst3_lane_v: 6804 case NEON::BI__builtin_neon_vst3q_lane_v: { 6805 Ops.push_back(Ops[0]); 6806 Ops.erase(Ops.begin()); 6807 Ops[3] = Builder.CreateZExt(Ops[3], Int64Ty); 6808 llvm::Type *Tys[2] = { VTy, Ops[4]->getType() }; 6809 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st3lane, Tys), 6810 Ops, ""); 6811 } 6812 case NEON::BI__builtin_neon_vst4_v: 6813 case NEON::BI__builtin_neon_vst4q_v: { 6814 Ops.push_back(Ops[0]); 6815 Ops.erase(Ops.begin()); 6816 llvm::Type *Tys[2] = { VTy, Ops[4]->getType() }; 6817 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st4, Tys), 6818 Ops, ""); 6819 } 6820 case NEON::BI__builtin_neon_vst4_lane_v: 6821 case NEON::BI__builtin_neon_vst4q_lane_v: { 6822 Ops.push_back(Ops[0]); 6823 Ops.erase(Ops.begin()); 6824 Ops[4] = Builder.CreateZExt(Ops[4], Int64Ty); 6825 llvm::Type *Tys[2] = { VTy, Ops[5]->getType() }; 6826 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st4lane, Tys), 6827 Ops, ""); 6828 } 6829 case NEON::BI__builtin_neon_vtrn_v: 6830 case NEON::BI__builtin_neon_vtrnq_v: { 6831 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty)); 6832 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 6833 Ops[2] = Builder.CreateBitCast(Ops[2], Ty); 6834 Value *SV = nullptr; 6835 6836 for (unsigned vi = 0; vi != 2; ++vi) { 6837 SmallVector<uint32_t, 16> Indices; 6838 for (unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) { 6839 Indices.push_back(i+vi); 6840 Indices.push_back(i+e+vi); 6841 } 6842 Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi); 6843 SV = Builder.CreateShuffleVector(Ops[1], Ops[2], Indices, "vtrn"); 6844 SV = Builder.CreateDefaultAlignedStore(SV, Addr); 6845 } 6846 return SV; 6847 } 6848 case NEON::BI__builtin_neon_vuzp_v: 6849 case NEON::BI__builtin_neon_vuzpq_v: { 6850 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty)); 6851 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 6852 Ops[2] = Builder.CreateBitCast(Ops[2], Ty); 6853 Value *SV = nullptr; 6854 6855 for (unsigned vi = 0; vi != 2; ++vi) { 6856 SmallVector<uint32_t, 16> Indices; 6857 for (unsigned i = 0, e = VTy->getNumElements(); i != e; ++i) 6858 Indices.push_back(2*i+vi); 6859 6860 Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi); 6861 SV = Builder.CreateShuffleVector(Ops[1], Ops[2], Indices, "vuzp"); 6862 SV = Builder.CreateDefaultAlignedStore(SV, Addr); 6863 } 6864 return SV; 6865 } 6866 case NEON::BI__builtin_neon_vzip_v: 6867 case NEON::BI__builtin_neon_vzipq_v: { 6868 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty)); 6869 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 6870 Ops[2] = Builder.CreateBitCast(Ops[2], Ty); 6871 Value *SV = nullptr; 6872 6873 for (unsigned vi = 0; vi != 2; ++vi) { 6874 SmallVector<uint32_t, 16> Indices; 6875 for (unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) { 6876 Indices.push_back((i + vi*e) >> 1); 6877 Indices.push_back(((i + vi*e) >> 1)+e); 6878 } 6879 Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi); 6880 SV = Builder.CreateShuffleVector(Ops[1], Ops[2], Indices, "vzip"); 6881 SV = Builder.CreateDefaultAlignedStore(SV, Addr); 6882 } 6883 return SV; 6884 } 6885 case NEON::BI__builtin_neon_vqtbl1q_v: { 6886 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbl1, Ty), 6887 Ops, "vtbl1"); 6888 } 6889 case NEON::BI__builtin_neon_vqtbl2q_v: { 6890 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbl2, Ty), 6891 Ops, "vtbl2"); 6892 } 6893 case NEON::BI__builtin_neon_vqtbl3q_v: { 6894 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbl3, Ty), 6895 Ops, "vtbl3"); 6896 } 6897 case NEON::BI__builtin_neon_vqtbl4q_v: { 6898 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbl4, Ty), 6899 Ops, "vtbl4"); 6900 } 6901 case NEON::BI__builtin_neon_vqtbx1q_v: { 6902 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbx1, Ty), 6903 Ops, "vtbx1"); 6904 } 6905 case NEON::BI__builtin_neon_vqtbx2q_v: { 6906 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbx2, Ty), 6907 Ops, "vtbx2"); 6908 } 6909 case NEON::BI__builtin_neon_vqtbx3q_v: { 6910 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbx3, Ty), 6911 Ops, "vtbx3"); 6912 } 6913 case NEON::BI__builtin_neon_vqtbx4q_v: { 6914 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbx4, Ty), 6915 Ops, "vtbx4"); 6916 } 6917 case NEON::BI__builtin_neon_vsqadd_v: 6918 case NEON::BI__builtin_neon_vsqaddq_v: { 6919 Int = Intrinsic::aarch64_neon_usqadd; 6920 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vsqadd"); 6921 } 6922 case NEON::BI__builtin_neon_vuqadd_v: 6923 case NEON::BI__builtin_neon_vuqaddq_v: { 6924 Int = Intrinsic::aarch64_neon_suqadd; 6925 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vuqadd"); 6926 } 6927 } 6928 } 6929 6930 llvm::Value *CodeGenFunction:: 6931 BuildVector(ArrayRef<llvm::Value*> Ops) { 6932 assert((Ops.size() & (Ops.size() - 1)) == 0 && 6933 "Not a power-of-two sized vector!"); 6934 bool AllConstants = true; 6935 for (unsigned i = 0, e = Ops.size(); i != e && AllConstants; ++i) 6936 AllConstants &= isa<Constant>(Ops[i]); 6937 6938 // If this is a constant vector, create a ConstantVector. 6939 if (AllConstants) { 6940 SmallVector<llvm::Constant*, 16> CstOps; 6941 for (unsigned i = 0, e = Ops.size(); i != e; ++i) 6942 CstOps.push_back(cast<Constant>(Ops[i])); 6943 return llvm::ConstantVector::get(CstOps); 6944 } 6945 6946 // Otherwise, insertelement the values to build the vector. 6947 Value *Result = 6948 llvm::UndefValue::get(llvm::VectorType::get(Ops[0]->getType(), Ops.size())); 6949 6950 for (unsigned i = 0, e = Ops.size(); i != e; ++i) 6951 Result = Builder.CreateInsertElement(Result, Ops[i], Builder.getInt32(i)); 6952 6953 return Result; 6954 } 6955 6956 // Convert the mask from an integer type to a vector of i1. 6957 static Value *getMaskVecValue(CodeGenFunction &CGF, Value *Mask, 6958 unsigned NumElts) { 6959 6960 llvm::VectorType *MaskTy = llvm::VectorType::get(CGF.Builder.getInt1Ty(), 6961 cast<IntegerType>(Mask->getType())->getBitWidth()); 6962 Value *MaskVec = CGF.Builder.CreateBitCast(Mask, MaskTy); 6963 6964 // If we have less than 8 elements, then the starting mask was an i8 and 6965 // we need to extract down to the right number of elements. 6966 if (NumElts < 8) { 6967 uint32_t Indices[4]; 6968 for (unsigned i = 0; i != NumElts; ++i) 6969 Indices[i] = i; 6970 MaskVec = CGF.Builder.CreateShuffleVector(MaskVec, MaskVec, 6971 makeArrayRef(Indices, NumElts), 6972 "extract"); 6973 } 6974 return MaskVec; 6975 } 6976 6977 static Value *EmitX86MaskedStore(CodeGenFunction &CGF, 6978 SmallVectorImpl<Value *> &Ops, 6979 unsigned Align) { 6980 // Cast the pointer to right type. 6981 Ops[0] = CGF.Builder.CreateBitCast(Ops[0], 6982 llvm::PointerType::getUnqual(Ops[1]->getType())); 6983 6984 // If the mask is all ones just emit a regular store. 6985 if (const auto *C = dyn_cast<Constant>(Ops[2])) 6986 if (C->isAllOnesValue()) 6987 return CGF.Builder.CreateAlignedStore(Ops[1], Ops[0], Align); 6988 6989 Value *MaskVec = getMaskVecValue(CGF, Ops[2], 6990 Ops[1]->getType()->getVectorNumElements()); 6991 6992 return CGF.Builder.CreateMaskedStore(Ops[1], Ops[0], Align, MaskVec); 6993 } 6994 6995 static Value *EmitX86MaskedLoad(CodeGenFunction &CGF, 6996 SmallVectorImpl<Value *> &Ops, unsigned Align) { 6997 // Cast the pointer to right type. 6998 Ops[0] = CGF.Builder.CreateBitCast(Ops[0], 6999 llvm::PointerType::getUnqual(Ops[1]->getType())); 7000 7001 // If the mask is all ones just emit a regular store. 7002 if (const auto *C = dyn_cast<Constant>(Ops[2])) 7003 if (C->isAllOnesValue()) 7004 return CGF.Builder.CreateAlignedLoad(Ops[0], Align); 7005 7006 Value *MaskVec = getMaskVecValue(CGF, Ops[2], 7007 Ops[1]->getType()->getVectorNumElements()); 7008 7009 return CGF.Builder.CreateMaskedLoad(Ops[0], Align, MaskVec, Ops[1]); 7010 } 7011 7012 static Value *EmitX86SubVectorBroadcast(CodeGenFunction &CGF, 7013 SmallVectorImpl<Value *> &Ops, 7014 llvm::Type *DstTy, 7015 unsigned SrcSizeInBits, 7016 unsigned Align) { 7017 // Load the subvector. 7018 Ops[0] = CGF.Builder.CreateAlignedLoad(Ops[0], Align); 7019 7020 // Create broadcast mask. 7021 unsigned NumDstElts = DstTy->getVectorNumElements(); 7022 unsigned NumSrcElts = SrcSizeInBits / DstTy->getScalarSizeInBits(); 7023 7024 SmallVector<uint32_t, 8> Mask; 7025 for (unsigned i = 0; i != NumDstElts; i += NumSrcElts) 7026 for (unsigned j = 0; j != NumSrcElts; ++j) 7027 Mask.push_back(j); 7028 7029 return CGF.Builder.CreateShuffleVector(Ops[0], Ops[0], Mask, "subvecbcst"); 7030 } 7031 7032 static Value *EmitX86Select(CodeGenFunction &CGF, 7033 Value *Mask, Value *Op0, Value *Op1) { 7034 7035 // If the mask is all ones just return first argument. 7036 if (const auto *C = dyn_cast<Constant>(Mask)) 7037 if (C->isAllOnesValue()) 7038 return Op0; 7039 7040 Mask = getMaskVecValue(CGF, Mask, Op0->getType()->getVectorNumElements()); 7041 7042 return CGF.Builder.CreateSelect(Mask, Op0, Op1); 7043 } 7044 7045 static Value *EmitX86MaskedCompare(CodeGenFunction &CGF, unsigned CC, 7046 bool Signed, SmallVectorImpl<Value *> &Ops) { 7047 unsigned NumElts = Ops[0]->getType()->getVectorNumElements(); 7048 Value *Cmp; 7049 7050 if (CC == 3) { 7051 Cmp = Constant::getNullValue( 7052 llvm::VectorType::get(CGF.Builder.getInt1Ty(), NumElts)); 7053 } else if (CC == 7) { 7054 Cmp = Constant::getAllOnesValue( 7055 llvm::VectorType::get(CGF.Builder.getInt1Ty(), NumElts)); 7056 } else { 7057 ICmpInst::Predicate Pred; 7058 switch (CC) { 7059 default: llvm_unreachable("Unknown condition code"); 7060 case 0: Pred = ICmpInst::ICMP_EQ; break; 7061 case 1: Pred = Signed ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT; break; 7062 case 2: Pred = Signed ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_ULE; break; 7063 case 4: Pred = ICmpInst::ICMP_NE; break; 7064 case 5: Pred = Signed ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE; break; 7065 case 6: Pred = Signed ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT; break; 7066 } 7067 Cmp = CGF.Builder.CreateICmp(Pred, Ops[0], Ops[1]); 7068 } 7069 7070 const auto *C = dyn_cast<Constant>(Ops.back()); 7071 if (!C || !C->isAllOnesValue()) 7072 Cmp = CGF.Builder.CreateAnd(Cmp, getMaskVecValue(CGF, Ops.back(), NumElts)); 7073 7074 if (NumElts < 8) { 7075 uint32_t Indices[8]; 7076 for (unsigned i = 0; i != NumElts; ++i) 7077 Indices[i] = i; 7078 for (unsigned i = NumElts; i != 8; ++i) 7079 Indices[i] = i % NumElts + NumElts; 7080 Cmp = CGF.Builder.CreateShuffleVector( 7081 Cmp, llvm::Constant::getNullValue(Cmp->getType()), Indices); 7082 } 7083 return CGF.Builder.CreateBitCast(Cmp, 7084 IntegerType::get(CGF.getLLVMContext(), 7085 std::max(NumElts, 8U))); 7086 } 7087 7088 static Value *EmitX86MinMax(CodeGenFunction &CGF, ICmpInst::Predicate Pred, 7089 ArrayRef<Value *> Ops) { 7090 Value *Cmp = CGF.Builder.CreateICmp(Pred, Ops[0], Ops[1]); 7091 Value *Res = CGF.Builder.CreateSelect(Cmp, Ops[0], Ops[1]); 7092 7093 if (Ops.size() == 2) 7094 return Res; 7095 7096 assert(Ops.size() == 4); 7097 return EmitX86Select(CGF, Ops[3], Res, Ops[2]); 7098 } 7099 7100 Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, 7101 const CallExpr *E) { 7102 if (BuiltinID == X86::BI__builtin_ms_va_start || 7103 BuiltinID == X86::BI__builtin_ms_va_end) 7104 return EmitVAStartEnd(EmitMSVAListRef(E->getArg(0)).getPointer(), 7105 BuiltinID == X86::BI__builtin_ms_va_start); 7106 if (BuiltinID == X86::BI__builtin_ms_va_copy) { 7107 // Lower this manually. We can't reliably determine whether or not any 7108 // given va_copy() is for a Win64 va_list from the calling convention 7109 // alone, because it's legal to do this from a System V ABI function. 7110 // With opaque pointer types, we won't have enough information in LLVM 7111 // IR to determine this from the argument types, either. Best to do it 7112 // now, while we have enough information. 7113 Address DestAddr = EmitMSVAListRef(E->getArg(0)); 7114 Address SrcAddr = EmitMSVAListRef(E->getArg(1)); 7115 7116 llvm::Type *BPP = Int8PtrPtrTy; 7117 7118 DestAddr = Address(Builder.CreateBitCast(DestAddr.getPointer(), BPP, "cp"), 7119 DestAddr.getAlignment()); 7120 SrcAddr = Address(Builder.CreateBitCast(SrcAddr.getPointer(), BPP, "ap"), 7121 SrcAddr.getAlignment()); 7122 7123 Value *ArgPtr = Builder.CreateLoad(SrcAddr, "ap.val"); 7124 return Builder.CreateStore(ArgPtr, DestAddr); 7125 } 7126 7127 SmallVector<Value*, 4> Ops; 7128 7129 // Find out if any arguments are required to be integer constant expressions. 7130 unsigned ICEArguments = 0; 7131 ASTContext::GetBuiltinTypeError Error; 7132 getContext().GetBuiltinType(BuiltinID, Error, &ICEArguments); 7133 assert(Error == ASTContext::GE_None && "Should not codegen an error"); 7134 7135 for (unsigned i = 0, e = E->getNumArgs(); i != e; i++) { 7136 // If this is a normal argument, just emit it as a scalar. 7137 if ((ICEArguments & (1 << i)) == 0) { 7138 Ops.push_back(EmitScalarExpr(E->getArg(i))); 7139 continue; 7140 } 7141 7142 // If this is required to be a constant, constant fold it so that we know 7143 // that the generated intrinsic gets a ConstantInt. 7144 llvm::APSInt Result; 7145 bool IsConst = E->getArg(i)->isIntegerConstantExpr(Result, getContext()); 7146 assert(IsConst && "Constant arg isn't actually constant?"); (void)IsConst; 7147 Ops.push_back(llvm::ConstantInt::get(getLLVMContext(), Result)); 7148 } 7149 7150 // These exist so that the builtin that takes an immediate can be bounds 7151 // checked by clang to avoid passing bad immediates to the backend. Since 7152 // AVX has a larger immediate than SSE we would need separate builtins to 7153 // do the different bounds checking. Rather than create a clang specific 7154 // SSE only builtin, this implements eight separate builtins to match gcc 7155 // implementation. 7156 auto getCmpIntrinsicCall = [this, &Ops](Intrinsic::ID ID, unsigned Imm) { 7157 Ops.push_back(llvm::ConstantInt::get(Int8Ty, Imm)); 7158 llvm::Function *F = CGM.getIntrinsic(ID); 7159 return Builder.CreateCall(F, Ops); 7160 }; 7161 7162 // For the vector forms of FP comparisons, translate the builtins directly to 7163 // IR. 7164 // TODO: The builtins could be removed if the SSE header files used vector 7165 // extension comparisons directly (vector ordered/unordered may need 7166 // additional support via __builtin_isnan()). 7167 auto getVectorFCmpIR = [this, &Ops](CmpInst::Predicate Pred) { 7168 Value *Cmp = Builder.CreateFCmp(Pred, Ops[0], Ops[1]); 7169 llvm::VectorType *FPVecTy = cast<llvm::VectorType>(Ops[0]->getType()); 7170 llvm::VectorType *IntVecTy = llvm::VectorType::getInteger(FPVecTy); 7171 Value *Sext = Builder.CreateSExt(Cmp, IntVecTy); 7172 return Builder.CreateBitCast(Sext, FPVecTy); 7173 }; 7174 7175 switch (BuiltinID) { 7176 default: return nullptr; 7177 case X86::BI__builtin_cpu_supports: { 7178 const Expr *FeatureExpr = E->getArg(0)->IgnoreParenCasts(); 7179 StringRef FeatureStr = cast<StringLiteral>(FeatureExpr)->getString(); 7180 7181 // TODO: When/if this becomes more than x86 specific then use a TargetInfo 7182 // based mapping. 7183 // Processor features and mapping to processor feature value. 7184 enum X86Features { 7185 CMOV = 0, 7186 MMX, 7187 POPCNT, 7188 SSE, 7189 SSE2, 7190 SSE3, 7191 SSSE3, 7192 SSE4_1, 7193 SSE4_2, 7194 AVX, 7195 AVX2, 7196 SSE4_A, 7197 FMA4, 7198 XOP, 7199 FMA, 7200 AVX512F, 7201 BMI, 7202 BMI2, 7203 AES, 7204 PCLMUL, 7205 AVX512VL, 7206 AVX512BW, 7207 AVX512DQ, 7208 AVX512CD, 7209 AVX512ER, 7210 AVX512PF, 7211 AVX512VBMI, 7212 AVX512IFMA, 7213 MAX 7214 }; 7215 7216 X86Features Feature = StringSwitch<X86Features>(FeatureStr) 7217 .Case("cmov", X86Features::CMOV) 7218 .Case("mmx", X86Features::MMX) 7219 .Case("popcnt", X86Features::POPCNT) 7220 .Case("sse", X86Features::SSE) 7221 .Case("sse2", X86Features::SSE2) 7222 .Case("sse3", X86Features::SSE3) 7223 .Case("ssse3", X86Features::SSSE3) 7224 .Case("sse4.1", X86Features::SSE4_1) 7225 .Case("sse4.2", X86Features::SSE4_2) 7226 .Case("avx", X86Features::AVX) 7227 .Case("avx2", X86Features::AVX2) 7228 .Case("sse4a", X86Features::SSE4_A) 7229 .Case("fma4", X86Features::FMA4) 7230 .Case("xop", X86Features::XOP) 7231 .Case("fma", X86Features::FMA) 7232 .Case("avx512f", X86Features::AVX512F) 7233 .Case("bmi", X86Features::BMI) 7234 .Case("bmi2", X86Features::BMI2) 7235 .Case("aes", X86Features::AES) 7236 .Case("pclmul", X86Features::PCLMUL) 7237 .Case("avx512vl", X86Features::AVX512VL) 7238 .Case("avx512bw", X86Features::AVX512BW) 7239 .Case("avx512dq", X86Features::AVX512DQ) 7240 .Case("avx512cd", X86Features::AVX512CD) 7241 .Case("avx512er", X86Features::AVX512ER) 7242 .Case("avx512pf", X86Features::AVX512PF) 7243 .Case("avx512vbmi", X86Features::AVX512VBMI) 7244 .Case("avx512ifma", X86Features::AVX512IFMA) 7245 .Default(X86Features::MAX); 7246 assert(Feature != X86Features::MAX && "Invalid feature!"); 7247 7248 // Matching the struct layout from the compiler-rt/libgcc structure that is 7249 // filled in: 7250 // unsigned int __cpu_vendor; 7251 // unsigned int __cpu_type; 7252 // unsigned int __cpu_subtype; 7253 // unsigned int __cpu_features[1]; 7254 llvm::Type *STy = llvm::StructType::get( 7255 Int32Ty, Int32Ty, Int32Ty, llvm::ArrayType::get(Int32Ty, 1), nullptr); 7256 7257 // Grab the global __cpu_model. 7258 llvm::Constant *CpuModel = CGM.CreateRuntimeVariable(STy, "__cpu_model"); 7259 7260 // Grab the first (0th) element from the field __cpu_features off of the 7261 // global in the struct STy. 7262 Value *Idxs[] = { 7263 ConstantInt::get(Int32Ty, 0), 7264 ConstantInt::get(Int32Ty, 3), 7265 ConstantInt::get(Int32Ty, 0) 7266 }; 7267 Value *CpuFeatures = Builder.CreateGEP(STy, CpuModel, Idxs); 7268 Value *Features = Builder.CreateAlignedLoad(CpuFeatures, 7269 CharUnits::fromQuantity(4)); 7270 7271 // Check the value of the bit corresponding to the feature requested. 7272 Value *Bitset = Builder.CreateAnd( 7273 Features, llvm::ConstantInt::get(Int32Ty, 1ULL << Feature)); 7274 return Builder.CreateICmpNE(Bitset, llvm::ConstantInt::get(Int32Ty, 0)); 7275 } 7276 case X86::BI_mm_prefetch: { 7277 Value *Address = Ops[0]; 7278 Value *RW = ConstantInt::get(Int32Ty, 0); 7279 Value *Locality = Ops[1]; 7280 Value *Data = ConstantInt::get(Int32Ty, 1); 7281 Value *F = CGM.getIntrinsic(Intrinsic::prefetch); 7282 return Builder.CreateCall(F, {Address, RW, Locality, Data}); 7283 } 7284 case X86::BI_mm_clflush: { 7285 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse2_clflush), 7286 Ops[0]); 7287 } 7288 case X86::BI_mm_lfence: { 7289 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse2_lfence)); 7290 } 7291 case X86::BI_mm_mfence: { 7292 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse2_mfence)); 7293 } 7294 case X86::BI_mm_sfence: { 7295 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_sfence)); 7296 } 7297 case X86::BI_mm_pause: { 7298 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse2_pause)); 7299 } 7300 case X86::BI__rdtsc: { 7301 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_rdtsc)); 7302 } 7303 case X86::BI__builtin_ia32_undef128: 7304 case X86::BI__builtin_ia32_undef256: 7305 case X86::BI__builtin_ia32_undef512: 7306 return UndefValue::get(ConvertType(E->getType())); 7307 case X86::BI__builtin_ia32_vec_init_v8qi: 7308 case X86::BI__builtin_ia32_vec_init_v4hi: 7309 case X86::BI__builtin_ia32_vec_init_v2si: 7310 return Builder.CreateBitCast(BuildVector(Ops), 7311 llvm::Type::getX86_MMXTy(getLLVMContext())); 7312 case X86::BI__builtin_ia32_vec_ext_v2si: 7313 return Builder.CreateExtractElement(Ops[0], 7314 llvm::ConstantInt::get(Ops[1]->getType(), 0)); 7315 case X86::BI_mm_setcsr: 7316 case X86::BI__builtin_ia32_ldmxcsr: { 7317 Address Tmp = CreateMemTemp(E->getArg(0)->getType()); 7318 Builder.CreateStore(Ops[0], Tmp); 7319 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_ldmxcsr), 7320 Builder.CreateBitCast(Tmp.getPointer(), Int8PtrTy)); 7321 } 7322 case X86::BI_mm_getcsr: 7323 case X86::BI__builtin_ia32_stmxcsr: { 7324 Address Tmp = CreateMemTemp(E->getType()); 7325 Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_stmxcsr), 7326 Builder.CreateBitCast(Tmp.getPointer(), Int8PtrTy)); 7327 return Builder.CreateLoad(Tmp, "stmxcsr"); 7328 } 7329 case X86::BI__builtin_ia32_xsave: 7330 case X86::BI__builtin_ia32_xsave64: 7331 case X86::BI__builtin_ia32_xrstor: 7332 case X86::BI__builtin_ia32_xrstor64: 7333 case X86::BI__builtin_ia32_xsaveopt: 7334 case X86::BI__builtin_ia32_xsaveopt64: 7335 case X86::BI__builtin_ia32_xrstors: 7336 case X86::BI__builtin_ia32_xrstors64: 7337 case X86::BI__builtin_ia32_xsavec: 7338 case X86::BI__builtin_ia32_xsavec64: 7339 case X86::BI__builtin_ia32_xsaves: 7340 case X86::BI__builtin_ia32_xsaves64: { 7341 Intrinsic::ID ID; 7342 #define INTRINSIC_X86_XSAVE_ID(NAME) \ 7343 case X86::BI__builtin_ia32_##NAME: \ 7344 ID = Intrinsic::x86_##NAME; \ 7345 break 7346 switch (BuiltinID) { 7347 default: llvm_unreachable("Unsupported intrinsic!"); 7348 INTRINSIC_X86_XSAVE_ID(xsave); 7349 INTRINSIC_X86_XSAVE_ID(xsave64); 7350 INTRINSIC_X86_XSAVE_ID(xrstor); 7351 INTRINSIC_X86_XSAVE_ID(xrstor64); 7352 INTRINSIC_X86_XSAVE_ID(xsaveopt); 7353 INTRINSIC_X86_XSAVE_ID(xsaveopt64); 7354 INTRINSIC_X86_XSAVE_ID(xrstors); 7355 INTRINSIC_X86_XSAVE_ID(xrstors64); 7356 INTRINSIC_X86_XSAVE_ID(xsavec); 7357 INTRINSIC_X86_XSAVE_ID(xsavec64); 7358 INTRINSIC_X86_XSAVE_ID(xsaves); 7359 INTRINSIC_X86_XSAVE_ID(xsaves64); 7360 } 7361 #undef INTRINSIC_X86_XSAVE_ID 7362 Value *Mhi = Builder.CreateTrunc( 7363 Builder.CreateLShr(Ops[1], ConstantInt::get(Int64Ty, 32)), Int32Ty); 7364 Value *Mlo = Builder.CreateTrunc(Ops[1], Int32Ty); 7365 Ops[1] = Mhi; 7366 Ops.push_back(Mlo); 7367 return Builder.CreateCall(CGM.getIntrinsic(ID), Ops); 7368 } 7369 case X86::BI__builtin_ia32_storedqudi128_mask: 7370 case X86::BI__builtin_ia32_storedqusi128_mask: 7371 case X86::BI__builtin_ia32_storedquhi128_mask: 7372 case X86::BI__builtin_ia32_storedquqi128_mask: 7373 case X86::BI__builtin_ia32_storeupd128_mask: 7374 case X86::BI__builtin_ia32_storeups128_mask: 7375 case X86::BI__builtin_ia32_storedqudi256_mask: 7376 case X86::BI__builtin_ia32_storedqusi256_mask: 7377 case X86::BI__builtin_ia32_storedquhi256_mask: 7378 case X86::BI__builtin_ia32_storedquqi256_mask: 7379 case X86::BI__builtin_ia32_storeupd256_mask: 7380 case X86::BI__builtin_ia32_storeups256_mask: 7381 case X86::BI__builtin_ia32_storedqudi512_mask: 7382 case X86::BI__builtin_ia32_storedqusi512_mask: 7383 case X86::BI__builtin_ia32_storedquhi512_mask: 7384 case X86::BI__builtin_ia32_storedquqi512_mask: 7385 case X86::BI__builtin_ia32_storeupd512_mask: 7386 case X86::BI__builtin_ia32_storeups512_mask: 7387 return EmitX86MaskedStore(*this, Ops, 1); 7388 7389 case X86::BI__builtin_ia32_movdqa32store128_mask: 7390 case X86::BI__builtin_ia32_movdqa64store128_mask: 7391 case X86::BI__builtin_ia32_storeaps128_mask: 7392 case X86::BI__builtin_ia32_storeapd128_mask: 7393 case X86::BI__builtin_ia32_movdqa32store256_mask: 7394 case X86::BI__builtin_ia32_movdqa64store256_mask: 7395 case X86::BI__builtin_ia32_storeaps256_mask: 7396 case X86::BI__builtin_ia32_storeapd256_mask: 7397 case X86::BI__builtin_ia32_movdqa32store512_mask: 7398 case X86::BI__builtin_ia32_movdqa64store512_mask: 7399 case X86::BI__builtin_ia32_storeaps512_mask: 7400 case X86::BI__builtin_ia32_storeapd512_mask: { 7401 unsigned Align = 7402 getContext().getTypeAlignInChars(E->getArg(1)->getType()).getQuantity(); 7403 return EmitX86MaskedStore(*this, Ops, Align); 7404 } 7405 case X86::BI__builtin_ia32_loadups128_mask: 7406 case X86::BI__builtin_ia32_loadups256_mask: 7407 case X86::BI__builtin_ia32_loadups512_mask: 7408 case X86::BI__builtin_ia32_loadupd128_mask: 7409 case X86::BI__builtin_ia32_loadupd256_mask: 7410 case X86::BI__builtin_ia32_loadupd512_mask: 7411 case X86::BI__builtin_ia32_loaddquqi128_mask: 7412 case X86::BI__builtin_ia32_loaddquqi256_mask: 7413 case X86::BI__builtin_ia32_loaddquqi512_mask: 7414 case X86::BI__builtin_ia32_loaddquhi128_mask: 7415 case X86::BI__builtin_ia32_loaddquhi256_mask: 7416 case X86::BI__builtin_ia32_loaddquhi512_mask: 7417 case X86::BI__builtin_ia32_loaddqusi128_mask: 7418 case X86::BI__builtin_ia32_loaddqusi256_mask: 7419 case X86::BI__builtin_ia32_loaddqusi512_mask: 7420 case X86::BI__builtin_ia32_loaddqudi128_mask: 7421 case X86::BI__builtin_ia32_loaddqudi256_mask: 7422 case X86::BI__builtin_ia32_loaddqudi512_mask: 7423 return EmitX86MaskedLoad(*this, Ops, 1); 7424 7425 case X86::BI__builtin_ia32_loadaps128_mask: 7426 case X86::BI__builtin_ia32_loadaps256_mask: 7427 case X86::BI__builtin_ia32_loadaps512_mask: 7428 case X86::BI__builtin_ia32_loadapd128_mask: 7429 case X86::BI__builtin_ia32_loadapd256_mask: 7430 case X86::BI__builtin_ia32_loadapd512_mask: 7431 case X86::BI__builtin_ia32_movdqa32load128_mask: 7432 case X86::BI__builtin_ia32_movdqa32load256_mask: 7433 case X86::BI__builtin_ia32_movdqa32load512_mask: 7434 case X86::BI__builtin_ia32_movdqa64load128_mask: 7435 case X86::BI__builtin_ia32_movdqa64load256_mask: 7436 case X86::BI__builtin_ia32_movdqa64load512_mask: { 7437 unsigned Align = 7438 getContext().getTypeAlignInChars(E->getArg(1)->getType()).getQuantity(); 7439 return EmitX86MaskedLoad(*this, Ops, Align); 7440 } 7441 7442 case X86::BI__builtin_ia32_vbroadcastf128_pd256: 7443 case X86::BI__builtin_ia32_vbroadcastf128_ps256: { 7444 llvm::Type *DstTy = ConvertType(E->getType()); 7445 return EmitX86SubVectorBroadcast(*this, Ops, DstTy, 128, 1); 7446 } 7447 7448 case X86::BI__builtin_ia32_storehps: 7449 case X86::BI__builtin_ia32_storelps: { 7450 llvm::Type *PtrTy = llvm::PointerType::getUnqual(Int64Ty); 7451 llvm::Type *VecTy = llvm::VectorType::get(Int64Ty, 2); 7452 7453 // cast val v2i64 7454 Ops[1] = Builder.CreateBitCast(Ops[1], VecTy, "cast"); 7455 7456 // extract (0, 1) 7457 unsigned Index = BuiltinID == X86::BI__builtin_ia32_storelps ? 0 : 1; 7458 llvm::Value *Idx = llvm::ConstantInt::get(SizeTy, Index); 7459 Ops[1] = Builder.CreateExtractElement(Ops[1], Idx, "extract"); 7460 7461 // cast pointer to i64 & store 7462 Ops[0] = Builder.CreateBitCast(Ops[0], PtrTy); 7463 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 7464 } 7465 case X86::BI__builtin_ia32_palignr128: 7466 case X86::BI__builtin_ia32_palignr256: 7467 case X86::BI__builtin_ia32_palignr512_mask: { 7468 unsigned ShiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue(); 7469 7470 unsigned NumElts = Ops[0]->getType()->getVectorNumElements(); 7471 assert(NumElts % 16 == 0); 7472 7473 // If palignr is shifting the pair of vectors more than the size of two 7474 // lanes, emit zero. 7475 if (ShiftVal >= 32) 7476 return llvm::Constant::getNullValue(ConvertType(E->getType())); 7477 7478 // If palignr is shifting the pair of input vectors more than one lane, 7479 // but less than two lanes, convert to shifting in zeroes. 7480 if (ShiftVal > 16) { 7481 ShiftVal -= 16; 7482 Ops[1] = Ops[0]; 7483 Ops[0] = llvm::Constant::getNullValue(Ops[0]->getType()); 7484 } 7485 7486 uint32_t Indices[64]; 7487 // 256-bit palignr operates on 128-bit lanes so we need to handle that 7488 for (unsigned l = 0; l != NumElts; l += 16) { 7489 for (unsigned i = 0; i != 16; ++i) { 7490 unsigned Idx = ShiftVal + i; 7491 if (Idx >= 16) 7492 Idx += NumElts - 16; // End of lane, switch operand. 7493 Indices[l + i] = Idx + l; 7494 } 7495 } 7496 7497 Value *Align = Builder.CreateShuffleVector(Ops[1], Ops[0], 7498 makeArrayRef(Indices, NumElts), 7499 "palignr"); 7500 7501 // If this isn't a masked builtin, just return the align operation. 7502 if (Ops.size() == 3) 7503 return Align; 7504 7505 return EmitX86Select(*this, Ops[4], Align, Ops[3]); 7506 } 7507 7508 case X86::BI__builtin_ia32_movnti: 7509 case X86::BI__builtin_ia32_movnti64: { 7510 llvm::MDNode *Node = llvm::MDNode::get( 7511 getLLVMContext(), llvm::ConstantAsMetadata::get(Builder.getInt32(1))); 7512 7513 // Convert the type of the pointer to a pointer to the stored type. 7514 Value *BC = Builder.CreateBitCast(Ops[0], 7515 llvm::PointerType::getUnqual(Ops[1]->getType()), 7516 "cast"); 7517 StoreInst *SI = Builder.CreateDefaultAlignedStore(Ops[1], BC); 7518 SI->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node); 7519 7520 // No alignment for scalar intrinsic store. 7521 SI->setAlignment(1); 7522 return SI; 7523 } 7524 case X86::BI__builtin_ia32_movntsd: 7525 case X86::BI__builtin_ia32_movntss: { 7526 llvm::MDNode *Node = llvm::MDNode::get( 7527 getLLVMContext(), llvm::ConstantAsMetadata::get(Builder.getInt32(1))); 7528 7529 // Extract the 0'th element of the source vector. 7530 Value *Scl = Builder.CreateExtractElement(Ops[1], (uint64_t)0, "extract"); 7531 7532 // Convert the type of the pointer to a pointer to the stored type. 7533 Value *BC = Builder.CreateBitCast(Ops[0], 7534 llvm::PointerType::getUnqual(Scl->getType()), 7535 "cast"); 7536 7537 // Unaligned nontemporal store of the scalar value. 7538 StoreInst *SI = Builder.CreateDefaultAlignedStore(Scl, BC); 7539 SI->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node); 7540 SI->setAlignment(1); 7541 return SI; 7542 } 7543 7544 case X86::BI__builtin_ia32_selectb_128: 7545 case X86::BI__builtin_ia32_selectb_256: 7546 case X86::BI__builtin_ia32_selectb_512: 7547 case X86::BI__builtin_ia32_selectw_128: 7548 case X86::BI__builtin_ia32_selectw_256: 7549 case X86::BI__builtin_ia32_selectw_512: 7550 case X86::BI__builtin_ia32_selectd_128: 7551 case X86::BI__builtin_ia32_selectd_256: 7552 case X86::BI__builtin_ia32_selectd_512: 7553 case X86::BI__builtin_ia32_selectq_128: 7554 case X86::BI__builtin_ia32_selectq_256: 7555 case X86::BI__builtin_ia32_selectq_512: 7556 case X86::BI__builtin_ia32_selectps_128: 7557 case X86::BI__builtin_ia32_selectps_256: 7558 case X86::BI__builtin_ia32_selectps_512: 7559 case X86::BI__builtin_ia32_selectpd_128: 7560 case X86::BI__builtin_ia32_selectpd_256: 7561 case X86::BI__builtin_ia32_selectpd_512: 7562 return EmitX86Select(*this, Ops[0], Ops[1], Ops[2]); 7563 case X86::BI__builtin_ia32_pcmpeqb128_mask: 7564 case X86::BI__builtin_ia32_pcmpeqb256_mask: 7565 case X86::BI__builtin_ia32_pcmpeqb512_mask: 7566 case X86::BI__builtin_ia32_pcmpeqw128_mask: 7567 case X86::BI__builtin_ia32_pcmpeqw256_mask: 7568 case X86::BI__builtin_ia32_pcmpeqw512_mask: 7569 case X86::BI__builtin_ia32_pcmpeqd128_mask: 7570 case X86::BI__builtin_ia32_pcmpeqd256_mask: 7571 case X86::BI__builtin_ia32_pcmpeqd512_mask: 7572 case X86::BI__builtin_ia32_pcmpeqq128_mask: 7573 case X86::BI__builtin_ia32_pcmpeqq256_mask: 7574 case X86::BI__builtin_ia32_pcmpeqq512_mask: 7575 return EmitX86MaskedCompare(*this, 0, false, Ops); 7576 case X86::BI__builtin_ia32_pcmpgtb128_mask: 7577 case X86::BI__builtin_ia32_pcmpgtb256_mask: 7578 case X86::BI__builtin_ia32_pcmpgtb512_mask: 7579 case X86::BI__builtin_ia32_pcmpgtw128_mask: 7580 case X86::BI__builtin_ia32_pcmpgtw256_mask: 7581 case X86::BI__builtin_ia32_pcmpgtw512_mask: 7582 case X86::BI__builtin_ia32_pcmpgtd128_mask: 7583 case X86::BI__builtin_ia32_pcmpgtd256_mask: 7584 case X86::BI__builtin_ia32_pcmpgtd512_mask: 7585 case X86::BI__builtin_ia32_pcmpgtq128_mask: 7586 case X86::BI__builtin_ia32_pcmpgtq256_mask: 7587 case X86::BI__builtin_ia32_pcmpgtq512_mask: 7588 return EmitX86MaskedCompare(*this, 6, true, Ops); 7589 case X86::BI__builtin_ia32_cmpb128_mask: 7590 case X86::BI__builtin_ia32_cmpb256_mask: 7591 case X86::BI__builtin_ia32_cmpb512_mask: 7592 case X86::BI__builtin_ia32_cmpw128_mask: 7593 case X86::BI__builtin_ia32_cmpw256_mask: 7594 case X86::BI__builtin_ia32_cmpw512_mask: 7595 case X86::BI__builtin_ia32_cmpd128_mask: 7596 case X86::BI__builtin_ia32_cmpd256_mask: 7597 case X86::BI__builtin_ia32_cmpd512_mask: 7598 case X86::BI__builtin_ia32_cmpq128_mask: 7599 case X86::BI__builtin_ia32_cmpq256_mask: 7600 case X86::BI__builtin_ia32_cmpq512_mask: { 7601 unsigned CC = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0x7; 7602 return EmitX86MaskedCompare(*this, CC, true, Ops); 7603 } 7604 case X86::BI__builtin_ia32_ucmpb128_mask: 7605 case X86::BI__builtin_ia32_ucmpb256_mask: 7606 case X86::BI__builtin_ia32_ucmpb512_mask: 7607 case X86::BI__builtin_ia32_ucmpw128_mask: 7608 case X86::BI__builtin_ia32_ucmpw256_mask: 7609 case X86::BI__builtin_ia32_ucmpw512_mask: 7610 case X86::BI__builtin_ia32_ucmpd128_mask: 7611 case X86::BI__builtin_ia32_ucmpd256_mask: 7612 case X86::BI__builtin_ia32_ucmpd512_mask: 7613 case X86::BI__builtin_ia32_ucmpq128_mask: 7614 case X86::BI__builtin_ia32_ucmpq256_mask: 7615 case X86::BI__builtin_ia32_ucmpq512_mask: { 7616 unsigned CC = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0x7; 7617 return EmitX86MaskedCompare(*this, CC, false, Ops); 7618 } 7619 7620 case X86::BI__builtin_ia32_vplzcntd_128_mask: 7621 case X86::BI__builtin_ia32_vplzcntd_256_mask: 7622 case X86::BI__builtin_ia32_vplzcntd_512_mask: 7623 case X86::BI__builtin_ia32_vplzcntq_128_mask: 7624 case X86::BI__builtin_ia32_vplzcntq_256_mask: 7625 case X86::BI__builtin_ia32_vplzcntq_512_mask: { 7626 Function *F = CGM.getIntrinsic(Intrinsic::ctlz, Ops[0]->getType()); 7627 return EmitX86Select(*this, Ops[2], 7628 Builder.CreateCall(F, {Ops[0],Builder.getInt1(false)}), 7629 Ops[1]); 7630 } 7631 7632 case X86::BI__builtin_ia32_pmaxsb128: 7633 case X86::BI__builtin_ia32_pmaxsw128: 7634 case X86::BI__builtin_ia32_pmaxsd128: 7635 case X86::BI__builtin_ia32_pmaxsq128_mask: 7636 case X86::BI__builtin_ia32_pmaxsb256: 7637 case X86::BI__builtin_ia32_pmaxsw256: 7638 case X86::BI__builtin_ia32_pmaxsd256: 7639 case X86::BI__builtin_ia32_pmaxsq256_mask: 7640 case X86::BI__builtin_ia32_pmaxsb512_mask: 7641 case X86::BI__builtin_ia32_pmaxsw512_mask: 7642 case X86::BI__builtin_ia32_pmaxsd512_mask: 7643 case X86::BI__builtin_ia32_pmaxsq512_mask: 7644 return EmitX86MinMax(*this, ICmpInst::ICMP_SGT, Ops); 7645 case X86::BI__builtin_ia32_pmaxub128: 7646 case X86::BI__builtin_ia32_pmaxuw128: 7647 case X86::BI__builtin_ia32_pmaxud128: 7648 case X86::BI__builtin_ia32_pmaxuq128_mask: 7649 case X86::BI__builtin_ia32_pmaxub256: 7650 case X86::BI__builtin_ia32_pmaxuw256: 7651 case X86::BI__builtin_ia32_pmaxud256: 7652 case X86::BI__builtin_ia32_pmaxuq256_mask: 7653 case X86::BI__builtin_ia32_pmaxub512_mask: 7654 case X86::BI__builtin_ia32_pmaxuw512_mask: 7655 case X86::BI__builtin_ia32_pmaxud512_mask: 7656 case X86::BI__builtin_ia32_pmaxuq512_mask: 7657 return EmitX86MinMax(*this, ICmpInst::ICMP_UGT, Ops); 7658 case X86::BI__builtin_ia32_pminsb128: 7659 case X86::BI__builtin_ia32_pminsw128: 7660 case X86::BI__builtin_ia32_pminsd128: 7661 case X86::BI__builtin_ia32_pminsq128_mask: 7662 case X86::BI__builtin_ia32_pminsb256: 7663 case X86::BI__builtin_ia32_pminsw256: 7664 case X86::BI__builtin_ia32_pminsd256: 7665 case X86::BI__builtin_ia32_pminsq256_mask: 7666 case X86::BI__builtin_ia32_pminsb512_mask: 7667 case X86::BI__builtin_ia32_pminsw512_mask: 7668 case X86::BI__builtin_ia32_pminsd512_mask: 7669 case X86::BI__builtin_ia32_pminsq512_mask: 7670 return EmitX86MinMax(*this, ICmpInst::ICMP_SLT, Ops); 7671 case X86::BI__builtin_ia32_pminub128: 7672 case X86::BI__builtin_ia32_pminuw128: 7673 case X86::BI__builtin_ia32_pminud128: 7674 case X86::BI__builtin_ia32_pminuq128_mask: 7675 case X86::BI__builtin_ia32_pminub256: 7676 case X86::BI__builtin_ia32_pminuw256: 7677 case X86::BI__builtin_ia32_pminud256: 7678 case X86::BI__builtin_ia32_pminuq256_mask: 7679 case X86::BI__builtin_ia32_pminub512_mask: 7680 case X86::BI__builtin_ia32_pminuw512_mask: 7681 case X86::BI__builtin_ia32_pminud512_mask: 7682 case X86::BI__builtin_ia32_pminuq512_mask: 7683 return EmitX86MinMax(*this, ICmpInst::ICMP_ULT, Ops); 7684 7685 // 3DNow! 7686 case X86::BI__builtin_ia32_pswapdsf: 7687 case X86::BI__builtin_ia32_pswapdsi: { 7688 llvm::Type *MMXTy = llvm::Type::getX86_MMXTy(getLLVMContext()); 7689 Ops[0] = Builder.CreateBitCast(Ops[0], MMXTy, "cast"); 7690 llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_3dnowa_pswapd); 7691 return Builder.CreateCall(F, Ops, "pswapd"); 7692 } 7693 case X86::BI__builtin_ia32_rdrand16_step: 7694 case X86::BI__builtin_ia32_rdrand32_step: 7695 case X86::BI__builtin_ia32_rdrand64_step: 7696 case X86::BI__builtin_ia32_rdseed16_step: 7697 case X86::BI__builtin_ia32_rdseed32_step: 7698 case X86::BI__builtin_ia32_rdseed64_step: { 7699 Intrinsic::ID ID; 7700 switch (BuiltinID) { 7701 default: llvm_unreachable("Unsupported intrinsic!"); 7702 case X86::BI__builtin_ia32_rdrand16_step: 7703 ID = Intrinsic::x86_rdrand_16; 7704 break; 7705 case X86::BI__builtin_ia32_rdrand32_step: 7706 ID = Intrinsic::x86_rdrand_32; 7707 break; 7708 case X86::BI__builtin_ia32_rdrand64_step: 7709 ID = Intrinsic::x86_rdrand_64; 7710 break; 7711 case X86::BI__builtin_ia32_rdseed16_step: 7712 ID = Intrinsic::x86_rdseed_16; 7713 break; 7714 case X86::BI__builtin_ia32_rdseed32_step: 7715 ID = Intrinsic::x86_rdseed_32; 7716 break; 7717 case X86::BI__builtin_ia32_rdseed64_step: 7718 ID = Intrinsic::x86_rdseed_64; 7719 break; 7720 } 7721 7722 Value *Call = Builder.CreateCall(CGM.getIntrinsic(ID)); 7723 Builder.CreateDefaultAlignedStore(Builder.CreateExtractValue(Call, 0), 7724 Ops[0]); 7725 return Builder.CreateExtractValue(Call, 1); 7726 } 7727 7728 // SSE packed comparison intrinsics 7729 case X86::BI__builtin_ia32_cmpeqps: 7730 case X86::BI__builtin_ia32_cmpeqpd: 7731 return getVectorFCmpIR(CmpInst::FCMP_OEQ); 7732 case X86::BI__builtin_ia32_cmpltps: 7733 case X86::BI__builtin_ia32_cmpltpd: 7734 return getVectorFCmpIR(CmpInst::FCMP_OLT); 7735 case X86::BI__builtin_ia32_cmpleps: 7736 case X86::BI__builtin_ia32_cmplepd: 7737 return getVectorFCmpIR(CmpInst::FCMP_OLE); 7738 case X86::BI__builtin_ia32_cmpunordps: 7739 case X86::BI__builtin_ia32_cmpunordpd: 7740 return getVectorFCmpIR(CmpInst::FCMP_UNO); 7741 case X86::BI__builtin_ia32_cmpneqps: 7742 case X86::BI__builtin_ia32_cmpneqpd: 7743 return getVectorFCmpIR(CmpInst::FCMP_UNE); 7744 case X86::BI__builtin_ia32_cmpnltps: 7745 case X86::BI__builtin_ia32_cmpnltpd: 7746 return getVectorFCmpIR(CmpInst::FCMP_UGE); 7747 case X86::BI__builtin_ia32_cmpnleps: 7748 case X86::BI__builtin_ia32_cmpnlepd: 7749 return getVectorFCmpIR(CmpInst::FCMP_UGT); 7750 case X86::BI__builtin_ia32_cmpordps: 7751 case X86::BI__builtin_ia32_cmpordpd: 7752 return getVectorFCmpIR(CmpInst::FCMP_ORD); 7753 case X86::BI__builtin_ia32_cmpps: 7754 case X86::BI__builtin_ia32_cmpps256: 7755 case X86::BI__builtin_ia32_cmppd: 7756 case X86::BI__builtin_ia32_cmppd256: { 7757 unsigned CC = cast<llvm::ConstantInt>(Ops[2])->getZExtValue(); 7758 // If this one of the SSE immediates, we can use native IR. 7759 if (CC < 8) { 7760 FCmpInst::Predicate Pred; 7761 switch (CC) { 7762 case 0: Pred = FCmpInst::FCMP_OEQ; break; 7763 case 1: Pred = FCmpInst::FCMP_OLT; break; 7764 case 2: Pred = FCmpInst::FCMP_OLE; break; 7765 case 3: Pred = FCmpInst::FCMP_UNO; break; 7766 case 4: Pred = FCmpInst::FCMP_UNE; break; 7767 case 5: Pred = FCmpInst::FCMP_UGE; break; 7768 case 6: Pred = FCmpInst::FCMP_UGT; break; 7769 case 7: Pred = FCmpInst::FCMP_ORD; break; 7770 } 7771 return getVectorFCmpIR(Pred); 7772 } 7773 7774 // We can't handle 8-31 immediates with native IR, use the intrinsic. 7775 Intrinsic::ID ID; 7776 switch (BuiltinID) { 7777 default: llvm_unreachable("Unsupported intrinsic!"); 7778 case X86::BI__builtin_ia32_cmpps: 7779 ID = Intrinsic::x86_sse_cmp_ps; 7780 break; 7781 case X86::BI__builtin_ia32_cmpps256: 7782 ID = Intrinsic::x86_avx_cmp_ps_256; 7783 break; 7784 case X86::BI__builtin_ia32_cmppd: 7785 ID = Intrinsic::x86_sse2_cmp_pd; 7786 break; 7787 case X86::BI__builtin_ia32_cmppd256: 7788 ID = Intrinsic::x86_avx_cmp_pd_256; 7789 break; 7790 } 7791 7792 return Builder.CreateCall(CGM.getIntrinsic(ID), Ops); 7793 } 7794 7795 // SSE scalar comparison intrinsics 7796 case X86::BI__builtin_ia32_cmpeqss: 7797 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 0); 7798 case X86::BI__builtin_ia32_cmpltss: 7799 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 1); 7800 case X86::BI__builtin_ia32_cmpless: 7801 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 2); 7802 case X86::BI__builtin_ia32_cmpunordss: 7803 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 3); 7804 case X86::BI__builtin_ia32_cmpneqss: 7805 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 4); 7806 case X86::BI__builtin_ia32_cmpnltss: 7807 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 5); 7808 case X86::BI__builtin_ia32_cmpnless: 7809 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 6); 7810 case X86::BI__builtin_ia32_cmpordss: 7811 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 7); 7812 case X86::BI__builtin_ia32_cmpeqsd: 7813 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 0); 7814 case X86::BI__builtin_ia32_cmpltsd: 7815 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 1); 7816 case X86::BI__builtin_ia32_cmplesd: 7817 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 2); 7818 case X86::BI__builtin_ia32_cmpunordsd: 7819 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 3); 7820 case X86::BI__builtin_ia32_cmpneqsd: 7821 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 4); 7822 case X86::BI__builtin_ia32_cmpnltsd: 7823 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 5); 7824 case X86::BI__builtin_ia32_cmpnlesd: 7825 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 6); 7826 case X86::BI__builtin_ia32_cmpordsd: 7827 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 7); 7828 7829 case X86::BI__emul: 7830 case X86::BI__emulu: { 7831 llvm::Type *Int64Ty = llvm::IntegerType::get(getLLVMContext(), 64); 7832 bool isSigned = (BuiltinID == X86::BI__emul); 7833 Value *LHS = Builder.CreateIntCast(Ops[0], Int64Ty, isSigned); 7834 Value *RHS = Builder.CreateIntCast(Ops[1], Int64Ty, isSigned); 7835 return Builder.CreateMul(LHS, RHS, "", !isSigned, isSigned); 7836 } 7837 case X86::BI__mulh: 7838 case X86::BI__umulh: 7839 case X86::BI_mul128: 7840 case X86::BI_umul128: { 7841 llvm::Type *ResType = ConvertType(E->getType()); 7842 llvm::Type *Int128Ty = llvm::IntegerType::get(getLLVMContext(), 128); 7843 7844 bool IsSigned = (BuiltinID == X86::BI__mulh || BuiltinID == X86::BI_mul128); 7845 Value *LHS = Builder.CreateIntCast(Ops[0], Int128Ty, IsSigned); 7846 Value *RHS = Builder.CreateIntCast(Ops[1], Int128Ty, IsSigned); 7847 7848 Value *MulResult, *HigherBits; 7849 if (IsSigned) { 7850 MulResult = Builder.CreateNSWMul(LHS, RHS); 7851 HigherBits = Builder.CreateAShr(MulResult, 64); 7852 } else { 7853 MulResult = Builder.CreateNUWMul(LHS, RHS); 7854 HigherBits = Builder.CreateLShr(MulResult, 64); 7855 } 7856 HigherBits = Builder.CreateIntCast(HigherBits, ResType, IsSigned); 7857 7858 if (BuiltinID == X86::BI__mulh || BuiltinID == X86::BI__umulh) 7859 return HigherBits; 7860 7861 Address HighBitsAddress = EmitPointerWithAlignment(E->getArg(2)); 7862 Builder.CreateStore(HigherBits, HighBitsAddress); 7863 return Builder.CreateIntCast(MulResult, ResType, IsSigned); 7864 } 7865 7866 case X86::BI__faststorefence: { 7867 return Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent, 7868 llvm::CrossThread); 7869 } 7870 case X86::BI_ReadWriteBarrier: 7871 case X86::BI_ReadBarrier: 7872 case X86::BI_WriteBarrier: { 7873 return Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent, 7874 llvm::SingleThread); 7875 } 7876 case X86::BI_BitScanForward: 7877 case X86::BI_BitScanForward64: 7878 return EmitMSVCBuiltinExpr(MSVCIntrin::_BitScanForward, E); 7879 case X86::BI_BitScanReverse: 7880 case X86::BI_BitScanReverse64: 7881 return EmitMSVCBuiltinExpr(MSVCIntrin::_BitScanReverse, E); 7882 7883 case X86::BI_InterlockedAnd64: 7884 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedAnd, E); 7885 case X86::BI_InterlockedExchange64: 7886 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchange, E); 7887 case X86::BI_InterlockedExchangeAdd64: 7888 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeAdd, E); 7889 case X86::BI_InterlockedExchangeSub64: 7890 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeSub, E); 7891 case X86::BI_InterlockedOr64: 7892 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedOr, E); 7893 case X86::BI_InterlockedXor64: 7894 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedXor, E); 7895 case X86::BI_InterlockedDecrement64: 7896 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedDecrement, E); 7897 case X86::BI_InterlockedIncrement64: 7898 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedIncrement, E); 7899 7900 case X86::BI_AddressOfReturnAddress: { 7901 Value *F = CGM.getIntrinsic(Intrinsic::addressofreturnaddress); 7902 return Builder.CreateCall(F); 7903 } 7904 case X86::BI__stosb: { 7905 // We treat __stosb as a volatile memset - it may not generate "rep stosb" 7906 // instruction, but it will create a memset that won't be optimized away. 7907 return Builder.CreateMemSet(Ops[0], Ops[1], Ops[2], 1, true); 7908 } 7909 } 7910 } 7911 7912 7913 Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID, 7914 const CallExpr *E) { 7915 SmallVector<Value*, 4> Ops; 7916 7917 for (unsigned i = 0, e = E->getNumArgs(); i != e; i++) 7918 Ops.push_back(EmitScalarExpr(E->getArg(i))); 7919 7920 Intrinsic::ID ID = Intrinsic::not_intrinsic; 7921 7922 switch (BuiltinID) { 7923 default: return nullptr; 7924 7925 // __builtin_ppc_get_timebase is GCC 4.8+'s PowerPC-specific name for what we 7926 // call __builtin_readcyclecounter. 7927 case PPC::BI__builtin_ppc_get_timebase: 7928 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::readcyclecounter)); 7929 7930 // vec_ld, vec_lvsl, vec_lvsr 7931 case PPC::BI__builtin_altivec_lvx: 7932 case PPC::BI__builtin_altivec_lvxl: 7933 case PPC::BI__builtin_altivec_lvebx: 7934 case PPC::BI__builtin_altivec_lvehx: 7935 case PPC::BI__builtin_altivec_lvewx: 7936 case PPC::BI__builtin_altivec_lvsl: 7937 case PPC::BI__builtin_altivec_lvsr: 7938 case PPC::BI__builtin_vsx_lxvd2x: 7939 case PPC::BI__builtin_vsx_lxvw4x: 7940 { 7941 Ops[1] = Builder.CreateBitCast(Ops[1], Int8PtrTy); 7942 7943 Ops[0] = Builder.CreateGEP(Ops[1], Ops[0]); 7944 Ops.pop_back(); 7945 7946 switch (BuiltinID) { 7947 default: llvm_unreachable("Unsupported ld/lvsl/lvsr intrinsic!"); 7948 case PPC::BI__builtin_altivec_lvx: 7949 ID = Intrinsic::ppc_altivec_lvx; 7950 break; 7951 case PPC::BI__builtin_altivec_lvxl: 7952 ID = Intrinsic::ppc_altivec_lvxl; 7953 break; 7954 case PPC::BI__builtin_altivec_lvebx: 7955 ID = Intrinsic::ppc_altivec_lvebx; 7956 break; 7957 case PPC::BI__builtin_altivec_lvehx: 7958 ID = Intrinsic::ppc_altivec_lvehx; 7959 break; 7960 case PPC::BI__builtin_altivec_lvewx: 7961 ID = Intrinsic::ppc_altivec_lvewx; 7962 break; 7963 case PPC::BI__builtin_altivec_lvsl: 7964 ID = Intrinsic::ppc_altivec_lvsl; 7965 break; 7966 case PPC::BI__builtin_altivec_lvsr: 7967 ID = Intrinsic::ppc_altivec_lvsr; 7968 break; 7969 case PPC::BI__builtin_vsx_lxvd2x: 7970 ID = Intrinsic::ppc_vsx_lxvd2x; 7971 break; 7972 case PPC::BI__builtin_vsx_lxvw4x: 7973 ID = Intrinsic::ppc_vsx_lxvw4x; 7974 break; 7975 } 7976 llvm::Function *F = CGM.getIntrinsic(ID); 7977 return Builder.CreateCall(F, Ops, ""); 7978 } 7979 7980 // vec_st 7981 case PPC::BI__builtin_altivec_stvx: 7982 case PPC::BI__builtin_altivec_stvxl: 7983 case PPC::BI__builtin_altivec_stvebx: 7984 case PPC::BI__builtin_altivec_stvehx: 7985 case PPC::BI__builtin_altivec_stvewx: 7986 case PPC::BI__builtin_vsx_stxvd2x: 7987 case PPC::BI__builtin_vsx_stxvw4x: 7988 { 7989 Ops[2] = Builder.CreateBitCast(Ops[2], Int8PtrTy); 7990 Ops[1] = Builder.CreateGEP(Ops[2], Ops[1]); 7991 Ops.pop_back(); 7992 7993 switch (BuiltinID) { 7994 default: llvm_unreachable("Unsupported st intrinsic!"); 7995 case PPC::BI__builtin_altivec_stvx: 7996 ID = Intrinsic::ppc_altivec_stvx; 7997 break; 7998 case PPC::BI__builtin_altivec_stvxl: 7999 ID = Intrinsic::ppc_altivec_stvxl; 8000 break; 8001 case PPC::BI__builtin_altivec_stvebx: 8002 ID = Intrinsic::ppc_altivec_stvebx; 8003 break; 8004 case PPC::BI__builtin_altivec_stvehx: 8005 ID = Intrinsic::ppc_altivec_stvehx; 8006 break; 8007 case PPC::BI__builtin_altivec_stvewx: 8008 ID = Intrinsic::ppc_altivec_stvewx; 8009 break; 8010 case PPC::BI__builtin_vsx_stxvd2x: 8011 ID = Intrinsic::ppc_vsx_stxvd2x; 8012 break; 8013 case PPC::BI__builtin_vsx_stxvw4x: 8014 ID = Intrinsic::ppc_vsx_stxvw4x; 8015 break; 8016 } 8017 llvm::Function *F = CGM.getIntrinsic(ID); 8018 return Builder.CreateCall(F, Ops, ""); 8019 } 8020 // Square root 8021 case PPC::BI__builtin_vsx_xvsqrtsp: 8022 case PPC::BI__builtin_vsx_xvsqrtdp: { 8023 llvm::Type *ResultType = ConvertType(E->getType()); 8024 Value *X = EmitScalarExpr(E->getArg(0)); 8025 ID = Intrinsic::sqrt; 8026 llvm::Function *F = CGM.getIntrinsic(ID, ResultType); 8027 return Builder.CreateCall(F, X); 8028 } 8029 // Count leading zeros 8030 case PPC::BI__builtin_altivec_vclzb: 8031 case PPC::BI__builtin_altivec_vclzh: 8032 case PPC::BI__builtin_altivec_vclzw: 8033 case PPC::BI__builtin_altivec_vclzd: { 8034 llvm::Type *ResultType = ConvertType(E->getType()); 8035 Value *X = EmitScalarExpr(E->getArg(0)); 8036 Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false); 8037 Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ResultType); 8038 return Builder.CreateCall(F, {X, Undef}); 8039 } 8040 case PPC::BI__builtin_altivec_vctzb: 8041 case PPC::BI__builtin_altivec_vctzh: 8042 case PPC::BI__builtin_altivec_vctzw: 8043 case PPC::BI__builtin_altivec_vctzd: { 8044 llvm::Type *ResultType = ConvertType(E->getType()); 8045 Value *X = EmitScalarExpr(E->getArg(0)); 8046 Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false); 8047 Function *F = CGM.getIntrinsic(Intrinsic::cttz, ResultType); 8048 return Builder.CreateCall(F, {X, Undef}); 8049 } 8050 case PPC::BI__builtin_altivec_vpopcntb: 8051 case PPC::BI__builtin_altivec_vpopcnth: 8052 case PPC::BI__builtin_altivec_vpopcntw: 8053 case PPC::BI__builtin_altivec_vpopcntd: { 8054 llvm::Type *ResultType = ConvertType(E->getType()); 8055 Value *X = EmitScalarExpr(E->getArg(0)); 8056 llvm::Function *F = CGM.getIntrinsic(Intrinsic::ctpop, ResultType); 8057 return Builder.CreateCall(F, X); 8058 } 8059 // Copy sign 8060 case PPC::BI__builtin_vsx_xvcpsgnsp: 8061 case PPC::BI__builtin_vsx_xvcpsgndp: { 8062 llvm::Type *ResultType = ConvertType(E->getType()); 8063 Value *X = EmitScalarExpr(E->getArg(0)); 8064 Value *Y = EmitScalarExpr(E->getArg(1)); 8065 ID = Intrinsic::copysign; 8066 llvm::Function *F = CGM.getIntrinsic(ID, ResultType); 8067 return Builder.CreateCall(F, {X, Y}); 8068 } 8069 // Rounding/truncation 8070 case PPC::BI__builtin_vsx_xvrspip: 8071 case PPC::BI__builtin_vsx_xvrdpip: 8072 case PPC::BI__builtin_vsx_xvrdpim: 8073 case PPC::BI__builtin_vsx_xvrspim: 8074 case PPC::BI__builtin_vsx_xvrdpi: 8075 case PPC::BI__builtin_vsx_xvrspi: 8076 case PPC::BI__builtin_vsx_xvrdpic: 8077 case PPC::BI__builtin_vsx_xvrspic: 8078 case PPC::BI__builtin_vsx_xvrdpiz: 8079 case PPC::BI__builtin_vsx_xvrspiz: { 8080 llvm::Type *ResultType = ConvertType(E->getType()); 8081 Value *X = EmitScalarExpr(E->getArg(0)); 8082 if (BuiltinID == PPC::BI__builtin_vsx_xvrdpim || 8083 BuiltinID == PPC::BI__builtin_vsx_xvrspim) 8084 ID = Intrinsic::floor; 8085 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpi || 8086 BuiltinID == PPC::BI__builtin_vsx_xvrspi) 8087 ID = Intrinsic::round; 8088 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpic || 8089 BuiltinID == PPC::BI__builtin_vsx_xvrspic) 8090 ID = Intrinsic::nearbyint; 8091 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpip || 8092 BuiltinID == PPC::BI__builtin_vsx_xvrspip) 8093 ID = Intrinsic::ceil; 8094 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpiz || 8095 BuiltinID == PPC::BI__builtin_vsx_xvrspiz) 8096 ID = Intrinsic::trunc; 8097 llvm::Function *F = CGM.getIntrinsic(ID, ResultType); 8098 return Builder.CreateCall(F, X); 8099 } 8100 8101 // Absolute value 8102 case PPC::BI__builtin_vsx_xvabsdp: 8103 case PPC::BI__builtin_vsx_xvabssp: { 8104 llvm::Type *ResultType = ConvertType(E->getType()); 8105 Value *X = EmitScalarExpr(E->getArg(0)); 8106 llvm::Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType); 8107 return Builder.CreateCall(F, X); 8108 } 8109 8110 // FMA variations 8111 case PPC::BI__builtin_vsx_xvmaddadp: 8112 case PPC::BI__builtin_vsx_xvmaddasp: 8113 case PPC::BI__builtin_vsx_xvnmaddadp: 8114 case PPC::BI__builtin_vsx_xvnmaddasp: 8115 case PPC::BI__builtin_vsx_xvmsubadp: 8116 case PPC::BI__builtin_vsx_xvmsubasp: 8117 case PPC::BI__builtin_vsx_xvnmsubadp: 8118 case PPC::BI__builtin_vsx_xvnmsubasp: { 8119 llvm::Type *ResultType = ConvertType(E->getType()); 8120 Value *X = EmitScalarExpr(E->getArg(0)); 8121 Value *Y = EmitScalarExpr(E->getArg(1)); 8122 Value *Z = EmitScalarExpr(E->getArg(2)); 8123 Value *Zero = llvm::ConstantFP::getZeroValueForNegation(ResultType); 8124 llvm::Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType); 8125 switch (BuiltinID) { 8126 case PPC::BI__builtin_vsx_xvmaddadp: 8127 case PPC::BI__builtin_vsx_xvmaddasp: 8128 return Builder.CreateCall(F, {X, Y, Z}); 8129 case PPC::BI__builtin_vsx_xvnmaddadp: 8130 case PPC::BI__builtin_vsx_xvnmaddasp: 8131 return Builder.CreateFSub(Zero, 8132 Builder.CreateCall(F, {X, Y, Z}), "sub"); 8133 case PPC::BI__builtin_vsx_xvmsubadp: 8134 case PPC::BI__builtin_vsx_xvmsubasp: 8135 return Builder.CreateCall(F, 8136 {X, Y, Builder.CreateFSub(Zero, Z, "sub")}); 8137 case PPC::BI__builtin_vsx_xvnmsubadp: 8138 case PPC::BI__builtin_vsx_xvnmsubasp: 8139 Value *FsubRes = 8140 Builder.CreateCall(F, {X, Y, Builder.CreateFSub(Zero, Z, "sub")}); 8141 return Builder.CreateFSub(Zero, FsubRes, "sub"); 8142 } 8143 llvm_unreachable("Unknown FMA operation"); 8144 return nullptr; // Suppress no-return warning 8145 } 8146 } 8147 } 8148 8149 Value *CodeGenFunction::EmitAMDGPUBuiltinExpr(unsigned BuiltinID, 8150 const CallExpr *E) { 8151 switch (BuiltinID) { 8152 case AMDGPU::BI__builtin_amdgcn_div_scale: 8153 case AMDGPU::BI__builtin_amdgcn_div_scalef: { 8154 // Translate from the intrinsics's struct return to the builtin's out 8155 // argument. 8156 8157 Address FlagOutPtr = EmitPointerWithAlignment(E->getArg(3)); 8158 8159 llvm::Value *X = EmitScalarExpr(E->getArg(0)); 8160 llvm::Value *Y = EmitScalarExpr(E->getArg(1)); 8161 llvm::Value *Z = EmitScalarExpr(E->getArg(2)); 8162 8163 llvm::Value *Callee = CGM.getIntrinsic(Intrinsic::amdgcn_div_scale, 8164 X->getType()); 8165 8166 llvm::Value *Tmp = Builder.CreateCall(Callee, {X, Y, Z}); 8167 8168 llvm::Value *Result = Builder.CreateExtractValue(Tmp, 0); 8169 llvm::Value *Flag = Builder.CreateExtractValue(Tmp, 1); 8170 8171 llvm::Type *RealFlagType 8172 = FlagOutPtr.getPointer()->getType()->getPointerElementType(); 8173 8174 llvm::Value *FlagExt = Builder.CreateZExt(Flag, RealFlagType); 8175 Builder.CreateStore(FlagExt, FlagOutPtr); 8176 return Result; 8177 } 8178 case AMDGPU::BI__builtin_amdgcn_div_fmas: 8179 case AMDGPU::BI__builtin_amdgcn_div_fmasf: { 8180 llvm::Value *Src0 = EmitScalarExpr(E->getArg(0)); 8181 llvm::Value *Src1 = EmitScalarExpr(E->getArg(1)); 8182 llvm::Value *Src2 = EmitScalarExpr(E->getArg(2)); 8183 llvm::Value *Src3 = EmitScalarExpr(E->getArg(3)); 8184 8185 llvm::Value *F = CGM.getIntrinsic(Intrinsic::amdgcn_div_fmas, 8186 Src0->getType()); 8187 llvm::Value *Src3ToBool = Builder.CreateIsNotNull(Src3); 8188 return Builder.CreateCall(F, {Src0, Src1, Src2, Src3ToBool}); 8189 } 8190 8191 case AMDGPU::BI__builtin_amdgcn_ds_swizzle: 8192 return emitBinaryBuiltin(*this, E, Intrinsic::amdgcn_ds_swizzle); 8193 case AMDGPU::BI__builtin_amdgcn_div_fixup: 8194 case AMDGPU::BI__builtin_amdgcn_div_fixupf: 8195 return emitTernaryBuiltin(*this, E, Intrinsic::amdgcn_div_fixup); 8196 case AMDGPU::BI__builtin_amdgcn_trig_preop: 8197 case AMDGPU::BI__builtin_amdgcn_trig_preopf: 8198 return emitFPIntBuiltin(*this, E, Intrinsic::amdgcn_trig_preop); 8199 case AMDGPU::BI__builtin_amdgcn_rcp: 8200 case AMDGPU::BI__builtin_amdgcn_rcpf: 8201 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_rcp); 8202 case AMDGPU::BI__builtin_amdgcn_rsq: 8203 case AMDGPU::BI__builtin_amdgcn_rsqf: 8204 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_rsq); 8205 case AMDGPU::BI__builtin_amdgcn_rsq_clamp: 8206 case AMDGPU::BI__builtin_amdgcn_rsq_clampf: 8207 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_rsq_clamp); 8208 case AMDGPU::BI__builtin_amdgcn_sinf: 8209 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_sin); 8210 case AMDGPU::BI__builtin_amdgcn_cosf: 8211 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_cos); 8212 case AMDGPU::BI__builtin_amdgcn_log_clampf: 8213 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_log_clamp); 8214 case AMDGPU::BI__builtin_amdgcn_ldexp: 8215 case AMDGPU::BI__builtin_amdgcn_ldexpf: 8216 return emitFPIntBuiltin(*this, E, Intrinsic::amdgcn_ldexp); 8217 case AMDGPU::BI__builtin_amdgcn_frexp_mant: 8218 case AMDGPU::BI__builtin_amdgcn_frexp_mantf: { 8219 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_frexp_mant); 8220 } 8221 case AMDGPU::BI__builtin_amdgcn_frexp_exp: 8222 case AMDGPU::BI__builtin_amdgcn_frexp_expf: { 8223 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_frexp_exp); 8224 } 8225 case AMDGPU::BI__builtin_amdgcn_fract: 8226 case AMDGPU::BI__builtin_amdgcn_fractf: 8227 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_fract); 8228 case AMDGPU::BI__builtin_amdgcn_lerp: 8229 return emitTernaryBuiltin(*this, E, Intrinsic::amdgcn_lerp); 8230 case AMDGPU::BI__builtin_amdgcn_uicmp: 8231 case AMDGPU::BI__builtin_amdgcn_uicmpl: 8232 case AMDGPU::BI__builtin_amdgcn_sicmp: 8233 case AMDGPU::BI__builtin_amdgcn_sicmpl: 8234 return emitTernaryBuiltin(*this, E, Intrinsic::amdgcn_icmp); 8235 case AMDGPU::BI__builtin_amdgcn_fcmp: 8236 case AMDGPU::BI__builtin_amdgcn_fcmpf: 8237 return emitTernaryBuiltin(*this, E, Intrinsic::amdgcn_fcmp); 8238 case AMDGPU::BI__builtin_amdgcn_class: 8239 case AMDGPU::BI__builtin_amdgcn_classf: 8240 return emitFPIntBuiltin(*this, E, Intrinsic::amdgcn_class); 8241 8242 case AMDGPU::BI__builtin_amdgcn_read_exec: { 8243 CallInst *CI = cast<CallInst>( 8244 EmitSpecialRegisterBuiltin(*this, E, Int64Ty, Int64Ty, true, "exec")); 8245 CI->setConvergent(); 8246 return CI; 8247 } 8248 8249 // amdgcn workitem 8250 case AMDGPU::BI__builtin_amdgcn_workitem_id_x: 8251 return emitRangedBuiltin(*this, Intrinsic::amdgcn_workitem_id_x, 0, 1024); 8252 case AMDGPU::BI__builtin_amdgcn_workitem_id_y: 8253 return emitRangedBuiltin(*this, Intrinsic::amdgcn_workitem_id_y, 0, 1024); 8254 case AMDGPU::BI__builtin_amdgcn_workitem_id_z: 8255 return emitRangedBuiltin(*this, Intrinsic::amdgcn_workitem_id_z, 0, 1024); 8256 8257 // r600 intrinsics 8258 case AMDGPU::BI__builtin_r600_recipsqrt_ieee: 8259 case AMDGPU::BI__builtin_r600_recipsqrt_ieeef: 8260 return emitUnaryBuiltin(*this, E, Intrinsic::r600_recipsqrt_ieee); 8261 case AMDGPU::BI__builtin_r600_read_tidig_x: 8262 return emitRangedBuiltin(*this, Intrinsic::r600_read_tidig_x, 0, 1024); 8263 case AMDGPU::BI__builtin_r600_read_tidig_y: 8264 return emitRangedBuiltin(*this, Intrinsic::r600_read_tidig_y, 0, 1024); 8265 case AMDGPU::BI__builtin_r600_read_tidig_z: 8266 return emitRangedBuiltin(*this, Intrinsic::r600_read_tidig_z, 0, 1024); 8267 default: 8268 return nullptr; 8269 } 8270 } 8271 8272 /// Handle a SystemZ function in which the final argument is a pointer 8273 /// to an int that receives the post-instruction CC value. At the LLVM level 8274 /// this is represented as a function that returns a {result, cc} pair. 8275 static Value *EmitSystemZIntrinsicWithCC(CodeGenFunction &CGF, 8276 unsigned IntrinsicID, 8277 const CallExpr *E) { 8278 unsigned NumArgs = E->getNumArgs() - 1; 8279 SmallVector<Value *, 8> Args(NumArgs); 8280 for (unsigned I = 0; I < NumArgs; ++I) 8281 Args[I] = CGF.EmitScalarExpr(E->getArg(I)); 8282 Address CCPtr = CGF.EmitPointerWithAlignment(E->getArg(NumArgs)); 8283 Value *F = CGF.CGM.getIntrinsic(IntrinsicID); 8284 Value *Call = CGF.Builder.CreateCall(F, Args); 8285 Value *CC = CGF.Builder.CreateExtractValue(Call, 1); 8286 CGF.Builder.CreateStore(CC, CCPtr); 8287 return CGF.Builder.CreateExtractValue(Call, 0); 8288 } 8289 8290 Value *CodeGenFunction::EmitSystemZBuiltinExpr(unsigned BuiltinID, 8291 const CallExpr *E) { 8292 switch (BuiltinID) { 8293 case SystemZ::BI__builtin_tbegin: { 8294 Value *TDB = EmitScalarExpr(E->getArg(0)); 8295 Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff0c); 8296 Value *F = CGM.getIntrinsic(Intrinsic::s390_tbegin); 8297 return Builder.CreateCall(F, {TDB, Control}); 8298 } 8299 case SystemZ::BI__builtin_tbegin_nofloat: { 8300 Value *TDB = EmitScalarExpr(E->getArg(0)); 8301 Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff0c); 8302 Value *F = CGM.getIntrinsic(Intrinsic::s390_tbegin_nofloat); 8303 return Builder.CreateCall(F, {TDB, Control}); 8304 } 8305 case SystemZ::BI__builtin_tbeginc: { 8306 Value *TDB = llvm::ConstantPointerNull::get(Int8PtrTy); 8307 Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff08); 8308 Value *F = CGM.getIntrinsic(Intrinsic::s390_tbeginc); 8309 return Builder.CreateCall(F, {TDB, Control}); 8310 } 8311 case SystemZ::BI__builtin_tabort: { 8312 Value *Data = EmitScalarExpr(E->getArg(0)); 8313 Value *F = CGM.getIntrinsic(Intrinsic::s390_tabort); 8314 return Builder.CreateCall(F, Builder.CreateSExt(Data, Int64Ty, "tabort")); 8315 } 8316 case SystemZ::BI__builtin_non_tx_store: { 8317 Value *Address = EmitScalarExpr(E->getArg(0)); 8318 Value *Data = EmitScalarExpr(E->getArg(1)); 8319 Value *F = CGM.getIntrinsic(Intrinsic::s390_ntstg); 8320 return Builder.CreateCall(F, {Data, Address}); 8321 } 8322 8323 // Vector builtins. Note that most vector builtins are mapped automatically 8324 // to target-specific LLVM intrinsics. The ones handled specially here can 8325 // be represented via standard LLVM IR, which is preferable to enable common 8326 // LLVM optimizations. 8327 8328 case SystemZ::BI__builtin_s390_vpopctb: 8329 case SystemZ::BI__builtin_s390_vpopcth: 8330 case SystemZ::BI__builtin_s390_vpopctf: 8331 case SystemZ::BI__builtin_s390_vpopctg: { 8332 llvm::Type *ResultType = ConvertType(E->getType()); 8333 Value *X = EmitScalarExpr(E->getArg(0)); 8334 Function *F = CGM.getIntrinsic(Intrinsic::ctpop, ResultType); 8335 return Builder.CreateCall(F, X); 8336 } 8337 8338 case SystemZ::BI__builtin_s390_vclzb: 8339 case SystemZ::BI__builtin_s390_vclzh: 8340 case SystemZ::BI__builtin_s390_vclzf: 8341 case SystemZ::BI__builtin_s390_vclzg: { 8342 llvm::Type *ResultType = ConvertType(E->getType()); 8343 Value *X = EmitScalarExpr(E->getArg(0)); 8344 Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false); 8345 Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ResultType); 8346 return Builder.CreateCall(F, {X, Undef}); 8347 } 8348 8349 case SystemZ::BI__builtin_s390_vctzb: 8350 case SystemZ::BI__builtin_s390_vctzh: 8351 case SystemZ::BI__builtin_s390_vctzf: 8352 case SystemZ::BI__builtin_s390_vctzg: { 8353 llvm::Type *ResultType = ConvertType(E->getType()); 8354 Value *X = EmitScalarExpr(E->getArg(0)); 8355 Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false); 8356 Function *F = CGM.getIntrinsic(Intrinsic::cttz, ResultType); 8357 return Builder.CreateCall(F, {X, Undef}); 8358 } 8359 8360 case SystemZ::BI__builtin_s390_vfsqdb: { 8361 llvm::Type *ResultType = ConvertType(E->getType()); 8362 Value *X = EmitScalarExpr(E->getArg(0)); 8363 Function *F = CGM.getIntrinsic(Intrinsic::sqrt, ResultType); 8364 return Builder.CreateCall(F, X); 8365 } 8366 case SystemZ::BI__builtin_s390_vfmadb: { 8367 llvm::Type *ResultType = ConvertType(E->getType()); 8368 Value *X = EmitScalarExpr(E->getArg(0)); 8369 Value *Y = EmitScalarExpr(E->getArg(1)); 8370 Value *Z = EmitScalarExpr(E->getArg(2)); 8371 Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType); 8372 return Builder.CreateCall(F, {X, Y, Z}); 8373 } 8374 case SystemZ::BI__builtin_s390_vfmsdb: { 8375 llvm::Type *ResultType = ConvertType(E->getType()); 8376 Value *X = EmitScalarExpr(E->getArg(0)); 8377 Value *Y = EmitScalarExpr(E->getArg(1)); 8378 Value *Z = EmitScalarExpr(E->getArg(2)); 8379 Value *Zero = llvm::ConstantFP::getZeroValueForNegation(ResultType); 8380 Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType); 8381 return Builder.CreateCall(F, {X, Y, Builder.CreateFSub(Zero, Z, "sub")}); 8382 } 8383 case SystemZ::BI__builtin_s390_vflpdb: { 8384 llvm::Type *ResultType = ConvertType(E->getType()); 8385 Value *X = EmitScalarExpr(E->getArg(0)); 8386 Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType); 8387 return Builder.CreateCall(F, X); 8388 } 8389 case SystemZ::BI__builtin_s390_vflndb: { 8390 llvm::Type *ResultType = ConvertType(E->getType()); 8391 Value *X = EmitScalarExpr(E->getArg(0)); 8392 Value *Zero = llvm::ConstantFP::getZeroValueForNegation(ResultType); 8393 Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType); 8394 return Builder.CreateFSub(Zero, Builder.CreateCall(F, X), "sub"); 8395 } 8396 case SystemZ::BI__builtin_s390_vfidb: { 8397 llvm::Type *ResultType = ConvertType(E->getType()); 8398 Value *X = EmitScalarExpr(E->getArg(0)); 8399 // Constant-fold the M4 and M5 mask arguments. 8400 llvm::APSInt M4, M5; 8401 bool IsConstM4 = E->getArg(1)->isIntegerConstantExpr(M4, getContext()); 8402 bool IsConstM5 = E->getArg(2)->isIntegerConstantExpr(M5, getContext()); 8403 assert(IsConstM4 && IsConstM5 && "Constant arg isn't actually constant?"); 8404 (void)IsConstM4; (void)IsConstM5; 8405 // Check whether this instance of vfidb can be represented via a LLVM 8406 // standard intrinsic. We only support some combinations of M4 and M5. 8407 Intrinsic::ID ID = Intrinsic::not_intrinsic; 8408 switch (M4.getZExtValue()) { 8409 default: break; 8410 case 0: // IEEE-inexact exception allowed 8411 switch (M5.getZExtValue()) { 8412 default: break; 8413 case 0: ID = Intrinsic::rint; break; 8414 } 8415 break; 8416 case 4: // IEEE-inexact exception suppressed 8417 switch (M5.getZExtValue()) { 8418 default: break; 8419 case 0: ID = Intrinsic::nearbyint; break; 8420 case 1: ID = Intrinsic::round; break; 8421 case 5: ID = Intrinsic::trunc; break; 8422 case 6: ID = Intrinsic::ceil; break; 8423 case 7: ID = Intrinsic::floor; break; 8424 } 8425 break; 8426 } 8427 if (ID != Intrinsic::not_intrinsic) { 8428 Function *F = CGM.getIntrinsic(ID, ResultType); 8429 return Builder.CreateCall(F, X); 8430 } 8431 Function *F = CGM.getIntrinsic(Intrinsic::s390_vfidb); 8432 Value *M4Value = llvm::ConstantInt::get(getLLVMContext(), M4); 8433 Value *M5Value = llvm::ConstantInt::get(getLLVMContext(), M5); 8434 return Builder.CreateCall(F, {X, M4Value, M5Value}); 8435 } 8436 8437 // Vector intrisincs that output the post-instruction CC value. 8438 8439 #define INTRINSIC_WITH_CC(NAME) \ 8440 case SystemZ::BI__builtin_##NAME: \ 8441 return EmitSystemZIntrinsicWithCC(*this, Intrinsic::NAME, E) 8442 8443 INTRINSIC_WITH_CC(s390_vpkshs); 8444 INTRINSIC_WITH_CC(s390_vpksfs); 8445 INTRINSIC_WITH_CC(s390_vpksgs); 8446 8447 INTRINSIC_WITH_CC(s390_vpklshs); 8448 INTRINSIC_WITH_CC(s390_vpklsfs); 8449 INTRINSIC_WITH_CC(s390_vpklsgs); 8450 8451 INTRINSIC_WITH_CC(s390_vceqbs); 8452 INTRINSIC_WITH_CC(s390_vceqhs); 8453 INTRINSIC_WITH_CC(s390_vceqfs); 8454 INTRINSIC_WITH_CC(s390_vceqgs); 8455 8456 INTRINSIC_WITH_CC(s390_vchbs); 8457 INTRINSIC_WITH_CC(s390_vchhs); 8458 INTRINSIC_WITH_CC(s390_vchfs); 8459 INTRINSIC_WITH_CC(s390_vchgs); 8460 8461 INTRINSIC_WITH_CC(s390_vchlbs); 8462 INTRINSIC_WITH_CC(s390_vchlhs); 8463 INTRINSIC_WITH_CC(s390_vchlfs); 8464 INTRINSIC_WITH_CC(s390_vchlgs); 8465 8466 INTRINSIC_WITH_CC(s390_vfaebs); 8467 INTRINSIC_WITH_CC(s390_vfaehs); 8468 INTRINSIC_WITH_CC(s390_vfaefs); 8469 8470 INTRINSIC_WITH_CC(s390_vfaezbs); 8471 INTRINSIC_WITH_CC(s390_vfaezhs); 8472 INTRINSIC_WITH_CC(s390_vfaezfs); 8473 8474 INTRINSIC_WITH_CC(s390_vfeebs); 8475 INTRINSIC_WITH_CC(s390_vfeehs); 8476 INTRINSIC_WITH_CC(s390_vfeefs); 8477 8478 INTRINSIC_WITH_CC(s390_vfeezbs); 8479 INTRINSIC_WITH_CC(s390_vfeezhs); 8480 INTRINSIC_WITH_CC(s390_vfeezfs); 8481 8482 INTRINSIC_WITH_CC(s390_vfenebs); 8483 INTRINSIC_WITH_CC(s390_vfenehs); 8484 INTRINSIC_WITH_CC(s390_vfenefs); 8485 8486 INTRINSIC_WITH_CC(s390_vfenezbs); 8487 INTRINSIC_WITH_CC(s390_vfenezhs); 8488 INTRINSIC_WITH_CC(s390_vfenezfs); 8489 8490 INTRINSIC_WITH_CC(s390_vistrbs); 8491 INTRINSIC_WITH_CC(s390_vistrhs); 8492 INTRINSIC_WITH_CC(s390_vistrfs); 8493 8494 INTRINSIC_WITH_CC(s390_vstrcbs); 8495 INTRINSIC_WITH_CC(s390_vstrchs); 8496 INTRINSIC_WITH_CC(s390_vstrcfs); 8497 8498 INTRINSIC_WITH_CC(s390_vstrczbs); 8499 INTRINSIC_WITH_CC(s390_vstrczhs); 8500 INTRINSIC_WITH_CC(s390_vstrczfs); 8501 8502 INTRINSIC_WITH_CC(s390_vfcedbs); 8503 INTRINSIC_WITH_CC(s390_vfchdbs); 8504 INTRINSIC_WITH_CC(s390_vfchedbs); 8505 8506 INTRINSIC_WITH_CC(s390_vftcidb); 8507 8508 #undef INTRINSIC_WITH_CC 8509 8510 default: 8511 return nullptr; 8512 } 8513 } 8514 8515 Value *CodeGenFunction::EmitNVPTXBuiltinExpr(unsigned BuiltinID, 8516 const CallExpr *E) { 8517 auto MakeLdg = [&](unsigned IntrinsicID) { 8518 Value *Ptr = EmitScalarExpr(E->getArg(0)); 8519 AlignmentSource AlignSource; 8520 clang::CharUnits Align = 8521 getNaturalPointeeTypeAlignment(E->getArg(0)->getType(), &AlignSource); 8522 return Builder.CreateCall( 8523 CGM.getIntrinsic(IntrinsicID, {Ptr->getType()->getPointerElementType(), 8524 Ptr->getType()}), 8525 {Ptr, ConstantInt::get(Builder.getInt32Ty(), Align.getQuantity())}); 8526 }; 8527 auto MakeScopedAtomic = [&](unsigned IntrinsicID) { 8528 Value *Ptr = EmitScalarExpr(E->getArg(0)); 8529 return Builder.CreateCall( 8530 CGM.getIntrinsic(IntrinsicID, {Ptr->getType()->getPointerElementType(), 8531 Ptr->getType()}), 8532 {Ptr, EmitScalarExpr(E->getArg(1))}); 8533 }; 8534 switch (BuiltinID) { 8535 case NVPTX::BI__nvvm_atom_add_gen_i: 8536 case NVPTX::BI__nvvm_atom_add_gen_l: 8537 case NVPTX::BI__nvvm_atom_add_gen_ll: 8538 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Add, E); 8539 8540 case NVPTX::BI__nvvm_atom_sub_gen_i: 8541 case NVPTX::BI__nvvm_atom_sub_gen_l: 8542 case NVPTX::BI__nvvm_atom_sub_gen_ll: 8543 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Sub, E); 8544 8545 case NVPTX::BI__nvvm_atom_and_gen_i: 8546 case NVPTX::BI__nvvm_atom_and_gen_l: 8547 case NVPTX::BI__nvvm_atom_and_gen_ll: 8548 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::And, E); 8549 8550 case NVPTX::BI__nvvm_atom_or_gen_i: 8551 case NVPTX::BI__nvvm_atom_or_gen_l: 8552 case NVPTX::BI__nvvm_atom_or_gen_ll: 8553 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Or, E); 8554 8555 case NVPTX::BI__nvvm_atom_xor_gen_i: 8556 case NVPTX::BI__nvvm_atom_xor_gen_l: 8557 case NVPTX::BI__nvvm_atom_xor_gen_ll: 8558 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Xor, E); 8559 8560 case NVPTX::BI__nvvm_atom_xchg_gen_i: 8561 case NVPTX::BI__nvvm_atom_xchg_gen_l: 8562 case NVPTX::BI__nvvm_atom_xchg_gen_ll: 8563 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Xchg, E); 8564 8565 case NVPTX::BI__nvvm_atom_max_gen_i: 8566 case NVPTX::BI__nvvm_atom_max_gen_l: 8567 case NVPTX::BI__nvvm_atom_max_gen_ll: 8568 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Max, E); 8569 8570 case NVPTX::BI__nvvm_atom_max_gen_ui: 8571 case NVPTX::BI__nvvm_atom_max_gen_ul: 8572 case NVPTX::BI__nvvm_atom_max_gen_ull: 8573 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::UMax, E); 8574 8575 case NVPTX::BI__nvvm_atom_min_gen_i: 8576 case NVPTX::BI__nvvm_atom_min_gen_l: 8577 case NVPTX::BI__nvvm_atom_min_gen_ll: 8578 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Min, E); 8579 8580 case NVPTX::BI__nvvm_atom_min_gen_ui: 8581 case NVPTX::BI__nvvm_atom_min_gen_ul: 8582 case NVPTX::BI__nvvm_atom_min_gen_ull: 8583 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::UMin, E); 8584 8585 case NVPTX::BI__nvvm_atom_cas_gen_i: 8586 case NVPTX::BI__nvvm_atom_cas_gen_l: 8587 case NVPTX::BI__nvvm_atom_cas_gen_ll: 8588 // __nvvm_atom_cas_gen_* should return the old value rather than the 8589 // success flag. 8590 return MakeAtomicCmpXchgValue(*this, E, /*ReturnBool=*/false); 8591 8592 case NVPTX::BI__nvvm_atom_add_gen_f: { 8593 Value *Ptr = EmitScalarExpr(E->getArg(0)); 8594 Value *Val = EmitScalarExpr(E->getArg(1)); 8595 // atomicrmw only deals with integer arguments so we need to use 8596 // LLVM's nvvm_atomic_load_add_f32 intrinsic for that. 8597 Value *FnALAF32 = 8598 CGM.getIntrinsic(Intrinsic::nvvm_atomic_load_add_f32, Ptr->getType()); 8599 return Builder.CreateCall(FnALAF32, {Ptr, Val}); 8600 } 8601 8602 case NVPTX::BI__nvvm_atom_inc_gen_ui: { 8603 Value *Ptr = EmitScalarExpr(E->getArg(0)); 8604 Value *Val = EmitScalarExpr(E->getArg(1)); 8605 Value *FnALI32 = 8606 CGM.getIntrinsic(Intrinsic::nvvm_atomic_load_inc_32, Ptr->getType()); 8607 return Builder.CreateCall(FnALI32, {Ptr, Val}); 8608 } 8609 8610 case NVPTX::BI__nvvm_atom_dec_gen_ui: { 8611 Value *Ptr = EmitScalarExpr(E->getArg(0)); 8612 Value *Val = EmitScalarExpr(E->getArg(1)); 8613 Value *FnALD32 = 8614 CGM.getIntrinsic(Intrinsic::nvvm_atomic_load_dec_32, Ptr->getType()); 8615 return Builder.CreateCall(FnALD32, {Ptr, Val}); 8616 } 8617 8618 case NVPTX::BI__nvvm_ldg_c: 8619 case NVPTX::BI__nvvm_ldg_c2: 8620 case NVPTX::BI__nvvm_ldg_c4: 8621 case NVPTX::BI__nvvm_ldg_s: 8622 case NVPTX::BI__nvvm_ldg_s2: 8623 case NVPTX::BI__nvvm_ldg_s4: 8624 case NVPTX::BI__nvvm_ldg_i: 8625 case NVPTX::BI__nvvm_ldg_i2: 8626 case NVPTX::BI__nvvm_ldg_i4: 8627 case NVPTX::BI__nvvm_ldg_l: 8628 case NVPTX::BI__nvvm_ldg_ll: 8629 case NVPTX::BI__nvvm_ldg_ll2: 8630 case NVPTX::BI__nvvm_ldg_uc: 8631 case NVPTX::BI__nvvm_ldg_uc2: 8632 case NVPTX::BI__nvvm_ldg_uc4: 8633 case NVPTX::BI__nvvm_ldg_us: 8634 case NVPTX::BI__nvvm_ldg_us2: 8635 case NVPTX::BI__nvvm_ldg_us4: 8636 case NVPTX::BI__nvvm_ldg_ui: 8637 case NVPTX::BI__nvvm_ldg_ui2: 8638 case NVPTX::BI__nvvm_ldg_ui4: 8639 case NVPTX::BI__nvvm_ldg_ul: 8640 case NVPTX::BI__nvvm_ldg_ull: 8641 case NVPTX::BI__nvvm_ldg_ull2: 8642 // PTX Interoperability section 2.2: "For a vector with an even number of 8643 // elements, its alignment is set to number of elements times the alignment 8644 // of its member: n*alignof(t)." 8645 return MakeLdg(Intrinsic::nvvm_ldg_global_i); 8646 case NVPTX::BI__nvvm_ldg_f: 8647 case NVPTX::BI__nvvm_ldg_f2: 8648 case NVPTX::BI__nvvm_ldg_f4: 8649 case NVPTX::BI__nvvm_ldg_d: 8650 case NVPTX::BI__nvvm_ldg_d2: 8651 return MakeLdg(Intrinsic::nvvm_ldg_global_f); 8652 8653 case NVPTX::BI__nvvm_atom_cta_add_gen_i: 8654 case NVPTX::BI__nvvm_atom_cta_add_gen_l: 8655 case NVPTX::BI__nvvm_atom_cta_add_gen_ll: 8656 return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_i_cta); 8657 case NVPTX::BI__nvvm_atom_sys_add_gen_i: 8658 case NVPTX::BI__nvvm_atom_sys_add_gen_l: 8659 case NVPTX::BI__nvvm_atom_sys_add_gen_ll: 8660 return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_i_sys); 8661 case NVPTX::BI__nvvm_atom_cta_add_gen_f: 8662 case NVPTX::BI__nvvm_atom_cta_add_gen_d: 8663 return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_f_cta); 8664 case NVPTX::BI__nvvm_atom_sys_add_gen_f: 8665 case NVPTX::BI__nvvm_atom_sys_add_gen_d: 8666 return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_f_sys); 8667 case NVPTX::BI__nvvm_atom_cta_xchg_gen_i: 8668 case NVPTX::BI__nvvm_atom_cta_xchg_gen_l: 8669 case NVPTX::BI__nvvm_atom_cta_xchg_gen_ll: 8670 return MakeScopedAtomic(Intrinsic::nvvm_atomic_exch_gen_i_cta); 8671 case NVPTX::BI__nvvm_atom_sys_xchg_gen_i: 8672 case NVPTX::BI__nvvm_atom_sys_xchg_gen_l: 8673 case NVPTX::BI__nvvm_atom_sys_xchg_gen_ll: 8674 return MakeScopedAtomic(Intrinsic::nvvm_atomic_exch_gen_i_sys); 8675 case NVPTX::BI__nvvm_atom_cta_max_gen_i: 8676 case NVPTX::BI__nvvm_atom_cta_max_gen_ui: 8677 case NVPTX::BI__nvvm_atom_cta_max_gen_l: 8678 case NVPTX::BI__nvvm_atom_cta_max_gen_ul: 8679 case NVPTX::BI__nvvm_atom_cta_max_gen_ll: 8680 case NVPTX::BI__nvvm_atom_cta_max_gen_ull: 8681 return MakeScopedAtomic(Intrinsic::nvvm_atomic_max_gen_i_cta); 8682 case NVPTX::BI__nvvm_atom_sys_max_gen_i: 8683 case NVPTX::BI__nvvm_atom_sys_max_gen_ui: 8684 case NVPTX::BI__nvvm_atom_sys_max_gen_l: 8685 case NVPTX::BI__nvvm_atom_sys_max_gen_ul: 8686 case NVPTX::BI__nvvm_atom_sys_max_gen_ll: 8687 case NVPTX::BI__nvvm_atom_sys_max_gen_ull: 8688 return MakeScopedAtomic(Intrinsic::nvvm_atomic_max_gen_i_sys); 8689 case NVPTX::BI__nvvm_atom_cta_min_gen_i: 8690 case NVPTX::BI__nvvm_atom_cta_min_gen_ui: 8691 case NVPTX::BI__nvvm_atom_cta_min_gen_l: 8692 case NVPTX::BI__nvvm_atom_cta_min_gen_ul: 8693 case NVPTX::BI__nvvm_atom_cta_min_gen_ll: 8694 case NVPTX::BI__nvvm_atom_cta_min_gen_ull: 8695 return MakeScopedAtomic(Intrinsic::nvvm_atomic_min_gen_i_cta); 8696 case NVPTX::BI__nvvm_atom_sys_min_gen_i: 8697 case NVPTX::BI__nvvm_atom_sys_min_gen_ui: 8698 case NVPTX::BI__nvvm_atom_sys_min_gen_l: 8699 case NVPTX::BI__nvvm_atom_sys_min_gen_ul: 8700 case NVPTX::BI__nvvm_atom_sys_min_gen_ll: 8701 case NVPTX::BI__nvvm_atom_sys_min_gen_ull: 8702 return MakeScopedAtomic(Intrinsic::nvvm_atomic_min_gen_i_sys); 8703 case NVPTX::BI__nvvm_atom_cta_inc_gen_ui: 8704 return MakeScopedAtomic(Intrinsic::nvvm_atomic_inc_gen_i_cta); 8705 case NVPTX::BI__nvvm_atom_cta_dec_gen_ui: 8706 return MakeScopedAtomic(Intrinsic::nvvm_atomic_dec_gen_i_cta); 8707 case NVPTX::BI__nvvm_atom_sys_inc_gen_ui: 8708 return MakeScopedAtomic(Intrinsic::nvvm_atomic_inc_gen_i_sys); 8709 case NVPTX::BI__nvvm_atom_sys_dec_gen_ui: 8710 return MakeScopedAtomic(Intrinsic::nvvm_atomic_dec_gen_i_sys); 8711 case NVPTX::BI__nvvm_atom_cta_and_gen_i: 8712 case NVPTX::BI__nvvm_atom_cta_and_gen_l: 8713 case NVPTX::BI__nvvm_atom_cta_and_gen_ll: 8714 return MakeScopedAtomic(Intrinsic::nvvm_atomic_and_gen_i_cta); 8715 case NVPTX::BI__nvvm_atom_sys_and_gen_i: 8716 case NVPTX::BI__nvvm_atom_sys_and_gen_l: 8717 case NVPTX::BI__nvvm_atom_sys_and_gen_ll: 8718 return MakeScopedAtomic(Intrinsic::nvvm_atomic_and_gen_i_sys); 8719 case NVPTX::BI__nvvm_atom_cta_or_gen_i: 8720 case NVPTX::BI__nvvm_atom_cta_or_gen_l: 8721 case NVPTX::BI__nvvm_atom_cta_or_gen_ll: 8722 return MakeScopedAtomic(Intrinsic::nvvm_atomic_or_gen_i_cta); 8723 case NVPTX::BI__nvvm_atom_sys_or_gen_i: 8724 case NVPTX::BI__nvvm_atom_sys_or_gen_l: 8725 case NVPTX::BI__nvvm_atom_sys_or_gen_ll: 8726 return MakeScopedAtomic(Intrinsic::nvvm_atomic_or_gen_i_sys); 8727 case NVPTX::BI__nvvm_atom_cta_xor_gen_i: 8728 case NVPTX::BI__nvvm_atom_cta_xor_gen_l: 8729 case NVPTX::BI__nvvm_atom_cta_xor_gen_ll: 8730 return MakeScopedAtomic(Intrinsic::nvvm_atomic_xor_gen_i_cta); 8731 case NVPTX::BI__nvvm_atom_sys_xor_gen_i: 8732 case NVPTX::BI__nvvm_atom_sys_xor_gen_l: 8733 case NVPTX::BI__nvvm_atom_sys_xor_gen_ll: 8734 return MakeScopedAtomic(Intrinsic::nvvm_atomic_xor_gen_i_sys); 8735 case NVPTX::BI__nvvm_atom_cta_cas_gen_i: 8736 case NVPTX::BI__nvvm_atom_cta_cas_gen_l: 8737 case NVPTX::BI__nvvm_atom_cta_cas_gen_ll: { 8738 Value *Ptr = EmitScalarExpr(E->getArg(0)); 8739 return Builder.CreateCall( 8740 CGM.getIntrinsic( 8741 Intrinsic::nvvm_atomic_cas_gen_i_cta, 8742 {Ptr->getType()->getPointerElementType(), Ptr->getType()}), 8743 {Ptr, EmitScalarExpr(E->getArg(1)), EmitScalarExpr(E->getArg(2))}); 8744 } 8745 case NVPTX::BI__nvvm_atom_sys_cas_gen_i: 8746 case NVPTX::BI__nvvm_atom_sys_cas_gen_l: 8747 case NVPTX::BI__nvvm_atom_sys_cas_gen_ll: { 8748 Value *Ptr = EmitScalarExpr(E->getArg(0)); 8749 return Builder.CreateCall( 8750 CGM.getIntrinsic( 8751 Intrinsic::nvvm_atomic_cas_gen_i_sys, 8752 {Ptr->getType()->getPointerElementType(), Ptr->getType()}), 8753 {Ptr, EmitScalarExpr(E->getArg(1)), EmitScalarExpr(E->getArg(2))}); 8754 } 8755 default: 8756 return nullptr; 8757 } 8758 } 8759 8760 Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID, 8761 const CallExpr *E) { 8762 switch (BuiltinID) { 8763 case WebAssembly::BI__builtin_wasm_current_memory: { 8764 llvm::Type *ResultType = ConvertType(E->getType()); 8765 Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_current_memory, ResultType); 8766 return Builder.CreateCall(Callee); 8767 } 8768 case WebAssembly::BI__builtin_wasm_grow_memory: { 8769 Value *X = EmitScalarExpr(E->getArg(0)); 8770 Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_grow_memory, X->getType()); 8771 return Builder.CreateCall(Callee, X); 8772 } 8773 8774 default: 8775 return nullptr; 8776 } 8777 } 8778