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