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