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