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