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, 7379 AVX5124FMAPS, 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("avx5124vnniw", X86Features::AVX5124VNNIW) 7415 .Case("avx5124fmaps", X86Features::AVX5124FMAPS) 7416 .Case("avx512vpopcntdq", X86Features::AVX512VPOPCNTDQ) 7417 .Default(X86Features::MAX); 7418 assert(Feature != X86Features::MAX && "Invalid feature!"); 7419 7420 // Matching the struct layout from the compiler-rt/libgcc structure that is 7421 // filled in: 7422 // unsigned int __cpu_vendor; 7423 // unsigned int __cpu_type; 7424 // unsigned int __cpu_subtype; 7425 // unsigned int __cpu_features[1]; 7426 llvm::Type *STy = llvm::StructType::get(Int32Ty, Int32Ty, Int32Ty, 7427 llvm::ArrayType::get(Int32Ty, 1)); 7428 7429 // Grab the global __cpu_model. 7430 llvm::Constant *CpuModel = CGM.CreateRuntimeVariable(STy, "__cpu_model"); 7431 7432 // Grab the first (0th) element from the field __cpu_features off of the 7433 // global in the struct STy. 7434 Value *Idxs[] = { 7435 ConstantInt::get(Int32Ty, 0), 7436 ConstantInt::get(Int32Ty, 3), 7437 ConstantInt::get(Int32Ty, 0) 7438 }; 7439 Value *CpuFeatures = Builder.CreateGEP(STy, CpuModel, Idxs); 7440 Value *Features = Builder.CreateAlignedLoad(CpuFeatures, 7441 CharUnits::fromQuantity(4)); 7442 7443 // Check the value of the bit corresponding to the feature requested. 7444 Value *Bitset = Builder.CreateAnd( 7445 Features, llvm::ConstantInt::get(Int32Ty, 1ULL << Feature)); 7446 return Builder.CreateICmpNE(Bitset, llvm::ConstantInt::get(Int32Ty, 0)); 7447 } 7448 case X86::BI_mm_prefetch: { 7449 Value *Address = Ops[0]; 7450 Value *RW = ConstantInt::get(Int32Ty, 0); 7451 Value *Locality = Ops[1]; 7452 Value *Data = ConstantInt::get(Int32Ty, 1); 7453 Value *F = CGM.getIntrinsic(Intrinsic::prefetch); 7454 return Builder.CreateCall(F, {Address, RW, Locality, Data}); 7455 } 7456 case X86::BI_mm_clflush: { 7457 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse2_clflush), 7458 Ops[0]); 7459 } 7460 case X86::BI_mm_lfence: { 7461 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse2_lfence)); 7462 } 7463 case X86::BI_mm_mfence: { 7464 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse2_mfence)); 7465 } 7466 case X86::BI_mm_sfence: { 7467 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_sfence)); 7468 } 7469 case X86::BI_mm_pause: { 7470 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse2_pause)); 7471 } 7472 case X86::BI__rdtsc: { 7473 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_rdtsc)); 7474 } 7475 case X86::BI__builtin_ia32_undef128: 7476 case X86::BI__builtin_ia32_undef256: 7477 case X86::BI__builtin_ia32_undef512: 7478 // The x86 definition of "undef" is not the same as the LLVM definition 7479 // (PR32176). We leave optimizing away an unnecessary zero constant to the 7480 // IR optimizer and backend. 7481 // TODO: If we had a "freeze" IR instruction to generate a fixed undef 7482 // value, we should use that here instead of a zero. 7483 return llvm::Constant::getNullValue(ConvertType(E->getType())); 7484 case X86::BI__builtin_ia32_vec_init_v8qi: 7485 case X86::BI__builtin_ia32_vec_init_v4hi: 7486 case X86::BI__builtin_ia32_vec_init_v2si: 7487 return Builder.CreateBitCast(BuildVector(Ops), 7488 llvm::Type::getX86_MMXTy(getLLVMContext())); 7489 case X86::BI__builtin_ia32_vec_ext_v2si: 7490 return Builder.CreateExtractElement(Ops[0], 7491 llvm::ConstantInt::get(Ops[1]->getType(), 0)); 7492 case X86::BI_mm_setcsr: 7493 case X86::BI__builtin_ia32_ldmxcsr: { 7494 Address Tmp = CreateMemTemp(E->getArg(0)->getType()); 7495 Builder.CreateStore(Ops[0], Tmp); 7496 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_ldmxcsr), 7497 Builder.CreateBitCast(Tmp.getPointer(), Int8PtrTy)); 7498 } 7499 case X86::BI_mm_getcsr: 7500 case X86::BI__builtin_ia32_stmxcsr: { 7501 Address Tmp = CreateMemTemp(E->getType()); 7502 Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_stmxcsr), 7503 Builder.CreateBitCast(Tmp.getPointer(), Int8PtrTy)); 7504 return Builder.CreateLoad(Tmp, "stmxcsr"); 7505 } 7506 case X86::BI__builtin_ia32_xsave: 7507 case X86::BI__builtin_ia32_xsave64: 7508 case X86::BI__builtin_ia32_xrstor: 7509 case X86::BI__builtin_ia32_xrstor64: 7510 case X86::BI__builtin_ia32_xsaveopt: 7511 case X86::BI__builtin_ia32_xsaveopt64: 7512 case X86::BI__builtin_ia32_xrstors: 7513 case X86::BI__builtin_ia32_xrstors64: 7514 case X86::BI__builtin_ia32_xsavec: 7515 case X86::BI__builtin_ia32_xsavec64: 7516 case X86::BI__builtin_ia32_xsaves: 7517 case X86::BI__builtin_ia32_xsaves64: { 7518 Intrinsic::ID ID; 7519 #define INTRINSIC_X86_XSAVE_ID(NAME) \ 7520 case X86::BI__builtin_ia32_##NAME: \ 7521 ID = Intrinsic::x86_##NAME; \ 7522 break 7523 switch (BuiltinID) { 7524 default: llvm_unreachable("Unsupported intrinsic!"); 7525 INTRINSIC_X86_XSAVE_ID(xsave); 7526 INTRINSIC_X86_XSAVE_ID(xsave64); 7527 INTRINSIC_X86_XSAVE_ID(xrstor); 7528 INTRINSIC_X86_XSAVE_ID(xrstor64); 7529 INTRINSIC_X86_XSAVE_ID(xsaveopt); 7530 INTRINSIC_X86_XSAVE_ID(xsaveopt64); 7531 INTRINSIC_X86_XSAVE_ID(xrstors); 7532 INTRINSIC_X86_XSAVE_ID(xrstors64); 7533 INTRINSIC_X86_XSAVE_ID(xsavec); 7534 INTRINSIC_X86_XSAVE_ID(xsavec64); 7535 INTRINSIC_X86_XSAVE_ID(xsaves); 7536 INTRINSIC_X86_XSAVE_ID(xsaves64); 7537 } 7538 #undef INTRINSIC_X86_XSAVE_ID 7539 Value *Mhi = Builder.CreateTrunc( 7540 Builder.CreateLShr(Ops[1], ConstantInt::get(Int64Ty, 32)), Int32Ty); 7541 Value *Mlo = Builder.CreateTrunc(Ops[1], Int32Ty); 7542 Ops[1] = Mhi; 7543 Ops.push_back(Mlo); 7544 return Builder.CreateCall(CGM.getIntrinsic(ID), Ops); 7545 } 7546 case X86::BI__builtin_ia32_storedqudi128_mask: 7547 case X86::BI__builtin_ia32_storedqusi128_mask: 7548 case X86::BI__builtin_ia32_storedquhi128_mask: 7549 case X86::BI__builtin_ia32_storedquqi128_mask: 7550 case X86::BI__builtin_ia32_storeupd128_mask: 7551 case X86::BI__builtin_ia32_storeups128_mask: 7552 case X86::BI__builtin_ia32_storedqudi256_mask: 7553 case X86::BI__builtin_ia32_storedqusi256_mask: 7554 case X86::BI__builtin_ia32_storedquhi256_mask: 7555 case X86::BI__builtin_ia32_storedquqi256_mask: 7556 case X86::BI__builtin_ia32_storeupd256_mask: 7557 case X86::BI__builtin_ia32_storeups256_mask: 7558 case X86::BI__builtin_ia32_storedqudi512_mask: 7559 case X86::BI__builtin_ia32_storedqusi512_mask: 7560 case X86::BI__builtin_ia32_storedquhi512_mask: 7561 case X86::BI__builtin_ia32_storedquqi512_mask: 7562 case X86::BI__builtin_ia32_storeupd512_mask: 7563 case X86::BI__builtin_ia32_storeups512_mask: 7564 return EmitX86MaskedStore(*this, Ops, 1); 7565 7566 case X86::BI__builtin_ia32_storess128_mask: 7567 case X86::BI__builtin_ia32_storesd128_mask: { 7568 return EmitX86MaskedStore(*this, Ops, 16); 7569 } 7570 case X86::BI__builtin_ia32_vpopcntd_512: 7571 case X86::BI__builtin_ia32_vpopcntq_512: { 7572 llvm::Type *ResultType = ConvertType(E->getType()); 7573 llvm::Function *F = CGM.getIntrinsic(Intrinsic::ctpop, ResultType); 7574 return Builder.CreateCall(F, Ops); 7575 } 7576 case X86::BI__builtin_ia32_cvtmask2b128: 7577 case X86::BI__builtin_ia32_cvtmask2b256: 7578 case X86::BI__builtin_ia32_cvtmask2b512: 7579 case X86::BI__builtin_ia32_cvtmask2w128: 7580 case X86::BI__builtin_ia32_cvtmask2w256: 7581 case X86::BI__builtin_ia32_cvtmask2w512: 7582 case X86::BI__builtin_ia32_cvtmask2d128: 7583 case X86::BI__builtin_ia32_cvtmask2d256: 7584 case X86::BI__builtin_ia32_cvtmask2d512: 7585 case X86::BI__builtin_ia32_cvtmask2q128: 7586 case X86::BI__builtin_ia32_cvtmask2q256: 7587 case X86::BI__builtin_ia32_cvtmask2q512: 7588 return EmitX86SExtMask(*this, Ops[0], ConvertType(E->getType())); 7589 7590 case X86::BI__builtin_ia32_movdqa32store128_mask: 7591 case X86::BI__builtin_ia32_movdqa64store128_mask: 7592 case X86::BI__builtin_ia32_storeaps128_mask: 7593 case X86::BI__builtin_ia32_storeapd128_mask: 7594 case X86::BI__builtin_ia32_movdqa32store256_mask: 7595 case X86::BI__builtin_ia32_movdqa64store256_mask: 7596 case X86::BI__builtin_ia32_storeaps256_mask: 7597 case X86::BI__builtin_ia32_storeapd256_mask: 7598 case X86::BI__builtin_ia32_movdqa32store512_mask: 7599 case X86::BI__builtin_ia32_movdqa64store512_mask: 7600 case X86::BI__builtin_ia32_storeaps512_mask: 7601 case X86::BI__builtin_ia32_storeapd512_mask: { 7602 unsigned Align = 7603 getContext().getTypeAlignInChars(E->getArg(1)->getType()).getQuantity(); 7604 return EmitX86MaskedStore(*this, Ops, Align); 7605 } 7606 case X86::BI__builtin_ia32_loadups128_mask: 7607 case X86::BI__builtin_ia32_loadups256_mask: 7608 case X86::BI__builtin_ia32_loadups512_mask: 7609 case X86::BI__builtin_ia32_loadupd128_mask: 7610 case X86::BI__builtin_ia32_loadupd256_mask: 7611 case X86::BI__builtin_ia32_loadupd512_mask: 7612 case X86::BI__builtin_ia32_loaddquqi128_mask: 7613 case X86::BI__builtin_ia32_loaddquqi256_mask: 7614 case X86::BI__builtin_ia32_loaddquqi512_mask: 7615 case X86::BI__builtin_ia32_loaddquhi128_mask: 7616 case X86::BI__builtin_ia32_loaddquhi256_mask: 7617 case X86::BI__builtin_ia32_loaddquhi512_mask: 7618 case X86::BI__builtin_ia32_loaddqusi128_mask: 7619 case X86::BI__builtin_ia32_loaddqusi256_mask: 7620 case X86::BI__builtin_ia32_loaddqusi512_mask: 7621 case X86::BI__builtin_ia32_loaddqudi128_mask: 7622 case X86::BI__builtin_ia32_loaddqudi256_mask: 7623 case X86::BI__builtin_ia32_loaddqudi512_mask: 7624 return EmitX86MaskedLoad(*this, Ops, 1); 7625 7626 case X86::BI__builtin_ia32_loadss128_mask: 7627 case X86::BI__builtin_ia32_loadsd128_mask: 7628 return EmitX86MaskedLoad(*this, Ops, 16); 7629 7630 case X86::BI__builtin_ia32_loadaps128_mask: 7631 case X86::BI__builtin_ia32_loadaps256_mask: 7632 case X86::BI__builtin_ia32_loadaps512_mask: 7633 case X86::BI__builtin_ia32_loadapd128_mask: 7634 case X86::BI__builtin_ia32_loadapd256_mask: 7635 case X86::BI__builtin_ia32_loadapd512_mask: 7636 case X86::BI__builtin_ia32_movdqa32load128_mask: 7637 case X86::BI__builtin_ia32_movdqa32load256_mask: 7638 case X86::BI__builtin_ia32_movdqa32load512_mask: 7639 case X86::BI__builtin_ia32_movdqa64load128_mask: 7640 case X86::BI__builtin_ia32_movdqa64load256_mask: 7641 case X86::BI__builtin_ia32_movdqa64load512_mask: { 7642 unsigned Align = 7643 getContext().getTypeAlignInChars(E->getArg(1)->getType()).getQuantity(); 7644 return EmitX86MaskedLoad(*this, Ops, Align); 7645 } 7646 7647 case X86::BI__builtin_ia32_vbroadcastf128_pd256: 7648 case X86::BI__builtin_ia32_vbroadcastf128_ps256: { 7649 llvm::Type *DstTy = ConvertType(E->getType()); 7650 return EmitX86SubVectorBroadcast(*this, Ops, DstTy, 128, 1); 7651 } 7652 7653 case X86::BI__builtin_ia32_storehps: 7654 case X86::BI__builtin_ia32_storelps: { 7655 llvm::Type *PtrTy = llvm::PointerType::getUnqual(Int64Ty); 7656 llvm::Type *VecTy = llvm::VectorType::get(Int64Ty, 2); 7657 7658 // cast val v2i64 7659 Ops[1] = Builder.CreateBitCast(Ops[1], VecTy, "cast"); 7660 7661 // extract (0, 1) 7662 unsigned Index = BuiltinID == X86::BI__builtin_ia32_storelps ? 0 : 1; 7663 llvm::Value *Idx = llvm::ConstantInt::get(SizeTy, Index); 7664 Ops[1] = Builder.CreateExtractElement(Ops[1], Idx, "extract"); 7665 7666 // cast pointer to i64 & store 7667 Ops[0] = Builder.CreateBitCast(Ops[0], PtrTy); 7668 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 7669 } 7670 case X86::BI__builtin_ia32_palignr128: 7671 case X86::BI__builtin_ia32_palignr256: 7672 case X86::BI__builtin_ia32_palignr512_mask: { 7673 unsigned ShiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue(); 7674 7675 unsigned NumElts = Ops[0]->getType()->getVectorNumElements(); 7676 assert(NumElts % 16 == 0); 7677 7678 // If palignr is shifting the pair of vectors more than the size of two 7679 // lanes, emit zero. 7680 if (ShiftVal >= 32) 7681 return llvm::Constant::getNullValue(ConvertType(E->getType())); 7682 7683 // If palignr is shifting the pair of input vectors more than one lane, 7684 // but less than two lanes, convert to shifting in zeroes. 7685 if (ShiftVal > 16) { 7686 ShiftVal -= 16; 7687 Ops[1] = Ops[0]; 7688 Ops[0] = llvm::Constant::getNullValue(Ops[0]->getType()); 7689 } 7690 7691 uint32_t Indices[64]; 7692 // 256-bit palignr operates on 128-bit lanes so we need to handle that 7693 for (unsigned l = 0; l != NumElts; l += 16) { 7694 for (unsigned i = 0; i != 16; ++i) { 7695 unsigned Idx = ShiftVal + i; 7696 if (Idx >= 16) 7697 Idx += NumElts - 16; // End of lane, switch operand. 7698 Indices[l + i] = Idx + l; 7699 } 7700 } 7701 7702 Value *Align = Builder.CreateShuffleVector(Ops[1], Ops[0], 7703 makeArrayRef(Indices, NumElts), 7704 "palignr"); 7705 7706 // If this isn't a masked builtin, just return the align operation. 7707 if (Ops.size() == 3) 7708 return Align; 7709 7710 return EmitX86Select(*this, Ops[4], Align, Ops[3]); 7711 } 7712 7713 case X86::BI__builtin_ia32_movnti: 7714 case X86::BI__builtin_ia32_movnti64: 7715 case X86::BI__builtin_ia32_movntsd: 7716 case X86::BI__builtin_ia32_movntss: { 7717 llvm::MDNode *Node = llvm::MDNode::get( 7718 getLLVMContext(), llvm::ConstantAsMetadata::get(Builder.getInt32(1))); 7719 7720 Value *Ptr = Ops[0]; 7721 Value *Src = Ops[1]; 7722 7723 // Extract the 0'th element of the source vector. 7724 if (BuiltinID == X86::BI__builtin_ia32_movntsd || 7725 BuiltinID == X86::BI__builtin_ia32_movntss) 7726 Src = Builder.CreateExtractElement(Src, (uint64_t)0, "extract"); 7727 7728 // Convert the type of the pointer to a pointer to the stored type. 7729 Value *BC = Builder.CreateBitCast( 7730 Ptr, llvm::PointerType::getUnqual(Src->getType()), "cast"); 7731 7732 // Unaligned nontemporal store of the scalar value. 7733 StoreInst *SI = Builder.CreateDefaultAlignedStore(Src, BC); 7734 SI->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node); 7735 SI->setAlignment(1); 7736 return SI; 7737 } 7738 7739 case X86::BI__builtin_ia32_selectb_128: 7740 case X86::BI__builtin_ia32_selectb_256: 7741 case X86::BI__builtin_ia32_selectb_512: 7742 case X86::BI__builtin_ia32_selectw_128: 7743 case X86::BI__builtin_ia32_selectw_256: 7744 case X86::BI__builtin_ia32_selectw_512: 7745 case X86::BI__builtin_ia32_selectd_128: 7746 case X86::BI__builtin_ia32_selectd_256: 7747 case X86::BI__builtin_ia32_selectd_512: 7748 case X86::BI__builtin_ia32_selectq_128: 7749 case X86::BI__builtin_ia32_selectq_256: 7750 case X86::BI__builtin_ia32_selectq_512: 7751 case X86::BI__builtin_ia32_selectps_128: 7752 case X86::BI__builtin_ia32_selectps_256: 7753 case X86::BI__builtin_ia32_selectps_512: 7754 case X86::BI__builtin_ia32_selectpd_128: 7755 case X86::BI__builtin_ia32_selectpd_256: 7756 case X86::BI__builtin_ia32_selectpd_512: 7757 return EmitX86Select(*this, Ops[0], Ops[1], Ops[2]); 7758 case X86::BI__builtin_ia32_pcmpeqb128_mask: 7759 case X86::BI__builtin_ia32_pcmpeqb256_mask: 7760 case X86::BI__builtin_ia32_pcmpeqb512_mask: 7761 case X86::BI__builtin_ia32_pcmpeqw128_mask: 7762 case X86::BI__builtin_ia32_pcmpeqw256_mask: 7763 case X86::BI__builtin_ia32_pcmpeqw512_mask: 7764 case X86::BI__builtin_ia32_pcmpeqd128_mask: 7765 case X86::BI__builtin_ia32_pcmpeqd256_mask: 7766 case X86::BI__builtin_ia32_pcmpeqd512_mask: 7767 case X86::BI__builtin_ia32_pcmpeqq128_mask: 7768 case X86::BI__builtin_ia32_pcmpeqq256_mask: 7769 case X86::BI__builtin_ia32_pcmpeqq512_mask: 7770 return EmitX86MaskedCompare(*this, 0, false, Ops); 7771 case X86::BI__builtin_ia32_pcmpgtb128_mask: 7772 case X86::BI__builtin_ia32_pcmpgtb256_mask: 7773 case X86::BI__builtin_ia32_pcmpgtb512_mask: 7774 case X86::BI__builtin_ia32_pcmpgtw128_mask: 7775 case X86::BI__builtin_ia32_pcmpgtw256_mask: 7776 case X86::BI__builtin_ia32_pcmpgtw512_mask: 7777 case X86::BI__builtin_ia32_pcmpgtd128_mask: 7778 case X86::BI__builtin_ia32_pcmpgtd256_mask: 7779 case X86::BI__builtin_ia32_pcmpgtd512_mask: 7780 case X86::BI__builtin_ia32_pcmpgtq128_mask: 7781 case X86::BI__builtin_ia32_pcmpgtq256_mask: 7782 case X86::BI__builtin_ia32_pcmpgtq512_mask: 7783 return EmitX86MaskedCompare(*this, 6, true, Ops); 7784 case X86::BI__builtin_ia32_cmpb128_mask: 7785 case X86::BI__builtin_ia32_cmpb256_mask: 7786 case X86::BI__builtin_ia32_cmpb512_mask: 7787 case X86::BI__builtin_ia32_cmpw128_mask: 7788 case X86::BI__builtin_ia32_cmpw256_mask: 7789 case X86::BI__builtin_ia32_cmpw512_mask: 7790 case X86::BI__builtin_ia32_cmpd128_mask: 7791 case X86::BI__builtin_ia32_cmpd256_mask: 7792 case X86::BI__builtin_ia32_cmpd512_mask: 7793 case X86::BI__builtin_ia32_cmpq128_mask: 7794 case X86::BI__builtin_ia32_cmpq256_mask: 7795 case X86::BI__builtin_ia32_cmpq512_mask: { 7796 unsigned CC = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0x7; 7797 return EmitX86MaskedCompare(*this, CC, true, Ops); 7798 } 7799 case X86::BI__builtin_ia32_ucmpb128_mask: 7800 case X86::BI__builtin_ia32_ucmpb256_mask: 7801 case X86::BI__builtin_ia32_ucmpb512_mask: 7802 case X86::BI__builtin_ia32_ucmpw128_mask: 7803 case X86::BI__builtin_ia32_ucmpw256_mask: 7804 case X86::BI__builtin_ia32_ucmpw512_mask: 7805 case X86::BI__builtin_ia32_ucmpd128_mask: 7806 case X86::BI__builtin_ia32_ucmpd256_mask: 7807 case X86::BI__builtin_ia32_ucmpd512_mask: 7808 case X86::BI__builtin_ia32_ucmpq128_mask: 7809 case X86::BI__builtin_ia32_ucmpq256_mask: 7810 case X86::BI__builtin_ia32_ucmpq512_mask: { 7811 unsigned CC = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0x7; 7812 return EmitX86MaskedCompare(*this, CC, false, Ops); 7813 } 7814 7815 case X86::BI__builtin_ia32_vplzcntd_128_mask: 7816 case X86::BI__builtin_ia32_vplzcntd_256_mask: 7817 case X86::BI__builtin_ia32_vplzcntd_512_mask: 7818 case X86::BI__builtin_ia32_vplzcntq_128_mask: 7819 case X86::BI__builtin_ia32_vplzcntq_256_mask: 7820 case X86::BI__builtin_ia32_vplzcntq_512_mask: { 7821 Function *F = CGM.getIntrinsic(Intrinsic::ctlz, Ops[0]->getType()); 7822 return EmitX86Select(*this, Ops[2], 7823 Builder.CreateCall(F, {Ops[0],Builder.getInt1(false)}), 7824 Ops[1]); 7825 } 7826 7827 case X86::BI__builtin_ia32_pmaxsb128: 7828 case X86::BI__builtin_ia32_pmaxsw128: 7829 case X86::BI__builtin_ia32_pmaxsd128: 7830 case X86::BI__builtin_ia32_pmaxsq128_mask: 7831 case X86::BI__builtin_ia32_pmaxsb256: 7832 case X86::BI__builtin_ia32_pmaxsw256: 7833 case X86::BI__builtin_ia32_pmaxsd256: 7834 case X86::BI__builtin_ia32_pmaxsq256_mask: 7835 case X86::BI__builtin_ia32_pmaxsb512_mask: 7836 case X86::BI__builtin_ia32_pmaxsw512_mask: 7837 case X86::BI__builtin_ia32_pmaxsd512_mask: 7838 case X86::BI__builtin_ia32_pmaxsq512_mask: 7839 return EmitX86MinMax(*this, ICmpInst::ICMP_SGT, Ops); 7840 case X86::BI__builtin_ia32_pmaxub128: 7841 case X86::BI__builtin_ia32_pmaxuw128: 7842 case X86::BI__builtin_ia32_pmaxud128: 7843 case X86::BI__builtin_ia32_pmaxuq128_mask: 7844 case X86::BI__builtin_ia32_pmaxub256: 7845 case X86::BI__builtin_ia32_pmaxuw256: 7846 case X86::BI__builtin_ia32_pmaxud256: 7847 case X86::BI__builtin_ia32_pmaxuq256_mask: 7848 case X86::BI__builtin_ia32_pmaxub512_mask: 7849 case X86::BI__builtin_ia32_pmaxuw512_mask: 7850 case X86::BI__builtin_ia32_pmaxud512_mask: 7851 case X86::BI__builtin_ia32_pmaxuq512_mask: 7852 return EmitX86MinMax(*this, ICmpInst::ICMP_UGT, Ops); 7853 case X86::BI__builtin_ia32_pminsb128: 7854 case X86::BI__builtin_ia32_pminsw128: 7855 case X86::BI__builtin_ia32_pminsd128: 7856 case X86::BI__builtin_ia32_pminsq128_mask: 7857 case X86::BI__builtin_ia32_pminsb256: 7858 case X86::BI__builtin_ia32_pminsw256: 7859 case X86::BI__builtin_ia32_pminsd256: 7860 case X86::BI__builtin_ia32_pminsq256_mask: 7861 case X86::BI__builtin_ia32_pminsb512_mask: 7862 case X86::BI__builtin_ia32_pminsw512_mask: 7863 case X86::BI__builtin_ia32_pminsd512_mask: 7864 case X86::BI__builtin_ia32_pminsq512_mask: 7865 return EmitX86MinMax(*this, ICmpInst::ICMP_SLT, Ops); 7866 case X86::BI__builtin_ia32_pminub128: 7867 case X86::BI__builtin_ia32_pminuw128: 7868 case X86::BI__builtin_ia32_pminud128: 7869 case X86::BI__builtin_ia32_pminuq128_mask: 7870 case X86::BI__builtin_ia32_pminub256: 7871 case X86::BI__builtin_ia32_pminuw256: 7872 case X86::BI__builtin_ia32_pminud256: 7873 case X86::BI__builtin_ia32_pminuq256_mask: 7874 case X86::BI__builtin_ia32_pminub512_mask: 7875 case X86::BI__builtin_ia32_pminuw512_mask: 7876 case X86::BI__builtin_ia32_pminud512_mask: 7877 case X86::BI__builtin_ia32_pminuq512_mask: 7878 return EmitX86MinMax(*this, ICmpInst::ICMP_ULT, Ops); 7879 7880 // 3DNow! 7881 case X86::BI__builtin_ia32_pswapdsf: 7882 case X86::BI__builtin_ia32_pswapdsi: { 7883 llvm::Type *MMXTy = llvm::Type::getX86_MMXTy(getLLVMContext()); 7884 Ops[0] = Builder.CreateBitCast(Ops[0], MMXTy, "cast"); 7885 llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_3dnowa_pswapd); 7886 return Builder.CreateCall(F, Ops, "pswapd"); 7887 } 7888 case X86::BI__builtin_ia32_rdrand16_step: 7889 case X86::BI__builtin_ia32_rdrand32_step: 7890 case X86::BI__builtin_ia32_rdrand64_step: 7891 case X86::BI__builtin_ia32_rdseed16_step: 7892 case X86::BI__builtin_ia32_rdseed32_step: 7893 case X86::BI__builtin_ia32_rdseed64_step: { 7894 Intrinsic::ID ID; 7895 switch (BuiltinID) { 7896 default: llvm_unreachable("Unsupported intrinsic!"); 7897 case X86::BI__builtin_ia32_rdrand16_step: 7898 ID = Intrinsic::x86_rdrand_16; 7899 break; 7900 case X86::BI__builtin_ia32_rdrand32_step: 7901 ID = Intrinsic::x86_rdrand_32; 7902 break; 7903 case X86::BI__builtin_ia32_rdrand64_step: 7904 ID = Intrinsic::x86_rdrand_64; 7905 break; 7906 case X86::BI__builtin_ia32_rdseed16_step: 7907 ID = Intrinsic::x86_rdseed_16; 7908 break; 7909 case X86::BI__builtin_ia32_rdseed32_step: 7910 ID = Intrinsic::x86_rdseed_32; 7911 break; 7912 case X86::BI__builtin_ia32_rdseed64_step: 7913 ID = Intrinsic::x86_rdseed_64; 7914 break; 7915 } 7916 7917 Value *Call = Builder.CreateCall(CGM.getIntrinsic(ID)); 7918 Builder.CreateDefaultAlignedStore(Builder.CreateExtractValue(Call, 0), 7919 Ops[0]); 7920 return Builder.CreateExtractValue(Call, 1); 7921 } 7922 7923 // SSE packed comparison intrinsics 7924 case X86::BI__builtin_ia32_cmpeqps: 7925 case X86::BI__builtin_ia32_cmpeqpd: 7926 return getVectorFCmpIR(CmpInst::FCMP_OEQ); 7927 case X86::BI__builtin_ia32_cmpltps: 7928 case X86::BI__builtin_ia32_cmpltpd: 7929 return getVectorFCmpIR(CmpInst::FCMP_OLT); 7930 case X86::BI__builtin_ia32_cmpleps: 7931 case X86::BI__builtin_ia32_cmplepd: 7932 return getVectorFCmpIR(CmpInst::FCMP_OLE); 7933 case X86::BI__builtin_ia32_cmpunordps: 7934 case X86::BI__builtin_ia32_cmpunordpd: 7935 return getVectorFCmpIR(CmpInst::FCMP_UNO); 7936 case X86::BI__builtin_ia32_cmpneqps: 7937 case X86::BI__builtin_ia32_cmpneqpd: 7938 return getVectorFCmpIR(CmpInst::FCMP_UNE); 7939 case X86::BI__builtin_ia32_cmpnltps: 7940 case X86::BI__builtin_ia32_cmpnltpd: 7941 return getVectorFCmpIR(CmpInst::FCMP_UGE); 7942 case X86::BI__builtin_ia32_cmpnleps: 7943 case X86::BI__builtin_ia32_cmpnlepd: 7944 return getVectorFCmpIR(CmpInst::FCMP_UGT); 7945 case X86::BI__builtin_ia32_cmpordps: 7946 case X86::BI__builtin_ia32_cmpordpd: 7947 return getVectorFCmpIR(CmpInst::FCMP_ORD); 7948 case X86::BI__builtin_ia32_cmpps: 7949 case X86::BI__builtin_ia32_cmpps256: 7950 case X86::BI__builtin_ia32_cmppd: 7951 case X86::BI__builtin_ia32_cmppd256: { 7952 unsigned CC = cast<llvm::ConstantInt>(Ops[2])->getZExtValue(); 7953 // If this one of the SSE immediates, we can use native IR. 7954 if (CC < 8) { 7955 FCmpInst::Predicate Pred; 7956 switch (CC) { 7957 case 0: Pred = FCmpInst::FCMP_OEQ; break; 7958 case 1: Pred = FCmpInst::FCMP_OLT; break; 7959 case 2: Pred = FCmpInst::FCMP_OLE; break; 7960 case 3: Pred = FCmpInst::FCMP_UNO; break; 7961 case 4: Pred = FCmpInst::FCMP_UNE; break; 7962 case 5: Pred = FCmpInst::FCMP_UGE; break; 7963 case 6: Pred = FCmpInst::FCMP_UGT; break; 7964 case 7: Pred = FCmpInst::FCMP_ORD; break; 7965 } 7966 return getVectorFCmpIR(Pred); 7967 } 7968 7969 // We can't handle 8-31 immediates with native IR, use the intrinsic. 7970 // Except for predicates that create constants. 7971 Intrinsic::ID ID; 7972 switch (BuiltinID) { 7973 default: llvm_unreachable("Unsupported intrinsic!"); 7974 case X86::BI__builtin_ia32_cmpps: 7975 ID = Intrinsic::x86_sse_cmp_ps; 7976 break; 7977 case X86::BI__builtin_ia32_cmpps256: 7978 // _CMP_TRUE_UQ, _CMP_TRUE_US produce -1,-1... vector 7979 // on any input and _CMP_FALSE_OQ, _CMP_FALSE_OS produce 0, 0... 7980 if (CC == 0xf || CC == 0xb || CC == 0x1b || CC == 0x1f) { 7981 Value *Constant = (CC == 0xf || CC == 0x1f) ? 7982 llvm::Constant::getAllOnesValue(Builder.getInt32Ty()) : 7983 llvm::Constant::getNullValue(Builder.getInt32Ty()); 7984 Value *Vec = Builder.CreateVectorSplat( 7985 Ops[0]->getType()->getVectorNumElements(), Constant); 7986 return Builder.CreateBitCast(Vec, Ops[0]->getType()); 7987 } 7988 ID = Intrinsic::x86_avx_cmp_ps_256; 7989 break; 7990 case X86::BI__builtin_ia32_cmppd: 7991 ID = Intrinsic::x86_sse2_cmp_pd; 7992 break; 7993 case X86::BI__builtin_ia32_cmppd256: 7994 // _CMP_TRUE_UQ, _CMP_TRUE_US produce -1,-1... vector 7995 // on any input and _CMP_FALSE_OQ, _CMP_FALSE_OS produce 0, 0... 7996 if (CC == 0xf || CC == 0xb || CC == 0x1b || CC == 0x1f) { 7997 Value *Constant = (CC == 0xf || CC == 0x1f) ? 7998 llvm::Constant::getAllOnesValue(Builder.getInt64Ty()) : 7999 llvm::Constant::getNullValue(Builder.getInt64Ty()); 8000 Value *Vec = Builder.CreateVectorSplat( 8001 Ops[0]->getType()->getVectorNumElements(), Constant); 8002 return Builder.CreateBitCast(Vec, Ops[0]->getType()); 8003 } 8004 ID = Intrinsic::x86_avx_cmp_pd_256; 8005 break; 8006 } 8007 8008 return Builder.CreateCall(CGM.getIntrinsic(ID), Ops); 8009 } 8010 8011 // SSE scalar comparison intrinsics 8012 case X86::BI__builtin_ia32_cmpeqss: 8013 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 0); 8014 case X86::BI__builtin_ia32_cmpltss: 8015 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 1); 8016 case X86::BI__builtin_ia32_cmpless: 8017 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 2); 8018 case X86::BI__builtin_ia32_cmpunordss: 8019 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 3); 8020 case X86::BI__builtin_ia32_cmpneqss: 8021 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 4); 8022 case X86::BI__builtin_ia32_cmpnltss: 8023 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 5); 8024 case X86::BI__builtin_ia32_cmpnless: 8025 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 6); 8026 case X86::BI__builtin_ia32_cmpordss: 8027 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 7); 8028 case X86::BI__builtin_ia32_cmpeqsd: 8029 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 0); 8030 case X86::BI__builtin_ia32_cmpltsd: 8031 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 1); 8032 case X86::BI__builtin_ia32_cmplesd: 8033 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 2); 8034 case X86::BI__builtin_ia32_cmpunordsd: 8035 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 3); 8036 case X86::BI__builtin_ia32_cmpneqsd: 8037 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 4); 8038 case X86::BI__builtin_ia32_cmpnltsd: 8039 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 5); 8040 case X86::BI__builtin_ia32_cmpnlesd: 8041 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 6); 8042 case X86::BI__builtin_ia32_cmpordsd: 8043 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 7); 8044 8045 case X86::BI__emul: 8046 case X86::BI__emulu: { 8047 llvm::Type *Int64Ty = llvm::IntegerType::get(getLLVMContext(), 64); 8048 bool isSigned = (BuiltinID == X86::BI__emul); 8049 Value *LHS = Builder.CreateIntCast(Ops[0], Int64Ty, isSigned); 8050 Value *RHS = Builder.CreateIntCast(Ops[1], Int64Ty, isSigned); 8051 return Builder.CreateMul(LHS, RHS, "", !isSigned, isSigned); 8052 } 8053 case X86::BI__mulh: 8054 case X86::BI__umulh: 8055 case X86::BI_mul128: 8056 case X86::BI_umul128: { 8057 llvm::Type *ResType = ConvertType(E->getType()); 8058 llvm::Type *Int128Ty = llvm::IntegerType::get(getLLVMContext(), 128); 8059 8060 bool IsSigned = (BuiltinID == X86::BI__mulh || BuiltinID == X86::BI_mul128); 8061 Value *LHS = Builder.CreateIntCast(Ops[0], Int128Ty, IsSigned); 8062 Value *RHS = Builder.CreateIntCast(Ops[1], Int128Ty, IsSigned); 8063 8064 Value *MulResult, *HigherBits; 8065 if (IsSigned) { 8066 MulResult = Builder.CreateNSWMul(LHS, RHS); 8067 HigherBits = Builder.CreateAShr(MulResult, 64); 8068 } else { 8069 MulResult = Builder.CreateNUWMul(LHS, RHS); 8070 HigherBits = Builder.CreateLShr(MulResult, 64); 8071 } 8072 HigherBits = Builder.CreateIntCast(HigherBits, ResType, IsSigned); 8073 8074 if (BuiltinID == X86::BI__mulh || BuiltinID == X86::BI__umulh) 8075 return HigherBits; 8076 8077 Address HighBitsAddress = EmitPointerWithAlignment(E->getArg(2)); 8078 Builder.CreateStore(HigherBits, HighBitsAddress); 8079 return Builder.CreateIntCast(MulResult, ResType, IsSigned); 8080 } 8081 8082 case X86::BI__faststorefence: { 8083 return Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent, 8084 llvm::SyncScope::System); 8085 } 8086 case X86::BI_ReadWriteBarrier: 8087 case X86::BI_ReadBarrier: 8088 case X86::BI_WriteBarrier: { 8089 return Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent, 8090 llvm::SyncScope::SingleThread); 8091 } 8092 case X86::BI_BitScanForward: 8093 case X86::BI_BitScanForward64: 8094 return EmitMSVCBuiltinExpr(MSVCIntrin::_BitScanForward, E); 8095 case X86::BI_BitScanReverse: 8096 case X86::BI_BitScanReverse64: 8097 return EmitMSVCBuiltinExpr(MSVCIntrin::_BitScanReverse, E); 8098 8099 case X86::BI_InterlockedAnd64: 8100 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedAnd, E); 8101 case X86::BI_InterlockedExchange64: 8102 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchange, E); 8103 case X86::BI_InterlockedExchangeAdd64: 8104 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeAdd, E); 8105 case X86::BI_InterlockedExchangeSub64: 8106 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeSub, E); 8107 case X86::BI_InterlockedOr64: 8108 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedOr, E); 8109 case X86::BI_InterlockedXor64: 8110 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedXor, E); 8111 case X86::BI_InterlockedDecrement64: 8112 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedDecrement, E); 8113 case X86::BI_InterlockedIncrement64: 8114 return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedIncrement, E); 8115 8116 case X86::BI_AddressOfReturnAddress: { 8117 Value *F = CGM.getIntrinsic(Intrinsic::addressofreturnaddress); 8118 return Builder.CreateCall(F); 8119 } 8120 case X86::BI__stosb: { 8121 // We treat __stosb as a volatile memset - it may not generate "rep stosb" 8122 // instruction, but it will create a memset that won't be optimized away. 8123 return Builder.CreateMemSet(Ops[0], Ops[1], Ops[2], 1, true); 8124 } 8125 case X86::BI__ud2: 8126 // llvm.trap makes a ud2a instruction on x86. 8127 return EmitTrapCall(Intrinsic::trap); 8128 case X86::BI__int2c: { 8129 // This syscall signals a driver assertion failure in x86 NT kernels. 8130 llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false); 8131 llvm::InlineAsm *IA = 8132 llvm::InlineAsm::get(FTy, "int $$0x2c", "", /*SideEffects=*/true); 8133 llvm::AttributeList NoReturnAttr = llvm::AttributeList::get( 8134 getLLVMContext(), llvm::AttributeList::FunctionIndex, 8135 llvm::Attribute::NoReturn); 8136 CallSite CS = Builder.CreateCall(IA); 8137 CS.setAttributes(NoReturnAttr); 8138 return CS.getInstruction(); 8139 } 8140 case X86::BI__readfsbyte: 8141 case X86::BI__readfsword: 8142 case X86::BI__readfsdword: 8143 case X86::BI__readfsqword: { 8144 llvm::Type *IntTy = ConvertType(E->getType()); 8145 Value *Ptr = Builder.CreateIntToPtr(EmitScalarExpr(E->getArg(0)), 8146 llvm::PointerType::get(IntTy, 257)); 8147 LoadInst *Load = Builder.CreateAlignedLoad( 8148 IntTy, Ptr, getContext().getTypeAlignInChars(E->getType())); 8149 Load->setVolatile(true); 8150 return Load; 8151 } 8152 case X86::BI__readgsbyte: 8153 case X86::BI__readgsword: 8154 case X86::BI__readgsdword: 8155 case X86::BI__readgsqword: { 8156 llvm::Type *IntTy = ConvertType(E->getType()); 8157 Value *Ptr = Builder.CreateIntToPtr(EmitScalarExpr(E->getArg(0)), 8158 llvm::PointerType::get(IntTy, 256)); 8159 LoadInst *Load = Builder.CreateAlignedLoad( 8160 IntTy, Ptr, getContext().getTypeAlignInChars(E->getType())); 8161 Load->setVolatile(true); 8162 return Load; 8163 } 8164 } 8165 } 8166 8167 8168 Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID, 8169 const CallExpr *E) { 8170 SmallVector<Value*, 4> Ops; 8171 8172 for (unsigned i = 0, e = E->getNumArgs(); i != e; i++) 8173 Ops.push_back(EmitScalarExpr(E->getArg(i))); 8174 8175 Intrinsic::ID ID = Intrinsic::not_intrinsic; 8176 8177 switch (BuiltinID) { 8178 default: return nullptr; 8179 8180 // __builtin_ppc_get_timebase is GCC 4.8+'s PowerPC-specific name for what we 8181 // call __builtin_readcyclecounter. 8182 case PPC::BI__builtin_ppc_get_timebase: 8183 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::readcyclecounter)); 8184 8185 // vec_ld, vec_xl_be, vec_lvsl, vec_lvsr 8186 case PPC::BI__builtin_altivec_lvx: 8187 case PPC::BI__builtin_altivec_lvxl: 8188 case PPC::BI__builtin_altivec_lvebx: 8189 case PPC::BI__builtin_altivec_lvehx: 8190 case PPC::BI__builtin_altivec_lvewx: 8191 case PPC::BI__builtin_altivec_lvsl: 8192 case PPC::BI__builtin_altivec_lvsr: 8193 case PPC::BI__builtin_vsx_lxvd2x: 8194 case PPC::BI__builtin_vsx_lxvw4x: 8195 case PPC::BI__builtin_vsx_lxvd2x_be: 8196 case PPC::BI__builtin_vsx_lxvw4x_be: 8197 case PPC::BI__builtin_vsx_lxvl: 8198 case PPC::BI__builtin_vsx_lxvll: 8199 { 8200 if(BuiltinID == PPC::BI__builtin_vsx_lxvl || 8201 BuiltinID == PPC::BI__builtin_vsx_lxvll){ 8202 Ops[0] = Builder.CreateBitCast(Ops[0], Int8PtrTy); 8203 }else { 8204 Ops[1] = Builder.CreateBitCast(Ops[1], Int8PtrTy); 8205 Ops[0] = Builder.CreateGEP(Ops[1], Ops[0]); 8206 Ops.pop_back(); 8207 } 8208 8209 switch (BuiltinID) { 8210 default: llvm_unreachable("Unsupported ld/lvsl/lvsr intrinsic!"); 8211 case PPC::BI__builtin_altivec_lvx: 8212 ID = Intrinsic::ppc_altivec_lvx; 8213 break; 8214 case PPC::BI__builtin_altivec_lvxl: 8215 ID = Intrinsic::ppc_altivec_lvxl; 8216 break; 8217 case PPC::BI__builtin_altivec_lvebx: 8218 ID = Intrinsic::ppc_altivec_lvebx; 8219 break; 8220 case PPC::BI__builtin_altivec_lvehx: 8221 ID = Intrinsic::ppc_altivec_lvehx; 8222 break; 8223 case PPC::BI__builtin_altivec_lvewx: 8224 ID = Intrinsic::ppc_altivec_lvewx; 8225 break; 8226 case PPC::BI__builtin_altivec_lvsl: 8227 ID = Intrinsic::ppc_altivec_lvsl; 8228 break; 8229 case PPC::BI__builtin_altivec_lvsr: 8230 ID = Intrinsic::ppc_altivec_lvsr; 8231 break; 8232 case PPC::BI__builtin_vsx_lxvd2x: 8233 ID = Intrinsic::ppc_vsx_lxvd2x; 8234 break; 8235 case PPC::BI__builtin_vsx_lxvw4x: 8236 ID = Intrinsic::ppc_vsx_lxvw4x; 8237 break; 8238 case PPC::BI__builtin_vsx_lxvd2x_be: 8239 ID = Intrinsic::ppc_vsx_lxvd2x_be; 8240 break; 8241 case PPC::BI__builtin_vsx_lxvw4x_be: 8242 ID = Intrinsic::ppc_vsx_lxvw4x_be; 8243 break; 8244 case PPC::BI__builtin_vsx_lxvl: 8245 ID = Intrinsic::ppc_vsx_lxvl; 8246 break; 8247 case PPC::BI__builtin_vsx_lxvll: 8248 ID = Intrinsic::ppc_vsx_lxvll; 8249 break; 8250 } 8251 llvm::Function *F = CGM.getIntrinsic(ID); 8252 return Builder.CreateCall(F, Ops, ""); 8253 } 8254 8255 // vec_st, vec_xst_be 8256 case PPC::BI__builtin_altivec_stvx: 8257 case PPC::BI__builtin_altivec_stvxl: 8258 case PPC::BI__builtin_altivec_stvebx: 8259 case PPC::BI__builtin_altivec_stvehx: 8260 case PPC::BI__builtin_altivec_stvewx: 8261 case PPC::BI__builtin_vsx_stxvd2x: 8262 case PPC::BI__builtin_vsx_stxvw4x: 8263 case PPC::BI__builtin_vsx_stxvd2x_be: 8264 case PPC::BI__builtin_vsx_stxvw4x_be: 8265 case PPC::BI__builtin_vsx_stxvl: 8266 case PPC::BI__builtin_vsx_stxvll: 8267 { 8268 if(BuiltinID == PPC::BI__builtin_vsx_stxvl || 8269 BuiltinID == PPC::BI__builtin_vsx_stxvll ){ 8270 Ops[1] = Builder.CreateBitCast(Ops[1], Int8PtrTy); 8271 }else { 8272 Ops[2] = Builder.CreateBitCast(Ops[2], Int8PtrTy); 8273 Ops[1] = Builder.CreateGEP(Ops[2], Ops[1]); 8274 Ops.pop_back(); 8275 } 8276 8277 switch (BuiltinID) { 8278 default: llvm_unreachable("Unsupported st intrinsic!"); 8279 case PPC::BI__builtin_altivec_stvx: 8280 ID = Intrinsic::ppc_altivec_stvx; 8281 break; 8282 case PPC::BI__builtin_altivec_stvxl: 8283 ID = Intrinsic::ppc_altivec_stvxl; 8284 break; 8285 case PPC::BI__builtin_altivec_stvebx: 8286 ID = Intrinsic::ppc_altivec_stvebx; 8287 break; 8288 case PPC::BI__builtin_altivec_stvehx: 8289 ID = Intrinsic::ppc_altivec_stvehx; 8290 break; 8291 case PPC::BI__builtin_altivec_stvewx: 8292 ID = Intrinsic::ppc_altivec_stvewx; 8293 break; 8294 case PPC::BI__builtin_vsx_stxvd2x: 8295 ID = Intrinsic::ppc_vsx_stxvd2x; 8296 break; 8297 case PPC::BI__builtin_vsx_stxvw4x: 8298 ID = Intrinsic::ppc_vsx_stxvw4x; 8299 break; 8300 case PPC::BI__builtin_vsx_stxvd2x_be: 8301 ID = Intrinsic::ppc_vsx_stxvd2x_be; 8302 break; 8303 case PPC::BI__builtin_vsx_stxvw4x_be: 8304 ID = Intrinsic::ppc_vsx_stxvw4x_be; 8305 break; 8306 case PPC::BI__builtin_vsx_stxvl: 8307 ID = Intrinsic::ppc_vsx_stxvl; 8308 break; 8309 case PPC::BI__builtin_vsx_stxvll: 8310 ID = Intrinsic::ppc_vsx_stxvll; 8311 break; 8312 } 8313 llvm::Function *F = CGM.getIntrinsic(ID); 8314 return Builder.CreateCall(F, Ops, ""); 8315 } 8316 // Square root 8317 case PPC::BI__builtin_vsx_xvsqrtsp: 8318 case PPC::BI__builtin_vsx_xvsqrtdp: { 8319 llvm::Type *ResultType = ConvertType(E->getType()); 8320 Value *X = EmitScalarExpr(E->getArg(0)); 8321 ID = Intrinsic::sqrt; 8322 llvm::Function *F = CGM.getIntrinsic(ID, ResultType); 8323 return Builder.CreateCall(F, X); 8324 } 8325 // Count leading zeros 8326 case PPC::BI__builtin_altivec_vclzb: 8327 case PPC::BI__builtin_altivec_vclzh: 8328 case PPC::BI__builtin_altivec_vclzw: 8329 case PPC::BI__builtin_altivec_vclzd: { 8330 llvm::Type *ResultType = ConvertType(E->getType()); 8331 Value *X = EmitScalarExpr(E->getArg(0)); 8332 Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false); 8333 Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ResultType); 8334 return Builder.CreateCall(F, {X, Undef}); 8335 } 8336 case PPC::BI__builtin_altivec_vctzb: 8337 case PPC::BI__builtin_altivec_vctzh: 8338 case PPC::BI__builtin_altivec_vctzw: 8339 case PPC::BI__builtin_altivec_vctzd: { 8340 llvm::Type *ResultType = ConvertType(E->getType()); 8341 Value *X = EmitScalarExpr(E->getArg(0)); 8342 Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false); 8343 Function *F = CGM.getIntrinsic(Intrinsic::cttz, ResultType); 8344 return Builder.CreateCall(F, {X, Undef}); 8345 } 8346 case PPC::BI__builtin_altivec_vpopcntb: 8347 case PPC::BI__builtin_altivec_vpopcnth: 8348 case PPC::BI__builtin_altivec_vpopcntw: 8349 case PPC::BI__builtin_altivec_vpopcntd: { 8350 llvm::Type *ResultType = ConvertType(E->getType()); 8351 Value *X = EmitScalarExpr(E->getArg(0)); 8352 llvm::Function *F = CGM.getIntrinsic(Intrinsic::ctpop, ResultType); 8353 return Builder.CreateCall(F, X); 8354 } 8355 // Copy sign 8356 case PPC::BI__builtin_vsx_xvcpsgnsp: 8357 case PPC::BI__builtin_vsx_xvcpsgndp: { 8358 llvm::Type *ResultType = ConvertType(E->getType()); 8359 Value *X = EmitScalarExpr(E->getArg(0)); 8360 Value *Y = EmitScalarExpr(E->getArg(1)); 8361 ID = Intrinsic::copysign; 8362 llvm::Function *F = CGM.getIntrinsic(ID, ResultType); 8363 return Builder.CreateCall(F, {X, Y}); 8364 } 8365 // Rounding/truncation 8366 case PPC::BI__builtin_vsx_xvrspip: 8367 case PPC::BI__builtin_vsx_xvrdpip: 8368 case PPC::BI__builtin_vsx_xvrdpim: 8369 case PPC::BI__builtin_vsx_xvrspim: 8370 case PPC::BI__builtin_vsx_xvrdpi: 8371 case PPC::BI__builtin_vsx_xvrspi: 8372 case PPC::BI__builtin_vsx_xvrdpic: 8373 case PPC::BI__builtin_vsx_xvrspic: 8374 case PPC::BI__builtin_vsx_xvrdpiz: 8375 case PPC::BI__builtin_vsx_xvrspiz: { 8376 llvm::Type *ResultType = ConvertType(E->getType()); 8377 Value *X = EmitScalarExpr(E->getArg(0)); 8378 if (BuiltinID == PPC::BI__builtin_vsx_xvrdpim || 8379 BuiltinID == PPC::BI__builtin_vsx_xvrspim) 8380 ID = Intrinsic::floor; 8381 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpi || 8382 BuiltinID == PPC::BI__builtin_vsx_xvrspi) 8383 ID = Intrinsic::round; 8384 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpic || 8385 BuiltinID == PPC::BI__builtin_vsx_xvrspic) 8386 ID = Intrinsic::nearbyint; 8387 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpip || 8388 BuiltinID == PPC::BI__builtin_vsx_xvrspip) 8389 ID = Intrinsic::ceil; 8390 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpiz || 8391 BuiltinID == PPC::BI__builtin_vsx_xvrspiz) 8392 ID = Intrinsic::trunc; 8393 llvm::Function *F = CGM.getIntrinsic(ID, ResultType); 8394 return Builder.CreateCall(F, X); 8395 } 8396 8397 // Absolute value 8398 case PPC::BI__builtin_vsx_xvabsdp: 8399 case PPC::BI__builtin_vsx_xvabssp: { 8400 llvm::Type *ResultType = ConvertType(E->getType()); 8401 Value *X = EmitScalarExpr(E->getArg(0)); 8402 llvm::Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType); 8403 return Builder.CreateCall(F, X); 8404 } 8405 8406 // FMA variations 8407 case PPC::BI__builtin_vsx_xvmaddadp: 8408 case PPC::BI__builtin_vsx_xvmaddasp: 8409 case PPC::BI__builtin_vsx_xvnmaddadp: 8410 case PPC::BI__builtin_vsx_xvnmaddasp: 8411 case PPC::BI__builtin_vsx_xvmsubadp: 8412 case PPC::BI__builtin_vsx_xvmsubasp: 8413 case PPC::BI__builtin_vsx_xvnmsubadp: 8414 case PPC::BI__builtin_vsx_xvnmsubasp: { 8415 llvm::Type *ResultType = ConvertType(E->getType()); 8416 Value *X = EmitScalarExpr(E->getArg(0)); 8417 Value *Y = EmitScalarExpr(E->getArg(1)); 8418 Value *Z = EmitScalarExpr(E->getArg(2)); 8419 Value *Zero = llvm::ConstantFP::getZeroValueForNegation(ResultType); 8420 llvm::Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType); 8421 switch (BuiltinID) { 8422 case PPC::BI__builtin_vsx_xvmaddadp: 8423 case PPC::BI__builtin_vsx_xvmaddasp: 8424 return Builder.CreateCall(F, {X, Y, Z}); 8425 case PPC::BI__builtin_vsx_xvnmaddadp: 8426 case PPC::BI__builtin_vsx_xvnmaddasp: 8427 return Builder.CreateFSub(Zero, 8428 Builder.CreateCall(F, {X, Y, Z}), "sub"); 8429 case PPC::BI__builtin_vsx_xvmsubadp: 8430 case PPC::BI__builtin_vsx_xvmsubasp: 8431 return Builder.CreateCall(F, 8432 {X, Y, Builder.CreateFSub(Zero, Z, "sub")}); 8433 case PPC::BI__builtin_vsx_xvnmsubadp: 8434 case PPC::BI__builtin_vsx_xvnmsubasp: 8435 Value *FsubRes = 8436 Builder.CreateCall(F, {X, Y, Builder.CreateFSub(Zero, Z, "sub")}); 8437 return Builder.CreateFSub(Zero, FsubRes, "sub"); 8438 } 8439 llvm_unreachable("Unknown FMA operation"); 8440 return nullptr; // Suppress no-return warning 8441 } 8442 8443 case PPC::BI__builtin_vsx_insertword: { 8444 llvm::Function *F = CGM.getIntrinsic(Intrinsic::ppc_vsx_xxinsertw); 8445 8446 // Third argument is a compile time constant int. It must be clamped to 8447 // to the range [0, 12]. 8448 ConstantInt *ArgCI = dyn_cast<ConstantInt>(Ops[2]); 8449 assert(ArgCI && 8450 "Third arg to xxinsertw intrinsic must be constant integer"); 8451 const int64_t MaxIndex = 12; 8452 int64_t Index = clamp(ArgCI->getSExtValue(), 0, MaxIndex); 8453 8454 // The builtin semantics don't exactly match the xxinsertw instructions 8455 // semantics (which ppc_vsx_xxinsertw follows). The builtin extracts the 8456 // word from the first argument, and inserts it in the second argument. The 8457 // instruction extracts the word from its second input register and inserts 8458 // it into its first input register, so swap the first and second arguments. 8459 std::swap(Ops[0], Ops[1]); 8460 8461 // Need to cast the second argument from a vector of unsigned int to a 8462 // vector of long long. 8463 Ops[1] = Builder.CreateBitCast(Ops[1], llvm::VectorType::get(Int64Ty, 2)); 8464 8465 if (getTarget().isLittleEndian()) { 8466 // Create a shuffle mask of (1, 0) 8467 Constant *ShuffleElts[2] = { ConstantInt::get(Int32Ty, 1), 8468 ConstantInt::get(Int32Ty, 0) 8469 }; 8470 Constant *ShuffleMask = llvm::ConstantVector::get(ShuffleElts); 8471 8472 // Reverse the double words in the vector we will extract from. 8473 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int64Ty, 2)); 8474 Ops[0] = Builder.CreateShuffleVector(Ops[0], Ops[0], ShuffleMask); 8475 8476 // Reverse the index. 8477 Index = MaxIndex - Index; 8478 } 8479 8480 // Intrinsic expects the first arg to be a vector of int. 8481 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int32Ty, 4)); 8482 Ops[2] = ConstantInt::getSigned(Int32Ty, Index); 8483 return Builder.CreateCall(F, Ops); 8484 } 8485 8486 case PPC::BI__builtin_vsx_extractuword: { 8487 llvm::Function *F = CGM.getIntrinsic(Intrinsic::ppc_vsx_xxextractuw); 8488 8489 // Intrinsic expects the first argument to be a vector of doublewords. 8490 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int64Ty, 2)); 8491 8492 // The second argument is a compile time constant int that needs to 8493 // be clamped to the range [0, 12]. 8494 ConstantInt *ArgCI = dyn_cast<ConstantInt>(Ops[1]); 8495 assert(ArgCI && 8496 "Second Arg to xxextractuw intrinsic must be a constant integer!"); 8497 const int64_t MaxIndex = 12; 8498 int64_t Index = clamp(ArgCI->getSExtValue(), 0, MaxIndex); 8499 8500 if (getTarget().isLittleEndian()) { 8501 // Reverse the index. 8502 Index = MaxIndex - Index; 8503 Ops[1] = ConstantInt::getSigned(Int32Ty, Index); 8504 8505 // Emit the call, then reverse the double words of the results vector. 8506 Value *Call = Builder.CreateCall(F, Ops); 8507 8508 // Create a shuffle mask of (1, 0) 8509 Constant *ShuffleElts[2] = { ConstantInt::get(Int32Ty, 1), 8510 ConstantInt::get(Int32Ty, 0) 8511 }; 8512 Constant *ShuffleMask = llvm::ConstantVector::get(ShuffleElts); 8513 8514 Value *ShuffleCall = Builder.CreateShuffleVector(Call, Call, ShuffleMask); 8515 return ShuffleCall; 8516 } else { 8517 Ops[1] = ConstantInt::getSigned(Int32Ty, Index); 8518 return Builder.CreateCall(F, Ops); 8519 } 8520 } 8521 8522 case PPC::BI__builtin_vsx_xxpermdi: { 8523 ConstantInt *ArgCI = dyn_cast<ConstantInt>(Ops[2]); 8524 assert(ArgCI && "Third arg must be constant integer!"); 8525 8526 unsigned Index = ArgCI->getZExtValue(); 8527 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int64Ty, 2)); 8528 Ops[1] = Builder.CreateBitCast(Ops[1], llvm::VectorType::get(Int64Ty, 2)); 8529 8530 // Element zero comes from the first input vector and element one comes from 8531 // the second. The element indices within each vector are numbered in big 8532 // endian order so the shuffle mask must be adjusted for this on little 8533 // endian platforms (i.e. index is complemented and source vector reversed). 8534 unsigned ElemIdx0; 8535 unsigned ElemIdx1; 8536 if (getTarget().isLittleEndian()) { 8537 ElemIdx0 = (~Index & 1) + 2; 8538 ElemIdx1 = (~Index & 2) >> 1; 8539 } else { // BigEndian 8540 ElemIdx0 = (Index & 2) >> 1; 8541 ElemIdx1 = 2 + (Index & 1); 8542 } 8543 8544 Constant *ShuffleElts[2] = {ConstantInt::get(Int32Ty, ElemIdx0), 8545 ConstantInt::get(Int32Ty, ElemIdx1)}; 8546 Constant *ShuffleMask = llvm::ConstantVector::get(ShuffleElts); 8547 8548 Value *ShuffleCall = 8549 Builder.CreateShuffleVector(Ops[0], Ops[1], ShuffleMask); 8550 QualType BIRetType = E->getType(); 8551 auto RetTy = ConvertType(BIRetType); 8552 return Builder.CreateBitCast(ShuffleCall, RetTy); 8553 } 8554 8555 case PPC::BI__builtin_vsx_xxsldwi: { 8556 ConstantInt *ArgCI = dyn_cast<ConstantInt>(Ops[2]); 8557 assert(ArgCI && "Third argument must be a compile time constant"); 8558 unsigned Index = ArgCI->getZExtValue() & 0x3; 8559 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int32Ty, 4)); 8560 Ops[1] = Builder.CreateBitCast(Ops[1], llvm::VectorType::get(Int32Ty, 4)); 8561 8562 // Create a shuffle mask 8563 unsigned ElemIdx0; 8564 unsigned ElemIdx1; 8565 unsigned ElemIdx2; 8566 unsigned ElemIdx3; 8567 if (getTarget().isLittleEndian()) { 8568 // Little endian element N comes from element 8+N-Index of the 8569 // concatenated wide vector (of course, using modulo arithmetic on 8570 // the total number of elements). 8571 ElemIdx0 = (8 - Index) % 8; 8572 ElemIdx1 = (9 - Index) % 8; 8573 ElemIdx2 = (10 - Index) % 8; 8574 ElemIdx3 = (11 - Index) % 8; 8575 } else { 8576 // Big endian ElemIdx<N> = Index + N 8577 ElemIdx0 = Index; 8578 ElemIdx1 = Index + 1; 8579 ElemIdx2 = Index + 2; 8580 ElemIdx3 = Index + 3; 8581 } 8582 8583 Constant *ShuffleElts[4] = {ConstantInt::get(Int32Ty, ElemIdx0), 8584 ConstantInt::get(Int32Ty, ElemIdx1), 8585 ConstantInt::get(Int32Ty, ElemIdx2), 8586 ConstantInt::get(Int32Ty, ElemIdx3)}; 8587 8588 Constant *ShuffleMask = llvm::ConstantVector::get(ShuffleElts); 8589 Value *ShuffleCall = 8590 Builder.CreateShuffleVector(Ops[0], Ops[1], ShuffleMask); 8591 QualType BIRetType = E->getType(); 8592 auto RetTy = ConvertType(BIRetType); 8593 return Builder.CreateBitCast(ShuffleCall, RetTy); 8594 } 8595 } 8596 } 8597 8598 Value *CodeGenFunction::EmitAMDGPUBuiltinExpr(unsigned BuiltinID, 8599 const CallExpr *E) { 8600 switch (BuiltinID) { 8601 case AMDGPU::BI__builtin_amdgcn_div_scale: 8602 case AMDGPU::BI__builtin_amdgcn_div_scalef: { 8603 // Translate from the intrinsics's struct return to the builtin's out 8604 // argument. 8605 8606 Address FlagOutPtr = EmitPointerWithAlignment(E->getArg(3)); 8607 8608 llvm::Value *X = EmitScalarExpr(E->getArg(0)); 8609 llvm::Value *Y = EmitScalarExpr(E->getArg(1)); 8610 llvm::Value *Z = EmitScalarExpr(E->getArg(2)); 8611 8612 llvm::Value *Callee = CGM.getIntrinsic(Intrinsic::amdgcn_div_scale, 8613 X->getType()); 8614 8615 llvm::Value *Tmp = Builder.CreateCall(Callee, {X, Y, Z}); 8616 8617 llvm::Value *Result = Builder.CreateExtractValue(Tmp, 0); 8618 llvm::Value *Flag = Builder.CreateExtractValue(Tmp, 1); 8619 8620 llvm::Type *RealFlagType 8621 = FlagOutPtr.getPointer()->getType()->getPointerElementType(); 8622 8623 llvm::Value *FlagExt = Builder.CreateZExt(Flag, RealFlagType); 8624 Builder.CreateStore(FlagExt, FlagOutPtr); 8625 return Result; 8626 } 8627 case AMDGPU::BI__builtin_amdgcn_div_fmas: 8628 case AMDGPU::BI__builtin_amdgcn_div_fmasf: { 8629 llvm::Value *Src0 = EmitScalarExpr(E->getArg(0)); 8630 llvm::Value *Src1 = EmitScalarExpr(E->getArg(1)); 8631 llvm::Value *Src2 = EmitScalarExpr(E->getArg(2)); 8632 llvm::Value *Src3 = EmitScalarExpr(E->getArg(3)); 8633 8634 llvm::Value *F = CGM.getIntrinsic(Intrinsic::amdgcn_div_fmas, 8635 Src0->getType()); 8636 llvm::Value *Src3ToBool = Builder.CreateIsNotNull(Src3); 8637 return Builder.CreateCall(F, {Src0, Src1, Src2, Src3ToBool}); 8638 } 8639 8640 case AMDGPU::BI__builtin_amdgcn_ds_swizzle: 8641 return emitBinaryBuiltin(*this, E, Intrinsic::amdgcn_ds_swizzle); 8642 case AMDGPU::BI__builtin_amdgcn_mov_dpp: { 8643 llvm::SmallVector<llvm::Value *, 5> Args; 8644 for (unsigned I = 0; I != 5; ++I) 8645 Args.push_back(EmitScalarExpr(E->getArg(I))); 8646 Value *F = CGM.getIntrinsic(Intrinsic::amdgcn_mov_dpp, 8647 Args[0]->getType()); 8648 return Builder.CreateCall(F, Args); 8649 } 8650 case AMDGPU::BI__builtin_amdgcn_div_fixup: 8651 case AMDGPU::BI__builtin_amdgcn_div_fixupf: 8652 case AMDGPU::BI__builtin_amdgcn_div_fixuph: 8653 return emitTernaryBuiltin(*this, E, Intrinsic::amdgcn_div_fixup); 8654 case AMDGPU::BI__builtin_amdgcn_trig_preop: 8655 case AMDGPU::BI__builtin_amdgcn_trig_preopf: 8656 return emitFPIntBuiltin(*this, E, Intrinsic::amdgcn_trig_preop); 8657 case AMDGPU::BI__builtin_amdgcn_rcp: 8658 case AMDGPU::BI__builtin_amdgcn_rcpf: 8659 case AMDGPU::BI__builtin_amdgcn_rcph: 8660 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_rcp); 8661 case AMDGPU::BI__builtin_amdgcn_rsq: 8662 case AMDGPU::BI__builtin_amdgcn_rsqf: 8663 case AMDGPU::BI__builtin_amdgcn_rsqh: 8664 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_rsq); 8665 case AMDGPU::BI__builtin_amdgcn_rsq_clamp: 8666 case AMDGPU::BI__builtin_amdgcn_rsq_clampf: 8667 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_rsq_clamp); 8668 case AMDGPU::BI__builtin_amdgcn_sinf: 8669 case AMDGPU::BI__builtin_amdgcn_sinh: 8670 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_sin); 8671 case AMDGPU::BI__builtin_amdgcn_cosf: 8672 case AMDGPU::BI__builtin_amdgcn_cosh: 8673 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_cos); 8674 case AMDGPU::BI__builtin_amdgcn_log_clampf: 8675 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_log_clamp); 8676 case AMDGPU::BI__builtin_amdgcn_ldexp: 8677 case AMDGPU::BI__builtin_amdgcn_ldexpf: 8678 case AMDGPU::BI__builtin_amdgcn_ldexph: 8679 return emitFPIntBuiltin(*this, E, Intrinsic::amdgcn_ldexp); 8680 case AMDGPU::BI__builtin_amdgcn_frexp_mant: 8681 case AMDGPU::BI__builtin_amdgcn_frexp_mantf: 8682 case AMDGPU::BI__builtin_amdgcn_frexp_manth: 8683 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_frexp_mant); 8684 case AMDGPU::BI__builtin_amdgcn_frexp_exp: 8685 case AMDGPU::BI__builtin_amdgcn_frexp_expf: { 8686 Value *Src0 = EmitScalarExpr(E->getArg(0)); 8687 Value *F = CGM.getIntrinsic(Intrinsic::amdgcn_frexp_exp, 8688 { Builder.getInt32Ty(), Src0->getType() }); 8689 return Builder.CreateCall(F, Src0); 8690 } 8691 case AMDGPU::BI__builtin_amdgcn_frexp_exph: { 8692 Value *Src0 = EmitScalarExpr(E->getArg(0)); 8693 Value *F = CGM.getIntrinsic(Intrinsic::amdgcn_frexp_exp, 8694 { Builder.getInt16Ty(), Src0->getType() }); 8695 return Builder.CreateCall(F, Src0); 8696 } 8697 case AMDGPU::BI__builtin_amdgcn_fract: 8698 case AMDGPU::BI__builtin_amdgcn_fractf: 8699 case AMDGPU::BI__builtin_amdgcn_fracth: 8700 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_fract); 8701 case AMDGPU::BI__builtin_amdgcn_lerp: 8702 return emitTernaryBuiltin(*this, E, Intrinsic::amdgcn_lerp); 8703 case AMDGPU::BI__builtin_amdgcn_uicmp: 8704 case AMDGPU::BI__builtin_amdgcn_uicmpl: 8705 case AMDGPU::BI__builtin_amdgcn_sicmp: 8706 case AMDGPU::BI__builtin_amdgcn_sicmpl: 8707 return emitTernaryBuiltin(*this, E, Intrinsic::amdgcn_icmp); 8708 case AMDGPU::BI__builtin_amdgcn_fcmp: 8709 case AMDGPU::BI__builtin_amdgcn_fcmpf: 8710 return emitTernaryBuiltin(*this, E, Intrinsic::amdgcn_fcmp); 8711 case AMDGPU::BI__builtin_amdgcn_class: 8712 case AMDGPU::BI__builtin_amdgcn_classf: 8713 case AMDGPU::BI__builtin_amdgcn_classh: 8714 return emitFPIntBuiltin(*this, E, Intrinsic::amdgcn_class); 8715 case AMDGPU::BI__builtin_amdgcn_fmed3f: 8716 case AMDGPU::BI__builtin_amdgcn_fmed3h: 8717 return emitTernaryBuiltin(*this, E, Intrinsic::amdgcn_fmed3); 8718 case AMDGPU::BI__builtin_amdgcn_read_exec: { 8719 CallInst *CI = cast<CallInst>( 8720 EmitSpecialRegisterBuiltin(*this, E, Int64Ty, Int64Ty, true, "exec")); 8721 CI->setConvergent(); 8722 return CI; 8723 } 8724 8725 // amdgcn workitem 8726 case AMDGPU::BI__builtin_amdgcn_workitem_id_x: 8727 return emitRangedBuiltin(*this, Intrinsic::amdgcn_workitem_id_x, 0, 1024); 8728 case AMDGPU::BI__builtin_amdgcn_workitem_id_y: 8729 return emitRangedBuiltin(*this, Intrinsic::amdgcn_workitem_id_y, 0, 1024); 8730 case AMDGPU::BI__builtin_amdgcn_workitem_id_z: 8731 return emitRangedBuiltin(*this, Intrinsic::amdgcn_workitem_id_z, 0, 1024); 8732 8733 // r600 intrinsics 8734 case AMDGPU::BI__builtin_r600_recipsqrt_ieee: 8735 case AMDGPU::BI__builtin_r600_recipsqrt_ieeef: 8736 return emitUnaryBuiltin(*this, E, Intrinsic::r600_recipsqrt_ieee); 8737 case AMDGPU::BI__builtin_r600_read_tidig_x: 8738 return emitRangedBuiltin(*this, Intrinsic::r600_read_tidig_x, 0, 1024); 8739 case AMDGPU::BI__builtin_r600_read_tidig_y: 8740 return emitRangedBuiltin(*this, Intrinsic::r600_read_tidig_y, 0, 1024); 8741 case AMDGPU::BI__builtin_r600_read_tidig_z: 8742 return emitRangedBuiltin(*this, Intrinsic::r600_read_tidig_z, 0, 1024); 8743 default: 8744 return nullptr; 8745 } 8746 } 8747 8748 /// Handle a SystemZ function in which the final argument is a pointer 8749 /// to an int that receives the post-instruction CC value. At the LLVM level 8750 /// this is represented as a function that returns a {result, cc} pair. 8751 static Value *EmitSystemZIntrinsicWithCC(CodeGenFunction &CGF, 8752 unsigned IntrinsicID, 8753 const CallExpr *E) { 8754 unsigned NumArgs = E->getNumArgs() - 1; 8755 SmallVector<Value *, 8> Args(NumArgs); 8756 for (unsigned I = 0; I < NumArgs; ++I) 8757 Args[I] = CGF.EmitScalarExpr(E->getArg(I)); 8758 Address CCPtr = CGF.EmitPointerWithAlignment(E->getArg(NumArgs)); 8759 Value *F = CGF.CGM.getIntrinsic(IntrinsicID); 8760 Value *Call = CGF.Builder.CreateCall(F, Args); 8761 Value *CC = CGF.Builder.CreateExtractValue(Call, 1); 8762 CGF.Builder.CreateStore(CC, CCPtr); 8763 return CGF.Builder.CreateExtractValue(Call, 0); 8764 } 8765 8766 Value *CodeGenFunction::EmitSystemZBuiltinExpr(unsigned BuiltinID, 8767 const CallExpr *E) { 8768 switch (BuiltinID) { 8769 case SystemZ::BI__builtin_tbegin: { 8770 Value *TDB = EmitScalarExpr(E->getArg(0)); 8771 Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff0c); 8772 Value *F = CGM.getIntrinsic(Intrinsic::s390_tbegin); 8773 return Builder.CreateCall(F, {TDB, Control}); 8774 } 8775 case SystemZ::BI__builtin_tbegin_nofloat: { 8776 Value *TDB = EmitScalarExpr(E->getArg(0)); 8777 Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff0c); 8778 Value *F = CGM.getIntrinsic(Intrinsic::s390_tbegin_nofloat); 8779 return Builder.CreateCall(F, {TDB, Control}); 8780 } 8781 case SystemZ::BI__builtin_tbeginc: { 8782 Value *TDB = llvm::ConstantPointerNull::get(Int8PtrTy); 8783 Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff08); 8784 Value *F = CGM.getIntrinsic(Intrinsic::s390_tbeginc); 8785 return Builder.CreateCall(F, {TDB, Control}); 8786 } 8787 case SystemZ::BI__builtin_tabort: { 8788 Value *Data = EmitScalarExpr(E->getArg(0)); 8789 Value *F = CGM.getIntrinsic(Intrinsic::s390_tabort); 8790 return Builder.CreateCall(F, Builder.CreateSExt(Data, Int64Ty, "tabort")); 8791 } 8792 case SystemZ::BI__builtin_non_tx_store: { 8793 Value *Address = EmitScalarExpr(E->getArg(0)); 8794 Value *Data = EmitScalarExpr(E->getArg(1)); 8795 Value *F = CGM.getIntrinsic(Intrinsic::s390_ntstg); 8796 return Builder.CreateCall(F, {Data, Address}); 8797 } 8798 8799 // Vector builtins. Note that most vector builtins are mapped automatically 8800 // to target-specific LLVM intrinsics. The ones handled specially here can 8801 // be represented via standard LLVM IR, which is preferable to enable common 8802 // LLVM optimizations. 8803 8804 case SystemZ::BI__builtin_s390_vpopctb: 8805 case SystemZ::BI__builtin_s390_vpopcth: 8806 case SystemZ::BI__builtin_s390_vpopctf: 8807 case SystemZ::BI__builtin_s390_vpopctg: { 8808 llvm::Type *ResultType = ConvertType(E->getType()); 8809 Value *X = EmitScalarExpr(E->getArg(0)); 8810 Function *F = CGM.getIntrinsic(Intrinsic::ctpop, ResultType); 8811 return Builder.CreateCall(F, X); 8812 } 8813 8814 case SystemZ::BI__builtin_s390_vclzb: 8815 case SystemZ::BI__builtin_s390_vclzh: 8816 case SystemZ::BI__builtin_s390_vclzf: 8817 case SystemZ::BI__builtin_s390_vclzg: { 8818 llvm::Type *ResultType = ConvertType(E->getType()); 8819 Value *X = EmitScalarExpr(E->getArg(0)); 8820 Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false); 8821 Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ResultType); 8822 return Builder.CreateCall(F, {X, Undef}); 8823 } 8824 8825 case SystemZ::BI__builtin_s390_vctzb: 8826 case SystemZ::BI__builtin_s390_vctzh: 8827 case SystemZ::BI__builtin_s390_vctzf: 8828 case SystemZ::BI__builtin_s390_vctzg: { 8829 llvm::Type *ResultType = ConvertType(E->getType()); 8830 Value *X = EmitScalarExpr(E->getArg(0)); 8831 Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false); 8832 Function *F = CGM.getIntrinsic(Intrinsic::cttz, ResultType); 8833 return Builder.CreateCall(F, {X, Undef}); 8834 } 8835 8836 case SystemZ::BI__builtin_s390_vfsqsb: 8837 case SystemZ::BI__builtin_s390_vfsqdb: { 8838 llvm::Type *ResultType = ConvertType(E->getType()); 8839 Value *X = EmitScalarExpr(E->getArg(0)); 8840 Function *F = CGM.getIntrinsic(Intrinsic::sqrt, ResultType); 8841 return Builder.CreateCall(F, X); 8842 } 8843 case SystemZ::BI__builtin_s390_vfmasb: 8844 case SystemZ::BI__builtin_s390_vfmadb: { 8845 llvm::Type *ResultType = ConvertType(E->getType()); 8846 Value *X = EmitScalarExpr(E->getArg(0)); 8847 Value *Y = EmitScalarExpr(E->getArg(1)); 8848 Value *Z = EmitScalarExpr(E->getArg(2)); 8849 Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType); 8850 return Builder.CreateCall(F, {X, Y, Z}); 8851 } 8852 case SystemZ::BI__builtin_s390_vfmssb: 8853 case SystemZ::BI__builtin_s390_vfmsdb: { 8854 llvm::Type *ResultType = ConvertType(E->getType()); 8855 Value *X = EmitScalarExpr(E->getArg(0)); 8856 Value *Y = EmitScalarExpr(E->getArg(1)); 8857 Value *Z = EmitScalarExpr(E->getArg(2)); 8858 Value *Zero = llvm::ConstantFP::getZeroValueForNegation(ResultType); 8859 Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType); 8860 return Builder.CreateCall(F, {X, Y, Builder.CreateFSub(Zero, Z, "sub")}); 8861 } 8862 case SystemZ::BI__builtin_s390_vfnmasb: 8863 case SystemZ::BI__builtin_s390_vfnmadb: { 8864 llvm::Type *ResultType = ConvertType(E->getType()); 8865 Value *X = EmitScalarExpr(E->getArg(0)); 8866 Value *Y = EmitScalarExpr(E->getArg(1)); 8867 Value *Z = EmitScalarExpr(E->getArg(2)); 8868 Value *Zero = llvm::ConstantFP::getZeroValueForNegation(ResultType); 8869 Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType); 8870 return Builder.CreateFSub(Zero, Builder.CreateCall(F, {X, Y, Z}), "sub"); 8871 } 8872 case SystemZ::BI__builtin_s390_vfnmssb: 8873 case SystemZ::BI__builtin_s390_vfnmsdb: { 8874 llvm::Type *ResultType = ConvertType(E->getType()); 8875 Value *X = EmitScalarExpr(E->getArg(0)); 8876 Value *Y = EmitScalarExpr(E->getArg(1)); 8877 Value *Z = EmitScalarExpr(E->getArg(2)); 8878 Value *Zero = llvm::ConstantFP::getZeroValueForNegation(ResultType); 8879 Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType); 8880 Value *NegZ = Builder.CreateFSub(Zero, Z, "sub"); 8881 return Builder.CreateFSub(Zero, Builder.CreateCall(F, {X, Y, NegZ})); 8882 } 8883 case SystemZ::BI__builtin_s390_vflpsb: 8884 case SystemZ::BI__builtin_s390_vflpdb: { 8885 llvm::Type *ResultType = ConvertType(E->getType()); 8886 Value *X = EmitScalarExpr(E->getArg(0)); 8887 Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType); 8888 return Builder.CreateCall(F, X); 8889 } 8890 case SystemZ::BI__builtin_s390_vflnsb: 8891 case SystemZ::BI__builtin_s390_vflndb: { 8892 llvm::Type *ResultType = ConvertType(E->getType()); 8893 Value *X = EmitScalarExpr(E->getArg(0)); 8894 Value *Zero = llvm::ConstantFP::getZeroValueForNegation(ResultType); 8895 Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType); 8896 return Builder.CreateFSub(Zero, Builder.CreateCall(F, X), "sub"); 8897 } 8898 case SystemZ::BI__builtin_s390_vfisb: 8899 case SystemZ::BI__builtin_s390_vfidb: { 8900 llvm::Type *ResultType = ConvertType(E->getType()); 8901 Value *X = EmitScalarExpr(E->getArg(0)); 8902 // Constant-fold the M4 and M5 mask arguments. 8903 llvm::APSInt M4, M5; 8904 bool IsConstM4 = E->getArg(1)->isIntegerConstantExpr(M4, getContext()); 8905 bool IsConstM5 = E->getArg(2)->isIntegerConstantExpr(M5, getContext()); 8906 assert(IsConstM4 && IsConstM5 && "Constant arg isn't actually constant?"); 8907 (void)IsConstM4; (void)IsConstM5; 8908 // Check whether this instance can be represented via a LLVM standard 8909 // intrinsic. We only support some combinations of M4 and M5. 8910 Intrinsic::ID ID = Intrinsic::not_intrinsic; 8911 switch (M4.getZExtValue()) { 8912 default: break; 8913 case 0: // IEEE-inexact exception allowed 8914 switch (M5.getZExtValue()) { 8915 default: break; 8916 case 0: ID = Intrinsic::rint; break; 8917 } 8918 break; 8919 case 4: // IEEE-inexact exception suppressed 8920 switch (M5.getZExtValue()) { 8921 default: break; 8922 case 0: ID = Intrinsic::nearbyint; break; 8923 case 1: ID = Intrinsic::round; break; 8924 case 5: ID = Intrinsic::trunc; break; 8925 case 6: ID = Intrinsic::ceil; break; 8926 case 7: ID = Intrinsic::floor; break; 8927 } 8928 break; 8929 } 8930 if (ID != Intrinsic::not_intrinsic) { 8931 Function *F = CGM.getIntrinsic(ID, ResultType); 8932 return Builder.CreateCall(F, X); 8933 } 8934 switch (BuiltinID) { 8935 case SystemZ::BI__builtin_s390_vfisb: ID = Intrinsic::s390_vfisb; break; 8936 case SystemZ::BI__builtin_s390_vfidb: ID = Intrinsic::s390_vfidb; break; 8937 default: llvm_unreachable("Unknown BuiltinID"); 8938 } 8939 Function *F = CGM.getIntrinsic(ID); 8940 Value *M4Value = llvm::ConstantInt::get(getLLVMContext(), M4); 8941 Value *M5Value = llvm::ConstantInt::get(getLLVMContext(), M5); 8942 return Builder.CreateCall(F, {X, M4Value, M5Value}); 8943 } 8944 case SystemZ::BI__builtin_s390_vfmaxsb: 8945 case SystemZ::BI__builtin_s390_vfmaxdb: { 8946 llvm::Type *ResultType = ConvertType(E->getType()); 8947 Value *X = EmitScalarExpr(E->getArg(0)); 8948 Value *Y = EmitScalarExpr(E->getArg(1)); 8949 // Constant-fold the M4 mask argument. 8950 llvm::APSInt M4; 8951 bool IsConstM4 = E->getArg(2)->isIntegerConstantExpr(M4, getContext()); 8952 assert(IsConstM4 && "Constant arg isn't actually constant?"); 8953 (void)IsConstM4; 8954 // Check whether this instance can be represented via a LLVM standard 8955 // intrinsic. We only support some values of M4. 8956 Intrinsic::ID ID = Intrinsic::not_intrinsic; 8957 switch (M4.getZExtValue()) { 8958 default: break; 8959 case 4: ID = Intrinsic::maxnum; break; 8960 } 8961 if (ID != Intrinsic::not_intrinsic) { 8962 Function *F = CGM.getIntrinsic(ID, ResultType); 8963 return Builder.CreateCall(F, {X, Y}); 8964 } 8965 switch (BuiltinID) { 8966 case SystemZ::BI__builtin_s390_vfmaxsb: ID = Intrinsic::s390_vfmaxsb; break; 8967 case SystemZ::BI__builtin_s390_vfmaxdb: ID = Intrinsic::s390_vfmaxdb; break; 8968 default: llvm_unreachable("Unknown BuiltinID"); 8969 } 8970 Function *F = CGM.getIntrinsic(ID); 8971 Value *M4Value = llvm::ConstantInt::get(getLLVMContext(), M4); 8972 return Builder.CreateCall(F, {X, Y, M4Value}); 8973 } 8974 case SystemZ::BI__builtin_s390_vfminsb: 8975 case SystemZ::BI__builtin_s390_vfmindb: { 8976 llvm::Type *ResultType = ConvertType(E->getType()); 8977 Value *X = EmitScalarExpr(E->getArg(0)); 8978 Value *Y = EmitScalarExpr(E->getArg(1)); 8979 // Constant-fold the M4 mask argument. 8980 llvm::APSInt M4; 8981 bool IsConstM4 = E->getArg(2)->isIntegerConstantExpr(M4, getContext()); 8982 assert(IsConstM4 && "Constant arg isn't actually constant?"); 8983 (void)IsConstM4; 8984 // Check whether this instance can be represented via a LLVM standard 8985 // intrinsic. We only support some values of M4. 8986 Intrinsic::ID ID = Intrinsic::not_intrinsic; 8987 switch (M4.getZExtValue()) { 8988 default: break; 8989 case 4: ID = Intrinsic::minnum; break; 8990 } 8991 if (ID != Intrinsic::not_intrinsic) { 8992 Function *F = CGM.getIntrinsic(ID, ResultType); 8993 return Builder.CreateCall(F, {X, Y}); 8994 } 8995 switch (BuiltinID) { 8996 case SystemZ::BI__builtin_s390_vfminsb: ID = Intrinsic::s390_vfminsb; break; 8997 case SystemZ::BI__builtin_s390_vfmindb: ID = Intrinsic::s390_vfmindb; break; 8998 default: llvm_unreachable("Unknown BuiltinID"); 8999 } 9000 Function *F = CGM.getIntrinsic(ID); 9001 Value *M4Value = llvm::ConstantInt::get(getLLVMContext(), M4); 9002 return Builder.CreateCall(F, {X, Y, M4Value}); 9003 } 9004 9005 // Vector intrisincs that output the post-instruction CC value. 9006 9007 #define INTRINSIC_WITH_CC(NAME) \ 9008 case SystemZ::BI__builtin_##NAME: \ 9009 return EmitSystemZIntrinsicWithCC(*this, Intrinsic::NAME, E) 9010 9011 INTRINSIC_WITH_CC(s390_vpkshs); 9012 INTRINSIC_WITH_CC(s390_vpksfs); 9013 INTRINSIC_WITH_CC(s390_vpksgs); 9014 9015 INTRINSIC_WITH_CC(s390_vpklshs); 9016 INTRINSIC_WITH_CC(s390_vpklsfs); 9017 INTRINSIC_WITH_CC(s390_vpklsgs); 9018 9019 INTRINSIC_WITH_CC(s390_vceqbs); 9020 INTRINSIC_WITH_CC(s390_vceqhs); 9021 INTRINSIC_WITH_CC(s390_vceqfs); 9022 INTRINSIC_WITH_CC(s390_vceqgs); 9023 9024 INTRINSIC_WITH_CC(s390_vchbs); 9025 INTRINSIC_WITH_CC(s390_vchhs); 9026 INTRINSIC_WITH_CC(s390_vchfs); 9027 INTRINSIC_WITH_CC(s390_vchgs); 9028 9029 INTRINSIC_WITH_CC(s390_vchlbs); 9030 INTRINSIC_WITH_CC(s390_vchlhs); 9031 INTRINSIC_WITH_CC(s390_vchlfs); 9032 INTRINSIC_WITH_CC(s390_vchlgs); 9033 9034 INTRINSIC_WITH_CC(s390_vfaebs); 9035 INTRINSIC_WITH_CC(s390_vfaehs); 9036 INTRINSIC_WITH_CC(s390_vfaefs); 9037 9038 INTRINSIC_WITH_CC(s390_vfaezbs); 9039 INTRINSIC_WITH_CC(s390_vfaezhs); 9040 INTRINSIC_WITH_CC(s390_vfaezfs); 9041 9042 INTRINSIC_WITH_CC(s390_vfeebs); 9043 INTRINSIC_WITH_CC(s390_vfeehs); 9044 INTRINSIC_WITH_CC(s390_vfeefs); 9045 9046 INTRINSIC_WITH_CC(s390_vfeezbs); 9047 INTRINSIC_WITH_CC(s390_vfeezhs); 9048 INTRINSIC_WITH_CC(s390_vfeezfs); 9049 9050 INTRINSIC_WITH_CC(s390_vfenebs); 9051 INTRINSIC_WITH_CC(s390_vfenehs); 9052 INTRINSIC_WITH_CC(s390_vfenefs); 9053 9054 INTRINSIC_WITH_CC(s390_vfenezbs); 9055 INTRINSIC_WITH_CC(s390_vfenezhs); 9056 INTRINSIC_WITH_CC(s390_vfenezfs); 9057 9058 INTRINSIC_WITH_CC(s390_vistrbs); 9059 INTRINSIC_WITH_CC(s390_vistrhs); 9060 INTRINSIC_WITH_CC(s390_vistrfs); 9061 9062 INTRINSIC_WITH_CC(s390_vstrcbs); 9063 INTRINSIC_WITH_CC(s390_vstrchs); 9064 INTRINSIC_WITH_CC(s390_vstrcfs); 9065 9066 INTRINSIC_WITH_CC(s390_vstrczbs); 9067 INTRINSIC_WITH_CC(s390_vstrczhs); 9068 INTRINSIC_WITH_CC(s390_vstrczfs); 9069 9070 INTRINSIC_WITH_CC(s390_vfcesbs); 9071 INTRINSIC_WITH_CC(s390_vfcedbs); 9072 INTRINSIC_WITH_CC(s390_vfchsbs); 9073 INTRINSIC_WITH_CC(s390_vfchdbs); 9074 INTRINSIC_WITH_CC(s390_vfchesbs); 9075 INTRINSIC_WITH_CC(s390_vfchedbs); 9076 9077 INTRINSIC_WITH_CC(s390_vftcisb); 9078 INTRINSIC_WITH_CC(s390_vftcidb); 9079 9080 #undef INTRINSIC_WITH_CC 9081 9082 default: 9083 return nullptr; 9084 } 9085 } 9086 9087 Value *CodeGenFunction::EmitNVPTXBuiltinExpr(unsigned BuiltinID, 9088 const CallExpr *E) { 9089 auto MakeLdg = [&](unsigned IntrinsicID) { 9090 Value *Ptr = EmitScalarExpr(E->getArg(0)); 9091 clang::CharUnits Align = 9092 getNaturalPointeeTypeAlignment(E->getArg(0)->getType()); 9093 return Builder.CreateCall( 9094 CGM.getIntrinsic(IntrinsicID, {Ptr->getType()->getPointerElementType(), 9095 Ptr->getType()}), 9096 {Ptr, ConstantInt::get(Builder.getInt32Ty(), Align.getQuantity())}); 9097 }; 9098 auto MakeScopedAtomic = [&](unsigned IntrinsicID) { 9099 Value *Ptr = EmitScalarExpr(E->getArg(0)); 9100 return Builder.CreateCall( 9101 CGM.getIntrinsic(IntrinsicID, {Ptr->getType()->getPointerElementType(), 9102 Ptr->getType()}), 9103 {Ptr, EmitScalarExpr(E->getArg(1))}); 9104 }; 9105 switch (BuiltinID) { 9106 case NVPTX::BI__nvvm_atom_add_gen_i: 9107 case NVPTX::BI__nvvm_atom_add_gen_l: 9108 case NVPTX::BI__nvvm_atom_add_gen_ll: 9109 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Add, E); 9110 9111 case NVPTX::BI__nvvm_atom_sub_gen_i: 9112 case NVPTX::BI__nvvm_atom_sub_gen_l: 9113 case NVPTX::BI__nvvm_atom_sub_gen_ll: 9114 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Sub, E); 9115 9116 case NVPTX::BI__nvvm_atom_and_gen_i: 9117 case NVPTX::BI__nvvm_atom_and_gen_l: 9118 case NVPTX::BI__nvvm_atom_and_gen_ll: 9119 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::And, E); 9120 9121 case NVPTX::BI__nvvm_atom_or_gen_i: 9122 case NVPTX::BI__nvvm_atom_or_gen_l: 9123 case NVPTX::BI__nvvm_atom_or_gen_ll: 9124 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Or, E); 9125 9126 case NVPTX::BI__nvvm_atom_xor_gen_i: 9127 case NVPTX::BI__nvvm_atom_xor_gen_l: 9128 case NVPTX::BI__nvvm_atom_xor_gen_ll: 9129 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Xor, E); 9130 9131 case NVPTX::BI__nvvm_atom_xchg_gen_i: 9132 case NVPTX::BI__nvvm_atom_xchg_gen_l: 9133 case NVPTX::BI__nvvm_atom_xchg_gen_ll: 9134 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Xchg, E); 9135 9136 case NVPTX::BI__nvvm_atom_max_gen_i: 9137 case NVPTX::BI__nvvm_atom_max_gen_l: 9138 case NVPTX::BI__nvvm_atom_max_gen_ll: 9139 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Max, E); 9140 9141 case NVPTX::BI__nvvm_atom_max_gen_ui: 9142 case NVPTX::BI__nvvm_atom_max_gen_ul: 9143 case NVPTX::BI__nvvm_atom_max_gen_ull: 9144 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::UMax, E); 9145 9146 case NVPTX::BI__nvvm_atom_min_gen_i: 9147 case NVPTX::BI__nvvm_atom_min_gen_l: 9148 case NVPTX::BI__nvvm_atom_min_gen_ll: 9149 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Min, E); 9150 9151 case NVPTX::BI__nvvm_atom_min_gen_ui: 9152 case NVPTX::BI__nvvm_atom_min_gen_ul: 9153 case NVPTX::BI__nvvm_atom_min_gen_ull: 9154 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::UMin, E); 9155 9156 case NVPTX::BI__nvvm_atom_cas_gen_i: 9157 case NVPTX::BI__nvvm_atom_cas_gen_l: 9158 case NVPTX::BI__nvvm_atom_cas_gen_ll: 9159 // __nvvm_atom_cas_gen_* should return the old value rather than the 9160 // success flag. 9161 return MakeAtomicCmpXchgValue(*this, E, /*ReturnBool=*/false); 9162 9163 case NVPTX::BI__nvvm_atom_add_gen_f: { 9164 Value *Ptr = EmitScalarExpr(E->getArg(0)); 9165 Value *Val = EmitScalarExpr(E->getArg(1)); 9166 // atomicrmw only deals with integer arguments so we need to use 9167 // LLVM's nvvm_atomic_load_add_f32 intrinsic for that. 9168 Value *FnALAF32 = 9169 CGM.getIntrinsic(Intrinsic::nvvm_atomic_load_add_f32, Ptr->getType()); 9170 return Builder.CreateCall(FnALAF32, {Ptr, Val}); 9171 } 9172 9173 case NVPTX::BI__nvvm_atom_inc_gen_ui: { 9174 Value *Ptr = EmitScalarExpr(E->getArg(0)); 9175 Value *Val = EmitScalarExpr(E->getArg(1)); 9176 Value *FnALI32 = 9177 CGM.getIntrinsic(Intrinsic::nvvm_atomic_load_inc_32, Ptr->getType()); 9178 return Builder.CreateCall(FnALI32, {Ptr, Val}); 9179 } 9180 9181 case NVPTX::BI__nvvm_atom_dec_gen_ui: { 9182 Value *Ptr = EmitScalarExpr(E->getArg(0)); 9183 Value *Val = EmitScalarExpr(E->getArg(1)); 9184 Value *FnALD32 = 9185 CGM.getIntrinsic(Intrinsic::nvvm_atomic_load_dec_32, Ptr->getType()); 9186 return Builder.CreateCall(FnALD32, {Ptr, Val}); 9187 } 9188 9189 case NVPTX::BI__nvvm_ldg_c: 9190 case NVPTX::BI__nvvm_ldg_c2: 9191 case NVPTX::BI__nvvm_ldg_c4: 9192 case NVPTX::BI__nvvm_ldg_s: 9193 case NVPTX::BI__nvvm_ldg_s2: 9194 case NVPTX::BI__nvvm_ldg_s4: 9195 case NVPTX::BI__nvvm_ldg_i: 9196 case NVPTX::BI__nvvm_ldg_i2: 9197 case NVPTX::BI__nvvm_ldg_i4: 9198 case NVPTX::BI__nvvm_ldg_l: 9199 case NVPTX::BI__nvvm_ldg_ll: 9200 case NVPTX::BI__nvvm_ldg_ll2: 9201 case NVPTX::BI__nvvm_ldg_uc: 9202 case NVPTX::BI__nvvm_ldg_uc2: 9203 case NVPTX::BI__nvvm_ldg_uc4: 9204 case NVPTX::BI__nvvm_ldg_us: 9205 case NVPTX::BI__nvvm_ldg_us2: 9206 case NVPTX::BI__nvvm_ldg_us4: 9207 case NVPTX::BI__nvvm_ldg_ui: 9208 case NVPTX::BI__nvvm_ldg_ui2: 9209 case NVPTX::BI__nvvm_ldg_ui4: 9210 case NVPTX::BI__nvvm_ldg_ul: 9211 case NVPTX::BI__nvvm_ldg_ull: 9212 case NVPTX::BI__nvvm_ldg_ull2: 9213 // PTX Interoperability section 2.2: "For a vector with an even number of 9214 // elements, its alignment is set to number of elements times the alignment 9215 // of its member: n*alignof(t)." 9216 return MakeLdg(Intrinsic::nvvm_ldg_global_i); 9217 case NVPTX::BI__nvvm_ldg_f: 9218 case NVPTX::BI__nvvm_ldg_f2: 9219 case NVPTX::BI__nvvm_ldg_f4: 9220 case NVPTX::BI__nvvm_ldg_d: 9221 case NVPTX::BI__nvvm_ldg_d2: 9222 return MakeLdg(Intrinsic::nvvm_ldg_global_f); 9223 9224 case NVPTX::BI__nvvm_atom_cta_add_gen_i: 9225 case NVPTX::BI__nvvm_atom_cta_add_gen_l: 9226 case NVPTX::BI__nvvm_atom_cta_add_gen_ll: 9227 return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_i_cta); 9228 case NVPTX::BI__nvvm_atom_sys_add_gen_i: 9229 case NVPTX::BI__nvvm_atom_sys_add_gen_l: 9230 case NVPTX::BI__nvvm_atom_sys_add_gen_ll: 9231 return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_i_sys); 9232 case NVPTX::BI__nvvm_atom_cta_add_gen_f: 9233 case NVPTX::BI__nvvm_atom_cta_add_gen_d: 9234 return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_f_cta); 9235 case NVPTX::BI__nvvm_atom_sys_add_gen_f: 9236 case NVPTX::BI__nvvm_atom_sys_add_gen_d: 9237 return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_f_sys); 9238 case NVPTX::BI__nvvm_atom_cta_xchg_gen_i: 9239 case NVPTX::BI__nvvm_atom_cta_xchg_gen_l: 9240 case NVPTX::BI__nvvm_atom_cta_xchg_gen_ll: 9241 return MakeScopedAtomic(Intrinsic::nvvm_atomic_exch_gen_i_cta); 9242 case NVPTX::BI__nvvm_atom_sys_xchg_gen_i: 9243 case NVPTX::BI__nvvm_atom_sys_xchg_gen_l: 9244 case NVPTX::BI__nvvm_atom_sys_xchg_gen_ll: 9245 return MakeScopedAtomic(Intrinsic::nvvm_atomic_exch_gen_i_sys); 9246 case NVPTX::BI__nvvm_atom_cta_max_gen_i: 9247 case NVPTX::BI__nvvm_atom_cta_max_gen_ui: 9248 case NVPTX::BI__nvvm_atom_cta_max_gen_l: 9249 case NVPTX::BI__nvvm_atom_cta_max_gen_ul: 9250 case NVPTX::BI__nvvm_atom_cta_max_gen_ll: 9251 case NVPTX::BI__nvvm_atom_cta_max_gen_ull: 9252 return MakeScopedAtomic(Intrinsic::nvvm_atomic_max_gen_i_cta); 9253 case NVPTX::BI__nvvm_atom_sys_max_gen_i: 9254 case NVPTX::BI__nvvm_atom_sys_max_gen_ui: 9255 case NVPTX::BI__nvvm_atom_sys_max_gen_l: 9256 case NVPTX::BI__nvvm_atom_sys_max_gen_ul: 9257 case NVPTX::BI__nvvm_atom_sys_max_gen_ll: 9258 case NVPTX::BI__nvvm_atom_sys_max_gen_ull: 9259 return MakeScopedAtomic(Intrinsic::nvvm_atomic_max_gen_i_sys); 9260 case NVPTX::BI__nvvm_atom_cta_min_gen_i: 9261 case NVPTX::BI__nvvm_atom_cta_min_gen_ui: 9262 case NVPTX::BI__nvvm_atom_cta_min_gen_l: 9263 case NVPTX::BI__nvvm_atom_cta_min_gen_ul: 9264 case NVPTX::BI__nvvm_atom_cta_min_gen_ll: 9265 case NVPTX::BI__nvvm_atom_cta_min_gen_ull: 9266 return MakeScopedAtomic(Intrinsic::nvvm_atomic_min_gen_i_cta); 9267 case NVPTX::BI__nvvm_atom_sys_min_gen_i: 9268 case NVPTX::BI__nvvm_atom_sys_min_gen_ui: 9269 case NVPTX::BI__nvvm_atom_sys_min_gen_l: 9270 case NVPTX::BI__nvvm_atom_sys_min_gen_ul: 9271 case NVPTX::BI__nvvm_atom_sys_min_gen_ll: 9272 case NVPTX::BI__nvvm_atom_sys_min_gen_ull: 9273 return MakeScopedAtomic(Intrinsic::nvvm_atomic_min_gen_i_sys); 9274 case NVPTX::BI__nvvm_atom_cta_inc_gen_ui: 9275 return MakeScopedAtomic(Intrinsic::nvvm_atomic_inc_gen_i_cta); 9276 case NVPTX::BI__nvvm_atom_cta_dec_gen_ui: 9277 return MakeScopedAtomic(Intrinsic::nvvm_atomic_dec_gen_i_cta); 9278 case NVPTX::BI__nvvm_atom_sys_inc_gen_ui: 9279 return MakeScopedAtomic(Intrinsic::nvvm_atomic_inc_gen_i_sys); 9280 case NVPTX::BI__nvvm_atom_sys_dec_gen_ui: 9281 return MakeScopedAtomic(Intrinsic::nvvm_atomic_dec_gen_i_sys); 9282 case NVPTX::BI__nvvm_atom_cta_and_gen_i: 9283 case NVPTX::BI__nvvm_atom_cta_and_gen_l: 9284 case NVPTX::BI__nvvm_atom_cta_and_gen_ll: 9285 return MakeScopedAtomic(Intrinsic::nvvm_atomic_and_gen_i_cta); 9286 case NVPTX::BI__nvvm_atom_sys_and_gen_i: 9287 case NVPTX::BI__nvvm_atom_sys_and_gen_l: 9288 case NVPTX::BI__nvvm_atom_sys_and_gen_ll: 9289 return MakeScopedAtomic(Intrinsic::nvvm_atomic_and_gen_i_sys); 9290 case NVPTX::BI__nvvm_atom_cta_or_gen_i: 9291 case NVPTX::BI__nvvm_atom_cta_or_gen_l: 9292 case NVPTX::BI__nvvm_atom_cta_or_gen_ll: 9293 return MakeScopedAtomic(Intrinsic::nvvm_atomic_or_gen_i_cta); 9294 case NVPTX::BI__nvvm_atom_sys_or_gen_i: 9295 case NVPTX::BI__nvvm_atom_sys_or_gen_l: 9296 case NVPTX::BI__nvvm_atom_sys_or_gen_ll: 9297 return MakeScopedAtomic(Intrinsic::nvvm_atomic_or_gen_i_sys); 9298 case NVPTX::BI__nvvm_atom_cta_xor_gen_i: 9299 case NVPTX::BI__nvvm_atom_cta_xor_gen_l: 9300 case NVPTX::BI__nvvm_atom_cta_xor_gen_ll: 9301 return MakeScopedAtomic(Intrinsic::nvvm_atomic_xor_gen_i_cta); 9302 case NVPTX::BI__nvvm_atom_sys_xor_gen_i: 9303 case NVPTX::BI__nvvm_atom_sys_xor_gen_l: 9304 case NVPTX::BI__nvvm_atom_sys_xor_gen_ll: 9305 return MakeScopedAtomic(Intrinsic::nvvm_atomic_xor_gen_i_sys); 9306 case NVPTX::BI__nvvm_atom_cta_cas_gen_i: 9307 case NVPTX::BI__nvvm_atom_cta_cas_gen_l: 9308 case NVPTX::BI__nvvm_atom_cta_cas_gen_ll: { 9309 Value *Ptr = EmitScalarExpr(E->getArg(0)); 9310 return Builder.CreateCall( 9311 CGM.getIntrinsic( 9312 Intrinsic::nvvm_atomic_cas_gen_i_cta, 9313 {Ptr->getType()->getPointerElementType(), Ptr->getType()}), 9314 {Ptr, EmitScalarExpr(E->getArg(1)), EmitScalarExpr(E->getArg(2))}); 9315 } 9316 case NVPTX::BI__nvvm_atom_sys_cas_gen_i: 9317 case NVPTX::BI__nvvm_atom_sys_cas_gen_l: 9318 case NVPTX::BI__nvvm_atom_sys_cas_gen_ll: { 9319 Value *Ptr = EmitScalarExpr(E->getArg(0)); 9320 return Builder.CreateCall( 9321 CGM.getIntrinsic( 9322 Intrinsic::nvvm_atomic_cas_gen_i_sys, 9323 {Ptr->getType()->getPointerElementType(), Ptr->getType()}), 9324 {Ptr, EmitScalarExpr(E->getArg(1)), EmitScalarExpr(E->getArg(2))}); 9325 } 9326 default: 9327 return nullptr; 9328 } 9329 } 9330 9331 Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID, 9332 const CallExpr *E) { 9333 switch (BuiltinID) { 9334 case WebAssembly::BI__builtin_wasm_current_memory: { 9335 llvm::Type *ResultType = ConvertType(E->getType()); 9336 Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_current_memory, ResultType); 9337 return Builder.CreateCall(Callee); 9338 } 9339 case WebAssembly::BI__builtin_wasm_grow_memory: { 9340 Value *X = EmitScalarExpr(E->getArg(0)); 9341 Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_grow_memory, X->getType()); 9342 return Builder.CreateCall(Callee, X); 9343 } 9344 case WebAssembly::BI__builtin_wasm_throw: { 9345 Value *Tag = EmitScalarExpr(E->getArg(0)); 9346 Value *Obj = EmitScalarExpr(E->getArg(1)); 9347 Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_throw); 9348 return Builder.CreateCall(Callee, {Tag, Obj}); 9349 } 9350 case WebAssembly::BI__builtin_wasm_rethrow: { 9351 Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_rethrow); 9352 return Builder.CreateCall(Callee); 9353 } 9354 9355 default: 9356 return nullptr; 9357 } 9358 } 9359