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, 3654 bool IsRead, 3655 StringRef SysReg = "") { 3656 // write and register intrinsics only support 32 and 64 bit operations. 3657 assert((RegisterType->isIntegerTy(32) || RegisterType->isIntegerTy(64)) 3658 && "Unsupported size for register."); 3659 3660 CodeGen::CGBuilderTy &Builder = CGF.Builder; 3661 CodeGen::CodeGenModule &CGM = CGF.CGM; 3662 LLVMContext &Context = CGM.getLLVMContext(); 3663 3664 if (SysReg.empty()) { 3665 const Expr *SysRegStrExpr = E->getArg(0)->IgnoreParenCasts(); 3666 SysReg = cast<StringLiteral>(SysRegStrExpr)->getString(); 3667 } 3668 3669 llvm::Metadata *Ops[] = { llvm::MDString::get(Context, SysReg) }; 3670 llvm::MDNode *RegName = llvm::MDNode::get(Context, Ops); 3671 llvm::Value *Metadata = llvm::MetadataAsValue::get(Context, RegName); 3672 3673 llvm::Type *Types[] = { RegisterType }; 3674 3675 bool MixedTypes = RegisterType->isIntegerTy(64) && ValueType->isIntegerTy(32); 3676 assert(!(RegisterType->isIntegerTy(32) && ValueType->isIntegerTy(64)) 3677 && "Can't fit 64-bit value in 32-bit register"); 3678 3679 if (IsRead) { 3680 llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::read_register, Types); 3681 llvm::Value *Call = Builder.CreateCall(F, Metadata); 3682 3683 if (MixedTypes) 3684 // Read into 64 bit register and then truncate result to 32 bit. 3685 return Builder.CreateTrunc(Call, ValueType); 3686 3687 if (ValueType->isPointerTy()) 3688 // Have i32/i64 result (Call) but want to return a VoidPtrTy (i8*). 3689 return Builder.CreateIntToPtr(Call, ValueType); 3690 3691 return Call; 3692 } 3693 3694 llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::write_register, Types); 3695 llvm::Value *ArgValue = CGF.EmitScalarExpr(E->getArg(1)); 3696 if (MixedTypes) { 3697 // Extend 32 bit write value to 64 bit to pass to write. 3698 ArgValue = Builder.CreateZExt(ArgValue, RegisterType); 3699 return Builder.CreateCall(F, { Metadata, ArgValue }); 3700 } 3701 3702 if (ValueType->isPointerTy()) { 3703 // Have VoidPtrTy ArgValue but want to return an i32/i64. 3704 ArgValue = Builder.CreatePtrToInt(ArgValue, RegisterType); 3705 return Builder.CreateCall(F, { Metadata, ArgValue }); 3706 } 3707 3708 return Builder.CreateCall(F, { Metadata, ArgValue }); 3709 } 3710 3711 /// Return true if BuiltinID is an overloaded Neon intrinsic with an extra 3712 /// argument that specifies the vector type. 3713 static bool HasExtraNeonArgument(unsigned BuiltinID) { 3714 switch (BuiltinID) { 3715 default: break; 3716 case NEON::BI__builtin_neon_vget_lane_i8: 3717 case NEON::BI__builtin_neon_vget_lane_i16: 3718 case NEON::BI__builtin_neon_vget_lane_i32: 3719 case NEON::BI__builtin_neon_vget_lane_i64: 3720 case NEON::BI__builtin_neon_vget_lane_f32: 3721 case NEON::BI__builtin_neon_vgetq_lane_i8: 3722 case NEON::BI__builtin_neon_vgetq_lane_i16: 3723 case NEON::BI__builtin_neon_vgetq_lane_i32: 3724 case NEON::BI__builtin_neon_vgetq_lane_i64: 3725 case NEON::BI__builtin_neon_vgetq_lane_f32: 3726 case NEON::BI__builtin_neon_vset_lane_i8: 3727 case NEON::BI__builtin_neon_vset_lane_i16: 3728 case NEON::BI__builtin_neon_vset_lane_i32: 3729 case NEON::BI__builtin_neon_vset_lane_i64: 3730 case NEON::BI__builtin_neon_vset_lane_f32: 3731 case NEON::BI__builtin_neon_vsetq_lane_i8: 3732 case NEON::BI__builtin_neon_vsetq_lane_i16: 3733 case NEON::BI__builtin_neon_vsetq_lane_i32: 3734 case NEON::BI__builtin_neon_vsetq_lane_i64: 3735 case NEON::BI__builtin_neon_vsetq_lane_f32: 3736 case NEON::BI__builtin_neon_vsha1h_u32: 3737 case NEON::BI__builtin_neon_vsha1cq_u32: 3738 case NEON::BI__builtin_neon_vsha1pq_u32: 3739 case NEON::BI__builtin_neon_vsha1mq_u32: 3740 case ARM::BI_MoveToCoprocessor: 3741 case ARM::BI_MoveToCoprocessor2: 3742 return false; 3743 } 3744 return true; 3745 } 3746 3747 Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, 3748 const CallExpr *E) { 3749 if (auto Hint = GetValueForARMHint(BuiltinID)) 3750 return Hint; 3751 3752 if (BuiltinID == ARM::BI__emit) { 3753 bool IsThumb = getTarget().getTriple().getArch() == llvm::Triple::thumb; 3754 llvm::FunctionType *FTy = 3755 llvm::FunctionType::get(VoidTy, /*Variadic=*/false); 3756 3757 APSInt Value; 3758 if (!E->getArg(0)->EvaluateAsInt(Value, CGM.getContext())) 3759 llvm_unreachable("Sema will ensure that the parameter is constant"); 3760 3761 uint64_t ZExtValue = Value.zextOrTrunc(IsThumb ? 16 : 32).getZExtValue(); 3762 3763 llvm::InlineAsm *Emit = 3764 IsThumb ? InlineAsm::get(FTy, ".inst.n 0x" + utohexstr(ZExtValue), "", 3765 /*SideEffects=*/true) 3766 : InlineAsm::get(FTy, ".inst 0x" + utohexstr(ZExtValue), "", 3767 /*SideEffects=*/true); 3768 3769 return Builder.CreateCall(Emit); 3770 } 3771 3772 if (BuiltinID == ARM::BI__builtin_arm_dbg) { 3773 Value *Option = EmitScalarExpr(E->getArg(0)); 3774 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_dbg), Option); 3775 } 3776 3777 if (BuiltinID == ARM::BI__builtin_arm_prefetch) { 3778 Value *Address = EmitScalarExpr(E->getArg(0)); 3779 Value *RW = EmitScalarExpr(E->getArg(1)); 3780 Value *IsData = EmitScalarExpr(E->getArg(2)); 3781 3782 // Locality is not supported on ARM target 3783 Value *Locality = llvm::ConstantInt::get(Int32Ty, 3); 3784 3785 Value *F = CGM.getIntrinsic(Intrinsic::prefetch); 3786 return Builder.CreateCall(F, {Address, RW, Locality, IsData}); 3787 } 3788 3789 if (BuiltinID == ARM::BI__builtin_arm_rbit) { 3790 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_rbit), 3791 EmitScalarExpr(E->getArg(0)), 3792 "rbit"); 3793 } 3794 3795 if (BuiltinID == ARM::BI__clear_cache) { 3796 assert(E->getNumArgs() == 2 && "__clear_cache takes 2 arguments"); 3797 const FunctionDecl *FD = E->getDirectCallee(); 3798 Value *Ops[2]; 3799 for (unsigned i = 0; i < 2; i++) 3800 Ops[i] = EmitScalarExpr(E->getArg(i)); 3801 llvm::Type *Ty = CGM.getTypes().ConvertType(FD->getType()); 3802 llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty); 3803 StringRef Name = FD->getName(); 3804 return EmitNounwindRuntimeCall(CGM.CreateRuntimeFunction(FTy, Name), Ops); 3805 } 3806 3807 if (BuiltinID == ARM::BI__builtin_arm_mcrr || 3808 BuiltinID == ARM::BI__builtin_arm_mcrr2) { 3809 Function *F; 3810 3811 switch (BuiltinID) { 3812 default: llvm_unreachable("unexpected builtin"); 3813 case ARM::BI__builtin_arm_mcrr: 3814 F = CGM.getIntrinsic(Intrinsic::arm_mcrr); 3815 break; 3816 case ARM::BI__builtin_arm_mcrr2: 3817 F = CGM.getIntrinsic(Intrinsic::arm_mcrr2); 3818 break; 3819 } 3820 3821 // MCRR{2} instruction has 5 operands but 3822 // the intrinsic has 4 because Rt and Rt2 3823 // are represented as a single unsigned 64 3824 // bit integer in the intrinsic definition 3825 // but internally it's represented as 2 32 3826 // bit integers. 3827 3828 Value *Coproc = EmitScalarExpr(E->getArg(0)); 3829 Value *Opc1 = EmitScalarExpr(E->getArg(1)); 3830 Value *RtAndRt2 = EmitScalarExpr(E->getArg(2)); 3831 Value *CRm = EmitScalarExpr(E->getArg(3)); 3832 3833 Value *C1 = llvm::ConstantInt::get(Int64Ty, 32); 3834 Value *Rt = Builder.CreateTruncOrBitCast(RtAndRt2, Int32Ty); 3835 Value *Rt2 = Builder.CreateLShr(RtAndRt2, C1); 3836 Rt2 = Builder.CreateTruncOrBitCast(Rt2, Int32Ty); 3837 3838 return Builder.CreateCall(F, {Coproc, Opc1, Rt, Rt2, CRm}); 3839 } 3840 3841 if (BuiltinID == ARM::BI__builtin_arm_mrrc || 3842 BuiltinID == ARM::BI__builtin_arm_mrrc2) { 3843 Function *F; 3844 3845 switch (BuiltinID) { 3846 default: llvm_unreachable("unexpected builtin"); 3847 case ARM::BI__builtin_arm_mrrc: 3848 F = CGM.getIntrinsic(Intrinsic::arm_mrrc); 3849 break; 3850 case ARM::BI__builtin_arm_mrrc2: 3851 F = CGM.getIntrinsic(Intrinsic::arm_mrrc2); 3852 break; 3853 } 3854 3855 Value *Coproc = EmitScalarExpr(E->getArg(0)); 3856 Value *Opc1 = EmitScalarExpr(E->getArg(1)); 3857 Value *CRm = EmitScalarExpr(E->getArg(2)); 3858 Value *RtAndRt2 = Builder.CreateCall(F, {Coproc, Opc1, CRm}); 3859 3860 // Returns an unsigned 64 bit integer, represented 3861 // as two 32 bit integers. 3862 3863 Value *Rt = Builder.CreateExtractValue(RtAndRt2, 1); 3864 Value *Rt1 = Builder.CreateExtractValue(RtAndRt2, 0); 3865 Rt = Builder.CreateZExt(Rt, Int64Ty); 3866 Rt1 = Builder.CreateZExt(Rt1, Int64Ty); 3867 3868 Value *ShiftCast = llvm::ConstantInt::get(Int64Ty, 32); 3869 RtAndRt2 = Builder.CreateShl(Rt, ShiftCast, "shl", true); 3870 RtAndRt2 = Builder.CreateOr(RtAndRt2, Rt1); 3871 3872 return Builder.CreateBitCast(RtAndRt2, ConvertType(E->getType())); 3873 } 3874 3875 if (BuiltinID == ARM::BI__builtin_arm_ldrexd || 3876 ((BuiltinID == ARM::BI__builtin_arm_ldrex || 3877 BuiltinID == ARM::BI__builtin_arm_ldaex) && 3878 getContext().getTypeSize(E->getType()) == 64) || 3879 BuiltinID == ARM::BI__ldrexd) { 3880 Function *F; 3881 3882 switch (BuiltinID) { 3883 default: llvm_unreachable("unexpected builtin"); 3884 case ARM::BI__builtin_arm_ldaex: 3885 F = CGM.getIntrinsic(Intrinsic::arm_ldaexd); 3886 break; 3887 case ARM::BI__builtin_arm_ldrexd: 3888 case ARM::BI__builtin_arm_ldrex: 3889 case ARM::BI__ldrexd: 3890 F = CGM.getIntrinsic(Intrinsic::arm_ldrexd); 3891 break; 3892 } 3893 3894 Value *LdPtr = EmitScalarExpr(E->getArg(0)); 3895 Value *Val = Builder.CreateCall(F, Builder.CreateBitCast(LdPtr, Int8PtrTy), 3896 "ldrexd"); 3897 3898 Value *Val0 = Builder.CreateExtractValue(Val, 1); 3899 Value *Val1 = Builder.CreateExtractValue(Val, 0); 3900 Val0 = Builder.CreateZExt(Val0, Int64Ty); 3901 Val1 = Builder.CreateZExt(Val1, Int64Ty); 3902 3903 Value *ShiftCst = llvm::ConstantInt::get(Int64Ty, 32); 3904 Val = Builder.CreateShl(Val0, ShiftCst, "shl", true /* nuw */); 3905 Val = Builder.CreateOr(Val, Val1); 3906 return Builder.CreateBitCast(Val, ConvertType(E->getType())); 3907 } 3908 3909 if (BuiltinID == ARM::BI__builtin_arm_ldrex || 3910 BuiltinID == ARM::BI__builtin_arm_ldaex) { 3911 Value *LoadAddr = EmitScalarExpr(E->getArg(0)); 3912 3913 QualType Ty = E->getType(); 3914 llvm::Type *RealResTy = ConvertType(Ty); 3915 llvm::Type *IntResTy = llvm::IntegerType::get(getLLVMContext(), 3916 getContext().getTypeSize(Ty)); 3917 LoadAddr = Builder.CreateBitCast(LoadAddr, IntResTy->getPointerTo()); 3918 3919 Function *F = CGM.getIntrinsic(BuiltinID == ARM::BI__builtin_arm_ldaex 3920 ? Intrinsic::arm_ldaex 3921 : Intrinsic::arm_ldrex, 3922 LoadAddr->getType()); 3923 Value *Val = Builder.CreateCall(F, LoadAddr, "ldrex"); 3924 3925 if (RealResTy->isPointerTy()) 3926 return Builder.CreateIntToPtr(Val, RealResTy); 3927 else { 3928 Val = Builder.CreateTruncOrBitCast(Val, IntResTy); 3929 return Builder.CreateBitCast(Val, RealResTy); 3930 } 3931 } 3932 3933 if (BuiltinID == ARM::BI__builtin_arm_strexd || 3934 ((BuiltinID == ARM::BI__builtin_arm_stlex || 3935 BuiltinID == ARM::BI__builtin_arm_strex) && 3936 getContext().getTypeSize(E->getArg(0)->getType()) == 64)) { 3937 Function *F = CGM.getIntrinsic(BuiltinID == ARM::BI__builtin_arm_stlex 3938 ? Intrinsic::arm_stlexd 3939 : Intrinsic::arm_strexd); 3940 llvm::Type *STy = llvm::StructType::get(Int32Ty, Int32Ty, nullptr); 3941 3942 Address Tmp = CreateMemTemp(E->getArg(0)->getType()); 3943 Value *Val = EmitScalarExpr(E->getArg(0)); 3944 Builder.CreateStore(Val, Tmp); 3945 3946 Address LdPtr = Builder.CreateBitCast(Tmp,llvm::PointerType::getUnqual(STy)); 3947 Val = Builder.CreateLoad(LdPtr); 3948 3949 Value *Arg0 = Builder.CreateExtractValue(Val, 0); 3950 Value *Arg1 = Builder.CreateExtractValue(Val, 1); 3951 Value *StPtr = Builder.CreateBitCast(EmitScalarExpr(E->getArg(1)), Int8PtrTy); 3952 return Builder.CreateCall(F, {Arg0, Arg1, StPtr}, "strexd"); 3953 } 3954 3955 if (BuiltinID == ARM::BI__builtin_arm_strex || 3956 BuiltinID == ARM::BI__builtin_arm_stlex) { 3957 Value *StoreVal = EmitScalarExpr(E->getArg(0)); 3958 Value *StoreAddr = EmitScalarExpr(E->getArg(1)); 3959 3960 QualType Ty = E->getArg(0)->getType(); 3961 llvm::Type *StoreTy = llvm::IntegerType::get(getLLVMContext(), 3962 getContext().getTypeSize(Ty)); 3963 StoreAddr = Builder.CreateBitCast(StoreAddr, StoreTy->getPointerTo()); 3964 3965 if (StoreVal->getType()->isPointerTy()) 3966 StoreVal = Builder.CreatePtrToInt(StoreVal, Int32Ty); 3967 else { 3968 StoreVal = Builder.CreateBitCast(StoreVal, StoreTy); 3969 StoreVal = Builder.CreateZExtOrBitCast(StoreVal, Int32Ty); 3970 } 3971 3972 Function *F = CGM.getIntrinsic(BuiltinID == ARM::BI__builtin_arm_stlex 3973 ? Intrinsic::arm_stlex 3974 : Intrinsic::arm_strex, 3975 StoreAddr->getType()); 3976 return Builder.CreateCall(F, {StoreVal, StoreAddr}, "strex"); 3977 } 3978 3979 if (BuiltinID == ARM::BI__builtin_arm_clrex) { 3980 Function *F = CGM.getIntrinsic(Intrinsic::arm_clrex); 3981 return Builder.CreateCall(F); 3982 } 3983 3984 // CRC32 3985 Intrinsic::ID CRCIntrinsicID = Intrinsic::not_intrinsic; 3986 switch (BuiltinID) { 3987 case ARM::BI__builtin_arm_crc32b: 3988 CRCIntrinsicID = Intrinsic::arm_crc32b; break; 3989 case ARM::BI__builtin_arm_crc32cb: 3990 CRCIntrinsicID = Intrinsic::arm_crc32cb; break; 3991 case ARM::BI__builtin_arm_crc32h: 3992 CRCIntrinsicID = Intrinsic::arm_crc32h; break; 3993 case ARM::BI__builtin_arm_crc32ch: 3994 CRCIntrinsicID = Intrinsic::arm_crc32ch; break; 3995 case ARM::BI__builtin_arm_crc32w: 3996 case ARM::BI__builtin_arm_crc32d: 3997 CRCIntrinsicID = Intrinsic::arm_crc32w; break; 3998 case ARM::BI__builtin_arm_crc32cw: 3999 case ARM::BI__builtin_arm_crc32cd: 4000 CRCIntrinsicID = Intrinsic::arm_crc32cw; break; 4001 } 4002 4003 if (CRCIntrinsicID != Intrinsic::not_intrinsic) { 4004 Value *Arg0 = EmitScalarExpr(E->getArg(0)); 4005 Value *Arg1 = EmitScalarExpr(E->getArg(1)); 4006 4007 // crc32{c,}d intrinsics are implemnted as two calls to crc32{c,}w 4008 // intrinsics, hence we need different codegen for these cases. 4009 if (BuiltinID == ARM::BI__builtin_arm_crc32d || 4010 BuiltinID == ARM::BI__builtin_arm_crc32cd) { 4011 Value *C1 = llvm::ConstantInt::get(Int64Ty, 32); 4012 Value *Arg1a = Builder.CreateTruncOrBitCast(Arg1, Int32Ty); 4013 Value *Arg1b = Builder.CreateLShr(Arg1, C1); 4014 Arg1b = Builder.CreateTruncOrBitCast(Arg1b, Int32Ty); 4015 4016 Function *F = CGM.getIntrinsic(CRCIntrinsicID); 4017 Value *Res = Builder.CreateCall(F, {Arg0, Arg1a}); 4018 return Builder.CreateCall(F, {Res, Arg1b}); 4019 } else { 4020 Arg1 = Builder.CreateZExtOrBitCast(Arg1, Int32Ty); 4021 4022 Function *F = CGM.getIntrinsic(CRCIntrinsicID); 4023 return Builder.CreateCall(F, {Arg0, Arg1}); 4024 } 4025 } 4026 4027 if (BuiltinID == ARM::BI__builtin_arm_rsr || 4028 BuiltinID == ARM::BI__builtin_arm_rsr64 || 4029 BuiltinID == ARM::BI__builtin_arm_rsrp || 4030 BuiltinID == ARM::BI__builtin_arm_wsr || 4031 BuiltinID == ARM::BI__builtin_arm_wsr64 || 4032 BuiltinID == ARM::BI__builtin_arm_wsrp) { 4033 4034 bool IsRead = BuiltinID == ARM::BI__builtin_arm_rsr || 4035 BuiltinID == ARM::BI__builtin_arm_rsr64 || 4036 BuiltinID == ARM::BI__builtin_arm_rsrp; 4037 4038 bool IsPointerBuiltin = BuiltinID == ARM::BI__builtin_arm_rsrp || 4039 BuiltinID == ARM::BI__builtin_arm_wsrp; 4040 4041 bool Is64Bit = BuiltinID == ARM::BI__builtin_arm_rsr64 || 4042 BuiltinID == ARM::BI__builtin_arm_wsr64; 4043 4044 llvm::Type *ValueType; 4045 llvm::Type *RegisterType; 4046 if (IsPointerBuiltin) { 4047 ValueType = VoidPtrTy; 4048 RegisterType = Int32Ty; 4049 } else if (Is64Bit) { 4050 ValueType = RegisterType = Int64Ty; 4051 } else { 4052 ValueType = RegisterType = Int32Ty; 4053 } 4054 4055 return EmitSpecialRegisterBuiltin(*this, E, RegisterType, ValueType, IsRead); 4056 } 4057 4058 // Find out if any arguments are required to be integer constant 4059 // expressions. 4060 unsigned ICEArguments = 0; 4061 ASTContext::GetBuiltinTypeError Error; 4062 getContext().GetBuiltinType(BuiltinID, Error, &ICEArguments); 4063 assert(Error == ASTContext::GE_None && "Should not codegen an error"); 4064 4065 auto getAlignmentValue32 = [&](Address addr) -> Value* { 4066 return Builder.getInt32(addr.getAlignment().getQuantity()); 4067 }; 4068 4069 Address PtrOp0 = Address::invalid(); 4070 Address PtrOp1 = Address::invalid(); 4071 SmallVector<Value*, 4> Ops; 4072 bool HasExtraArg = HasExtraNeonArgument(BuiltinID); 4073 unsigned NumArgs = E->getNumArgs() - (HasExtraArg ? 1 : 0); 4074 for (unsigned i = 0, e = NumArgs; i != e; i++) { 4075 if (i == 0) { 4076 switch (BuiltinID) { 4077 case NEON::BI__builtin_neon_vld1_v: 4078 case NEON::BI__builtin_neon_vld1q_v: 4079 case NEON::BI__builtin_neon_vld1q_lane_v: 4080 case NEON::BI__builtin_neon_vld1_lane_v: 4081 case NEON::BI__builtin_neon_vld1_dup_v: 4082 case NEON::BI__builtin_neon_vld1q_dup_v: 4083 case NEON::BI__builtin_neon_vst1_v: 4084 case NEON::BI__builtin_neon_vst1q_v: 4085 case NEON::BI__builtin_neon_vst1q_lane_v: 4086 case NEON::BI__builtin_neon_vst1_lane_v: 4087 case NEON::BI__builtin_neon_vst2_v: 4088 case NEON::BI__builtin_neon_vst2q_v: 4089 case NEON::BI__builtin_neon_vst2_lane_v: 4090 case NEON::BI__builtin_neon_vst2q_lane_v: 4091 case NEON::BI__builtin_neon_vst3_v: 4092 case NEON::BI__builtin_neon_vst3q_v: 4093 case NEON::BI__builtin_neon_vst3_lane_v: 4094 case NEON::BI__builtin_neon_vst3q_lane_v: 4095 case NEON::BI__builtin_neon_vst4_v: 4096 case NEON::BI__builtin_neon_vst4q_v: 4097 case NEON::BI__builtin_neon_vst4_lane_v: 4098 case NEON::BI__builtin_neon_vst4q_lane_v: 4099 // Get the alignment for the argument in addition to the value; 4100 // we'll use it later. 4101 PtrOp0 = EmitPointerWithAlignment(E->getArg(0)); 4102 Ops.push_back(PtrOp0.getPointer()); 4103 continue; 4104 } 4105 } 4106 if (i == 1) { 4107 switch (BuiltinID) { 4108 case NEON::BI__builtin_neon_vld2_v: 4109 case NEON::BI__builtin_neon_vld2q_v: 4110 case NEON::BI__builtin_neon_vld3_v: 4111 case NEON::BI__builtin_neon_vld3q_v: 4112 case NEON::BI__builtin_neon_vld4_v: 4113 case NEON::BI__builtin_neon_vld4q_v: 4114 case NEON::BI__builtin_neon_vld2_lane_v: 4115 case NEON::BI__builtin_neon_vld2q_lane_v: 4116 case NEON::BI__builtin_neon_vld3_lane_v: 4117 case NEON::BI__builtin_neon_vld3q_lane_v: 4118 case NEON::BI__builtin_neon_vld4_lane_v: 4119 case NEON::BI__builtin_neon_vld4q_lane_v: 4120 case NEON::BI__builtin_neon_vld2_dup_v: 4121 case NEON::BI__builtin_neon_vld3_dup_v: 4122 case NEON::BI__builtin_neon_vld4_dup_v: 4123 // Get the alignment for the argument in addition to the value; 4124 // we'll use it later. 4125 PtrOp1 = EmitPointerWithAlignment(E->getArg(1)); 4126 Ops.push_back(PtrOp1.getPointer()); 4127 continue; 4128 } 4129 } 4130 4131 if ((ICEArguments & (1 << i)) == 0) { 4132 Ops.push_back(EmitScalarExpr(E->getArg(i))); 4133 } else { 4134 // If this is required to be a constant, constant fold it so that we know 4135 // that the generated intrinsic gets a ConstantInt. 4136 llvm::APSInt Result; 4137 bool IsConst = E->getArg(i)->isIntegerConstantExpr(Result, getContext()); 4138 assert(IsConst && "Constant arg isn't actually constant?"); (void)IsConst; 4139 Ops.push_back(llvm::ConstantInt::get(getLLVMContext(), Result)); 4140 } 4141 } 4142 4143 switch (BuiltinID) { 4144 default: break; 4145 4146 case NEON::BI__builtin_neon_vget_lane_i8: 4147 case NEON::BI__builtin_neon_vget_lane_i16: 4148 case NEON::BI__builtin_neon_vget_lane_i32: 4149 case NEON::BI__builtin_neon_vget_lane_i64: 4150 case NEON::BI__builtin_neon_vget_lane_f32: 4151 case NEON::BI__builtin_neon_vgetq_lane_i8: 4152 case NEON::BI__builtin_neon_vgetq_lane_i16: 4153 case NEON::BI__builtin_neon_vgetq_lane_i32: 4154 case NEON::BI__builtin_neon_vgetq_lane_i64: 4155 case NEON::BI__builtin_neon_vgetq_lane_f32: 4156 return Builder.CreateExtractElement(Ops[0], Ops[1], "vget_lane"); 4157 4158 case NEON::BI__builtin_neon_vset_lane_i8: 4159 case NEON::BI__builtin_neon_vset_lane_i16: 4160 case NEON::BI__builtin_neon_vset_lane_i32: 4161 case NEON::BI__builtin_neon_vset_lane_i64: 4162 case NEON::BI__builtin_neon_vset_lane_f32: 4163 case NEON::BI__builtin_neon_vsetq_lane_i8: 4164 case NEON::BI__builtin_neon_vsetq_lane_i16: 4165 case NEON::BI__builtin_neon_vsetq_lane_i32: 4166 case NEON::BI__builtin_neon_vsetq_lane_i64: 4167 case NEON::BI__builtin_neon_vsetq_lane_f32: 4168 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vset_lane"); 4169 4170 case NEON::BI__builtin_neon_vsha1h_u32: 4171 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_sha1h), Ops, 4172 "vsha1h"); 4173 case NEON::BI__builtin_neon_vsha1cq_u32: 4174 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_sha1c), Ops, 4175 "vsha1h"); 4176 case NEON::BI__builtin_neon_vsha1pq_u32: 4177 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_sha1p), Ops, 4178 "vsha1h"); 4179 case NEON::BI__builtin_neon_vsha1mq_u32: 4180 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_sha1m), Ops, 4181 "vsha1h"); 4182 4183 // The ARM _MoveToCoprocessor builtins put the input register value as 4184 // the first argument, but the LLVM intrinsic expects it as the third one. 4185 case ARM::BI_MoveToCoprocessor: 4186 case ARM::BI_MoveToCoprocessor2: { 4187 Function *F = CGM.getIntrinsic(BuiltinID == ARM::BI_MoveToCoprocessor ? 4188 Intrinsic::arm_mcr : Intrinsic::arm_mcr2); 4189 return Builder.CreateCall(F, {Ops[1], Ops[2], Ops[0], 4190 Ops[3], Ops[4], Ops[5]}); 4191 } 4192 } 4193 4194 // Get the last argument, which specifies the vector type. 4195 assert(HasExtraArg); 4196 llvm::APSInt Result; 4197 const Expr *Arg = E->getArg(E->getNumArgs()-1); 4198 if (!Arg->isIntegerConstantExpr(Result, getContext())) 4199 return nullptr; 4200 4201 if (BuiltinID == ARM::BI__builtin_arm_vcvtr_f || 4202 BuiltinID == ARM::BI__builtin_arm_vcvtr_d) { 4203 // Determine the overloaded type of this builtin. 4204 llvm::Type *Ty; 4205 if (BuiltinID == ARM::BI__builtin_arm_vcvtr_f) 4206 Ty = FloatTy; 4207 else 4208 Ty = DoubleTy; 4209 4210 // Determine whether this is an unsigned conversion or not. 4211 bool usgn = Result.getZExtValue() == 1; 4212 unsigned Int = usgn ? Intrinsic::arm_vcvtru : Intrinsic::arm_vcvtr; 4213 4214 // Call the appropriate intrinsic. 4215 Function *F = CGM.getIntrinsic(Int, Ty); 4216 return Builder.CreateCall(F, Ops, "vcvtr"); 4217 } 4218 4219 // Determine the type of this overloaded NEON intrinsic. 4220 NeonTypeFlags Type(Result.getZExtValue()); 4221 bool usgn = Type.isUnsigned(); 4222 bool rightShift = false; 4223 4224 llvm::VectorType *VTy = GetNeonType(this, Type); 4225 llvm::Type *Ty = VTy; 4226 if (!Ty) 4227 return nullptr; 4228 4229 // Many NEON builtins have identical semantics and uses in ARM and 4230 // AArch64. Emit these in a single function. 4231 auto IntrinsicMap = makeArrayRef(ARMSIMDIntrinsicMap); 4232 const NeonIntrinsicInfo *Builtin = findNeonIntrinsicInMap( 4233 IntrinsicMap, BuiltinID, NEONSIMDIntrinsicsProvenSorted); 4234 if (Builtin) 4235 return EmitCommonNeonBuiltinExpr( 4236 Builtin->BuiltinID, Builtin->LLVMIntrinsic, Builtin->AltLLVMIntrinsic, 4237 Builtin->NameHint, Builtin->TypeModifier, E, Ops, PtrOp0, PtrOp1); 4238 4239 unsigned Int; 4240 switch (BuiltinID) { 4241 default: return nullptr; 4242 case NEON::BI__builtin_neon_vld1q_lane_v: 4243 // Handle 64-bit integer elements as a special case. Use shuffles of 4244 // one-element vectors to avoid poor code for i64 in the backend. 4245 if (VTy->getElementType()->isIntegerTy(64)) { 4246 // Extract the other lane. 4247 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 4248 uint32_t Lane = cast<ConstantInt>(Ops[2])->getZExtValue(); 4249 Value *SV = llvm::ConstantVector::get(ConstantInt::get(Int32Ty, 1-Lane)); 4250 Ops[1] = Builder.CreateShuffleVector(Ops[1], Ops[1], SV); 4251 // Load the value as a one-element vector. 4252 Ty = llvm::VectorType::get(VTy->getElementType(), 1); 4253 llvm::Type *Tys[] = {Ty, Int8PtrTy}; 4254 Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld1, Tys); 4255 Value *Align = getAlignmentValue32(PtrOp0); 4256 Value *Ld = Builder.CreateCall(F, {Ops[0], Align}); 4257 // Combine them. 4258 uint32_t Indices[] = {1 - Lane, Lane}; 4259 SV = llvm::ConstantDataVector::get(getLLVMContext(), Indices); 4260 return Builder.CreateShuffleVector(Ops[1], Ld, SV, "vld1q_lane"); 4261 } 4262 // fall through 4263 case NEON::BI__builtin_neon_vld1_lane_v: { 4264 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 4265 PtrOp0 = Builder.CreateElementBitCast(PtrOp0, VTy->getElementType()); 4266 Value *Ld = Builder.CreateLoad(PtrOp0); 4267 return Builder.CreateInsertElement(Ops[1], Ld, Ops[2], "vld1_lane"); 4268 } 4269 case NEON::BI__builtin_neon_vld2_dup_v: 4270 case NEON::BI__builtin_neon_vld3_dup_v: 4271 case NEON::BI__builtin_neon_vld4_dup_v: { 4272 // Handle 64-bit elements as a special-case. There is no "dup" needed. 4273 if (VTy->getElementType()->getPrimitiveSizeInBits() == 64) { 4274 switch (BuiltinID) { 4275 case NEON::BI__builtin_neon_vld2_dup_v: 4276 Int = Intrinsic::arm_neon_vld2; 4277 break; 4278 case NEON::BI__builtin_neon_vld3_dup_v: 4279 Int = Intrinsic::arm_neon_vld3; 4280 break; 4281 case NEON::BI__builtin_neon_vld4_dup_v: 4282 Int = Intrinsic::arm_neon_vld4; 4283 break; 4284 default: llvm_unreachable("unknown vld_dup intrinsic?"); 4285 } 4286 llvm::Type *Tys[] = {Ty, Int8PtrTy}; 4287 Function *F = CGM.getIntrinsic(Int, Tys); 4288 llvm::Value *Align = getAlignmentValue32(PtrOp1); 4289 Ops[1] = Builder.CreateCall(F, {Ops[1], Align}, "vld_dup"); 4290 Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); 4291 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 4292 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 4293 } 4294 switch (BuiltinID) { 4295 case NEON::BI__builtin_neon_vld2_dup_v: 4296 Int = Intrinsic::arm_neon_vld2lane; 4297 break; 4298 case NEON::BI__builtin_neon_vld3_dup_v: 4299 Int = Intrinsic::arm_neon_vld3lane; 4300 break; 4301 case NEON::BI__builtin_neon_vld4_dup_v: 4302 Int = Intrinsic::arm_neon_vld4lane; 4303 break; 4304 default: llvm_unreachable("unknown vld_dup intrinsic?"); 4305 } 4306 llvm::Type *Tys[] = {Ty, Int8PtrTy}; 4307 Function *F = CGM.getIntrinsic(Int, Tys); 4308 llvm::StructType *STy = cast<llvm::StructType>(F->getReturnType()); 4309 4310 SmallVector<Value*, 6> Args; 4311 Args.push_back(Ops[1]); 4312 Args.append(STy->getNumElements(), UndefValue::get(Ty)); 4313 4314 llvm::Constant *CI = ConstantInt::get(Int32Ty, 0); 4315 Args.push_back(CI); 4316 Args.push_back(getAlignmentValue32(PtrOp1)); 4317 4318 Ops[1] = Builder.CreateCall(F, Args, "vld_dup"); 4319 // splat lane 0 to all elts in each vector of the result. 4320 for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) { 4321 Value *Val = Builder.CreateExtractValue(Ops[1], i); 4322 Value *Elt = Builder.CreateBitCast(Val, Ty); 4323 Elt = EmitNeonSplat(Elt, CI); 4324 Elt = Builder.CreateBitCast(Elt, Val->getType()); 4325 Ops[1] = Builder.CreateInsertValue(Ops[1], Elt, i); 4326 } 4327 Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); 4328 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 4329 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 4330 } 4331 case NEON::BI__builtin_neon_vqrshrn_n_v: 4332 Int = 4333 usgn ? Intrinsic::arm_neon_vqrshiftnu : Intrinsic::arm_neon_vqrshiftns; 4334 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqrshrn_n", 4335 1, true); 4336 case NEON::BI__builtin_neon_vqrshrun_n_v: 4337 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqrshiftnsu, Ty), 4338 Ops, "vqrshrun_n", 1, true); 4339 case NEON::BI__builtin_neon_vqshrn_n_v: 4340 Int = usgn ? Intrinsic::arm_neon_vqshiftnu : Intrinsic::arm_neon_vqshiftns; 4341 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshrn_n", 4342 1, true); 4343 case NEON::BI__builtin_neon_vqshrun_n_v: 4344 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqshiftnsu, Ty), 4345 Ops, "vqshrun_n", 1, true); 4346 case NEON::BI__builtin_neon_vrecpe_v: 4347 case NEON::BI__builtin_neon_vrecpeq_v: 4348 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrecpe, Ty), 4349 Ops, "vrecpe"); 4350 case NEON::BI__builtin_neon_vrshrn_n_v: 4351 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrshiftn, Ty), 4352 Ops, "vrshrn_n", 1, true); 4353 case NEON::BI__builtin_neon_vrsra_n_v: 4354 case NEON::BI__builtin_neon_vrsraq_n_v: 4355 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 4356 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 4357 Ops[2] = EmitNeonShiftVector(Ops[2], Ty, true); 4358 Int = usgn ? Intrinsic::arm_neon_vrshiftu : Intrinsic::arm_neon_vrshifts; 4359 Ops[1] = Builder.CreateCall(CGM.getIntrinsic(Int, Ty), {Ops[1], Ops[2]}); 4360 return Builder.CreateAdd(Ops[0], Ops[1], "vrsra_n"); 4361 case NEON::BI__builtin_neon_vsri_n_v: 4362 case NEON::BI__builtin_neon_vsriq_n_v: 4363 rightShift = true; 4364 case NEON::BI__builtin_neon_vsli_n_v: 4365 case NEON::BI__builtin_neon_vsliq_n_v: 4366 Ops[2] = EmitNeonShiftVector(Ops[2], Ty, rightShift); 4367 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vshiftins, Ty), 4368 Ops, "vsli_n"); 4369 case NEON::BI__builtin_neon_vsra_n_v: 4370 case NEON::BI__builtin_neon_vsraq_n_v: 4371 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 4372 Ops[1] = EmitNeonRShiftImm(Ops[1], Ops[2], Ty, usgn, "vsra_n"); 4373 return Builder.CreateAdd(Ops[0], Ops[1]); 4374 case NEON::BI__builtin_neon_vst1q_lane_v: 4375 // Handle 64-bit integer elements as a special case. Use a shuffle to get 4376 // a one-element vector and avoid poor code for i64 in the backend. 4377 if (VTy->getElementType()->isIntegerTy(64)) { 4378 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 4379 Value *SV = llvm::ConstantVector::get(cast<llvm::Constant>(Ops[2])); 4380 Ops[1] = Builder.CreateShuffleVector(Ops[1], Ops[1], SV); 4381 Ops[2] = getAlignmentValue32(PtrOp0); 4382 llvm::Type *Tys[] = {Int8PtrTy, Ops[1]->getType()}; 4383 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst1, 4384 Tys), Ops); 4385 } 4386 // fall through 4387 case NEON::BI__builtin_neon_vst1_lane_v: { 4388 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 4389 Ops[1] = Builder.CreateExtractElement(Ops[1], Ops[2]); 4390 Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); 4391 auto St = Builder.CreateStore(Ops[1], Builder.CreateBitCast(PtrOp0, Ty)); 4392 return St; 4393 } 4394 case NEON::BI__builtin_neon_vtbl1_v: 4395 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl1), 4396 Ops, "vtbl1"); 4397 case NEON::BI__builtin_neon_vtbl2_v: 4398 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl2), 4399 Ops, "vtbl2"); 4400 case NEON::BI__builtin_neon_vtbl3_v: 4401 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl3), 4402 Ops, "vtbl3"); 4403 case NEON::BI__builtin_neon_vtbl4_v: 4404 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl4), 4405 Ops, "vtbl4"); 4406 case NEON::BI__builtin_neon_vtbx1_v: 4407 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx1), 4408 Ops, "vtbx1"); 4409 case NEON::BI__builtin_neon_vtbx2_v: 4410 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx2), 4411 Ops, "vtbx2"); 4412 case NEON::BI__builtin_neon_vtbx3_v: 4413 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx3), 4414 Ops, "vtbx3"); 4415 case NEON::BI__builtin_neon_vtbx4_v: 4416 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx4), 4417 Ops, "vtbx4"); 4418 } 4419 } 4420 4421 static Value *EmitAArch64TblBuiltinExpr(CodeGenFunction &CGF, unsigned BuiltinID, 4422 const CallExpr *E, 4423 SmallVectorImpl<Value *> &Ops) { 4424 unsigned int Int = 0; 4425 const char *s = nullptr; 4426 4427 switch (BuiltinID) { 4428 default: 4429 return nullptr; 4430 case NEON::BI__builtin_neon_vtbl1_v: 4431 case NEON::BI__builtin_neon_vqtbl1_v: 4432 case NEON::BI__builtin_neon_vqtbl1q_v: 4433 case NEON::BI__builtin_neon_vtbl2_v: 4434 case NEON::BI__builtin_neon_vqtbl2_v: 4435 case NEON::BI__builtin_neon_vqtbl2q_v: 4436 case NEON::BI__builtin_neon_vtbl3_v: 4437 case NEON::BI__builtin_neon_vqtbl3_v: 4438 case NEON::BI__builtin_neon_vqtbl3q_v: 4439 case NEON::BI__builtin_neon_vtbl4_v: 4440 case NEON::BI__builtin_neon_vqtbl4_v: 4441 case NEON::BI__builtin_neon_vqtbl4q_v: 4442 break; 4443 case NEON::BI__builtin_neon_vtbx1_v: 4444 case NEON::BI__builtin_neon_vqtbx1_v: 4445 case NEON::BI__builtin_neon_vqtbx1q_v: 4446 case NEON::BI__builtin_neon_vtbx2_v: 4447 case NEON::BI__builtin_neon_vqtbx2_v: 4448 case NEON::BI__builtin_neon_vqtbx2q_v: 4449 case NEON::BI__builtin_neon_vtbx3_v: 4450 case NEON::BI__builtin_neon_vqtbx3_v: 4451 case NEON::BI__builtin_neon_vqtbx3q_v: 4452 case NEON::BI__builtin_neon_vtbx4_v: 4453 case NEON::BI__builtin_neon_vqtbx4_v: 4454 case NEON::BI__builtin_neon_vqtbx4q_v: 4455 break; 4456 } 4457 4458 assert(E->getNumArgs() >= 3); 4459 4460 // Get the last argument, which specifies the vector type. 4461 llvm::APSInt Result; 4462 const Expr *Arg = E->getArg(E->getNumArgs() - 1); 4463 if (!Arg->isIntegerConstantExpr(Result, CGF.getContext())) 4464 return nullptr; 4465 4466 // Determine the type of this overloaded NEON intrinsic. 4467 NeonTypeFlags Type(Result.getZExtValue()); 4468 llvm::VectorType *Ty = GetNeonType(&CGF, Type); 4469 if (!Ty) 4470 return nullptr; 4471 4472 CodeGen::CGBuilderTy &Builder = CGF.Builder; 4473 4474 // AArch64 scalar builtins are not overloaded, they do not have an extra 4475 // argument that specifies the vector type, need to handle each case. 4476 switch (BuiltinID) { 4477 case NEON::BI__builtin_neon_vtbl1_v: { 4478 return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 1), nullptr, 4479 Ops[1], Ty, Intrinsic::aarch64_neon_tbl1, 4480 "vtbl1"); 4481 } 4482 case NEON::BI__builtin_neon_vtbl2_v: { 4483 return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 2), nullptr, 4484 Ops[2], Ty, Intrinsic::aarch64_neon_tbl1, 4485 "vtbl1"); 4486 } 4487 case NEON::BI__builtin_neon_vtbl3_v: { 4488 return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 3), nullptr, 4489 Ops[3], Ty, Intrinsic::aarch64_neon_tbl2, 4490 "vtbl2"); 4491 } 4492 case NEON::BI__builtin_neon_vtbl4_v: { 4493 return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 4), nullptr, 4494 Ops[4], Ty, Intrinsic::aarch64_neon_tbl2, 4495 "vtbl2"); 4496 } 4497 case NEON::BI__builtin_neon_vtbx1_v: { 4498 Value *TblRes = 4499 packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 1), nullptr, Ops[2], 4500 Ty, Intrinsic::aarch64_neon_tbl1, "vtbl1"); 4501 4502 llvm::Constant *EightV = ConstantInt::get(Ty, 8); 4503 Value *CmpRes = Builder.CreateICmp(ICmpInst::ICMP_UGE, Ops[2], EightV); 4504 CmpRes = Builder.CreateSExt(CmpRes, Ty); 4505 4506 Value *EltsFromInput = Builder.CreateAnd(CmpRes, Ops[0]); 4507 Value *EltsFromTbl = Builder.CreateAnd(Builder.CreateNot(CmpRes), TblRes); 4508 return Builder.CreateOr(EltsFromInput, EltsFromTbl, "vtbx"); 4509 } 4510 case NEON::BI__builtin_neon_vtbx2_v: { 4511 return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 2), Ops[0], 4512 Ops[3], Ty, Intrinsic::aarch64_neon_tbx1, 4513 "vtbx1"); 4514 } 4515 case NEON::BI__builtin_neon_vtbx3_v: { 4516 Value *TblRes = 4517 packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 3), nullptr, Ops[4], 4518 Ty, Intrinsic::aarch64_neon_tbl2, "vtbl2"); 4519 4520 llvm::Constant *TwentyFourV = ConstantInt::get(Ty, 24); 4521 Value *CmpRes = Builder.CreateICmp(ICmpInst::ICMP_UGE, Ops[4], 4522 TwentyFourV); 4523 CmpRes = Builder.CreateSExt(CmpRes, Ty); 4524 4525 Value *EltsFromInput = Builder.CreateAnd(CmpRes, Ops[0]); 4526 Value *EltsFromTbl = Builder.CreateAnd(Builder.CreateNot(CmpRes), TblRes); 4527 return Builder.CreateOr(EltsFromInput, EltsFromTbl, "vtbx"); 4528 } 4529 case NEON::BI__builtin_neon_vtbx4_v: { 4530 return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 4), Ops[0], 4531 Ops[5], Ty, Intrinsic::aarch64_neon_tbx2, 4532 "vtbx2"); 4533 } 4534 case NEON::BI__builtin_neon_vqtbl1_v: 4535 case NEON::BI__builtin_neon_vqtbl1q_v: 4536 Int = Intrinsic::aarch64_neon_tbl1; s = "vtbl1"; break; 4537 case NEON::BI__builtin_neon_vqtbl2_v: 4538 case NEON::BI__builtin_neon_vqtbl2q_v: { 4539 Int = Intrinsic::aarch64_neon_tbl2; s = "vtbl2"; break; 4540 case NEON::BI__builtin_neon_vqtbl3_v: 4541 case NEON::BI__builtin_neon_vqtbl3q_v: 4542 Int = Intrinsic::aarch64_neon_tbl3; s = "vtbl3"; break; 4543 case NEON::BI__builtin_neon_vqtbl4_v: 4544 case NEON::BI__builtin_neon_vqtbl4q_v: 4545 Int = Intrinsic::aarch64_neon_tbl4; s = "vtbl4"; break; 4546 case NEON::BI__builtin_neon_vqtbx1_v: 4547 case NEON::BI__builtin_neon_vqtbx1q_v: 4548 Int = Intrinsic::aarch64_neon_tbx1; s = "vtbx1"; break; 4549 case NEON::BI__builtin_neon_vqtbx2_v: 4550 case NEON::BI__builtin_neon_vqtbx2q_v: 4551 Int = Intrinsic::aarch64_neon_tbx2; s = "vtbx2"; break; 4552 case NEON::BI__builtin_neon_vqtbx3_v: 4553 case NEON::BI__builtin_neon_vqtbx3q_v: 4554 Int = Intrinsic::aarch64_neon_tbx3; s = "vtbx3"; break; 4555 case NEON::BI__builtin_neon_vqtbx4_v: 4556 case NEON::BI__builtin_neon_vqtbx4q_v: 4557 Int = Intrinsic::aarch64_neon_tbx4; s = "vtbx4"; break; 4558 } 4559 } 4560 4561 if (!Int) 4562 return nullptr; 4563 4564 Function *F = CGF.CGM.getIntrinsic(Int, Ty); 4565 return CGF.EmitNeonCall(F, Ops, s); 4566 } 4567 4568 Value *CodeGenFunction::vectorWrapScalar16(Value *Op) { 4569 llvm::Type *VTy = llvm::VectorType::get(Int16Ty, 4); 4570 Op = Builder.CreateBitCast(Op, Int16Ty); 4571 Value *V = UndefValue::get(VTy); 4572 llvm::Constant *CI = ConstantInt::get(SizeTy, 0); 4573 Op = Builder.CreateInsertElement(V, Op, CI); 4574 return Op; 4575 } 4576 4577 Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, 4578 const CallExpr *E) { 4579 unsigned HintID = static_cast<unsigned>(-1); 4580 switch (BuiltinID) { 4581 default: break; 4582 case AArch64::BI__builtin_arm_nop: 4583 HintID = 0; 4584 break; 4585 case AArch64::BI__builtin_arm_yield: 4586 HintID = 1; 4587 break; 4588 case AArch64::BI__builtin_arm_wfe: 4589 HintID = 2; 4590 break; 4591 case AArch64::BI__builtin_arm_wfi: 4592 HintID = 3; 4593 break; 4594 case AArch64::BI__builtin_arm_sev: 4595 HintID = 4; 4596 break; 4597 case AArch64::BI__builtin_arm_sevl: 4598 HintID = 5; 4599 break; 4600 } 4601 4602 if (HintID != static_cast<unsigned>(-1)) { 4603 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_hint); 4604 return Builder.CreateCall(F, llvm::ConstantInt::get(Int32Ty, HintID)); 4605 } 4606 4607 if (BuiltinID == AArch64::BI__builtin_arm_prefetch) { 4608 Value *Address = EmitScalarExpr(E->getArg(0)); 4609 Value *RW = EmitScalarExpr(E->getArg(1)); 4610 Value *CacheLevel = EmitScalarExpr(E->getArg(2)); 4611 Value *RetentionPolicy = EmitScalarExpr(E->getArg(3)); 4612 Value *IsData = EmitScalarExpr(E->getArg(4)); 4613 4614 Value *Locality = nullptr; 4615 if (cast<llvm::ConstantInt>(RetentionPolicy)->isZero()) { 4616 // Temporal fetch, needs to convert cache level to locality. 4617 Locality = llvm::ConstantInt::get(Int32Ty, 4618 -cast<llvm::ConstantInt>(CacheLevel)->getValue() + 3); 4619 } else { 4620 // Streaming fetch. 4621 Locality = llvm::ConstantInt::get(Int32Ty, 0); 4622 } 4623 4624 // FIXME: We need AArch64 specific LLVM intrinsic if we want to specify 4625 // PLDL3STRM or PLDL2STRM. 4626 Value *F = CGM.getIntrinsic(Intrinsic::prefetch); 4627 return Builder.CreateCall(F, {Address, RW, Locality, IsData}); 4628 } 4629 4630 if (BuiltinID == AArch64::BI__builtin_arm_rbit) { 4631 assert((getContext().getTypeSize(E->getType()) == 32) && 4632 "rbit of unusual size!"); 4633 llvm::Value *Arg = EmitScalarExpr(E->getArg(0)); 4634 return Builder.CreateCall( 4635 CGM.getIntrinsic(Intrinsic::aarch64_rbit, Arg->getType()), Arg, "rbit"); 4636 } 4637 if (BuiltinID == AArch64::BI__builtin_arm_rbit64) { 4638 assert((getContext().getTypeSize(E->getType()) == 64) && 4639 "rbit of unusual size!"); 4640 llvm::Value *Arg = EmitScalarExpr(E->getArg(0)); 4641 return Builder.CreateCall( 4642 CGM.getIntrinsic(Intrinsic::aarch64_rbit, Arg->getType()), Arg, "rbit"); 4643 } 4644 4645 if (BuiltinID == AArch64::BI__clear_cache) { 4646 assert(E->getNumArgs() == 2 && "__clear_cache takes 2 arguments"); 4647 const FunctionDecl *FD = E->getDirectCallee(); 4648 Value *Ops[2]; 4649 for (unsigned i = 0; i < 2; i++) 4650 Ops[i] = EmitScalarExpr(E->getArg(i)); 4651 llvm::Type *Ty = CGM.getTypes().ConvertType(FD->getType()); 4652 llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty); 4653 StringRef Name = FD->getName(); 4654 return EmitNounwindRuntimeCall(CGM.CreateRuntimeFunction(FTy, Name), Ops); 4655 } 4656 4657 if ((BuiltinID == AArch64::BI__builtin_arm_ldrex || 4658 BuiltinID == AArch64::BI__builtin_arm_ldaex) && 4659 getContext().getTypeSize(E->getType()) == 128) { 4660 Function *F = CGM.getIntrinsic(BuiltinID == AArch64::BI__builtin_arm_ldaex 4661 ? Intrinsic::aarch64_ldaxp 4662 : Intrinsic::aarch64_ldxp); 4663 4664 Value *LdPtr = EmitScalarExpr(E->getArg(0)); 4665 Value *Val = Builder.CreateCall(F, Builder.CreateBitCast(LdPtr, Int8PtrTy), 4666 "ldxp"); 4667 4668 Value *Val0 = Builder.CreateExtractValue(Val, 1); 4669 Value *Val1 = Builder.CreateExtractValue(Val, 0); 4670 llvm::Type *Int128Ty = llvm::IntegerType::get(getLLVMContext(), 128); 4671 Val0 = Builder.CreateZExt(Val0, Int128Ty); 4672 Val1 = Builder.CreateZExt(Val1, Int128Ty); 4673 4674 Value *ShiftCst = llvm::ConstantInt::get(Int128Ty, 64); 4675 Val = Builder.CreateShl(Val0, ShiftCst, "shl", true /* nuw */); 4676 Val = Builder.CreateOr(Val, Val1); 4677 return Builder.CreateBitCast(Val, ConvertType(E->getType())); 4678 } else if (BuiltinID == AArch64::BI__builtin_arm_ldrex || 4679 BuiltinID == AArch64::BI__builtin_arm_ldaex) { 4680 Value *LoadAddr = EmitScalarExpr(E->getArg(0)); 4681 4682 QualType Ty = E->getType(); 4683 llvm::Type *RealResTy = ConvertType(Ty); 4684 llvm::Type *IntResTy = llvm::IntegerType::get(getLLVMContext(), 4685 getContext().getTypeSize(Ty)); 4686 LoadAddr = Builder.CreateBitCast(LoadAddr, IntResTy->getPointerTo()); 4687 4688 Function *F = CGM.getIntrinsic(BuiltinID == AArch64::BI__builtin_arm_ldaex 4689 ? Intrinsic::aarch64_ldaxr 4690 : Intrinsic::aarch64_ldxr, 4691 LoadAddr->getType()); 4692 Value *Val = Builder.CreateCall(F, LoadAddr, "ldxr"); 4693 4694 if (RealResTy->isPointerTy()) 4695 return Builder.CreateIntToPtr(Val, RealResTy); 4696 4697 Val = Builder.CreateTruncOrBitCast(Val, IntResTy); 4698 return Builder.CreateBitCast(Val, RealResTy); 4699 } 4700 4701 if ((BuiltinID == AArch64::BI__builtin_arm_strex || 4702 BuiltinID == AArch64::BI__builtin_arm_stlex) && 4703 getContext().getTypeSize(E->getArg(0)->getType()) == 128) { 4704 Function *F = CGM.getIntrinsic(BuiltinID == AArch64::BI__builtin_arm_stlex 4705 ? Intrinsic::aarch64_stlxp 4706 : Intrinsic::aarch64_stxp); 4707 llvm::Type *STy = llvm::StructType::get(Int64Ty, Int64Ty, nullptr); 4708 4709 Address Tmp = CreateMemTemp(E->getArg(0)->getType()); 4710 EmitAnyExprToMem(E->getArg(0), Tmp, Qualifiers(), /*init*/ true); 4711 4712 Tmp = Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(STy)); 4713 llvm::Value *Val = Builder.CreateLoad(Tmp); 4714 4715 Value *Arg0 = Builder.CreateExtractValue(Val, 0); 4716 Value *Arg1 = Builder.CreateExtractValue(Val, 1); 4717 Value *StPtr = Builder.CreateBitCast(EmitScalarExpr(E->getArg(1)), 4718 Int8PtrTy); 4719 return Builder.CreateCall(F, {Arg0, Arg1, StPtr}, "stxp"); 4720 } 4721 4722 if (BuiltinID == AArch64::BI__builtin_arm_strex || 4723 BuiltinID == AArch64::BI__builtin_arm_stlex) { 4724 Value *StoreVal = EmitScalarExpr(E->getArg(0)); 4725 Value *StoreAddr = EmitScalarExpr(E->getArg(1)); 4726 4727 QualType Ty = E->getArg(0)->getType(); 4728 llvm::Type *StoreTy = llvm::IntegerType::get(getLLVMContext(), 4729 getContext().getTypeSize(Ty)); 4730 StoreAddr = Builder.CreateBitCast(StoreAddr, StoreTy->getPointerTo()); 4731 4732 if (StoreVal->getType()->isPointerTy()) 4733 StoreVal = Builder.CreatePtrToInt(StoreVal, Int64Ty); 4734 else { 4735 StoreVal = Builder.CreateBitCast(StoreVal, StoreTy); 4736 StoreVal = Builder.CreateZExtOrBitCast(StoreVal, Int64Ty); 4737 } 4738 4739 Function *F = CGM.getIntrinsic(BuiltinID == AArch64::BI__builtin_arm_stlex 4740 ? Intrinsic::aarch64_stlxr 4741 : Intrinsic::aarch64_stxr, 4742 StoreAddr->getType()); 4743 return Builder.CreateCall(F, {StoreVal, StoreAddr}, "stxr"); 4744 } 4745 4746 if (BuiltinID == AArch64::BI__builtin_arm_clrex) { 4747 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_clrex); 4748 return Builder.CreateCall(F); 4749 } 4750 4751 // CRC32 4752 Intrinsic::ID CRCIntrinsicID = Intrinsic::not_intrinsic; 4753 switch (BuiltinID) { 4754 case AArch64::BI__builtin_arm_crc32b: 4755 CRCIntrinsicID = Intrinsic::aarch64_crc32b; break; 4756 case AArch64::BI__builtin_arm_crc32cb: 4757 CRCIntrinsicID = Intrinsic::aarch64_crc32cb; break; 4758 case AArch64::BI__builtin_arm_crc32h: 4759 CRCIntrinsicID = Intrinsic::aarch64_crc32h; break; 4760 case AArch64::BI__builtin_arm_crc32ch: 4761 CRCIntrinsicID = Intrinsic::aarch64_crc32ch; break; 4762 case AArch64::BI__builtin_arm_crc32w: 4763 CRCIntrinsicID = Intrinsic::aarch64_crc32w; break; 4764 case AArch64::BI__builtin_arm_crc32cw: 4765 CRCIntrinsicID = Intrinsic::aarch64_crc32cw; break; 4766 case AArch64::BI__builtin_arm_crc32d: 4767 CRCIntrinsicID = Intrinsic::aarch64_crc32x; break; 4768 case AArch64::BI__builtin_arm_crc32cd: 4769 CRCIntrinsicID = Intrinsic::aarch64_crc32cx; break; 4770 } 4771 4772 if (CRCIntrinsicID != Intrinsic::not_intrinsic) { 4773 Value *Arg0 = EmitScalarExpr(E->getArg(0)); 4774 Value *Arg1 = EmitScalarExpr(E->getArg(1)); 4775 Function *F = CGM.getIntrinsic(CRCIntrinsicID); 4776 4777 llvm::Type *DataTy = F->getFunctionType()->getParamType(1); 4778 Arg1 = Builder.CreateZExtOrBitCast(Arg1, DataTy); 4779 4780 return Builder.CreateCall(F, {Arg0, Arg1}); 4781 } 4782 4783 if (BuiltinID == AArch64::BI__builtin_arm_rsr || 4784 BuiltinID == AArch64::BI__builtin_arm_rsr64 || 4785 BuiltinID == AArch64::BI__builtin_arm_rsrp || 4786 BuiltinID == AArch64::BI__builtin_arm_wsr || 4787 BuiltinID == AArch64::BI__builtin_arm_wsr64 || 4788 BuiltinID == AArch64::BI__builtin_arm_wsrp) { 4789 4790 bool IsRead = BuiltinID == AArch64::BI__builtin_arm_rsr || 4791 BuiltinID == AArch64::BI__builtin_arm_rsr64 || 4792 BuiltinID == AArch64::BI__builtin_arm_rsrp; 4793 4794 bool IsPointerBuiltin = BuiltinID == AArch64::BI__builtin_arm_rsrp || 4795 BuiltinID == AArch64::BI__builtin_arm_wsrp; 4796 4797 bool Is64Bit = BuiltinID != AArch64::BI__builtin_arm_rsr && 4798 BuiltinID != AArch64::BI__builtin_arm_wsr; 4799 4800 llvm::Type *ValueType; 4801 llvm::Type *RegisterType = Int64Ty; 4802 if (IsPointerBuiltin) { 4803 ValueType = VoidPtrTy; 4804 } else if (Is64Bit) { 4805 ValueType = Int64Ty; 4806 } else { 4807 ValueType = Int32Ty; 4808 } 4809 4810 return EmitSpecialRegisterBuiltin(*this, E, RegisterType, ValueType, IsRead); 4811 } 4812 4813 // Find out if any arguments are required to be integer constant 4814 // expressions. 4815 unsigned ICEArguments = 0; 4816 ASTContext::GetBuiltinTypeError Error; 4817 getContext().GetBuiltinType(BuiltinID, Error, &ICEArguments); 4818 assert(Error == ASTContext::GE_None && "Should not codegen an error"); 4819 4820 llvm::SmallVector<Value*, 4> Ops; 4821 for (unsigned i = 0, e = E->getNumArgs() - 1; i != e; i++) { 4822 if ((ICEArguments & (1 << i)) == 0) { 4823 Ops.push_back(EmitScalarExpr(E->getArg(i))); 4824 } else { 4825 // If this is required to be a constant, constant fold it so that we know 4826 // that the generated intrinsic gets a ConstantInt. 4827 llvm::APSInt Result; 4828 bool IsConst = E->getArg(i)->isIntegerConstantExpr(Result, getContext()); 4829 assert(IsConst && "Constant arg isn't actually constant?"); 4830 (void)IsConst; 4831 Ops.push_back(llvm::ConstantInt::get(getLLVMContext(), Result)); 4832 } 4833 } 4834 4835 auto SISDMap = makeArrayRef(AArch64SISDIntrinsicMap); 4836 const NeonIntrinsicInfo *Builtin = findNeonIntrinsicInMap( 4837 SISDMap, BuiltinID, AArch64SISDIntrinsicsProvenSorted); 4838 4839 if (Builtin) { 4840 Ops.push_back(EmitScalarExpr(E->getArg(E->getNumArgs() - 1))); 4841 Value *Result = EmitCommonNeonSISDBuiltinExpr(*this, *Builtin, Ops, E); 4842 assert(Result && "SISD intrinsic should have been handled"); 4843 return Result; 4844 } 4845 4846 llvm::APSInt Result; 4847 const Expr *Arg = E->getArg(E->getNumArgs()-1); 4848 NeonTypeFlags Type(0); 4849 if (Arg->isIntegerConstantExpr(Result, getContext())) 4850 // Determine the type of this overloaded NEON intrinsic. 4851 Type = NeonTypeFlags(Result.getZExtValue()); 4852 4853 bool usgn = Type.isUnsigned(); 4854 bool quad = Type.isQuad(); 4855 4856 // Handle non-overloaded intrinsics first. 4857 switch (BuiltinID) { 4858 default: break; 4859 case NEON::BI__builtin_neon_vldrq_p128: { 4860 llvm::Type *Int128PTy = llvm::Type::getIntNPtrTy(getLLVMContext(), 128); 4861 Value *Ptr = Builder.CreateBitCast(EmitScalarExpr(E->getArg(0)), Int128PTy); 4862 return Builder.CreateDefaultAlignedLoad(Ptr); 4863 } 4864 case NEON::BI__builtin_neon_vstrq_p128: { 4865 llvm::Type *Int128PTy = llvm::Type::getIntNPtrTy(getLLVMContext(), 128); 4866 Value *Ptr = Builder.CreateBitCast(Ops[0], Int128PTy); 4867 return Builder.CreateDefaultAlignedStore(EmitScalarExpr(E->getArg(1)), Ptr); 4868 } 4869 case NEON::BI__builtin_neon_vcvts_u32_f32: 4870 case NEON::BI__builtin_neon_vcvtd_u64_f64: 4871 usgn = true; 4872 // FALL THROUGH 4873 case NEON::BI__builtin_neon_vcvts_s32_f32: 4874 case NEON::BI__builtin_neon_vcvtd_s64_f64: { 4875 Ops.push_back(EmitScalarExpr(E->getArg(0))); 4876 bool Is64 = Ops[0]->getType()->getPrimitiveSizeInBits() == 64; 4877 llvm::Type *InTy = Is64 ? Int64Ty : Int32Ty; 4878 llvm::Type *FTy = Is64 ? DoubleTy : FloatTy; 4879 Ops[0] = Builder.CreateBitCast(Ops[0], FTy); 4880 if (usgn) 4881 return Builder.CreateFPToUI(Ops[0], InTy); 4882 return Builder.CreateFPToSI(Ops[0], InTy); 4883 } 4884 case NEON::BI__builtin_neon_vcvts_f32_u32: 4885 case NEON::BI__builtin_neon_vcvtd_f64_u64: 4886 usgn = true; 4887 // FALL THROUGH 4888 case NEON::BI__builtin_neon_vcvts_f32_s32: 4889 case NEON::BI__builtin_neon_vcvtd_f64_s64: { 4890 Ops.push_back(EmitScalarExpr(E->getArg(0))); 4891 bool Is64 = Ops[0]->getType()->getPrimitiveSizeInBits() == 64; 4892 llvm::Type *InTy = Is64 ? Int64Ty : Int32Ty; 4893 llvm::Type *FTy = Is64 ? DoubleTy : FloatTy; 4894 Ops[0] = Builder.CreateBitCast(Ops[0], InTy); 4895 if (usgn) 4896 return Builder.CreateUIToFP(Ops[0], FTy); 4897 return Builder.CreateSIToFP(Ops[0], FTy); 4898 } 4899 case NEON::BI__builtin_neon_vpaddd_s64: { 4900 llvm::Type *Ty = llvm::VectorType::get(Int64Ty, 2); 4901 Value *Vec = EmitScalarExpr(E->getArg(0)); 4902 // The vector is v2f64, so make sure it's bitcast to that. 4903 Vec = Builder.CreateBitCast(Vec, Ty, "v2i64"); 4904 llvm::Value *Idx0 = llvm::ConstantInt::get(SizeTy, 0); 4905 llvm::Value *Idx1 = llvm::ConstantInt::get(SizeTy, 1); 4906 Value *Op0 = Builder.CreateExtractElement(Vec, Idx0, "lane0"); 4907 Value *Op1 = Builder.CreateExtractElement(Vec, Idx1, "lane1"); 4908 // Pairwise addition of a v2f64 into a scalar f64. 4909 return Builder.CreateAdd(Op0, Op1, "vpaddd"); 4910 } 4911 case NEON::BI__builtin_neon_vpaddd_f64: { 4912 llvm::Type *Ty = 4913 llvm::VectorType::get(DoubleTy, 2); 4914 Value *Vec = EmitScalarExpr(E->getArg(0)); 4915 // The vector is v2f64, so make sure it's bitcast to that. 4916 Vec = Builder.CreateBitCast(Vec, Ty, "v2f64"); 4917 llvm::Value *Idx0 = llvm::ConstantInt::get(SizeTy, 0); 4918 llvm::Value *Idx1 = llvm::ConstantInt::get(SizeTy, 1); 4919 Value *Op0 = Builder.CreateExtractElement(Vec, Idx0, "lane0"); 4920 Value *Op1 = Builder.CreateExtractElement(Vec, Idx1, "lane1"); 4921 // Pairwise addition of a v2f64 into a scalar f64. 4922 return Builder.CreateFAdd(Op0, Op1, "vpaddd"); 4923 } 4924 case NEON::BI__builtin_neon_vpadds_f32: { 4925 llvm::Type *Ty = 4926 llvm::VectorType::get(FloatTy, 2); 4927 Value *Vec = EmitScalarExpr(E->getArg(0)); 4928 // The vector is v2f32, so make sure it's bitcast to that. 4929 Vec = Builder.CreateBitCast(Vec, Ty, "v2f32"); 4930 llvm::Value *Idx0 = llvm::ConstantInt::get(SizeTy, 0); 4931 llvm::Value *Idx1 = llvm::ConstantInt::get(SizeTy, 1); 4932 Value *Op0 = Builder.CreateExtractElement(Vec, Idx0, "lane0"); 4933 Value *Op1 = Builder.CreateExtractElement(Vec, Idx1, "lane1"); 4934 // Pairwise addition of a v2f32 into a scalar f32. 4935 return Builder.CreateFAdd(Op0, Op1, "vpaddd"); 4936 } 4937 case NEON::BI__builtin_neon_vceqzd_s64: 4938 case NEON::BI__builtin_neon_vceqzd_f64: 4939 case NEON::BI__builtin_neon_vceqzs_f32: 4940 Ops.push_back(EmitScalarExpr(E->getArg(0))); 4941 return EmitAArch64CompareBuiltinExpr( 4942 Ops[0], ConvertType(E->getCallReturnType(getContext())), 4943 ICmpInst::FCMP_OEQ, ICmpInst::ICMP_EQ, "vceqz"); 4944 case NEON::BI__builtin_neon_vcgezd_s64: 4945 case NEON::BI__builtin_neon_vcgezd_f64: 4946 case NEON::BI__builtin_neon_vcgezs_f32: 4947 Ops.push_back(EmitScalarExpr(E->getArg(0))); 4948 return EmitAArch64CompareBuiltinExpr( 4949 Ops[0], ConvertType(E->getCallReturnType(getContext())), 4950 ICmpInst::FCMP_OGE, ICmpInst::ICMP_SGE, "vcgez"); 4951 case NEON::BI__builtin_neon_vclezd_s64: 4952 case NEON::BI__builtin_neon_vclezd_f64: 4953 case NEON::BI__builtin_neon_vclezs_f32: 4954 Ops.push_back(EmitScalarExpr(E->getArg(0))); 4955 return EmitAArch64CompareBuiltinExpr( 4956 Ops[0], ConvertType(E->getCallReturnType(getContext())), 4957 ICmpInst::FCMP_OLE, ICmpInst::ICMP_SLE, "vclez"); 4958 case NEON::BI__builtin_neon_vcgtzd_s64: 4959 case NEON::BI__builtin_neon_vcgtzd_f64: 4960 case NEON::BI__builtin_neon_vcgtzs_f32: 4961 Ops.push_back(EmitScalarExpr(E->getArg(0))); 4962 return EmitAArch64CompareBuiltinExpr( 4963 Ops[0], ConvertType(E->getCallReturnType(getContext())), 4964 ICmpInst::FCMP_OGT, ICmpInst::ICMP_SGT, "vcgtz"); 4965 case NEON::BI__builtin_neon_vcltzd_s64: 4966 case NEON::BI__builtin_neon_vcltzd_f64: 4967 case NEON::BI__builtin_neon_vcltzs_f32: 4968 Ops.push_back(EmitScalarExpr(E->getArg(0))); 4969 return EmitAArch64CompareBuiltinExpr( 4970 Ops[0], ConvertType(E->getCallReturnType(getContext())), 4971 ICmpInst::FCMP_OLT, ICmpInst::ICMP_SLT, "vcltz"); 4972 4973 case NEON::BI__builtin_neon_vceqzd_u64: { 4974 Ops.push_back(EmitScalarExpr(E->getArg(0))); 4975 Ops[0] = Builder.CreateBitCast(Ops[0], Int64Ty); 4976 Ops[0] = 4977 Builder.CreateICmpEQ(Ops[0], llvm::Constant::getNullValue(Int64Ty)); 4978 return Builder.CreateSExt(Ops[0], Int64Ty, "vceqzd"); 4979 } 4980 case NEON::BI__builtin_neon_vceqd_f64: 4981 case NEON::BI__builtin_neon_vcled_f64: 4982 case NEON::BI__builtin_neon_vcltd_f64: 4983 case NEON::BI__builtin_neon_vcged_f64: 4984 case NEON::BI__builtin_neon_vcgtd_f64: { 4985 llvm::CmpInst::Predicate P; 4986 switch (BuiltinID) { 4987 default: llvm_unreachable("missing builtin ID in switch!"); 4988 case NEON::BI__builtin_neon_vceqd_f64: P = llvm::FCmpInst::FCMP_OEQ; break; 4989 case NEON::BI__builtin_neon_vcled_f64: P = llvm::FCmpInst::FCMP_OLE; break; 4990 case NEON::BI__builtin_neon_vcltd_f64: P = llvm::FCmpInst::FCMP_OLT; break; 4991 case NEON::BI__builtin_neon_vcged_f64: P = llvm::FCmpInst::FCMP_OGE; break; 4992 case NEON::BI__builtin_neon_vcgtd_f64: P = llvm::FCmpInst::FCMP_OGT; break; 4993 } 4994 Ops.push_back(EmitScalarExpr(E->getArg(1))); 4995 Ops[0] = Builder.CreateBitCast(Ops[0], DoubleTy); 4996 Ops[1] = Builder.CreateBitCast(Ops[1], DoubleTy); 4997 Ops[0] = Builder.CreateFCmp(P, Ops[0], Ops[1]); 4998 return Builder.CreateSExt(Ops[0], Int64Ty, "vcmpd"); 4999 } 5000 case NEON::BI__builtin_neon_vceqs_f32: 5001 case NEON::BI__builtin_neon_vcles_f32: 5002 case NEON::BI__builtin_neon_vclts_f32: 5003 case NEON::BI__builtin_neon_vcges_f32: 5004 case NEON::BI__builtin_neon_vcgts_f32: { 5005 llvm::CmpInst::Predicate P; 5006 switch (BuiltinID) { 5007 default: llvm_unreachable("missing builtin ID in switch!"); 5008 case NEON::BI__builtin_neon_vceqs_f32: P = llvm::FCmpInst::FCMP_OEQ; break; 5009 case NEON::BI__builtin_neon_vcles_f32: P = llvm::FCmpInst::FCMP_OLE; break; 5010 case NEON::BI__builtin_neon_vclts_f32: P = llvm::FCmpInst::FCMP_OLT; break; 5011 case NEON::BI__builtin_neon_vcges_f32: P = llvm::FCmpInst::FCMP_OGE; break; 5012 case NEON::BI__builtin_neon_vcgts_f32: P = llvm::FCmpInst::FCMP_OGT; break; 5013 } 5014 Ops.push_back(EmitScalarExpr(E->getArg(1))); 5015 Ops[0] = Builder.CreateBitCast(Ops[0], FloatTy); 5016 Ops[1] = Builder.CreateBitCast(Ops[1], FloatTy); 5017 Ops[0] = Builder.CreateFCmp(P, Ops[0], Ops[1]); 5018 return Builder.CreateSExt(Ops[0], Int32Ty, "vcmpd"); 5019 } 5020 case NEON::BI__builtin_neon_vceqd_s64: 5021 case NEON::BI__builtin_neon_vceqd_u64: 5022 case NEON::BI__builtin_neon_vcgtd_s64: 5023 case NEON::BI__builtin_neon_vcgtd_u64: 5024 case NEON::BI__builtin_neon_vcltd_s64: 5025 case NEON::BI__builtin_neon_vcltd_u64: 5026 case NEON::BI__builtin_neon_vcged_u64: 5027 case NEON::BI__builtin_neon_vcged_s64: 5028 case NEON::BI__builtin_neon_vcled_u64: 5029 case NEON::BI__builtin_neon_vcled_s64: { 5030 llvm::CmpInst::Predicate P; 5031 switch (BuiltinID) { 5032 default: llvm_unreachable("missing builtin ID in switch!"); 5033 case NEON::BI__builtin_neon_vceqd_s64: 5034 case NEON::BI__builtin_neon_vceqd_u64:P = llvm::ICmpInst::ICMP_EQ;break; 5035 case NEON::BI__builtin_neon_vcgtd_s64:P = llvm::ICmpInst::ICMP_SGT;break; 5036 case NEON::BI__builtin_neon_vcgtd_u64:P = llvm::ICmpInst::ICMP_UGT;break; 5037 case NEON::BI__builtin_neon_vcltd_s64:P = llvm::ICmpInst::ICMP_SLT;break; 5038 case NEON::BI__builtin_neon_vcltd_u64:P = llvm::ICmpInst::ICMP_ULT;break; 5039 case NEON::BI__builtin_neon_vcged_u64:P = llvm::ICmpInst::ICMP_UGE;break; 5040 case NEON::BI__builtin_neon_vcged_s64:P = llvm::ICmpInst::ICMP_SGE;break; 5041 case NEON::BI__builtin_neon_vcled_u64:P = llvm::ICmpInst::ICMP_ULE;break; 5042 case NEON::BI__builtin_neon_vcled_s64:P = llvm::ICmpInst::ICMP_SLE;break; 5043 } 5044 Ops.push_back(EmitScalarExpr(E->getArg(1))); 5045 Ops[0] = Builder.CreateBitCast(Ops[0], Int64Ty); 5046 Ops[1] = Builder.CreateBitCast(Ops[1], Int64Ty); 5047 Ops[0] = Builder.CreateICmp(P, Ops[0], Ops[1]); 5048 return Builder.CreateSExt(Ops[0], Int64Ty, "vceqd"); 5049 } 5050 case NEON::BI__builtin_neon_vtstd_s64: 5051 case NEON::BI__builtin_neon_vtstd_u64: { 5052 Ops.push_back(EmitScalarExpr(E->getArg(1))); 5053 Ops[0] = Builder.CreateBitCast(Ops[0], Int64Ty); 5054 Ops[1] = Builder.CreateBitCast(Ops[1], Int64Ty); 5055 Ops[0] = Builder.CreateAnd(Ops[0], Ops[1]); 5056 Ops[0] = Builder.CreateICmp(ICmpInst::ICMP_NE, Ops[0], 5057 llvm::Constant::getNullValue(Int64Ty)); 5058 return Builder.CreateSExt(Ops[0], Int64Ty, "vtstd"); 5059 } 5060 case NEON::BI__builtin_neon_vset_lane_i8: 5061 case NEON::BI__builtin_neon_vset_lane_i16: 5062 case NEON::BI__builtin_neon_vset_lane_i32: 5063 case NEON::BI__builtin_neon_vset_lane_i64: 5064 case NEON::BI__builtin_neon_vset_lane_f32: 5065 case NEON::BI__builtin_neon_vsetq_lane_i8: 5066 case NEON::BI__builtin_neon_vsetq_lane_i16: 5067 case NEON::BI__builtin_neon_vsetq_lane_i32: 5068 case NEON::BI__builtin_neon_vsetq_lane_i64: 5069 case NEON::BI__builtin_neon_vsetq_lane_f32: 5070 Ops.push_back(EmitScalarExpr(E->getArg(2))); 5071 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vset_lane"); 5072 case NEON::BI__builtin_neon_vset_lane_f64: 5073 // The vector type needs a cast for the v1f64 variant. 5074 Ops[1] = Builder.CreateBitCast(Ops[1], 5075 llvm::VectorType::get(DoubleTy, 1)); 5076 Ops.push_back(EmitScalarExpr(E->getArg(2))); 5077 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vset_lane"); 5078 case NEON::BI__builtin_neon_vsetq_lane_f64: 5079 // The vector type needs a cast for the v2f64 variant. 5080 Ops[1] = Builder.CreateBitCast(Ops[1], 5081 llvm::VectorType::get(DoubleTy, 2)); 5082 Ops.push_back(EmitScalarExpr(E->getArg(2))); 5083 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vset_lane"); 5084 5085 case NEON::BI__builtin_neon_vget_lane_i8: 5086 case NEON::BI__builtin_neon_vdupb_lane_i8: 5087 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int8Ty, 8)); 5088 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5089 "vget_lane"); 5090 case NEON::BI__builtin_neon_vgetq_lane_i8: 5091 case NEON::BI__builtin_neon_vdupb_laneq_i8: 5092 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int8Ty, 16)); 5093 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5094 "vgetq_lane"); 5095 case NEON::BI__builtin_neon_vget_lane_i16: 5096 case NEON::BI__builtin_neon_vduph_lane_i16: 5097 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int16Ty, 4)); 5098 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5099 "vget_lane"); 5100 case NEON::BI__builtin_neon_vgetq_lane_i16: 5101 case NEON::BI__builtin_neon_vduph_laneq_i16: 5102 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int16Ty, 8)); 5103 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5104 "vgetq_lane"); 5105 case NEON::BI__builtin_neon_vget_lane_i32: 5106 case NEON::BI__builtin_neon_vdups_lane_i32: 5107 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int32Ty, 2)); 5108 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5109 "vget_lane"); 5110 case NEON::BI__builtin_neon_vdups_lane_f32: 5111 Ops[0] = Builder.CreateBitCast(Ops[0], 5112 llvm::VectorType::get(FloatTy, 2)); 5113 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5114 "vdups_lane"); 5115 case NEON::BI__builtin_neon_vgetq_lane_i32: 5116 case NEON::BI__builtin_neon_vdups_laneq_i32: 5117 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int32Ty, 4)); 5118 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5119 "vgetq_lane"); 5120 case NEON::BI__builtin_neon_vget_lane_i64: 5121 case NEON::BI__builtin_neon_vdupd_lane_i64: 5122 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int64Ty, 1)); 5123 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5124 "vget_lane"); 5125 case NEON::BI__builtin_neon_vdupd_lane_f64: 5126 Ops[0] = Builder.CreateBitCast(Ops[0], 5127 llvm::VectorType::get(DoubleTy, 1)); 5128 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5129 "vdupd_lane"); 5130 case NEON::BI__builtin_neon_vgetq_lane_i64: 5131 case NEON::BI__builtin_neon_vdupd_laneq_i64: 5132 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int64Ty, 2)); 5133 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5134 "vgetq_lane"); 5135 case NEON::BI__builtin_neon_vget_lane_f32: 5136 Ops[0] = Builder.CreateBitCast(Ops[0], 5137 llvm::VectorType::get(FloatTy, 2)); 5138 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5139 "vget_lane"); 5140 case NEON::BI__builtin_neon_vget_lane_f64: 5141 Ops[0] = Builder.CreateBitCast(Ops[0], 5142 llvm::VectorType::get(DoubleTy, 1)); 5143 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5144 "vget_lane"); 5145 case NEON::BI__builtin_neon_vgetq_lane_f32: 5146 case NEON::BI__builtin_neon_vdups_laneq_f32: 5147 Ops[0] = Builder.CreateBitCast(Ops[0], 5148 llvm::VectorType::get(FloatTy, 4)); 5149 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5150 "vgetq_lane"); 5151 case NEON::BI__builtin_neon_vgetq_lane_f64: 5152 case NEON::BI__builtin_neon_vdupd_laneq_f64: 5153 Ops[0] = Builder.CreateBitCast(Ops[0], 5154 llvm::VectorType::get(DoubleTy, 2)); 5155 return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), 5156 "vgetq_lane"); 5157 case NEON::BI__builtin_neon_vaddd_s64: 5158 case NEON::BI__builtin_neon_vaddd_u64: 5159 return Builder.CreateAdd(Ops[0], EmitScalarExpr(E->getArg(1)), "vaddd"); 5160 case NEON::BI__builtin_neon_vsubd_s64: 5161 case NEON::BI__builtin_neon_vsubd_u64: 5162 return Builder.CreateSub(Ops[0], EmitScalarExpr(E->getArg(1)), "vsubd"); 5163 case NEON::BI__builtin_neon_vqdmlalh_s16: 5164 case NEON::BI__builtin_neon_vqdmlslh_s16: { 5165 SmallVector<Value *, 2> ProductOps; 5166 ProductOps.push_back(vectorWrapScalar16(Ops[1])); 5167 ProductOps.push_back(vectorWrapScalar16(EmitScalarExpr(E->getArg(2)))); 5168 llvm::Type *VTy = llvm::VectorType::get(Int32Ty, 4); 5169 Ops[1] = EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_sqdmull, VTy), 5170 ProductOps, "vqdmlXl"); 5171 Constant *CI = ConstantInt::get(SizeTy, 0); 5172 Ops[1] = Builder.CreateExtractElement(Ops[1], CI, "lane0"); 5173 5174 unsigned AccumInt = BuiltinID == NEON::BI__builtin_neon_vqdmlalh_s16 5175 ? Intrinsic::aarch64_neon_sqadd 5176 : Intrinsic::aarch64_neon_sqsub; 5177 return EmitNeonCall(CGM.getIntrinsic(AccumInt, Int32Ty), Ops, "vqdmlXl"); 5178 } 5179 case NEON::BI__builtin_neon_vqshlud_n_s64: { 5180 Ops.push_back(EmitScalarExpr(E->getArg(1))); 5181 Ops[1] = Builder.CreateZExt(Ops[1], Int64Ty); 5182 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_sqshlu, Int64Ty), 5183 Ops, "vqshlu_n"); 5184 } 5185 case NEON::BI__builtin_neon_vqshld_n_u64: 5186 case NEON::BI__builtin_neon_vqshld_n_s64: { 5187 unsigned Int = BuiltinID == NEON::BI__builtin_neon_vqshld_n_u64 5188 ? Intrinsic::aarch64_neon_uqshl 5189 : Intrinsic::aarch64_neon_sqshl; 5190 Ops.push_back(EmitScalarExpr(E->getArg(1))); 5191 Ops[1] = Builder.CreateZExt(Ops[1], Int64Ty); 5192 return EmitNeonCall(CGM.getIntrinsic(Int, Int64Ty), Ops, "vqshl_n"); 5193 } 5194 case NEON::BI__builtin_neon_vrshrd_n_u64: 5195 case NEON::BI__builtin_neon_vrshrd_n_s64: { 5196 unsigned Int = BuiltinID == NEON::BI__builtin_neon_vrshrd_n_u64 5197 ? Intrinsic::aarch64_neon_urshl 5198 : Intrinsic::aarch64_neon_srshl; 5199 Ops.push_back(EmitScalarExpr(E->getArg(1))); 5200 int SV = cast<ConstantInt>(Ops[1])->getSExtValue(); 5201 Ops[1] = ConstantInt::get(Int64Ty, -SV); 5202 return EmitNeonCall(CGM.getIntrinsic(Int, Int64Ty), Ops, "vrshr_n"); 5203 } 5204 case NEON::BI__builtin_neon_vrsrad_n_u64: 5205 case NEON::BI__builtin_neon_vrsrad_n_s64: { 5206 unsigned Int = BuiltinID == NEON::BI__builtin_neon_vrsrad_n_u64 5207 ? Intrinsic::aarch64_neon_urshl 5208 : Intrinsic::aarch64_neon_srshl; 5209 Ops[1] = Builder.CreateBitCast(Ops[1], Int64Ty); 5210 Ops.push_back(Builder.CreateNeg(EmitScalarExpr(E->getArg(2)))); 5211 Ops[1] = Builder.CreateCall(CGM.getIntrinsic(Int, Int64Ty), 5212 {Ops[1], Builder.CreateSExt(Ops[2], Int64Ty)}); 5213 return Builder.CreateAdd(Ops[0], Builder.CreateBitCast(Ops[1], Int64Ty)); 5214 } 5215 case NEON::BI__builtin_neon_vshld_n_s64: 5216 case NEON::BI__builtin_neon_vshld_n_u64: { 5217 llvm::ConstantInt *Amt = cast<ConstantInt>(EmitScalarExpr(E->getArg(1))); 5218 return Builder.CreateShl( 5219 Ops[0], ConstantInt::get(Int64Ty, Amt->getZExtValue()), "shld_n"); 5220 } 5221 case NEON::BI__builtin_neon_vshrd_n_s64: { 5222 llvm::ConstantInt *Amt = cast<ConstantInt>(EmitScalarExpr(E->getArg(1))); 5223 return Builder.CreateAShr( 5224 Ops[0], ConstantInt::get(Int64Ty, std::min(static_cast<uint64_t>(63), 5225 Amt->getZExtValue())), 5226 "shrd_n"); 5227 } 5228 case NEON::BI__builtin_neon_vshrd_n_u64: { 5229 llvm::ConstantInt *Amt = cast<ConstantInt>(EmitScalarExpr(E->getArg(1))); 5230 uint64_t ShiftAmt = Amt->getZExtValue(); 5231 // Right-shifting an unsigned value by its size yields 0. 5232 if (ShiftAmt == 64) 5233 return ConstantInt::get(Int64Ty, 0); 5234 return Builder.CreateLShr(Ops[0], ConstantInt::get(Int64Ty, ShiftAmt), 5235 "shrd_n"); 5236 } 5237 case NEON::BI__builtin_neon_vsrad_n_s64: { 5238 llvm::ConstantInt *Amt = cast<ConstantInt>(EmitScalarExpr(E->getArg(2))); 5239 Ops[1] = Builder.CreateAShr( 5240 Ops[1], ConstantInt::get(Int64Ty, std::min(static_cast<uint64_t>(63), 5241 Amt->getZExtValue())), 5242 "shrd_n"); 5243 return Builder.CreateAdd(Ops[0], Ops[1]); 5244 } 5245 case NEON::BI__builtin_neon_vsrad_n_u64: { 5246 llvm::ConstantInt *Amt = cast<ConstantInt>(EmitScalarExpr(E->getArg(2))); 5247 uint64_t ShiftAmt = Amt->getZExtValue(); 5248 // Right-shifting an unsigned value by its size yields 0. 5249 // As Op + 0 = Op, return Ops[0] directly. 5250 if (ShiftAmt == 64) 5251 return Ops[0]; 5252 Ops[1] = Builder.CreateLShr(Ops[1], ConstantInt::get(Int64Ty, ShiftAmt), 5253 "shrd_n"); 5254 return Builder.CreateAdd(Ops[0], Ops[1]); 5255 } 5256 case NEON::BI__builtin_neon_vqdmlalh_lane_s16: 5257 case NEON::BI__builtin_neon_vqdmlalh_laneq_s16: 5258 case NEON::BI__builtin_neon_vqdmlslh_lane_s16: 5259 case NEON::BI__builtin_neon_vqdmlslh_laneq_s16: { 5260 Ops[2] = Builder.CreateExtractElement(Ops[2], EmitScalarExpr(E->getArg(3)), 5261 "lane"); 5262 SmallVector<Value *, 2> ProductOps; 5263 ProductOps.push_back(vectorWrapScalar16(Ops[1])); 5264 ProductOps.push_back(vectorWrapScalar16(Ops[2])); 5265 llvm::Type *VTy = llvm::VectorType::get(Int32Ty, 4); 5266 Ops[1] = EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_sqdmull, VTy), 5267 ProductOps, "vqdmlXl"); 5268 Constant *CI = ConstantInt::get(SizeTy, 0); 5269 Ops[1] = Builder.CreateExtractElement(Ops[1], CI, "lane0"); 5270 Ops.pop_back(); 5271 5272 unsigned AccInt = (BuiltinID == NEON::BI__builtin_neon_vqdmlalh_lane_s16 || 5273 BuiltinID == NEON::BI__builtin_neon_vqdmlalh_laneq_s16) 5274 ? Intrinsic::aarch64_neon_sqadd 5275 : Intrinsic::aarch64_neon_sqsub; 5276 return EmitNeonCall(CGM.getIntrinsic(AccInt, Int32Ty), Ops, "vqdmlXl"); 5277 } 5278 case NEON::BI__builtin_neon_vqdmlals_s32: 5279 case NEON::BI__builtin_neon_vqdmlsls_s32: { 5280 SmallVector<Value *, 2> ProductOps; 5281 ProductOps.push_back(Ops[1]); 5282 ProductOps.push_back(EmitScalarExpr(E->getArg(2))); 5283 Ops[1] = 5284 EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_sqdmulls_scalar), 5285 ProductOps, "vqdmlXl"); 5286 5287 unsigned AccumInt = BuiltinID == NEON::BI__builtin_neon_vqdmlals_s32 5288 ? Intrinsic::aarch64_neon_sqadd 5289 : Intrinsic::aarch64_neon_sqsub; 5290 return EmitNeonCall(CGM.getIntrinsic(AccumInt, Int64Ty), Ops, "vqdmlXl"); 5291 } 5292 case NEON::BI__builtin_neon_vqdmlals_lane_s32: 5293 case NEON::BI__builtin_neon_vqdmlals_laneq_s32: 5294 case NEON::BI__builtin_neon_vqdmlsls_lane_s32: 5295 case NEON::BI__builtin_neon_vqdmlsls_laneq_s32: { 5296 Ops[2] = Builder.CreateExtractElement(Ops[2], EmitScalarExpr(E->getArg(3)), 5297 "lane"); 5298 SmallVector<Value *, 2> ProductOps; 5299 ProductOps.push_back(Ops[1]); 5300 ProductOps.push_back(Ops[2]); 5301 Ops[1] = 5302 EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_sqdmulls_scalar), 5303 ProductOps, "vqdmlXl"); 5304 Ops.pop_back(); 5305 5306 unsigned AccInt = (BuiltinID == NEON::BI__builtin_neon_vqdmlals_lane_s32 || 5307 BuiltinID == NEON::BI__builtin_neon_vqdmlals_laneq_s32) 5308 ? Intrinsic::aarch64_neon_sqadd 5309 : Intrinsic::aarch64_neon_sqsub; 5310 return EmitNeonCall(CGM.getIntrinsic(AccInt, Int64Ty), Ops, "vqdmlXl"); 5311 } 5312 } 5313 5314 llvm::VectorType *VTy = GetNeonType(this, Type); 5315 llvm::Type *Ty = VTy; 5316 if (!Ty) 5317 return nullptr; 5318 5319 // Not all intrinsics handled by the common case work for AArch64 yet, so only 5320 // defer to common code if it's been added to our special map. 5321 Builtin = findNeonIntrinsicInMap(AArch64SIMDIntrinsicMap, BuiltinID, 5322 AArch64SIMDIntrinsicsProvenSorted); 5323 5324 if (Builtin) 5325 return EmitCommonNeonBuiltinExpr( 5326 Builtin->BuiltinID, Builtin->LLVMIntrinsic, Builtin->AltLLVMIntrinsic, 5327 Builtin->NameHint, Builtin->TypeModifier, E, Ops, 5328 /*never use addresses*/ Address::invalid(), Address::invalid()); 5329 5330 if (Value *V = EmitAArch64TblBuiltinExpr(*this, BuiltinID, E, Ops)) 5331 return V; 5332 5333 unsigned Int; 5334 switch (BuiltinID) { 5335 default: return nullptr; 5336 case NEON::BI__builtin_neon_vbsl_v: 5337 case NEON::BI__builtin_neon_vbslq_v: { 5338 llvm::Type *BitTy = llvm::VectorType::getInteger(VTy); 5339 Ops[0] = Builder.CreateBitCast(Ops[0], BitTy, "vbsl"); 5340 Ops[1] = Builder.CreateBitCast(Ops[1], BitTy, "vbsl"); 5341 Ops[2] = Builder.CreateBitCast(Ops[2], BitTy, "vbsl"); 5342 5343 Ops[1] = Builder.CreateAnd(Ops[0], Ops[1], "vbsl"); 5344 Ops[2] = Builder.CreateAnd(Builder.CreateNot(Ops[0]), Ops[2], "vbsl"); 5345 Ops[0] = Builder.CreateOr(Ops[1], Ops[2], "vbsl"); 5346 return Builder.CreateBitCast(Ops[0], Ty); 5347 } 5348 case NEON::BI__builtin_neon_vfma_lane_v: 5349 case NEON::BI__builtin_neon_vfmaq_lane_v: { // Only used for FP types 5350 // The ARM builtins (and instructions) have the addend as the first 5351 // operand, but the 'fma' intrinsics have it last. Swap it around here. 5352 Value *Addend = Ops[0]; 5353 Value *Multiplicand = Ops[1]; 5354 Value *LaneSource = Ops[2]; 5355 Ops[0] = Multiplicand; 5356 Ops[1] = LaneSource; 5357 Ops[2] = Addend; 5358 5359 // Now adjust things to handle the lane access. 5360 llvm::Type *SourceTy = BuiltinID == NEON::BI__builtin_neon_vfmaq_lane_v ? 5361 llvm::VectorType::get(VTy->getElementType(), VTy->getNumElements() / 2) : 5362 VTy; 5363 llvm::Constant *cst = cast<Constant>(Ops[3]); 5364 Value *SV = llvm::ConstantVector::getSplat(VTy->getNumElements(), cst); 5365 Ops[1] = Builder.CreateBitCast(Ops[1], SourceTy); 5366 Ops[1] = Builder.CreateShuffleVector(Ops[1], Ops[1], SV, "lane"); 5367 5368 Ops.pop_back(); 5369 Int = Intrinsic::fma; 5370 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "fmla"); 5371 } 5372 case NEON::BI__builtin_neon_vfma_laneq_v: { 5373 llvm::VectorType *VTy = cast<llvm::VectorType>(Ty); 5374 // v1f64 fma should be mapped to Neon scalar f64 fma 5375 if (VTy && VTy->getElementType() == DoubleTy) { 5376 Ops[0] = Builder.CreateBitCast(Ops[0], DoubleTy); 5377 Ops[1] = Builder.CreateBitCast(Ops[1], DoubleTy); 5378 llvm::Type *VTy = GetNeonType(this, 5379 NeonTypeFlags(NeonTypeFlags::Float64, false, true)); 5380 Ops[2] = Builder.CreateBitCast(Ops[2], VTy); 5381 Ops[2] = Builder.CreateExtractElement(Ops[2], Ops[3], "extract"); 5382 Value *F = CGM.getIntrinsic(Intrinsic::fma, DoubleTy); 5383 Value *Result = Builder.CreateCall(F, {Ops[1], Ops[2], Ops[0]}); 5384 return Builder.CreateBitCast(Result, Ty); 5385 } 5386 Value *F = CGM.getIntrinsic(Intrinsic::fma, Ty); 5387 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 5388 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 5389 5390 llvm::Type *STy = llvm::VectorType::get(VTy->getElementType(), 5391 VTy->getNumElements() * 2); 5392 Ops[2] = Builder.CreateBitCast(Ops[2], STy); 5393 Value* SV = llvm::ConstantVector::getSplat(VTy->getNumElements(), 5394 cast<ConstantInt>(Ops[3])); 5395 Ops[2] = Builder.CreateShuffleVector(Ops[2], Ops[2], SV, "lane"); 5396 5397 return Builder.CreateCall(F, {Ops[2], Ops[1], Ops[0]}); 5398 } 5399 case NEON::BI__builtin_neon_vfmaq_laneq_v: { 5400 Value *F = CGM.getIntrinsic(Intrinsic::fma, Ty); 5401 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 5402 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 5403 5404 Ops[2] = Builder.CreateBitCast(Ops[2], Ty); 5405 Ops[2] = EmitNeonSplat(Ops[2], cast<ConstantInt>(Ops[3])); 5406 return Builder.CreateCall(F, {Ops[2], Ops[1], Ops[0]}); 5407 } 5408 case NEON::BI__builtin_neon_vfmas_lane_f32: 5409 case NEON::BI__builtin_neon_vfmas_laneq_f32: 5410 case NEON::BI__builtin_neon_vfmad_lane_f64: 5411 case NEON::BI__builtin_neon_vfmad_laneq_f64: { 5412 Ops.push_back(EmitScalarExpr(E->getArg(3))); 5413 llvm::Type *Ty = ConvertType(E->getCallReturnType(getContext())); 5414 Value *F = CGM.getIntrinsic(Intrinsic::fma, Ty); 5415 Ops[2] = Builder.CreateExtractElement(Ops[2], Ops[3], "extract"); 5416 return Builder.CreateCall(F, {Ops[1], Ops[2], Ops[0]}); 5417 } 5418 case NEON::BI__builtin_neon_vmull_v: 5419 // FIXME: improve sharing scheme to cope with 3 alternative LLVM intrinsics. 5420 Int = usgn ? Intrinsic::aarch64_neon_umull : Intrinsic::aarch64_neon_smull; 5421 if (Type.isPoly()) Int = Intrinsic::aarch64_neon_pmull; 5422 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmull"); 5423 case NEON::BI__builtin_neon_vmax_v: 5424 case NEON::BI__builtin_neon_vmaxq_v: 5425 // FIXME: improve sharing scheme to cope with 3 alternative LLVM intrinsics. 5426 Int = usgn ? Intrinsic::aarch64_neon_umax : Intrinsic::aarch64_neon_smax; 5427 if (Ty->isFPOrFPVectorTy()) Int = Intrinsic::aarch64_neon_fmax; 5428 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmax"); 5429 case NEON::BI__builtin_neon_vmin_v: 5430 case NEON::BI__builtin_neon_vminq_v: 5431 // FIXME: improve sharing scheme to cope with 3 alternative LLVM intrinsics. 5432 Int = usgn ? Intrinsic::aarch64_neon_umin : Intrinsic::aarch64_neon_smin; 5433 if (Ty->isFPOrFPVectorTy()) Int = Intrinsic::aarch64_neon_fmin; 5434 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmin"); 5435 case NEON::BI__builtin_neon_vabd_v: 5436 case NEON::BI__builtin_neon_vabdq_v: 5437 // FIXME: improve sharing scheme to cope with 3 alternative LLVM intrinsics. 5438 Int = usgn ? Intrinsic::aarch64_neon_uabd : Intrinsic::aarch64_neon_sabd; 5439 if (Ty->isFPOrFPVectorTy()) Int = Intrinsic::aarch64_neon_fabd; 5440 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vabd"); 5441 case NEON::BI__builtin_neon_vpadal_v: 5442 case NEON::BI__builtin_neon_vpadalq_v: { 5443 unsigned ArgElts = VTy->getNumElements(); 5444 llvm::IntegerType *EltTy = cast<IntegerType>(VTy->getElementType()); 5445 unsigned BitWidth = EltTy->getBitWidth(); 5446 llvm::Type *ArgTy = llvm::VectorType::get( 5447 llvm::IntegerType::get(getLLVMContext(), BitWidth/2), 2*ArgElts); 5448 llvm::Type* Tys[2] = { VTy, ArgTy }; 5449 Int = usgn ? Intrinsic::aarch64_neon_uaddlp : Intrinsic::aarch64_neon_saddlp; 5450 SmallVector<llvm::Value*, 1> TmpOps; 5451 TmpOps.push_back(Ops[1]); 5452 Function *F = CGM.getIntrinsic(Int, Tys); 5453 llvm::Value *tmp = EmitNeonCall(F, TmpOps, "vpadal"); 5454 llvm::Value *addend = Builder.CreateBitCast(Ops[0], tmp->getType()); 5455 return Builder.CreateAdd(tmp, addend); 5456 } 5457 case NEON::BI__builtin_neon_vpmin_v: 5458 case NEON::BI__builtin_neon_vpminq_v: 5459 // FIXME: improve sharing scheme to cope with 3 alternative LLVM intrinsics. 5460 Int = usgn ? Intrinsic::aarch64_neon_uminp : Intrinsic::aarch64_neon_sminp; 5461 if (Ty->isFPOrFPVectorTy()) Int = Intrinsic::aarch64_neon_fminp; 5462 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpmin"); 5463 case NEON::BI__builtin_neon_vpmax_v: 5464 case NEON::BI__builtin_neon_vpmaxq_v: 5465 // FIXME: improve sharing scheme to cope with 3 alternative LLVM intrinsics. 5466 Int = usgn ? Intrinsic::aarch64_neon_umaxp : Intrinsic::aarch64_neon_smaxp; 5467 if (Ty->isFPOrFPVectorTy()) Int = Intrinsic::aarch64_neon_fmaxp; 5468 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpmax"); 5469 case NEON::BI__builtin_neon_vminnm_v: 5470 case NEON::BI__builtin_neon_vminnmq_v: 5471 Int = Intrinsic::aarch64_neon_fminnm; 5472 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vminnm"); 5473 case NEON::BI__builtin_neon_vmaxnm_v: 5474 case NEON::BI__builtin_neon_vmaxnmq_v: 5475 Int = Intrinsic::aarch64_neon_fmaxnm; 5476 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmaxnm"); 5477 case NEON::BI__builtin_neon_vrecpss_f32: { 5478 Ops.push_back(EmitScalarExpr(E->getArg(1))); 5479 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_frecps, FloatTy), 5480 Ops, "vrecps"); 5481 } 5482 case NEON::BI__builtin_neon_vrecpsd_f64: { 5483 Ops.push_back(EmitScalarExpr(E->getArg(1))); 5484 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_frecps, DoubleTy), 5485 Ops, "vrecps"); 5486 } 5487 case NEON::BI__builtin_neon_vqshrun_n_v: 5488 Int = Intrinsic::aarch64_neon_sqshrun; 5489 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshrun_n"); 5490 case NEON::BI__builtin_neon_vqrshrun_n_v: 5491 Int = Intrinsic::aarch64_neon_sqrshrun; 5492 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqrshrun_n"); 5493 case NEON::BI__builtin_neon_vqshrn_n_v: 5494 Int = usgn ? Intrinsic::aarch64_neon_uqshrn : Intrinsic::aarch64_neon_sqshrn; 5495 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshrn_n"); 5496 case NEON::BI__builtin_neon_vrshrn_n_v: 5497 Int = Intrinsic::aarch64_neon_rshrn; 5498 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrshrn_n"); 5499 case NEON::BI__builtin_neon_vqrshrn_n_v: 5500 Int = usgn ? Intrinsic::aarch64_neon_uqrshrn : Intrinsic::aarch64_neon_sqrshrn; 5501 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqrshrn_n"); 5502 case NEON::BI__builtin_neon_vrnda_v: 5503 case NEON::BI__builtin_neon_vrndaq_v: { 5504 Int = Intrinsic::round; 5505 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrnda"); 5506 } 5507 case NEON::BI__builtin_neon_vrndi_v: 5508 case NEON::BI__builtin_neon_vrndiq_v: { 5509 Int = Intrinsic::nearbyint; 5510 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrndi"); 5511 } 5512 case NEON::BI__builtin_neon_vrndm_v: 5513 case NEON::BI__builtin_neon_vrndmq_v: { 5514 Int = Intrinsic::floor; 5515 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrndm"); 5516 } 5517 case NEON::BI__builtin_neon_vrndn_v: 5518 case NEON::BI__builtin_neon_vrndnq_v: { 5519 Int = Intrinsic::aarch64_neon_frintn; 5520 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrndn"); 5521 } 5522 case NEON::BI__builtin_neon_vrndp_v: 5523 case NEON::BI__builtin_neon_vrndpq_v: { 5524 Int = Intrinsic::ceil; 5525 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrndp"); 5526 } 5527 case NEON::BI__builtin_neon_vrndx_v: 5528 case NEON::BI__builtin_neon_vrndxq_v: { 5529 Int = Intrinsic::rint; 5530 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrndx"); 5531 } 5532 case NEON::BI__builtin_neon_vrnd_v: 5533 case NEON::BI__builtin_neon_vrndq_v: { 5534 Int = Intrinsic::trunc; 5535 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrndz"); 5536 } 5537 case NEON::BI__builtin_neon_vceqz_v: 5538 case NEON::BI__builtin_neon_vceqzq_v: 5539 return EmitAArch64CompareBuiltinExpr(Ops[0], Ty, ICmpInst::FCMP_OEQ, 5540 ICmpInst::ICMP_EQ, "vceqz"); 5541 case NEON::BI__builtin_neon_vcgez_v: 5542 case NEON::BI__builtin_neon_vcgezq_v: 5543 return EmitAArch64CompareBuiltinExpr(Ops[0], Ty, ICmpInst::FCMP_OGE, 5544 ICmpInst::ICMP_SGE, "vcgez"); 5545 case NEON::BI__builtin_neon_vclez_v: 5546 case NEON::BI__builtin_neon_vclezq_v: 5547 return EmitAArch64CompareBuiltinExpr(Ops[0], Ty, ICmpInst::FCMP_OLE, 5548 ICmpInst::ICMP_SLE, "vclez"); 5549 case NEON::BI__builtin_neon_vcgtz_v: 5550 case NEON::BI__builtin_neon_vcgtzq_v: 5551 return EmitAArch64CompareBuiltinExpr(Ops[0], Ty, ICmpInst::FCMP_OGT, 5552 ICmpInst::ICMP_SGT, "vcgtz"); 5553 case NEON::BI__builtin_neon_vcltz_v: 5554 case NEON::BI__builtin_neon_vcltzq_v: 5555 return EmitAArch64CompareBuiltinExpr(Ops[0], Ty, ICmpInst::FCMP_OLT, 5556 ICmpInst::ICMP_SLT, "vcltz"); 5557 case NEON::BI__builtin_neon_vcvt_f64_v: 5558 case NEON::BI__builtin_neon_vcvtq_f64_v: 5559 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 5560 Ty = GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float64, false, quad)); 5561 return usgn ? Builder.CreateUIToFP(Ops[0], Ty, "vcvt") 5562 : Builder.CreateSIToFP(Ops[0], Ty, "vcvt"); 5563 case NEON::BI__builtin_neon_vcvt_f64_f32: { 5564 assert(Type.getEltType() == NeonTypeFlags::Float64 && quad && 5565 "unexpected vcvt_f64_f32 builtin"); 5566 NeonTypeFlags SrcFlag = NeonTypeFlags(NeonTypeFlags::Float32, false, false); 5567 Ops[0] = Builder.CreateBitCast(Ops[0], GetNeonType(this, SrcFlag)); 5568 5569 return Builder.CreateFPExt(Ops[0], Ty, "vcvt"); 5570 } 5571 case NEON::BI__builtin_neon_vcvt_f32_f64: { 5572 assert(Type.getEltType() == NeonTypeFlags::Float32 && 5573 "unexpected vcvt_f32_f64 builtin"); 5574 NeonTypeFlags SrcFlag = NeonTypeFlags(NeonTypeFlags::Float64, false, true); 5575 Ops[0] = Builder.CreateBitCast(Ops[0], GetNeonType(this, SrcFlag)); 5576 5577 return Builder.CreateFPTrunc(Ops[0], Ty, "vcvt"); 5578 } 5579 case NEON::BI__builtin_neon_vcvt_s32_v: 5580 case NEON::BI__builtin_neon_vcvt_u32_v: 5581 case NEON::BI__builtin_neon_vcvt_s64_v: 5582 case NEON::BI__builtin_neon_vcvt_u64_v: 5583 case NEON::BI__builtin_neon_vcvtq_s32_v: 5584 case NEON::BI__builtin_neon_vcvtq_u32_v: 5585 case NEON::BI__builtin_neon_vcvtq_s64_v: 5586 case NEON::BI__builtin_neon_vcvtq_u64_v: { 5587 Ops[0] = Builder.CreateBitCast(Ops[0], GetFloatNeonType(this, Type)); 5588 if (usgn) 5589 return Builder.CreateFPToUI(Ops[0], Ty); 5590 return Builder.CreateFPToSI(Ops[0], Ty); 5591 } 5592 case NEON::BI__builtin_neon_vcvta_s32_v: 5593 case NEON::BI__builtin_neon_vcvtaq_s32_v: 5594 case NEON::BI__builtin_neon_vcvta_u32_v: 5595 case NEON::BI__builtin_neon_vcvtaq_u32_v: 5596 case NEON::BI__builtin_neon_vcvta_s64_v: 5597 case NEON::BI__builtin_neon_vcvtaq_s64_v: 5598 case NEON::BI__builtin_neon_vcvta_u64_v: 5599 case NEON::BI__builtin_neon_vcvtaq_u64_v: { 5600 Int = usgn ? Intrinsic::aarch64_neon_fcvtau : Intrinsic::aarch64_neon_fcvtas; 5601 llvm::Type *Tys[2] = { Ty, GetFloatNeonType(this, Type) }; 5602 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvta"); 5603 } 5604 case NEON::BI__builtin_neon_vcvtm_s32_v: 5605 case NEON::BI__builtin_neon_vcvtmq_s32_v: 5606 case NEON::BI__builtin_neon_vcvtm_u32_v: 5607 case NEON::BI__builtin_neon_vcvtmq_u32_v: 5608 case NEON::BI__builtin_neon_vcvtm_s64_v: 5609 case NEON::BI__builtin_neon_vcvtmq_s64_v: 5610 case NEON::BI__builtin_neon_vcvtm_u64_v: 5611 case NEON::BI__builtin_neon_vcvtmq_u64_v: { 5612 Int = usgn ? Intrinsic::aarch64_neon_fcvtmu : Intrinsic::aarch64_neon_fcvtms; 5613 llvm::Type *Tys[2] = { Ty, GetFloatNeonType(this, Type) }; 5614 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvtm"); 5615 } 5616 case NEON::BI__builtin_neon_vcvtn_s32_v: 5617 case NEON::BI__builtin_neon_vcvtnq_s32_v: 5618 case NEON::BI__builtin_neon_vcvtn_u32_v: 5619 case NEON::BI__builtin_neon_vcvtnq_u32_v: 5620 case NEON::BI__builtin_neon_vcvtn_s64_v: 5621 case NEON::BI__builtin_neon_vcvtnq_s64_v: 5622 case NEON::BI__builtin_neon_vcvtn_u64_v: 5623 case NEON::BI__builtin_neon_vcvtnq_u64_v: { 5624 Int = usgn ? Intrinsic::aarch64_neon_fcvtnu : Intrinsic::aarch64_neon_fcvtns; 5625 llvm::Type *Tys[2] = { Ty, GetFloatNeonType(this, Type) }; 5626 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvtn"); 5627 } 5628 case NEON::BI__builtin_neon_vcvtp_s32_v: 5629 case NEON::BI__builtin_neon_vcvtpq_s32_v: 5630 case NEON::BI__builtin_neon_vcvtp_u32_v: 5631 case NEON::BI__builtin_neon_vcvtpq_u32_v: 5632 case NEON::BI__builtin_neon_vcvtp_s64_v: 5633 case NEON::BI__builtin_neon_vcvtpq_s64_v: 5634 case NEON::BI__builtin_neon_vcvtp_u64_v: 5635 case NEON::BI__builtin_neon_vcvtpq_u64_v: { 5636 Int = usgn ? Intrinsic::aarch64_neon_fcvtpu : Intrinsic::aarch64_neon_fcvtps; 5637 llvm::Type *Tys[2] = { Ty, GetFloatNeonType(this, Type) }; 5638 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvtp"); 5639 } 5640 case NEON::BI__builtin_neon_vmulx_v: 5641 case NEON::BI__builtin_neon_vmulxq_v: { 5642 Int = Intrinsic::aarch64_neon_fmulx; 5643 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmulx"); 5644 } 5645 case NEON::BI__builtin_neon_vmul_lane_v: 5646 case NEON::BI__builtin_neon_vmul_laneq_v: { 5647 // v1f64 vmul_lane should be mapped to Neon scalar mul lane 5648 bool Quad = false; 5649 if (BuiltinID == NEON::BI__builtin_neon_vmul_laneq_v) 5650 Quad = true; 5651 Ops[0] = Builder.CreateBitCast(Ops[0], DoubleTy); 5652 llvm::Type *VTy = GetNeonType(this, 5653 NeonTypeFlags(NeonTypeFlags::Float64, false, Quad)); 5654 Ops[1] = Builder.CreateBitCast(Ops[1], VTy); 5655 Ops[1] = Builder.CreateExtractElement(Ops[1], Ops[2], "extract"); 5656 Value *Result = Builder.CreateFMul(Ops[0], Ops[1]); 5657 return Builder.CreateBitCast(Result, Ty); 5658 } 5659 case NEON::BI__builtin_neon_vnegd_s64: 5660 return Builder.CreateNeg(EmitScalarExpr(E->getArg(0)), "vnegd"); 5661 case NEON::BI__builtin_neon_vpmaxnm_v: 5662 case NEON::BI__builtin_neon_vpmaxnmq_v: { 5663 Int = Intrinsic::aarch64_neon_fmaxnmp; 5664 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpmaxnm"); 5665 } 5666 case NEON::BI__builtin_neon_vpminnm_v: 5667 case NEON::BI__builtin_neon_vpminnmq_v: { 5668 Int = Intrinsic::aarch64_neon_fminnmp; 5669 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpminnm"); 5670 } 5671 case NEON::BI__builtin_neon_vsqrt_v: 5672 case NEON::BI__builtin_neon_vsqrtq_v: { 5673 Int = Intrinsic::sqrt; 5674 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 5675 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vsqrt"); 5676 } 5677 case NEON::BI__builtin_neon_vrbit_v: 5678 case NEON::BI__builtin_neon_vrbitq_v: { 5679 Int = Intrinsic::aarch64_neon_rbit; 5680 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrbit"); 5681 } 5682 case NEON::BI__builtin_neon_vaddv_u8: 5683 // FIXME: These are handled by the AArch64 scalar code. 5684 usgn = true; 5685 // FALLTHROUGH 5686 case NEON::BI__builtin_neon_vaddv_s8: { 5687 Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv; 5688 Ty = Int32Ty; 5689 VTy = llvm::VectorType::get(Int8Ty, 8); 5690 llvm::Type *Tys[2] = { Ty, VTy }; 5691 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5692 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv"); 5693 return Builder.CreateTrunc(Ops[0], Int8Ty); 5694 } 5695 case NEON::BI__builtin_neon_vaddv_u16: 5696 usgn = true; 5697 // FALLTHROUGH 5698 case NEON::BI__builtin_neon_vaddv_s16: { 5699 Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv; 5700 Ty = Int32Ty; 5701 VTy = llvm::VectorType::get(Int16Ty, 4); 5702 llvm::Type *Tys[2] = { Ty, VTy }; 5703 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5704 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv"); 5705 return Builder.CreateTrunc(Ops[0], Int16Ty); 5706 } 5707 case NEON::BI__builtin_neon_vaddvq_u8: 5708 usgn = true; 5709 // FALLTHROUGH 5710 case NEON::BI__builtin_neon_vaddvq_s8: { 5711 Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv; 5712 Ty = Int32Ty; 5713 VTy = llvm::VectorType::get(Int8Ty, 16); 5714 llvm::Type *Tys[2] = { Ty, VTy }; 5715 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5716 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv"); 5717 return Builder.CreateTrunc(Ops[0], Int8Ty); 5718 } 5719 case NEON::BI__builtin_neon_vaddvq_u16: 5720 usgn = true; 5721 // FALLTHROUGH 5722 case NEON::BI__builtin_neon_vaddvq_s16: { 5723 Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv; 5724 Ty = Int32Ty; 5725 VTy = llvm::VectorType::get(Int16Ty, 8); 5726 llvm::Type *Tys[2] = { Ty, VTy }; 5727 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5728 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv"); 5729 return Builder.CreateTrunc(Ops[0], Int16Ty); 5730 } 5731 case NEON::BI__builtin_neon_vmaxv_u8: { 5732 Int = Intrinsic::aarch64_neon_umaxv; 5733 Ty = Int32Ty; 5734 VTy = llvm::VectorType::get(Int8Ty, 8); 5735 llvm::Type *Tys[2] = { Ty, VTy }; 5736 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5737 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); 5738 return Builder.CreateTrunc(Ops[0], Int8Ty); 5739 } 5740 case NEON::BI__builtin_neon_vmaxv_u16: { 5741 Int = Intrinsic::aarch64_neon_umaxv; 5742 Ty = Int32Ty; 5743 VTy = llvm::VectorType::get(Int16Ty, 4); 5744 llvm::Type *Tys[2] = { Ty, VTy }; 5745 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5746 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); 5747 return Builder.CreateTrunc(Ops[0], Int16Ty); 5748 } 5749 case NEON::BI__builtin_neon_vmaxvq_u8: { 5750 Int = Intrinsic::aarch64_neon_umaxv; 5751 Ty = Int32Ty; 5752 VTy = llvm::VectorType::get(Int8Ty, 16); 5753 llvm::Type *Tys[2] = { Ty, VTy }; 5754 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5755 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); 5756 return Builder.CreateTrunc(Ops[0], Int8Ty); 5757 } 5758 case NEON::BI__builtin_neon_vmaxvq_u16: { 5759 Int = Intrinsic::aarch64_neon_umaxv; 5760 Ty = Int32Ty; 5761 VTy = llvm::VectorType::get(Int16Ty, 8); 5762 llvm::Type *Tys[2] = { Ty, VTy }; 5763 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5764 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); 5765 return Builder.CreateTrunc(Ops[0], Int16Ty); 5766 } 5767 case NEON::BI__builtin_neon_vmaxv_s8: { 5768 Int = Intrinsic::aarch64_neon_smaxv; 5769 Ty = Int32Ty; 5770 VTy = llvm::VectorType::get(Int8Ty, 8); 5771 llvm::Type *Tys[2] = { Ty, VTy }; 5772 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5773 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); 5774 return Builder.CreateTrunc(Ops[0], Int8Ty); 5775 } 5776 case NEON::BI__builtin_neon_vmaxv_s16: { 5777 Int = Intrinsic::aarch64_neon_smaxv; 5778 Ty = Int32Ty; 5779 VTy = llvm::VectorType::get(Int16Ty, 4); 5780 llvm::Type *Tys[2] = { Ty, VTy }; 5781 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5782 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); 5783 return Builder.CreateTrunc(Ops[0], Int16Ty); 5784 } 5785 case NEON::BI__builtin_neon_vmaxvq_s8: { 5786 Int = Intrinsic::aarch64_neon_smaxv; 5787 Ty = Int32Ty; 5788 VTy = llvm::VectorType::get(Int8Ty, 16); 5789 llvm::Type *Tys[2] = { Ty, VTy }; 5790 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5791 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); 5792 return Builder.CreateTrunc(Ops[0], Int8Ty); 5793 } 5794 case NEON::BI__builtin_neon_vmaxvq_s16: { 5795 Int = Intrinsic::aarch64_neon_smaxv; 5796 Ty = Int32Ty; 5797 VTy = llvm::VectorType::get(Int16Ty, 8); 5798 llvm::Type *Tys[2] = { Ty, VTy }; 5799 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5800 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); 5801 return Builder.CreateTrunc(Ops[0], Int16Ty); 5802 } 5803 case NEON::BI__builtin_neon_vminv_u8: { 5804 Int = Intrinsic::aarch64_neon_uminv; 5805 Ty = Int32Ty; 5806 VTy = llvm::VectorType::get(Int8Ty, 8); 5807 llvm::Type *Tys[2] = { Ty, VTy }; 5808 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5809 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); 5810 return Builder.CreateTrunc(Ops[0], Int8Ty); 5811 } 5812 case NEON::BI__builtin_neon_vminv_u16: { 5813 Int = Intrinsic::aarch64_neon_uminv; 5814 Ty = Int32Ty; 5815 VTy = llvm::VectorType::get(Int16Ty, 4); 5816 llvm::Type *Tys[2] = { Ty, VTy }; 5817 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5818 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); 5819 return Builder.CreateTrunc(Ops[0], Int16Ty); 5820 } 5821 case NEON::BI__builtin_neon_vminvq_u8: { 5822 Int = Intrinsic::aarch64_neon_uminv; 5823 Ty = Int32Ty; 5824 VTy = llvm::VectorType::get(Int8Ty, 16); 5825 llvm::Type *Tys[2] = { Ty, VTy }; 5826 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5827 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); 5828 return Builder.CreateTrunc(Ops[0], Int8Ty); 5829 } 5830 case NEON::BI__builtin_neon_vminvq_u16: { 5831 Int = Intrinsic::aarch64_neon_uminv; 5832 Ty = Int32Ty; 5833 VTy = llvm::VectorType::get(Int16Ty, 8); 5834 llvm::Type *Tys[2] = { Ty, VTy }; 5835 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5836 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); 5837 return Builder.CreateTrunc(Ops[0], Int16Ty); 5838 } 5839 case NEON::BI__builtin_neon_vminv_s8: { 5840 Int = Intrinsic::aarch64_neon_sminv; 5841 Ty = Int32Ty; 5842 VTy = llvm::VectorType::get(Int8Ty, 8); 5843 llvm::Type *Tys[2] = { Ty, VTy }; 5844 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5845 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); 5846 return Builder.CreateTrunc(Ops[0], Int8Ty); 5847 } 5848 case NEON::BI__builtin_neon_vminv_s16: { 5849 Int = Intrinsic::aarch64_neon_sminv; 5850 Ty = Int32Ty; 5851 VTy = llvm::VectorType::get(Int16Ty, 4); 5852 llvm::Type *Tys[2] = { Ty, VTy }; 5853 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5854 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); 5855 return Builder.CreateTrunc(Ops[0], Int16Ty); 5856 } 5857 case NEON::BI__builtin_neon_vminvq_s8: { 5858 Int = Intrinsic::aarch64_neon_sminv; 5859 Ty = Int32Ty; 5860 VTy = llvm::VectorType::get(Int8Ty, 16); 5861 llvm::Type *Tys[2] = { Ty, VTy }; 5862 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5863 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); 5864 return Builder.CreateTrunc(Ops[0], Int8Ty); 5865 } 5866 case NEON::BI__builtin_neon_vminvq_s16: { 5867 Int = Intrinsic::aarch64_neon_sminv; 5868 Ty = Int32Ty; 5869 VTy = llvm::VectorType::get(Int16Ty, 8); 5870 llvm::Type *Tys[2] = { Ty, VTy }; 5871 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5872 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); 5873 return Builder.CreateTrunc(Ops[0], Int16Ty); 5874 } 5875 case NEON::BI__builtin_neon_vmul_n_f64: { 5876 Ops[0] = Builder.CreateBitCast(Ops[0], DoubleTy); 5877 Value *RHS = Builder.CreateBitCast(EmitScalarExpr(E->getArg(1)), DoubleTy); 5878 return Builder.CreateFMul(Ops[0], RHS); 5879 } 5880 case NEON::BI__builtin_neon_vaddlv_u8: { 5881 Int = Intrinsic::aarch64_neon_uaddlv; 5882 Ty = Int32Ty; 5883 VTy = llvm::VectorType::get(Int8Ty, 8); 5884 llvm::Type *Tys[2] = { Ty, VTy }; 5885 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5886 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv"); 5887 return Builder.CreateTrunc(Ops[0], Int16Ty); 5888 } 5889 case NEON::BI__builtin_neon_vaddlv_u16: { 5890 Int = Intrinsic::aarch64_neon_uaddlv; 5891 Ty = Int32Ty; 5892 VTy = llvm::VectorType::get(Int16Ty, 4); 5893 llvm::Type *Tys[2] = { Ty, VTy }; 5894 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5895 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv"); 5896 } 5897 case NEON::BI__builtin_neon_vaddlvq_u8: { 5898 Int = Intrinsic::aarch64_neon_uaddlv; 5899 Ty = Int32Ty; 5900 VTy = llvm::VectorType::get(Int8Ty, 16); 5901 llvm::Type *Tys[2] = { Ty, VTy }; 5902 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5903 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv"); 5904 return Builder.CreateTrunc(Ops[0], Int16Ty); 5905 } 5906 case NEON::BI__builtin_neon_vaddlvq_u16: { 5907 Int = Intrinsic::aarch64_neon_uaddlv; 5908 Ty = Int32Ty; 5909 VTy = llvm::VectorType::get(Int16Ty, 8); 5910 llvm::Type *Tys[2] = { Ty, VTy }; 5911 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5912 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv"); 5913 } 5914 case NEON::BI__builtin_neon_vaddlv_s8: { 5915 Int = Intrinsic::aarch64_neon_saddlv; 5916 Ty = Int32Ty; 5917 VTy = llvm::VectorType::get(Int8Ty, 8); 5918 llvm::Type *Tys[2] = { Ty, VTy }; 5919 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5920 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv"); 5921 return Builder.CreateTrunc(Ops[0], Int16Ty); 5922 } 5923 case NEON::BI__builtin_neon_vaddlv_s16: { 5924 Int = Intrinsic::aarch64_neon_saddlv; 5925 Ty = Int32Ty; 5926 VTy = llvm::VectorType::get(Int16Ty, 4); 5927 llvm::Type *Tys[2] = { Ty, VTy }; 5928 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5929 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv"); 5930 } 5931 case NEON::BI__builtin_neon_vaddlvq_s8: { 5932 Int = Intrinsic::aarch64_neon_saddlv; 5933 Ty = Int32Ty; 5934 VTy = llvm::VectorType::get(Int8Ty, 16); 5935 llvm::Type *Tys[2] = { Ty, VTy }; 5936 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5937 Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv"); 5938 return Builder.CreateTrunc(Ops[0], Int16Ty); 5939 } 5940 case NEON::BI__builtin_neon_vaddlvq_s16: { 5941 Int = Intrinsic::aarch64_neon_saddlv; 5942 Ty = Int32Ty; 5943 VTy = llvm::VectorType::get(Int16Ty, 8); 5944 llvm::Type *Tys[2] = { Ty, VTy }; 5945 Ops.push_back(EmitScalarExpr(E->getArg(0))); 5946 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv"); 5947 } 5948 case NEON::BI__builtin_neon_vsri_n_v: 5949 case NEON::BI__builtin_neon_vsriq_n_v: { 5950 Int = Intrinsic::aarch64_neon_vsri; 5951 llvm::Function *Intrin = CGM.getIntrinsic(Int, Ty); 5952 return EmitNeonCall(Intrin, Ops, "vsri_n"); 5953 } 5954 case NEON::BI__builtin_neon_vsli_n_v: 5955 case NEON::BI__builtin_neon_vsliq_n_v: { 5956 Int = Intrinsic::aarch64_neon_vsli; 5957 llvm::Function *Intrin = CGM.getIntrinsic(Int, Ty); 5958 return EmitNeonCall(Intrin, Ops, "vsli_n"); 5959 } 5960 case NEON::BI__builtin_neon_vsra_n_v: 5961 case NEON::BI__builtin_neon_vsraq_n_v: 5962 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 5963 Ops[1] = EmitNeonRShiftImm(Ops[1], Ops[2], Ty, usgn, "vsra_n"); 5964 return Builder.CreateAdd(Ops[0], Ops[1]); 5965 case NEON::BI__builtin_neon_vrsra_n_v: 5966 case NEON::BI__builtin_neon_vrsraq_n_v: { 5967 Int = usgn ? Intrinsic::aarch64_neon_urshl : Intrinsic::aarch64_neon_srshl; 5968 SmallVector<llvm::Value*,2> TmpOps; 5969 TmpOps.push_back(Ops[1]); 5970 TmpOps.push_back(Ops[2]); 5971 Function* F = CGM.getIntrinsic(Int, Ty); 5972 llvm::Value *tmp = EmitNeonCall(F, TmpOps, "vrshr_n", 1, true); 5973 Ops[0] = Builder.CreateBitCast(Ops[0], VTy); 5974 return Builder.CreateAdd(Ops[0], tmp); 5975 } 5976 // FIXME: Sharing loads & stores with 32-bit is complicated by the absence 5977 // of an Align parameter here. 5978 case NEON::BI__builtin_neon_vld1_x2_v: 5979 case NEON::BI__builtin_neon_vld1q_x2_v: 5980 case NEON::BI__builtin_neon_vld1_x3_v: 5981 case NEON::BI__builtin_neon_vld1q_x3_v: 5982 case NEON::BI__builtin_neon_vld1_x4_v: 5983 case NEON::BI__builtin_neon_vld1q_x4_v: { 5984 llvm::Type *PTy = llvm::PointerType::getUnqual(VTy->getVectorElementType()); 5985 Ops[1] = Builder.CreateBitCast(Ops[1], PTy); 5986 llvm::Type *Tys[2] = { VTy, PTy }; 5987 unsigned Int; 5988 switch (BuiltinID) { 5989 case NEON::BI__builtin_neon_vld1_x2_v: 5990 case NEON::BI__builtin_neon_vld1q_x2_v: 5991 Int = Intrinsic::aarch64_neon_ld1x2; 5992 break; 5993 case NEON::BI__builtin_neon_vld1_x3_v: 5994 case NEON::BI__builtin_neon_vld1q_x3_v: 5995 Int = Intrinsic::aarch64_neon_ld1x3; 5996 break; 5997 case NEON::BI__builtin_neon_vld1_x4_v: 5998 case NEON::BI__builtin_neon_vld1q_x4_v: 5999 Int = Intrinsic::aarch64_neon_ld1x4; 6000 break; 6001 } 6002 Function *F = CGM.getIntrinsic(Int, Tys); 6003 Ops[1] = Builder.CreateCall(F, Ops[1], "vld1xN"); 6004 Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); 6005 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 6006 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6007 } 6008 case NEON::BI__builtin_neon_vst1_x2_v: 6009 case NEON::BI__builtin_neon_vst1q_x2_v: 6010 case NEON::BI__builtin_neon_vst1_x3_v: 6011 case NEON::BI__builtin_neon_vst1q_x3_v: 6012 case NEON::BI__builtin_neon_vst1_x4_v: 6013 case NEON::BI__builtin_neon_vst1q_x4_v: { 6014 llvm::Type *PTy = llvm::PointerType::getUnqual(VTy->getVectorElementType()); 6015 llvm::Type *Tys[2] = { VTy, PTy }; 6016 unsigned Int; 6017 switch (BuiltinID) { 6018 case NEON::BI__builtin_neon_vst1_x2_v: 6019 case NEON::BI__builtin_neon_vst1q_x2_v: 6020 Int = Intrinsic::aarch64_neon_st1x2; 6021 break; 6022 case NEON::BI__builtin_neon_vst1_x3_v: 6023 case NEON::BI__builtin_neon_vst1q_x3_v: 6024 Int = Intrinsic::aarch64_neon_st1x3; 6025 break; 6026 case NEON::BI__builtin_neon_vst1_x4_v: 6027 case NEON::BI__builtin_neon_vst1q_x4_v: 6028 Int = Intrinsic::aarch64_neon_st1x4; 6029 break; 6030 } 6031 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end()); 6032 return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, ""); 6033 } 6034 case NEON::BI__builtin_neon_vld1_v: 6035 case NEON::BI__builtin_neon_vld1q_v: 6036 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(VTy)); 6037 return Builder.CreateDefaultAlignedLoad(Ops[0]); 6038 case NEON::BI__builtin_neon_vst1_v: 6039 case NEON::BI__builtin_neon_vst1q_v: 6040 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(VTy)); 6041 Ops[1] = Builder.CreateBitCast(Ops[1], VTy); 6042 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6043 case NEON::BI__builtin_neon_vld1_lane_v: 6044 case NEON::BI__builtin_neon_vld1q_lane_v: 6045 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 6046 Ty = llvm::PointerType::getUnqual(VTy->getElementType()); 6047 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 6048 Ops[0] = Builder.CreateDefaultAlignedLoad(Ops[0]); 6049 return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vld1_lane"); 6050 case NEON::BI__builtin_neon_vld1_dup_v: 6051 case NEON::BI__builtin_neon_vld1q_dup_v: { 6052 Value *V = UndefValue::get(Ty); 6053 Ty = llvm::PointerType::getUnqual(VTy->getElementType()); 6054 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 6055 Ops[0] = Builder.CreateDefaultAlignedLoad(Ops[0]); 6056 llvm::Constant *CI = ConstantInt::get(Int32Ty, 0); 6057 Ops[0] = Builder.CreateInsertElement(V, Ops[0], CI); 6058 return EmitNeonSplat(Ops[0], CI); 6059 } 6060 case NEON::BI__builtin_neon_vst1_lane_v: 6061 case NEON::BI__builtin_neon_vst1q_lane_v: 6062 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 6063 Ops[1] = Builder.CreateExtractElement(Ops[1], Ops[2]); 6064 Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); 6065 return Builder.CreateDefaultAlignedStore(Ops[1], 6066 Builder.CreateBitCast(Ops[0], Ty)); 6067 case NEON::BI__builtin_neon_vld2_v: 6068 case NEON::BI__builtin_neon_vld2q_v: { 6069 llvm::Type *PTy = llvm::PointerType::getUnqual(VTy); 6070 Ops[1] = Builder.CreateBitCast(Ops[1], PTy); 6071 llvm::Type *Tys[2] = { VTy, PTy }; 6072 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld2, Tys); 6073 Ops[1] = Builder.CreateCall(F, Ops[1], "vld2"); 6074 Ops[0] = Builder.CreateBitCast(Ops[0], 6075 llvm::PointerType::getUnqual(Ops[1]->getType())); 6076 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6077 } 6078 case NEON::BI__builtin_neon_vld3_v: 6079 case NEON::BI__builtin_neon_vld3q_v: { 6080 llvm::Type *PTy = llvm::PointerType::getUnqual(VTy); 6081 Ops[1] = Builder.CreateBitCast(Ops[1], PTy); 6082 llvm::Type *Tys[2] = { VTy, PTy }; 6083 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld3, Tys); 6084 Ops[1] = Builder.CreateCall(F, Ops[1], "vld3"); 6085 Ops[0] = Builder.CreateBitCast(Ops[0], 6086 llvm::PointerType::getUnqual(Ops[1]->getType())); 6087 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6088 } 6089 case NEON::BI__builtin_neon_vld4_v: 6090 case NEON::BI__builtin_neon_vld4q_v: { 6091 llvm::Type *PTy = llvm::PointerType::getUnqual(VTy); 6092 Ops[1] = Builder.CreateBitCast(Ops[1], PTy); 6093 llvm::Type *Tys[2] = { VTy, PTy }; 6094 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld4, Tys); 6095 Ops[1] = Builder.CreateCall(F, Ops[1], "vld4"); 6096 Ops[0] = Builder.CreateBitCast(Ops[0], 6097 llvm::PointerType::getUnqual(Ops[1]->getType())); 6098 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6099 } 6100 case NEON::BI__builtin_neon_vld2_dup_v: 6101 case NEON::BI__builtin_neon_vld2q_dup_v: { 6102 llvm::Type *PTy = 6103 llvm::PointerType::getUnqual(VTy->getElementType()); 6104 Ops[1] = Builder.CreateBitCast(Ops[1], PTy); 6105 llvm::Type *Tys[2] = { VTy, PTy }; 6106 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld2r, Tys); 6107 Ops[1] = Builder.CreateCall(F, Ops[1], "vld2"); 6108 Ops[0] = Builder.CreateBitCast(Ops[0], 6109 llvm::PointerType::getUnqual(Ops[1]->getType())); 6110 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6111 } 6112 case NEON::BI__builtin_neon_vld3_dup_v: 6113 case NEON::BI__builtin_neon_vld3q_dup_v: { 6114 llvm::Type *PTy = 6115 llvm::PointerType::getUnqual(VTy->getElementType()); 6116 Ops[1] = Builder.CreateBitCast(Ops[1], PTy); 6117 llvm::Type *Tys[2] = { VTy, PTy }; 6118 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld3r, Tys); 6119 Ops[1] = Builder.CreateCall(F, Ops[1], "vld3"); 6120 Ops[0] = Builder.CreateBitCast(Ops[0], 6121 llvm::PointerType::getUnqual(Ops[1]->getType())); 6122 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6123 } 6124 case NEON::BI__builtin_neon_vld4_dup_v: 6125 case NEON::BI__builtin_neon_vld4q_dup_v: { 6126 llvm::Type *PTy = 6127 llvm::PointerType::getUnqual(VTy->getElementType()); 6128 Ops[1] = Builder.CreateBitCast(Ops[1], PTy); 6129 llvm::Type *Tys[2] = { VTy, PTy }; 6130 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld4r, Tys); 6131 Ops[1] = Builder.CreateCall(F, Ops[1], "vld4"); 6132 Ops[0] = Builder.CreateBitCast(Ops[0], 6133 llvm::PointerType::getUnqual(Ops[1]->getType())); 6134 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6135 } 6136 case NEON::BI__builtin_neon_vld2_lane_v: 6137 case NEON::BI__builtin_neon_vld2q_lane_v: { 6138 llvm::Type *Tys[2] = { VTy, Ops[1]->getType() }; 6139 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld2lane, Tys); 6140 Ops.push_back(Ops[1]); 6141 Ops.erase(Ops.begin()+1); 6142 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 6143 Ops[2] = Builder.CreateBitCast(Ops[2], Ty); 6144 Ops[3] = Builder.CreateZExt(Ops[3], Int64Ty); 6145 Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld2_lane"); 6146 Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); 6147 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 6148 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6149 } 6150 case NEON::BI__builtin_neon_vld3_lane_v: 6151 case NEON::BI__builtin_neon_vld3q_lane_v: { 6152 llvm::Type *Tys[2] = { VTy, Ops[1]->getType() }; 6153 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld3lane, Tys); 6154 Ops.push_back(Ops[1]); 6155 Ops.erase(Ops.begin()+1); 6156 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 6157 Ops[2] = Builder.CreateBitCast(Ops[2], Ty); 6158 Ops[3] = Builder.CreateBitCast(Ops[3], Ty); 6159 Ops[4] = Builder.CreateZExt(Ops[4], Int64Ty); 6160 Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld3_lane"); 6161 Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); 6162 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 6163 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6164 } 6165 case NEON::BI__builtin_neon_vld4_lane_v: 6166 case NEON::BI__builtin_neon_vld4q_lane_v: { 6167 llvm::Type *Tys[2] = { VTy, Ops[1]->getType() }; 6168 Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld4lane, Tys); 6169 Ops.push_back(Ops[1]); 6170 Ops.erase(Ops.begin()+1); 6171 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 6172 Ops[2] = Builder.CreateBitCast(Ops[2], Ty); 6173 Ops[3] = Builder.CreateBitCast(Ops[3], Ty); 6174 Ops[4] = Builder.CreateBitCast(Ops[4], Ty); 6175 Ops[5] = Builder.CreateZExt(Ops[5], Int64Ty); 6176 Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld4_lane"); 6177 Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); 6178 Ops[0] = Builder.CreateBitCast(Ops[0], Ty); 6179 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6180 } 6181 case NEON::BI__builtin_neon_vst2_v: 6182 case NEON::BI__builtin_neon_vst2q_v: { 6183 Ops.push_back(Ops[0]); 6184 Ops.erase(Ops.begin()); 6185 llvm::Type *Tys[2] = { VTy, Ops[2]->getType() }; 6186 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st2, Tys), 6187 Ops, ""); 6188 } 6189 case NEON::BI__builtin_neon_vst2_lane_v: 6190 case NEON::BI__builtin_neon_vst2q_lane_v: { 6191 Ops.push_back(Ops[0]); 6192 Ops.erase(Ops.begin()); 6193 Ops[2] = Builder.CreateZExt(Ops[2], Int64Ty); 6194 llvm::Type *Tys[2] = { VTy, Ops[3]->getType() }; 6195 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st2lane, Tys), 6196 Ops, ""); 6197 } 6198 case NEON::BI__builtin_neon_vst3_v: 6199 case NEON::BI__builtin_neon_vst3q_v: { 6200 Ops.push_back(Ops[0]); 6201 Ops.erase(Ops.begin()); 6202 llvm::Type *Tys[2] = { VTy, Ops[3]->getType() }; 6203 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st3, Tys), 6204 Ops, ""); 6205 } 6206 case NEON::BI__builtin_neon_vst3_lane_v: 6207 case NEON::BI__builtin_neon_vst3q_lane_v: { 6208 Ops.push_back(Ops[0]); 6209 Ops.erase(Ops.begin()); 6210 Ops[3] = Builder.CreateZExt(Ops[3], Int64Ty); 6211 llvm::Type *Tys[2] = { VTy, Ops[4]->getType() }; 6212 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st3lane, Tys), 6213 Ops, ""); 6214 } 6215 case NEON::BI__builtin_neon_vst4_v: 6216 case NEON::BI__builtin_neon_vst4q_v: { 6217 Ops.push_back(Ops[0]); 6218 Ops.erase(Ops.begin()); 6219 llvm::Type *Tys[2] = { VTy, Ops[4]->getType() }; 6220 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st4, Tys), 6221 Ops, ""); 6222 } 6223 case NEON::BI__builtin_neon_vst4_lane_v: 6224 case NEON::BI__builtin_neon_vst4q_lane_v: { 6225 Ops.push_back(Ops[0]); 6226 Ops.erase(Ops.begin()); 6227 Ops[4] = Builder.CreateZExt(Ops[4], Int64Ty); 6228 llvm::Type *Tys[2] = { VTy, Ops[5]->getType() }; 6229 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st4lane, Tys), 6230 Ops, ""); 6231 } 6232 case NEON::BI__builtin_neon_vtrn_v: 6233 case NEON::BI__builtin_neon_vtrnq_v: { 6234 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty)); 6235 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 6236 Ops[2] = Builder.CreateBitCast(Ops[2], Ty); 6237 Value *SV = nullptr; 6238 6239 for (unsigned vi = 0; vi != 2; ++vi) { 6240 SmallVector<uint32_t, 16> Indices; 6241 for (unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) { 6242 Indices.push_back(i+vi); 6243 Indices.push_back(i+e+vi); 6244 } 6245 Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi); 6246 SV = Builder.CreateShuffleVector(Ops[1], Ops[2], Indices, "vtrn"); 6247 SV = Builder.CreateDefaultAlignedStore(SV, Addr); 6248 } 6249 return SV; 6250 } 6251 case NEON::BI__builtin_neon_vuzp_v: 6252 case NEON::BI__builtin_neon_vuzpq_v: { 6253 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty)); 6254 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 6255 Ops[2] = Builder.CreateBitCast(Ops[2], Ty); 6256 Value *SV = nullptr; 6257 6258 for (unsigned vi = 0; vi != 2; ++vi) { 6259 SmallVector<uint32_t, 16> Indices; 6260 for (unsigned i = 0, e = VTy->getNumElements(); i != e; ++i) 6261 Indices.push_back(2*i+vi); 6262 6263 Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi); 6264 SV = Builder.CreateShuffleVector(Ops[1], Ops[2], Indices, "vuzp"); 6265 SV = Builder.CreateDefaultAlignedStore(SV, Addr); 6266 } 6267 return SV; 6268 } 6269 case NEON::BI__builtin_neon_vzip_v: 6270 case NEON::BI__builtin_neon_vzipq_v: { 6271 Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty)); 6272 Ops[1] = Builder.CreateBitCast(Ops[1], Ty); 6273 Ops[2] = Builder.CreateBitCast(Ops[2], Ty); 6274 Value *SV = nullptr; 6275 6276 for (unsigned vi = 0; vi != 2; ++vi) { 6277 SmallVector<uint32_t, 16> Indices; 6278 for (unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) { 6279 Indices.push_back((i + vi*e) >> 1); 6280 Indices.push_back(((i + vi*e) >> 1)+e); 6281 } 6282 Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi); 6283 SV = Builder.CreateShuffleVector(Ops[1], Ops[2], Indices, "vzip"); 6284 SV = Builder.CreateDefaultAlignedStore(SV, Addr); 6285 } 6286 return SV; 6287 } 6288 case NEON::BI__builtin_neon_vqtbl1q_v: { 6289 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbl1, Ty), 6290 Ops, "vtbl1"); 6291 } 6292 case NEON::BI__builtin_neon_vqtbl2q_v: { 6293 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbl2, Ty), 6294 Ops, "vtbl2"); 6295 } 6296 case NEON::BI__builtin_neon_vqtbl3q_v: { 6297 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbl3, Ty), 6298 Ops, "vtbl3"); 6299 } 6300 case NEON::BI__builtin_neon_vqtbl4q_v: { 6301 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbl4, Ty), 6302 Ops, "vtbl4"); 6303 } 6304 case NEON::BI__builtin_neon_vqtbx1q_v: { 6305 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbx1, Ty), 6306 Ops, "vtbx1"); 6307 } 6308 case NEON::BI__builtin_neon_vqtbx2q_v: { 6309 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbx2, Ty), 6310 Ops, "vtbx2"); 6311 } 6312 case NEON::BI__builtin_neon_vqtbx3q_v: { 6313 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbx3, Ty), 6314 Ops, "vtbx3"); 6315 } 6316 case NEON::BI__builtin_neon_vqtbx4q_v: { 6317 return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbx4, Ty), 6318 Ops, "vtbx4"); 6319 } 6320 case NEON::BI__builtin_neon_vsqadd_v: 6321 case NEON::BI__builtin_neon_vsqaddq_v: { 6322 Int = Intrinsic::aarch64_neon_usqadd; 6323 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vsqadd"); 6324 } 6325 case NEON::BI__builtin_neon_vuqadd_v: 6326 case NEON::BI__builtin_neon_vuqaddq_v: { 6327 Int = Intrinsic::aarch64_neon_suqadd; 6328 return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vuqadd"); 6329 } 6330 } 6331 } 6332 6333 llvm::Value *CodeGenFunction:: 6334 BuildVector(ArrayRef<llvm::Value*> Ops) { 6335 assert((Ops.size() & (Ops.size() - 1)) == 0 && 6336 "Not a power-of-two sized vector!"); 6337 bool AllConstants = true; 6338 for (unsigned i = 0, e = Ops.size(); i != e && AllConstants; ++i) 6339 AllConstants &= isa<Constant>(Ops[i]); 6340 6341 // If this is a constant vector, create a ConstantVector. 6342 if (AllConstants) { 6343 SmallVector<llvm::Constant*, 16> CstOps; 6344 for (unsigned i = 0, e = Ops.size(); i != e; ++i) 6345 CstOps.push_back(cast<Constant>(Ops[i])); 6346 return llvm::ConstantVector::get(CstOps); 6347 } 6348 6349 // Otherwise, insertelement the values to build the vector. 6350 Value *Result = 6351 llvm::UndefValue::get(llvm::VectorType::get(Ops[0]->getType(), Ops.size())); 6352 6353 for (unsigned i = 0, e = Ops.size(); i != e; ++i) 6354 Result = Builder.CreateInsertElement(Result, Ops[i], Builder.getInt32(i)); 6355 6356 return Result; 6357 } 6358 6359 // Convert the mask from an integer type to a vector of i1. 6360 static Value *getMaskVecValue(CodeGenFunction &CGF, Value *Mask, 6361 unsigned NumElts) { 6362 6363 llvm::VectorType *MaskTy = llvm::VectorType::get(CGF.Builder.getInt1Ty(), 6364 cast<IntegerType>(Mask->getType())->getBitWidth()); 6365 Value *MaskVec = CGF.Builder.CreateBitCast(Mask, MaskTy); 6366 6367 // If we have less than 8 elements, then the starting mask was an i8 and 6368 // we need to extract down to the right number of elements. 6369 if (NumElts < 8) { 6370 uint32_t Indices[4]; 6371 for (unsigned i = 0; i != NumElts; ++i) 6372 Indices[i] = i; 6373 MaskVec = CGF.Builder.CreateShuffleVector(MaskVec, MaskVec, 6374 makeArrayRef(Indices, NumElts), 6375 "extract"); 6376 } 6377 return MaskVec; 6378 } 6379 6380 static Value *EmitX86MaskedStore(CodeGenFunction &CGF, 6381 SmallVectorImpl<Value *> &Ops, 6382 unsigned Align) { 6383 // Cast the pointer to right type. 6384 Ops[0] = CGF.Builder.CreateBitCast(Ops[0], 6385 llvm::PointerType::getUnqual(Ops[1]->getType())); 6386 6387 // If the mask is all ones just emit a regular store. 6388 if (const auto *C = dyn_cast<Constant>(Ops[2])) 6389 if (C->isAllOnesValue()) 6390 return CGF.Builder.CreateAlignedStore(Ops[1], Ops[0], Align); 6391 6392 Value *MaskVec = getMaskVecValue(CGF, Ops[2], 6393 Ops[1]->getType()->getVectorNumElements()); 6394 6395 return CGF.Builder.CreateMaskedStore(Ops[1], Ops[0], Align, MaskVec); 6396 } 6397 6398 static Value *EmitX86MaskedLoad(CodeGenFunction &CGF, 6399 SmallVectorImpl<Value *> &Ops, unsigned Align) { 6400 // Cast the pointer to right type. 6401 Ops[0] = CGF.Builder.CreateBitCast(Ops[0], 6402 llvm::PointerType::getUnqual(Ops[1]->getType())); 6403 6404 // If the mask is all ones just emit a regular store. 6405 if (const auto *C = dyn_cast<Constant>(Ops[2])) 6406 if (C->isAllOnesValue()) 6407 return CGF.Builder.CreateAlignedLoad(Ops[0], Align); 6408 6409 Value *MaskVec = getMaskVecValue(CGF, Ops[2], 6410 Ops[1]->getType()->getVectorNumElements()); 6411 6412 return CGF.Builder.CreateMaskedLoad(Ops[0], Align, MaskVec, Ops[1]); 6413 } 6414 6415 static Value *EmitX86Select(CodeGenFunction &CGF, 6416 Value *Mask, Value *Op0, Value *Op1) { 6417 6418 // If the mask is all ones just return first argument. 6419 if (const auto *C = dyn_cast<Constant>(Mask)) 6420 if (C->isAllOnesValue()) 6421 return Op0; 6422 6423 Mask = getMaskVecValue(CGF, Mask, Op0->getType()->getVectorNumElements()); 6424 6425 return CGF.Builder.CreateSelect(Mask, Op0, Op1); 6426 } 6427 6428 static Value *EmitX86MaskedCompare(CodeGenFunction &CGF, unsigned CC, 6429 bool Signed, SmallVectorImpl<Value *> &Ops) { 6430 unsigned NumElts = Ops[0]->getType()->getVectorNumElements(); 6431 Value *Cmp; 6432 6433 if (CC == 3) { 6434 Cmp = Constant::getNullValue( 6435 llvm::VectorType::get(CGF.Builder.getInt1Ty(), NumElts)); 6436 } else if (CC == 7) { 6437 Cmp = Constant::getAllOnesValue( 6438 llvm::VectorType::get(CGF.Builder.getInt1Ty(), NumElts)); 6439 } else { 6440 ICmpInst::Predicate Pred; 6441 switch (CC) { 6442 default: llvm_unreachable("Unknown condition code"); 6443 case 0: Pred = ICmpInst::ICMP_EQ; break; 6444 case 1: Pred = Signed ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT; break; 6445 case 2: Pred = Signed ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_ULE; break; 6446 case 4: Pred = ICmpInst::ICMP_NE; break; 6447 case 5: Pred = Signed ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE; break; 6448 case 6: Pred = Signed ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT; break; 6449 } 6450 Cmp = CGF.Builder.CreateICmp(Pred, Ops[0], Ops[1]); 6451 } 6452 6453 const auto *C = dyn_cast<Constant>(Ops.back()); 6454 if (!C || !C->isAllOnesValue()) 6455 Cmp = CGF.Builder.CreateAnd(Cmp, getMaskVecValue(CGF, Ops.back(), NumElts)); 6456 6457 if (NumElts < 8) { 6458 uint32_t Indices[8]; 6459 for (unsigned i = 0; i != NumElts; ++i) 6460 Indices[i] = i; 6461 for (unsigned i = NumElts; i != 8; ++i) 6462 Indices[i] = NumElts; 6463 Cmp = CGF.Builder.CreateShuffleVector( 6464 Cmp, llvm::Constant::getNullValue(Cmp->getType()), Indices); 6465 } 6466 return CGF.Builder.CreateBitCast(Cmp, 6467 IntegerType::get(CGF.getLLVMContext(), 6468 std::max(NumElts, 8U))); 6469 } 6470 6471 Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, 6472 const CallExpr *E) { 6473 if (BuiltinID == X86::BI__builtin_ms_va_start || 6474 BuiltinID == X86::BI__builtin_ms_va_end) 6475 return EmitVAStartEnd(EmitMSVAListRef(E->getArg(0)).getPointer(), 6476 BuiltinID == X86::BI__builtin_ms_va_start); 6477 if (BuiltinID == X86::BI__builtin_ms_va_copy) { 6478 // Lower this manually. We can't reliably determine whether or not any 6479 // given va_copy() is for a Win64 va_list from the calling convention 6480 // alone, because it's legal to do this from a System V ABI function. 6481 // With opaque pointer types, we won't have enough information in LLVM 6482 // IR to determine this from the argument types, either. Best to do it 6483 // now, while we have enough information. 6484 Address DestAddr = EmitMSVAListRef(E->getArg(0)); 6485 Address SrcAddr = EmitMSVAListRef(E->getArg(1)); 6486 6487 llvm::Type *BPP = Int8PtrPtrTy; 6488 6489 DestAddr = Address(Builder.CreateBitCast(DestAddr.getPointer(), BPP, "cp"), 6490 DestAddr.getAlignment()); 6491 SrcAddr = Address(Builder.CreateBitCast(SrcAddr.getPointer(), BPP, "ap"), 6492 SrcAddr.getAlignment()); 6493 6494 Value *ArgPtr = Builder.CreateLoad(SrcAddr, "ap.val"); 6495 return Builder.CreateStore(ArgPtr, DestAddr); 6496 } 6497 6498 SmallVector<Value*, 4> Ops; 6499 6500 // Find out if any arguments are required to be integer constant expressions. 6501 unsigned ICEArguments = 0; 6502 ASTContext::GetBuiltinTypeError Error; 6503 getContext().GetBuiltinType(BuiltinID, Error, &ICEArguments); 6504 assert(Error == ASTContext::GE_None && "Should not codegen an error"); 6505 6506 for (unsigned i = 0, e = E->getNumArgs(); i != e; i++) { 6507 // If this is a normal argument, just emit it as a scalar. 6508 if ((ICEArguments & (1 << i)) == 0) { 6509 Ops.push_back(EmitScalarExpr(E->getArg(i))); 6510 continue; 6511 } 6512 6513 // If this is required to be a constant, constant fold it so that we know 6514 // that the generated intrinsic gets a ConstantInt. 6515 llvm::APSInt Result; 6516 bool IsConst = E->getArg(i)->isIntegerConstantExpr(Result, getContext()); 6517 assert(IsConst && "Constant arg isn't actually constant?"); (void)IsConst; 6518 Ops.push_back(llvm::ConstantInt::get(getLLVMContext(), Result)); 6519 } 6520 6521 // These exist so that the builtin that takes an immediate can be bounds 6522 // checked by clang to avoid passing bad immediates to the backend. Since 6523 // AVX has a larger immediate than SSE we would need separate builtins to 6524 // do the different bounds checking. Rather than create a clang specific 6525 // SSE only builtin, this implements eight separate builtins to match gcc 6526 // implementation. 6527 auto getCmpIntrinsicCall = [this, &Ops](Intrinsic::ID ID, unsigned Imm) { 6528 Ops.push_back(llvm::ConstantInt::get(Int8Ty, Imm)); 6529 llvm::Function *F = CGM.getIntrinsic(ID); 6530 return Builder.CreateCall(F, Ops); 6531 }; 6532 6533 // For the vector forms of FP comparisons, translate the builtins directly to 6534 // IR. 6535 // TODO: The builtins could be removed if the SSE header files used vector 6536 // extension comparisons directly (vector ordered/unordered may need 6537 // additional support via __builtin_isnan()). 6538 llvm::VectorType *V2F64 = 6539 llvm::VectorType::get(llvm::Type::getDoubleTy(getLLVMContext()), 2); 6540 llvm::VectorType *V4F32 = 6541 llvm::VectorType::get(llvm::Type::getFloatTy(getLLVMContext()), 4); 6542 6543 auto getVectorFCmpIR = [this, &Ops](CmpInst::Predicate Pred, 6544 llvm::VectorType *FPVecTy) { 6545 Value *Cmp = Builder.CreateFCmp(Pred, Ops[0], Ops[1]); 6546 llvm::VectorType *IntVecTy = llvm::VectorType::getInteger(FPVecTy); 6547 Value *Sext = Builder.CreateSExt(Cmp, IntVecTy); 6548 return Builder.CreateBitCast(Sext, FPVecTy); 6549 }; 6550 6551 switch (BuiltinID) { 6552 default: return nullptr; 6553 case X86::BI__builtin_cpu_supports: { 6554 const Expr *FeatureExpr = E->getArg(0)->IgnoreParenCasts(); 6555 StringRef FeatureStr = cast<StringLiteral>(FeatureExpr)->getString(); 6556 6557 // TODO: When/if this becomes more than x86 specific then use a TargetInfo 6558 // based mapping. 6559 // Processor features and mapping to processor feature value. 6560 enum X86Features { 6561 CMOV = 0, 6562 MMX, 6563 POPCNT, 6564 SSE, 6565 SSE2, 6566 SSE3, 6567 SSSE3, 6568 SSE4_1, 6569 SSE4_2, 6570 AVX, 6571 AVX2, 6572 SSE4_A, 6573 FMA4, 6574 XOP, 6575 FMA, 6576 AVX512F, 6577 BMI, 6578 BMI2, 6579 AES, 6580 PCLMUL, 6581 AVX512VL, 6582 AVX512BW, 6583 AVX512DQ, 6584 AVX512CD, 6585 AVX512ER, 6586 AVX512PF, 6587 AVX512VBMI, 6588 AVX512IFMA, 6589 MAX 6590 }; 6591 6592 X86Features Feature = StringSwitch<X86Features>(FeatureStr) 6593 .Case("cmov", X86Features::CMOV) 6594 .Case("mmx", X86Features::MMX) 6595 .Case("popcnt", X86Features::POPCNT) 6596 .Case("sse", X86Features::SSE) 6597 .Case("sse2", X86Features::SSE2) 6598 .Case("sse3", X86Features::SSE3) 6599 .Case("ssse3", X86Features::SSSE3) 6600 .Case("sse4.1", X86Features::SSE4_1) 6601 .Case("sse4.2", X86Features::SSE4_2) 6602 .Case("avx", X86Features::AVX) 6603 .Case("avx2", X86Features::AVX2) 6604 .Case("sse4a", X86Features::SSE4_A) 6605 .Case("fma4", X86Features::FMA4) 6606 .Case("xop", X86Features::XOP) 6607 .Case("fma", X86Features::FMA) 6608 .Case("avx512f", X86Features::AVX512F) 6609 .Case("bmi", X86Features::BMI) 6610 .Case("bmi2", X86Features::BMI2) 6611 .Case("aes", X86Features::AES) 6612 .Case("pclmul", X86Features::PCLMUL) 6613 .Case("avx512vl", X86Features::AVX512VL) 6614 .Case("avx512bw", X86Features::AVX512BW) 6615 .Case("avx512dq", X86Features::AVX512DQ) 6616 .Case("avx512cd", X86Features::AVX512CD) 6617 .Case("avx512er", X86Features::AVX512ER) 6618 .Case("avx512pf", X86Features::AVX512PF) 6619 .Case("avx512vbmi", X86Features::AVX512VBMI) 6620 .Case("avx512ifma", X86Features::AVX512IFMA) 6621 .Default(X86Features::MAX); 6622 assert(Feature != X86Features::MAX && "Invalid feature!"); 6623 6624 // Matching the struct layout from the compiler-rt/libgcc structure that is 6625 // filled in: 6626 // unsigned int __cpu_vendor; 6627 // unsigned int __cpu_type; 6628 // unsigned int __cpu_subtype; 6629 // unsigned int __cpu_features[1]; 6630 llvm::Type *STy = llvm::StructType::get( 6631 Int32Ty, Int32Ty, Int32Ty, llvm::ArrayType::get(Int32Ty, 1), nullptr); 6632 6633 // Grab the global __cpu_model. 6634 llvm::Constant *CpuModel = CGM.CreateRuntimeVariable(STy, "__cpu_model"); 6635 6636 // Grab the first (0th) element from the field __cpu_features off of the 6637 // global in the struct STy. 6638 Value *Idxs[] = { 6639 ConstantInt::get(Int32Ty, 0), 6640 ConstantInt::get(Int32Ty, 3), 6641 ConstantInt::get(Int32Ty, 0) 6642 }; 6643 Value *CpuFeatures = Builder.CreateGEP(STy, CpuModel, Idxs); 6644 Value *Features = Builder.CreateAlignedLoad(CpuFeatures, 6645 CharUnits::fromQuantity(4)); 6646 6647 // Check the value of the bit corresponding to the feature requested. 6648 Value *Bitset = Builder.CreateAnd( 6649 Features, llvm::ConstantInt::get(Int32Ty, 1ULL << Feature)); 6650 return Builder.CreateICmpNE(Bitset, llvm::ConstantInt::get(Int32Ty, 0)); 6651 } 6652 case X86::BI_mm_prefetch: { 6653 Value *Address = Ops[0]; 6654 Value *RW = ConstantInt::get(Int32Ty, 0); 6655 Value *Locality = Ops[1]; 6656 Value *Data = ConstantInt::get(Int32Ty, 1); 6657 Value *F = CGM.getIntrinsic(Intrinsic::prefetch); 6658 return Builder.CreateCall(F, {Address, RW, Locality, Data}); 6659 } 6660 case X86::BI__builtin_ia32_undef128: 6661 case X86::BI__builtin_ia32_undef256: 6662 case X86::BI__builtin_ia32_undef512: 6663 return UndefValue::get(ConvertType(E->getType())); 6664 case X86::BI__builtin_ia32_vec_init_v8qi: 6665 case X86::BI__builtin_ia32_vec_init_v4hi: 6666 case X86::BI__builtin_ia32_vec_init_v2si: 6667 return Builder.CreateBitCast(BuildVector(Ops), 6668 llvm::Type::getX86_MMXTy(getLLVMContext())); 6669 case X86::BI__builtin_ia32_vec_ext_v2si: 6670 return Builder.CreateExtractElement(Ops[0], 6671 llvm::ConstantInt::get(Ops[1]->getType(), 0)); 6672 case X86::BI__builtin_ia32_ldmxcsr: { 6673 Address Tmp = CreateMemTemp(E->getArg(0)->getType()); 6674 Builder.CreateStore(Ops[0], Tmp); 6675 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_ldmxcsr), 6676 Builder.CreateBitCast(Tmp.getPointer(), Int8PtrTy)); 6677 } 6678 case X86::BI__builtin_ia32_stmxcsr: { 6679 Address Tmp = CreateMemTemp(E->getType()); 6680 Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_stmxcsr), 6681 Builder.CreateBitCast(Tmp.getPointer(), Int8PtrTy)); 6682 return Builder.CreateLoad(Tmp, "stmxcsr"); 6683 } 6684 case X86::BI__builtin_ia32_xsave: 6685 case X86::BI__builtin_ia32_xsave64: 6686 case X86::BI__builtin_ia32_xrstor: 6687 case X86::BI__builtin_ia32_xrstor64: 6688 case X86::BI__builtin_ia32_xsaveopt: 6689 case X86::BI__builtin_ia32_xsaveopt64: 6690 case X86::BI__builtin_ia32_xrstors: 6691 case X86::BI__builtin_ia32_xrstors64: 6692 case X86::BI__builtin_ia32_xsavec: 6693 case X86::BI__builtin_ia32_xsavec64: 6694 case X86::BI__builtin_ia32_xsaves: 6695 case X86::BI__builtin_ia32_xsaves64: { 6696 Intrinsic::ID ID; 6697 #define INTRINSIC_X86_XSAVE_ID(NAME) \ 6698 case X86::BI__builtin_ia32_##NAME: \ 6699 ID = Intrinsic::x86_##NAME; \ 6700 break 6701 switch (BuiltinID) { 6702 default: llvm_unreachable("Unsupported intrinsic!"); 6703 INTRINSIC_X86_XSAVE_ID(xsave); 6704 INTRINSIC_X86_XSAVE_ID(xsave64); 6705 INTRINSIC_X86_XSAVE_ID(xrstor); 6706 INTRINSIC_X86_XSAVE_ID(xrstor64); 6707 INTRINSIC_X86_XSAVE_ID(xsaveopt); 6708 INTRINSIC_X86_XSAVE_ID(xsaveopt64); 6709 INTRINSIC_X86_XSAVE_ID(xrstors); 6710 INTRINSIC_X86_XSAVE_ID(xrstors64); 6711 INTRINSIC_X86_XSAVE_ID(xsavec); 6712 INTRINSIC_X86_XSAVE_ID(xsavec64); 6713 INTRINSIC_X86_XSAVE_ID(xsaves); 6714 INTRINSIC_X86_XSAVE_ID(xsaves64); 6715 } 6716 #undef INTRINSIC_X86_XSAVE_ID 6717 Value *Mhi = Builder.CreateTrunc( 6718 Builder.CreateLShr(Ops[1], ConstantInt::get(Int64Ty, 32)), Int32Ty); 6719 Value *Mlo = Builder.CreateTrunc(Ops[1], Int32Ty); 6720 Ops[1] = Mhi; 6721 Ops.push_back(Mlo); 6722 return Builder.CreateCall(CGM.getIntrinsic(ID), Ops); 6723 } 6724 case X86::BI__builtin_ia32_storedqudi128_mask: 6725 case X86::BI__builtin_ia32_storedqusi128_mask: 6726 case X86::BI__builtin_ia32_storedquhi128_mask: 6727 case X86::BI__builtin_ia32_storedquqi128_mask: 6728 case X86::BI__builtin_ia32_storeupd128_mask: 6729 case X86::BI__builtin_ia32_storeups128_mask: 6730 case X86::BI__builtin_ia32_storedqudi256_mask: 6731 case X86::BI__builtin_ia32_storedqusi256_mask: 6732 case X86::BI__builtin_ia32_storedquhi256_mask: 6733 case X86::BI__builtin_ia32_storedquqi256_mask: 6734 case X86::BI__builtin_ia32_storeupd256_mask: 6735 case X86::BI__builtin_ia32_storeups256_mask: 6736 case X86::BI__builtin_ia32_storedqudi512_mask: 6737 case X86::BI__builtin_ia32_storedqusi512_mask: 6738 case X86::BI__builtin_ia32_storedquhi512_mask: 6739 case X86::BI__builtin_ia32_storedquqi512_mask: 6740 case X86::BI__builtin_ia32_storeupd512_mask: 6741 case X86::BI__builtin_ia32_storeups512_mask: 6742 return EmitX86MaskedStore(*this, Ops, 1); 6743 6744 case X86::BI__builtin_ia32_movdqa32store128_mask: 6745 case X86::BI__builtin_ia32_movdqa64store128_mask: 6746 case X86::BI__builtin_ia32_storeaps128_mask: 6747 case X86::BI__builtin_ia32_storeapd128_mask: 6748 case X86::BI__builtin_ia32_movdqa32store256_mask: 6749 case X86::BI__builtin_ia32_movdqa64store256_mask: 6750 case X86::BI__builtin_ia32_storeaps256_mask: 6751 case X86::BI__builtin_ia32_storeapd256_mask: 6752 case X86::BI__builtin_ia32_movdqa32store512_mask: 6753 case X86::BI__builtin_ia32_movdqa64store512_mask: 6754 case X86::BI__builtin_ia32_storeaps512_mask: 6755 case X86::BI__builtin_ia32_storeapd512_mask: { 6756 unsigned Align = 6757 getContext().getTypeAlignInChars(E->getArg(1)->getType()).getQuantity(); 6758 return EmitX86MaskedStore(*this, Ops, Align); 6759 } 6760 case X86::BI__builtin_ia32_loadups128_mask: 6761 case X86::BI__builtin_ia32_loadups256_mask: 6762 case X86::BI__builtin_ia32_loadups512_mask: 6763 case X86::BI__builtin_ia32_loadupd128_mask: 6764 case X86::BI__builtin_ia32_loadupd256_mask: 6765 case X86::BI__builtin_ia32_loadupd512_mask: 6766 case X86::BI__builtin_ia32_loaddquqi128_mask: 6767 case X86::BI__builtin_ia32_loaddquqi256_mask: 6768 case X86::BI__builtin_ia32_loaddquqi512_mask: 6769 case X86::BI__builtin_ia32_loaddquhi128_mask: 6770 case X86::BI__builtin_ia32_loaddquhi256_mask: 6771 case X86::BI__builtin_ia32_loaddquhi512_mask: 6772 case X86::BI__builtin_ia32_loaddqusi128_mask: 6773 case X86::BI__builtin_ia32_loaddqusi256_mask: 6774 case X86::BI__builtin_ia32_loaddqusi512_mask: 6775 case X86::BI__builtin_ia32_loaddqudi128_mask: 6776 case X86::BI__builtin_ia32_loaddqudi256_mask: 6777 case X86::BI__builtin_ia32_loaddqudi512_mask: 6778 return EmitX86MaskedLoad(*this, Ops, 1); 6779 6780 case X86::BI__builtin_ia32_loadaps128_mask: 6781 case X86::BI__builtin_ia32_loadaps256_mask: 6782 case X86::BI__builtin_ia32_loadaps512_mask: 6783 case X86::BI__builtin_ia32_loadapd128_mask: 6784 case X86::BI__builtin_ia32_loadapd256_mask: 6785 case X86::BI__builtin_ia32_loadapd512_mask: 6786 case X86::BI__builtin_ia32_movdqa32load128_mask: 6787 case X86::BI__builtin_ia32_movdqa32load256_mask: 6788 case X86::BI__builtin_ia32_movdqa32load512_mask: 6789 case X86::BI__builtin_ia32_movdqa64load128_mask: 6790 case X86::BI__builtin_ia32_movdqa64load256_mask: 6791 case X86::BI__builtin_ia32_movdqa64load512_mask: { 6792 unsigned Align = 6793 getContext().getTypeAlignInChars(E->getArg(1)->getType()).getQuantity(); 6794 return EmitX86MaskedLoad(*this, Ops, Align); 6795 } 6796 case X86::BI__builtin_ia32_storehps: 6797 case X86::BI__builtin_ia32_storelps: { 6798 llvm::Type *PtrTy = llvm::PointerType::getUnqual(Int64Ty); 6799 llvm::Type *VecTy = llvm::VectorType::get(Int64Ty, 2); 6800 6801 // cast val v2i64 6802 Ops[1] = Builder.CreateBitCast(Ops[1], VecTy, "cast"); 6803 6804 // extract (0, 1) 6805 unsigned Index = BuiltinID == X86::BI__builtin_ia32_storelps ? 0 : 1; 6806 llvm::Value *Idx = llvm::ConstantInt::get(SizeTy, Index); 6807 Ops[1] = Builder.CreateExtractElement(Ops[1], Idx, "extract"); 6808 6809 // cast pointer to i64 & store 6810 Ops[0] = Builder.CreateBitCast(Ops[0], PtrTy); 6811 return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); 6812 } 6813 case X86::BI__builtin_ia32_palignr128: 6814 case X86::BI__builtin_ia32_palignr256: 6815 case X86::BI__builtin_ia32_palignr128_mask: 6816 case X86::BI__builtin_ia32_palignr256_mask: 6817 case X86::BI__builtin_ia32_palignr512_mask: { 6818 unsigned ShiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue(); 6819 6820 unsigned NumElts = 6821 cast<llvm::VectorType>(Ops[0]->getType())->getNumElements(); 6822 assert(NumElts % 16 == 0); 6823 6824 // If palignr is shifting the pair of vectors more than the size of two 6825 // lanes, emit zero. 6826 if (ShiftVal >= 32) 6827 return llvm::Constant::getNullValue(ConvertType(E->getType())); 6828 6829 // If palignr is shifting the pair of input vectors more than one lane, 6830 // but less than two lanes, convert to shifting in zeroes. 6831 if (ShiftVal > 16) { 6832 ShiftVal -= 16; 6833 Ops[1] = Ops[0]; 6834 Ops[0] = llvm::Constant::getNullValue(Ops[0]->getType()); 6835 } 6836 6837 uint32_t Indices[64]; 6838 // 256-bit palignr operates on 128-bit lanes so we need to handle that 6839 for (unsigned l = 0; l != NumElts; l += 16) { 6840 for (unsigned i = 0; i != 16; ++i) { 6841 unsigned Idx = ShiftVal + i; 6842 if (Idx >= 16) 6843 Idx += NumElts - 16; // End of lane, switch operand. 6844 Indices[l + i] = Idx + l; 6845 } 6846 } 6847 6848 Value *Align = Builder.CreateShuffleVector(Ops[1], Ops[0], 6849 makeArrayRef(Indices, NumElts), 6850 "palignr"); 6851 6852 // If this isn't a masked builtin, just return the align operation. 6853 if (Ops.size() == 3) 6854 return Align; 6855 6856 return EmitX86Select(*this, Ops[4], Align, Ops[3]); 6857 } 6858 6859 case X86::BI__builtin_ia32_movnti: 6860 case X86::BI__builtin_ia32_movnti64: { 6861 llvm::MDNode *Node = llvm::MDNode::get( 6862 getLLVMContext(), llvm::ConstantAsMetadata::get(Builder.getInt32(1))); 6863 6864 // Convert the type of the pointer to a pointer to the stored type. 6865 Value *BC = Builder.CreateBitCast(Ops[0], 6866 llvm::PointerType::getUnqual(Ops[1]->getType()), 6867 "cast"); 6868 StoreInst *SI = Builder.CreateDefaultAlignedStore(Ops[1], BC); 6869 SI->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node); 6870 6871 // No alignment for scalar intrinsic store. 6872 SI->setAlignment(1); 6873 return SI; 6874 } 6875 case X86::BI__builtin_ia32_movntsd: 6876 case X86::BI__builtin_ia32_movntss: { 6877 llvm::MDNode *Node = llvm::MDNode::get( 6878 getLLVMContext(), llvm::ConstantAsMetadata::get(Builder.getInt32(1))); 6879 6880 // Extract the 0'th element of the source vector. 6881 Value *Scl = Builder.CreateExtractElement(Ops[1], (uint64_t)0, "extract"); 6882 6883 // Convert the type of the pointer to a pointer to the stored type. 6884 Value *BC = Builder.CreateBitCast(Ops[0], 6885 llvm::PointerType::getUnqual(Scl->getType()), 6886 "cast"); 6887 6888 // Unaligned nontemporal store of the scalar value. 6889 StoreInst *SI = Builder.CreateDefaultAlignedStore(Scl, BC); 6890 SI->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node); 6891 SI->setAlignment(1); 6892 return SI; 6893 } 6894 6895 case X86::BI__builtin_ia32_selectb_128: 6896 case X86::BI__builtin_ia32_selectb_256: 6897 case X86::BI__builtin_ia32_selectb_512: 6898 case X86::BI__builtin_ia32_selectw_128: 6899 case X86::BI__builtin_ia32_selectw_256: 6900 case X86::BI__builtin_ia32_selectw_512: 6901 case X86::BI__builtin_ia32_selectd_128: 6902 case X86::BI__builtin_ia32_selectd_256: 6903 case X86::BI__builtin_ia32_selectd_512: 6904 case X86::BI__builtin_ia32_selectq_128: 6905 case X86::BI__builtin_ia32_selectq_256: 6906 case X86::BI__builtin_ia32_selectq_512: 6907 case X86::BI__builtin_ia32_selectps_128: 6908 case X86::BI__builtin_ia32_selectps_256: 6909 case X86::BI__builtin_ia32_selectps_512: 6910 case X86::BI__builtin_ia32_selectpd_128: 6911 case X86::BI__builtin_ia32_selectpd_256: 6912 case X86::BI__builtin_ia32_selectpd_512: 6913 return EmitX86Select(*this, Ops[0], Ops[1], Ops[2]); 6914 case X86::BI__builtin_ia32_pcmpeqb128_mask: 6915 case X86::BI__builtin_ia32_pcmpeqb256_mask: 6916 case X86::BI__builtin_ia32_pcmpeqb512_mask: 6917 case X86::BI__builtin_ia32_pcmpeqw128_mask: 6918 case X86::BI__builtin_ia32_pcmpeqw256_mask: 6919 case X86::BI__builtin_ia32_pcmpeqw512_mask: 6920 case X86::BI__builtin_ia32_pcmpeqd128_mask: 6921 case X86::BI__builtin_ia32_pcmpeqd256_mask: 6922 case X86::BI__builtin_ia32_pcmpeqd512_mask: 6923 case X86::BI__builtin_ia32_pcmpeqq128_mask: 6924 case X86::BI__builtin_ia32_pcmpeqq256_mask: 6925 case X86::BI__builtin_ia32_pcmpeqq512_mask: 6926 return EmitX86MaskedCompare(*this, 0, false, Ops); 6927 case X86::BI__builtin_ia32_pcmpgtb128_mask: 6928 case X86::BI__builtin_ia32_pcmpgtb256_mask: 6929 case X86::BI__builtin_ia32_pcmpgtb512_mask: 6930 case X86::BI__builtin_ia32_pcmpgtw128_mask: 6931 case X86::BI__builtin_ia32_pcmpgtw256_mask: 6932 case X86::BI__builtin_ia32_pcmpgtw512_mask: 6933 case X86::BI__builtin_ia32_pcmpgtd128_mask: 6934 case X86::BI__builtin_ia32_pcmpgtd256_mask: 6935 case X86::BI__builtin_ia32_pcmpgtd512_mask: 6936 case X86::BI__builtin_ia32_pcmpgtq128_mask: 6937 case X86::BI__builtin_ia32_pcmpgtq256_mask: 6938 case X86::BI__builtin_ia32_pcmpgtq512_mask: 6939 return EmitX86MaskedCompare(*this, 6, true, Ops); 6940 case X86::BI__builtin_ia32_cmpb128_mask: 6941 case X86::BI__builtin_ia32_cmpb256_mask: 6942 case X86::BI__builtin_ia32_cmpb512_mask: 6943 case X86::BI__builtin_ia32_cmpw128_mask: 6944 case X86::BI__builtin_ia32_cmpw256_mask: 6945 case X86::BI__builtin_ia32_cmpw512_mask: 6946 case X86::BI__builtin_ia32_cmpd128_mask: 6947 case X86::BI__builtin_ia32_cmpd256_mask: 6948 case X86::BI__builtin_ia32_cmpd512_mask: 6949 case X86::BI__builtin_ia32_cmpq128_mask: 6950 case X86::BI__builtin_ia32_cmpq256_mask: 6951 case X86::BI__builtin_ia32_cmpq512_mask: { 6952 unsigned CC = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0x7; 6953 return EmitX86MaskedCompare(*this, CC, true, Ops); 6954 } 6955 case X86::BI__builtin_ia32_ucmpb128_mask: 6956 case X86::BI__builtin_ia32_ucmpb256_mask: 6957 case X86::BI__builtin_ia32_ucmpb512_mask: 6958 case X86::BI__builtin_ia32_ucmpw128_mask: 6959 case X86::BI__builtin_ia32_ucmpw256_mask: 6960 case X86::BI__builtin_ia32_ucmpw512_mask: 6961 case X86::BI__builtin_ia32_ucmpd128_mask: 6962 case X86::BI__builtin_ia32_ucmpd256_mask: 6963 case X86::BI__builtin_ia32_ucmpd512_mask: 6964 case X86::BI__builtin_ia32_ucmpq128_mask: 6965 case X86::BI__builtin_ia32_ucmpq256_mask: 6966 case X86::BI__builtin_ia32_ucmpq512_mask: { 6967 unsigned CC = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0x7; 6968 return EmitX86MaskedCompare(*this, CC, false, Ops); 6969 } 6970 6971 // TODO: Handle 64/512-bit vector widths of min/max. 6972 case X86::BI__builtin_ia32_pmaxsb128: 6973 case X86::BI__builtin_ia32_pmaxsw128: 6974 case X86::BI__builtin_ia32_pmaxsd128: 6975 case X86::BI__builtin_ia32_pmaxsb256: 6976 case X86::BI__builtin_ia32_pmaxsw256: 6977 case X86::BI__builtin_ia32_pmaxsd256: { 6978 Value *Cmp = Builder.CreateICmp(ICmpInst::ICMP_SGT, Ops[0], Ops[1]); 6979 return Builder.CreateSelect(Cmp, Ops[0], Ops[1]); 6980 } 6981 case X86::BI__builtin_ia32_pmaxub128: 6982 case X86::BI__builtin_ia32_pmaxuw128: 6983 case X86::BI__builtin_ia32_pmaxud128: 6984 case X86::BI__builtin_ia32_pmaxub256: 6985 case X86::BI__builtin_ia32_pmaxuw256: 6986 case X86::BI__builtin_ia32_pmaxud256: { 6987 Value *Cmp = Builder.CreateICmp(ICmpInst::ICMP_UGT, Ops[0], Ops[1]); 6988 return Builder.CreateSelect(Cmp, Ops[0], Ops[1]); 6989 } 6990 case X86::BI__builtin_ia32_pminsb128: 6991 case X86::BI__builtin_ia32_pminsw128: 6992 case X86::BI__builtin_ia32_pminsd128: 6993 case X86::BI__builtin_ia32_pminsb256: 6994 case X86::BI__builtin_ia32_pminsw256: 6995 case X86::BI__builtin_ia32_pminsd256: { 6996 Value *Cmp = Builder.CreateICmp(ICmpInst::ICMP_SLT, Ops[0], Ops[1]); 6997 return Builder.CreateSelect(Cmp, Ops[0], Ops[1]); 6998 } 6999 case X86::BI__builtin_ia32_pminub128: 7000 case X86::BI__builtin_ia32_pminuw128: 7001 case X86::BI__builtin_ia32_pminud128: 7002 case X86::BI__builtin_ia32_pminub256: 7003 case X86::BI__builtin_ia32_pminuw256: 7004 case X86::BI__builtin_ia32_pminud256: { 7005 Value *Cmp = Builder.CreateICmp(ICmpInst::ICMP_ULT, Ops[0], Ops[1]); 7006 return Builder.CreateSelect(Cmp, Ops[0], Ops[1]); 7007 } 7008 7009 // 3DNow! 7010 case X86::BI__builtin_ia32_pswapdsf: 7011 case X86::BI__builtin_ia32_pswapdsi: { 7012 llvm::Type *MMXTy = llvm::Type::getX86_MMXTy(getLLVMContext()); 7013 Ops[0] = Builder.CreateBitCast(Ops[0], MMXTy, "cast"); 7014 llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_3dnowa_pswapd); 7015 return Builder.CreateCall(F, Ops, "pswapd"); 7016 } 7017 case X86::BI__builtin_ia32_rdrand16_step: 7018 case X86::BI__builtin_ia32_rdrand32_step: 7019 case X86::BI__builtin_ia32_rdrand64_step: 7020 case X86::BI__builtin_ia32_rdseed16_step: 7021 case X86::BI__builtin_ia32_rdseed32_step: 7022 case X86::BI__builtin_ia32_rdseed64_step: { 7023 Intrinsic::ID ID; 7024 switch (BuiltinID) { 7025 default: llvm_unreachable("Unsupported intrinsic!"); 7026 case X86::BI__builtin_ia32_rdrand16_step: 7027 ID = Intrinsic::x86_rdrand_16; 7028 break; 7029 case X86::BI__builtin_ia32_rdrand32_step: 7030 ID = Intrinsic::x86_rdrand_32; 7031 break; 7032 case X86::BI__builtin_ia32_rdrand64_step: 7033 ID = Intrinsic::x86_rdrand_64; 7034 break; 7035 case X86::BI__builtin_ia32_rdseed16_step: 7036 ID = Intrinsic::x86_rdseed_16; 7037 break; 7038 case X86::BI__builtin_ia32_rdseed32_step: 7039 ID = Intrinsic::x86_rdseed_32; 7040 break; 7041 case X86::BI__builtin_ia32_rdseed64_step: 7042 ID = Intrinsic::x86_rdseed_64; 7043 break; 7044 } 7045 7046 Value *Call = Builder.CreateCall(CGM.getIntrinsic(ID)); 7047 Builder.CreateDefaultAlignedStore(Builder.CreateExtractValue(Call, 0), 7048 Ops[0]); 7049 return Builder.CreateExtractValue(Call, 1); 7050 } 7051 7052 // SSE packed comparison intrinsics 7053 case X86::BI__builtin_ia32_cmpeqps: 7054 return getVectorFCmpIR(CmpInst::FCMP_OEQ, V4F32); 7055 case X86::BI__builtin_ia32_cmpltps: 7056 return getVectorFCmpIR(CmpInst::FCMP_OLT, V4F32); 7057 case X86::BI__builtin_ia32_cmpleps: 7058 return getVectorFCmpIR(CmpInst::FCMP_OLE, V4F32); 7059 case X86::BI__builtin_ia32_cmpunordps: 7060 return getVectorFCmpIR(CmpInst::FCMP_UNO, V4F32); 7061 case X86::BI__builtin_ia32_cmpneqps: 7062 return getVectorFCmpIR(CmpInst::FCMP_UNE, V4F32); 7063 case X86::BI__builtin_ia32_cmpnltps: 7064 return getVectorFCmpIR(CmpInst::FCMP_UGE, V4F32); 7065 case X86::BI__builtin_ia32_cmpnleps: 7066 return getVectorFCmpIR(CmpInst::FCMP_UGT, V4F32); 7067 case X86::BI__builtin_ia32_cmpordps: 7068 return getVectorFCmpIR(CmpInst::FCMP_ORD, V4F32); 7069 case X86::BI__builtin_ia32_cmpeqpd: 7070 return getVectorFCmpIR(CmpInst::FCMP_OEQ, V2F64); 7071 case X86::BI__builtin_ia32_cmpltpd: 7072 return getVectorFCmpIR(CmpInst::FCMP_OLT, V2F64); 7073 case X86::BI__builtin_ia32_cmplepd: 7074 return getVectorFCmpIR(CmpInst::FCMP_OLE, V2F64); 7075 case X86::BI__builtin_ia32_cmpunordpd: 7076 return getVectorFCmpIR(CmpInst::FCMP_UNO, V2F64); 7077 case X86::BI__builtin_ia32_cmpneqpd: 7078 return getVectorFCmpIR(CmpInst::FCMP_UNE, V2F64); 7079 case X86::BI__builtin_ia32_cmpnltpd: 7080 return getVectorFCmpIR(CmpInst::FCMP_UGE, V2F64); 7081 case X86::BI__builtin_ia32_cmpnlepd: 7082 return getVectorFCmpIR(CmpInst::FCMP_UGT, V2F64); 7083 case X86::BI__builtin_ia32_cmpordpd: 7084 return getVectorFCmpIR(CmpInst::FCMP_ORD, V2F64); 7085 7086 // SSE scalar comparison intrinsics 7087 case X86::BI__builtin_ia32_cmpeqss: 7088 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 0); 7089 case X86::BI__builtin_ia32_cmpltss: 7090 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 1); 7091 case X86::BI__builtin_ia32_cmpless: 7092 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 2); 7093 case X86::BI__builtin_ia32_cmpunordss: 7094 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 3); 7095 case X86::BI__builtin_ia32_cmpneqss: 7096 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 4); 7097 case X86::BI__builtin_ia32_cmpnltss: 7098 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 5); 7099 case X86::BI__builtin_ia32_cmpnless: 7100 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 6); 7101 case X86::BI__builtin_ia32_cmpordss: 7102 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 7); 7103 case X86::BI__builtin_ia32_cmpeqsd: 7104 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 0); 7105 case X86::BI__builtin_ia32_cmpltsd: 7106 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 1); 7107 case X86::BI__builtin_ia32_cmplesd: 7108 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 2); 7109 case X86::BI__builtin_ia32_cmpunordsd: 7110 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 3); 7111 case X86::BI__builtin_ia32_cmpneqsd: 7112 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 4); 7113 case X86::BI__builtin_ia32_cmpnltsd: 7114 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 5); 7115 case X86::BI__builtin_ia32_cmpnlesd: 7116 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 6); 7117 case X86::BI__builtin_ia32_cmpordsd: 7118 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 7); 7119 } 7120 } 7121 7122 7123 Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID, 7124 const CallExpr *E) { 7125 SmallVector<Value*, 4> Ops; 7126 7127 for (unsigned i = 0, e = E->getNumArgs(); i != e; i++) 7128 Ops.push_back(EmitScalarExpr(E->getArg(i))); 7129 7130 Intrinsic::ID ID = Intrinsic::not_intrinsic; 7131 7132 switch (BuiltinID) { 7133 default: return nullptr; 7134 7135 // __builtin_ppc_get_timebase is GCC 4.8+'s PowerPC-specific name for what we 7136 // call __builtin_readcyclecounter. 7137 case PPC::BI__builtin_ppc_get_timebase: 7138 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::readcyclecounter)); 7139 7140 // vec_ld, vec_lvsl, vec_lvsr 7141 case PPC::BI__builtin_altivec_lvx: 7142 case PPC::BI__builtin_altivec_lvxl: 7143 case PPC::BI__builtin_altivec_lvebx: 7144 case PPC::BI__builtin_altivec_lvehx: 7145 case PPC::BI__builtin_altivec_lvewx: 7146 case PPC::BI__builtin_altivec_lvsl: 7147 case PPC::BI__builtin_altivec_lvsr: 7148 case PPC::BI__builtin_vsx_lxvd2x: 7149 case PPC::BI__builtin_vsx_lxvw4x: 7150 { 7151 Ops[1] = Builder.CreateBitCast(Ops[1], Int8PtrTy); 7152 7153 Ops[0] = Builder.CreateGEP(Ops[1], Ops[0]); 7154 Ops.pop_back(); 7155 7156 switch (BuiltinID) { 7157 default: llvm_unreachable("Unsupported ld/lvsl/lvsr intrinsic!"); 7158 case PPC::BI__builtin_altivec_lvx: 7159 ID = Intrinsic::ppc_altivec_lvx; 7160 break; 7161 case PPC::BI__builtin_altivec_lvxl: 7162 ID = Intrinsic::ppc_altivec_lvxl; 7163 break; 7164 case PPC::BI__builtin_altivec_lvebx: 7165 ID = Intrinsic::ppc_altivec_lvebx; 7166 break; 7167 case PPC::BI__builtin_altivec_lvehx: 7168 ID = Intrinsic::ppc_altivec_lvehx; 7169 break; 7170 case PPC::BI__builtin_altivec_lvewx: 7171 ID = Intrinsic::ppc_altivec_lvewx; 7172 break; 7173 case PPC::BI__builtin_altivec_lvsl: 7174 ID = Intrinsic::ppc_altivec_lvsl; 7175 break; 7176 case PPC::BI__builtin_altivec_lvsr: 7177 ID = Intrinsic::ppc_altivec_lvsr; 7178 break; 7179 case PPC::BI__builtin_vsx_lxvd2x: 7180 ID = Intrinsic::ppc_vsx_lxvd2x; 7181 break; 7182 case PPC::BI__builtin_vsx_lxvw4x: 7183 ID = Intrinsic::ppc_vsx_lxvw4x; 7184 break; 7185 } 7186 llvm::Function *F = CGM.getIntrinsic(ID); 7187 return Builder.CreateCall(F, Ops, ""); 7188 } 7189 7190 // vec_st 7191 case PPC::BI__builtin_altivec_stvx: 7192 case PPC::BI__builtin_altivec_stvxl: 7193 case PPC::BI__builtin_altivec_stvebx: 7194 case PPC::BI__builtin_altivec_stvehx: 7195 case PPC::BI__builtin_altivec_stvewx: 7196 case PPC::BI__builtin_vsx_stxvd2x: 7197 case PPC::BI__builtin_vsx_stxvw4x: 7198 { 7199 Ops[2] = Builder.CreateBitCast(Ops[2], Int8PtrTy); 7200 Ops[1] = Builder.CreateGEP(Ops[2], Ops[1]); 7201 Ops.pop_back(); 7202 7203 switch (BuiltinID) { 7204 default: llvm_unreachable("Unsupported st intrinsic!"); 7205 case PPC::BI__builtin_altivec_stvx: 7206 ID = Intrinsic::ppc_altivec_stvx; 7207 break; 7208 case PPC::BI__builtin_altivec_stvxl: 7209 ID = Intrinsic::ppc_altivec_stvxl; 7210 break; 7211 case PPC::BI__builtin_altivec_stvebx: 7212 ID = Intrinsic::ppc_altivec_stvebx; 7213 break; 7214 case PPC::BI__builtin_altivec_stvehx: 7215 ID = Intrinsic::ppc_altivec_stvehx; 7216 break; 7217 case PPC::BI__builtin_altivec_stvewx: 7218 ID = Intrinsic::ppc_altivec_stvewx; 7219 break; 7220 case PPC::BI__builtin_vsx_stxvd2x: 7221 ID = Intrinsic::ppc_vsx_stxvd2x; 7222 break; 7223 case PPC::BI__builtin_vsx_stxvw4x: 7224 ID = Intrinsic::ppc_vsx_stxvw4x; 7225 break; 7226 } 7227 llvm::Function *F = CGM.getIntrinsic(ID); 7228 return Builder.CreateCall(F, Ops, ""); 7229 } 7230 // Square root 7231 case PPC::BI__builtin_vsx_xvsqrtsp: 7232 case PPC::BI__builtin_vsx_xvsqrtdp: { 7233 llvm::Type *ResultType = ConvertType(E->getType()); 7234 Value *X = EmitScalarExpr(E->getArg(0)); 7235 ID = Intrinsic::sqrt; 7236 llvm::Function *F = CGM.getIntrinsic(ID, ResultType); 7237 return Builder.CreateCall(F, X); 7238 } 7239 // Count leading zeros 7240 case PPC::BI__builtin_altivec_vclzb: 7241 case PPC::BI__builtin_altivec_vclzh: 7242 case PPC::BI__builtin_altivec_vclzw: 7243 case PPC::BI__builtin_altivec_vclzd: { 7244 llvm::Type *ResultType = ConvertType(E->getType()); 7245 Value *X = EmitScalarExpr(E->getArg(0)); 7246 Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false); 7247 Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ResultType); 7248 return Builder.CreateCall(F, {X, Undef}); 7249 } 7250 // Copy sign 7251 case PPC::BI__builtin_vsx_xvcpsgnsp: 7252 case PPC::BI__builtin_vsx_xvcpsgndp: { 7253 llvm::Type *ResultType = ConvertType(E->getType()); 7254 Value *X = EmitScalarExpr(E->getArg(0)); 7255 Value *Y = EmitScalarExpr(E->getArg(1)); 7256 ID = Intrinsic::copysign; 7257 llvm::Function *F = CGM.getIntrinsic(ID, ResultType); 7258 return Builder.CreateCall(F, {X, Y}); 7259 } 7260 // Rounding/truncation 7261 case PPC::BI__builtin_vsx_xvrspip: 7262 case PPC::BI__builtin_vsx_xvrdpip: 7263 case PPC::BI__builtin_vsx_xvrdpim: 7264 case PPC::BI__builtin_vsx_xvrspim: 7265 case PPC::BI__builtin_vsx_xvrdpi: 7266 case PPC::BI__builtin_vsx_xvrspi: 7267 case PPC::BI__builtin_vsx_xvrdpic: 7268 case PPC::BI__builtin_vsx_xvrspic: 7269 case PPC::BI__builtin_vsx_xvrdpiz: 7270 case PPC::BI__builtin_vsx_xvrspiz: { 7271 llvm::Type *ResultType = ConvertType(E->getType()); 7272 Value *X = EmitScalarExpr(E->getArg(0)); 7273 if (BuiltinID == PPC::BI__builtin_vsx_xvrdpim || 7274 BuiltinID == PPC::BI__builtin_vsx_xvrspim) 7275 ID = Intrinsic::floor; 7276 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpi || 7277 BuiltinID == PPC::BI__builtin_vsx_xvrspi) 7278 ID = Intrinsic::round; 7279 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpic || 7280 BuiltinID == PPC::BI__builtin_vsx_xvrspic) 7281 ID = Intrinsic::nearbyint; 7282 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpip || 7283 BuiltinID == PPC::BI__builtin_vsx_xvrspip) 7284 ID = Intrinsic::ceil; 7285 else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpiz || 7286 BuiltinID == PPC::BI__builtin_vsx_xvrspiz) 7287 ID = Intrinsic::trunc; 7288 llvm::Function *F = CGM.getIntrinsic(ID, ResultType); 7289 return Builder.CreateCall(F, X); 7290 } 7291 7292 // Absolute value 7293 case PPC::BI__builtin_vsx_xvabsdp: 7294 case PPC::BI__builtin_vsx_xvabssp: { 7295 llvm::Type *ResultType = ConvertType(E->getType()); 7296 Value *X = EmitScalarExpr(E->getArg(0)); 7297 llvm::Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType); 7298 return Builder.CreateCall(F, X); 7299 } 7300 7301 // FMA variations 7302 case PPC::BI__builtin_vsx_xvmaddadp: 7303 case PPC::BI__builtin_vsx_xvmaddasp: 7304 case PPC::BI__builtin_vsx_xvnmaddadp: 7305 case PPC::BI__builtin_vsx_xvnmaddasp: 7306 case PPC::BI__builtin_vsx_xvmsubadp: 7307 case PPC::BI__builtin_vsx_xvmsubasp: 7308 case PPC::BI__builtin_vsx_xvnmsubadp: 7309 case PPC::BI__builtin_vsx_xvnmsubasp: { 7310 llvm::Type *ResultType = ConvertType(E->getType()); 7311 Value *X = EmitScalarExpr(E->getArg(0)); 7312 Value *Y = EmitScalarExpr(E->getArg(1)); 7313 Value *Z = EmitScalarExpr(E->getArg(2)); 7314 Value *Zero = llvm::ConstantFP::getZeroValueForNegation(ResultType); 7315 llvm::Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType); 7316 switch (BuiltinID) { 7317 case PPC::BI__builtin_vsx_xvmaddadp: 7318 case PPC::BI__builtin_vsx_xvmaddasp: 7319 return Builder.CreateCall(F, {X, Y, Z}); 7320 case PPC::BI__builtin_vsx_xvnmaddadp: 7321 case PPC::BI__builtin_vsx_xvnmaddasp: 7322 return Builder.CreateFSub(Zero, 7323 Builder.CreateCall(F, {X, Y, Z}), "sub"); 7324 case PPC::BI__builtin_vsx_xvmsubadp: 7325 case PPC::BI__builtin_vsx_xvmsubasp: 7326 return Builder.CreateCall(F, 7327 {X, Y, Builder.CreateFSub(Zero, Z, "sub")}); 7328 case PPC::BI__builtin_vsx_xvnmsubadp: 7329 case PPC::BI__builtin_vsx_xvnmsubasp: 7330 Value *FsubRes = 7331 Builder.CreateCall(F, {X, Y, Builder.CreateFSub(Zero, Z, "sub")}); 7332 return Builder.CreateFSub(Zero, FsubRes, "sub"); 7333 } 7334 llvm_unreachable("Unknown FMA operation"); 7335 return nullptr; // Suppress no-return warning 7336 } 7337 } 7338 } 7339 7340 Value *CodeGenFunction::EmitAMDGPUBuiltinExpr(unsigned BuiltinID, 7341 const CallExpr *E) { 7342 switch (BuiltinID) { 7343 case AMDGPU::BI__builtin_amdgcn_div_scale: 7344 case AMDGPU::BI__builtin_amdgcn_div_scalef: { 7345 // Translate from the intrinsics's struct return to the builtin's out 7346 // argument. 7347 7348 Address FlagOutPtr = EmitPointerWithAlignment(E->getArg(3)); 7349 7350 llvm::Value *X = EmitScalarExpr(E->getArg(0)); 7351 llvm::Value *Y = EmitScalarExpr(E->getArg(1)); 7352 llvm::Value *Z = EmitScalarExpr(E->getArg(2)); 7353 7354 llvm::Value *Callee = CGM.getIntrinsic(Intrinsic::amdgcn_div_scale, 7355 X->getType()); 7356 7357 llvm::Value *Tmp = Builder.CreateCall(Callee, {X, Y, Z}); 7358 7359 llvm::Value *Result = Builder.CreateExtractValue(Tmp, 0); 7360 llvm::Value *Flag = Builder.CreateExtractValue(Tmp, 1); 7361 7362 llvm::Type *RealFlagType 7363 = FlagOutPtr.getPointer()->getType()->getPointerElementType(); 7364 7365 llvm::Value *FlagExt = Builder.CreateZExt(Flag, RealFlagType); 7366 Builder.CreateStore(FlagExt, FlagOutPtr); 7367 return Result; 7368 } 7369 case AMDGPU::BI__builtin_amdgcn_div_fmas: 7370 case AMDGPU::BI__builtin_amdgcn_div_fmasf: { 7371 llvm::Value *Src0 = EmitScalarExpr(E->getArg(0)); 7372 llvm::Value *Src1 = EmitScalarExpr(E->getArg(1)); 7373 llvm::Value *Src2 = EmitScalarExpr(E->getArg(2)); 7374 llvm::Value *Src3 = EmitScalarExpr(E->getArg(3)); 7375 7376 llvm::Value *F = CGM.getIntrinsic(Intrinsic::amdgcn_div_fmas, 7377 Src0->getType()); 7378 llvm::Value *Src3ToBool = Builder.CreateIsNotNull(Src3); 7379 return Builder.CreateCall(F, {Src0, Src1, Src2, Src3ToBool}); 7380 } 7381 case AMDGPU::BI__builtin_amdgcn_div_fixup: 7382 case AMDGPU::BI__builtin_amdgcn_div_fixupf: 7383 return emitTernaryFPBuiltin(*this, E, Intrinsic::amdgcn_div_fixup); 7384 case AMDGPU::BI__builtin_amdgcn_trig_preop: 7385 case AMDGPU::BI__builtin_amdgcn_trig_preopf: 7386 return emitFPIntBuiltin(*this, E, Intrinsic::amdgcn_trig_preop); 7387 case AMDGPU::BI__builtin_amdgcn_rcp: 7388 case AMDGPU::BI__builtin_amdgcn_rcpf: 7389 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_rcp); 7390 case AMDGPU::BI__builtin_amdgcn_rsq: 7391 case AMDGPU::BI__builtin_amdgcn_rsqf: 7392 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_rsq); 7393 case AMDGPU::BI__builtin_amdgcn_rsq_clamp: 7394 case AMDGPU::BI__builtin_amdgcn_rsq_clampf: 7395 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_rsq_clamp); 7396 case AMDGPU::BI__builtin_amdgcn_sinf: 7397 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_sin); 7398 case AMDGPU::BI__builtin_amdgcn_cosf: 7399 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_cos); 7400 case AMDGPU::BI__builtin_amdgcn_log_clampf: 7401 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_log_clamp); 7402 case AMDGPU::BI__builtin_amdgcn_ldexp: 7403 case AMDGPU::BI__builtin_amdgcn_ldexpf: 7404 return emitFPIntBuiltin(*this, E, Intrinsic::amdgcn_ldexp); 7405 case AMDGPU::BI__builtin_amdgcn_frexp_mant: 7406 case AMDGPU::BI__builtin_amdgcn_frexp_mantf: { 7407 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_frexp_mant); 7408 } 7409 case AMDGPU::BI__builtin_amdgcn_frexp_exp: 7410 case AMDGPU::BI__builtin_amdgcn_frexp_expf: { 7411 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_frexp_exp); 7412 } 7413 case AMDGPU::BI__builtin_amdgcn_fract: 7414 case AMDGPU::BI__builtin_amdgcn_fractf: 7415 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_fract); 7416 case AMDGPU::BI__builtin_amdgcn_class: 7417 case AMDGPU::BI__builtin_amdgcn_classf: 7418 return emitFPIntBuiltin(*this, E, Intrinsic::amdgcn_class); 7419 7420 case AMDGPU::BI__builtin_amdgcn_read_exec: { 7421 CallInst *CI = cast<CallInst>( 7422 EmitSpecialRegisterBuiltin(*this, E, Int64Ty, Int64Ty, true, "exec")); 7423 CI->setConvergent(); 7424 return CI; 7425 } 7426 // Legacy amdgpu prefix 7427 case AMDGPU::BI__builtin_amdgpu_rsq: 7428 case AMDGPU::BI__builtin_amdgpu_rsqf: { 7429 if (getTarget().getTriple().getArch() == Triple::amdgcn) 7430 return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_rsq); 7431 return emitUnaryBuiltin(*this, E, Intrinsic::r600_rsq); 7432 } 7433 case AMDGPU::BI__builtin_amdgpu_ldexp: 7434 case AMDGPU::BI__builtin_amdgpu_ldexpf: { 7435 if (getTarget().getTriple().getArch() == Triple::amdgcn) 7436 return emitFPIntBuiltin(*this, E, Intrinsic::amdgcn_ldexp); 7437 return emitFPIntBuiltin(*this, E, Intrinsic::AMDGPU_ldexp); 7438 } 7439 default: 7440 return nullptr; 7441 } 7442 } 7443 7444 /// Handle a SystemZ function in which the final argument is a pointer 7445 /// to an int that receives the post-instruction CC value. At the LLVM level 7446 /// this is represented as a function that returns a {result, cc} pair. 7447 static Value *EmitSystemZIntrinsicWithCC(CodeGenFunction &CGF, 7448 unsigned IntrinsicID, 7449 const CallExpr *E) { 7450 unsigned NumArgs = E->getNumArgs() - 1; 7451 SmallVector<Value *, 8> Args(NumArgs); 7452 for (unsigned I = 0; I < NumArgs; ++I) 7453 Args[I] = CGF.EmitScalarExpr(E->getArg(I)); 7454 Address CCPtr = CGF.EmitPointerWithAlignment(E->getArg(NumArgs)); 7455 Value *F = CGF.CGM.getIntrinsic(IntrinsicID); 7456 Value *Call = CGF.Builder.CreateCall(F, Args); 7457 Value *CC = CGF.Builder.CreateExtractValue(Call, 1); 7458 CGF.Builder.CreateStore(CC, CCPtr); 7459 return CGF.Builder.CreateExtractValue(Call, 0); 7460 } 7461 7462 Value *CodeGenFunction::EmitSystemZBuiltinExpr(unsigned BuiltinID, 7463 const CallExpr *E) { 7464 switch (BuiltinID) { 7465 case SystemZ::BI__builtin_tbegin: { 7466 Value *TDB = EmitScalarExpr(E->getArg(0)); 7467 Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff0c); 7468 Value *F = CGM.getIntrinsic(Intrinsic::s390_tbegin); 7469 return Builder.CreateCall(F, {TDB, Control}); 7470 } 7471 case SystemZ::BI__builtin_tbegin_nofloat: { 7472 Value *TDB = EmitScalarExpr(E->getArg(0)); 7473 Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff0c); 7474 Value *F = CGM.getIntrinsic(Intrinsic::s390_tbegin_nofloat); 7475 return Builder.CreateCall(F, {TDB, Control}); 7476 } 7477 case SystemZ::BI__builtin_tbeginc: { 7478 Value *TDB = llvm::ConstantPointerNull::get(Int8PtrTy); 7479 Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff08); 7480 Value *F = CGM.getIntrinsic(Intrinsic::s390_tbeginc); 7481 return Builder.CreateCall(F, {TDB, Control}); 7482 } 7483 case SystemZ::BI__builtin_tabort: { 7484 Value *Data = EmitScalarExpr(E->getArg(0)); 7485 Value *F = CGM.getIntrinsic(Intrinsic::s390_tabort); 7486 return Builder.CreateCall(F, Builder.CreateSExt(Data, Int64Ty, "tabort")); 7487 } 7488 case SystemZ::BI__builtin_non_tx_store: { 7489 Value *Address = EmitScalarExpr(E->getArg(0)); 7490 Value *Data = EmitScalarExpr(E->getArg(1)); 7491 Value *F = CGM.getIntrinsic(Intrinsic::s390_ntstg); 7492 return Builder.CreateCall(F, {Data, Address}); 7493 } 7494 7495 // Vector builtins. Note that most vector builtins are mapped automatically 7496 // to target-specific LLVM intrinsics. The ones handled specially here can 7497 // be represented via standard LLVM IR, which is preferable to enable common 7498 // LLVM optimizations. 7499 7500 case SystemZ::BI__builtin_s390_vpopctb: 7501 case SystemZ::BI__builtin_s390_vpopcth: 7502 case SystemZ::BI__builtin_s390_vpopctf: 7503 case SystemZ::BI__builtin_s390_vpopctg: { 7504 llvm::Type *ResultType = ConvertType(E->getType()); 7505 Value *X = EmitScalarExpr(E->getArg(0)); 7506 Function *F = CGM.getIntrinsic(Intrinsic::ctpop, ResultType); 7507 return Builder.CreateCall(F, X); 7508 } 7509 7510 case SystemZ::BI__builtin_s390_vclzb: 7511 case SystemZ::BI__builtin_s390_vclzh: 7512 case SystemZ::BI__builtin_s390_vclzf: 7513 case SystemZ::BI__builtin_s390_vclzg: { 7514 llvm::Type *ResultType = ConvertType(E->getType()); 7515 Value *X = EmitScalarExpr(E->getArg(0)); 7516 Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false); 7517 Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ResultType); 7518 return Builder.CreateCall(F, {X, Undef}); 7519 } 7520 7521 case SystemZ::BI__builtin_s390_vctzb: 7522 case SystemZ::BI__builtin_s390_vctzh: 7523 case SystemZ::BI__builtin_s390_vctzf: 7524 case SystemZ::BI__builtin_s390_vctzg: { 7525 llvm::Type *ResultType = ConvertType(E->getType()); 7526 Value *X = EmitScalarExpr(E->getArg(0)); 7527 Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false); 7528 Function *F = CGM.getIntrinsic(Intrinsic::cttz, ResultType); 7529 return Builder.CreateCall(F, {X, Undef}); 7530 } 7531 7532 case SystemZ::BI__builtin_s390_vfsqdb: { 7533 llvm::Type *ResultType = ConvertType(E->getType()); 7534 Value *X = EmitScalarExpr(E->getArg(0)); 7535 Function *F = CGM.getIntrinsic(Intrinsic::sqrt, ResultType); 7536 return Builder.CreateCall(F, X); 7537 } 7538 case SystemZ::BI__builtin_s390_vfmadb: { 7539 llvm::Type *ResultType = ConvertType(E->getType()); 7540 Value *X = EmitScalarExpr(E->getArg(0)); 7541 Value *Y = EmitScalarExpr(E->getArg(1)); 7542 Value *Z = EmitScalarExpr(E->getArg(2)); 7543 Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType); 7544 return Builder.CreateCall(F, {X, Y, Z}); 7545 } 7546 case SystemZ::BI__builtin_s390_vfmsdb: { 7547 llvm::Type *ResultType = ConvertType(E->getType()); 7548 Value *X = EmitScalarExpr(E->getArg(0)); 7549 Value *Y = EmitScalarExpr(E->getArg(1)); 7550 Value *Z = EmitScalarExpr(E->getArg(2)); 7551 Value *Zero = llvm::ConstantFP::getZeroValueForNegation(ResultType); 7552 Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType); 7553 return Builder.CreateCall(F, {X, Y, Builder.CreateFSub(Zero, Z, "sub")}); 7554 } 7555 case SystemZ::BI__builtin_s390_vflpdb: { 7556 llvm::Type *ResultType = ConvertType(E->getType()); 7557 Value *X = EmitScalarExpr(E->getArg(0)); 7558 Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType); 7559 return Builder.CreateCall(F, X); 7560 } 7561 case SystemZ::BI__builtin_s390_vflndb: { 7562 llvm::Type *ResultType = ConvertType(E->getType()); 7563 Value *X = EmitScalarExpr(E->getArg(0)); 7564 Value *Zero = llvm::ConstantFP::getZeroValueForNegation(ResultType); 7565 Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType); 7566 return Builder.CreateFSub(Zero, Builder.CreateCall(F, X), "sub"); 7567 } 7568 case SystemZ::BI__builtin_s390_vfidb: { 7569 llvm::Type *ResultType = ConvertType(E->getType()); 7570 Value *X = EmitScalarExpr(E->getArg(0)); 7571 // Constant-fold the M4 and M5 mask arguments. 7572 llvm::APSInt M4, M5; 7573 bool IsConstM4 = E->getArg(1)->isIntegerConstantExpr(M4, getContext()); 7574 bool IsConstM5 = E->getArg(2)->isIntegerConstantExpr(M5, getContext()); 7575 assert(IsConstM4 && IsConstM5 && "Constant arg isn't actually constant?"); 7576 (void)IsConstM4; (void)IsConstM5; 7577 // Check whether this instance of vfidb can be represented via a LLVM 7578 // standard intrinsic. We only support some combinations of M4 and M5. 7579 Intrinsic::ID ID = Intrinsic::not_intrinsic; 7580 switch (M4.getZExtValue()) { 7581 default: break; 7582 case 0: // IEEE-inexact exception allowed 7583 switch (M5.getZExtValue()) { 7584 default: break; 7585 case 0: ID = Intrinsic::rint; break; 7586 } 7587 break; 7588 case 4: // IEEE-inexact exception suppressed 7589 switch (M5.getZExtValue()) { 7590 default: break; 7591 case 0: ID = Intrinsic::nearbyint; break; 7592 case 1: ID = Intrinsic::round; break; 7593 case 5: ID = Intrinsic::trunc; break; 7594 case 6: ID = Intrinsic::ceil; break; 7595 case 7: ID = Intrinsic::floor; break; 7596 } 7597 break; 7598 } 7599 if (ID != Intrinsic::not_intrinsic) { 7600 Function *F = CGM.getIntrinsic(ID, ResultType); 7601 return Builder.CreateCall(F, X); 7602 } 7603 Function *F = CGM.getIntrinsic(Intrinsic::s390_vfidb); 7604 Value *M4Value = llvm::ConstantInt::get(getLLVMContext(), M4); 7605 Value *M5Value = llvm::ConstantInt::get(getLLVMContext(), M5); 7606 return Builder.CreateCall(F, {X, M4Value, M5Value}); 7607 } 7608 7609 // Vector intrisincs that output the post-instruction CC value. 7610 7611 #define INTRINSIC_WITH_CC(NAME) \ 7612 case SystemZ::BI__builtin_##NAME: \ 7613 return EmitSystemZIntrinsicWithCC(*this, Intrinsic::NAME, E) 7614 7615 INTRINSIC_WITH_CC(s390_vpkshs); 7616 INTRINSIC_WITH_CC(s390_vpksfs); 7617 INTRINSIC_WITH_CC(s390_vpksgs); 7618 7619 INTRINSIC_WITH_CC(s390_vpklshs); 7620 INTRINSIC_WITH_CC(s390_vpklsfs); 7621 INTRINSIC_WITH_CC(s390_vpklsgs); 7622 7623 INTRINSIC_WITH_CC(s390_vceqbs); 7624 INTRINSIC_WITH_CC(s390_vceqhs); 7625 INTRINSIC_WITH_CC(s390_vceqfs); 7626 INTRINSIC_WITH_CC(s390_vceqgs); 7627 7628 INTRINSIC_WITH_CC(s390_vchbs); 7629 INTRINSIC_WITH_CC(s390_vchhs); 7630 INTRINSIC_WITH_CC(s390_vchfs); 7631 INTRINSIC_WITH_CC(s390_vchgs); 7632 7633 INTRINSIC_WITH_CC(s390_vchlbs); 7634 INTRINSIC_WITH_CC(s390_vchlhs); 7635 INTRINSIC_WITH_CC(s390_vchlfs); 7636 INTRINSIC_WITH_CC(s390_vchlgs); 7637 7638 INTRINSIC_WITH_CC(s390_vfaebs); 7639 INTRINSIC_WITH_CC(s390_vfaehs); 7640 INTRINSIC_WITH_CC(s390_vfaefs); 7641 7642 INTRINSIC_WITH_CC(s390_vfaezbs); 7643 INTRINSIC_WITH_CC(s390_vfaezhs); 7644 INTRINSIC_WITH_CC(s390_vfaezfs); 7645 7646 INTRINSIC_WITH_CC(s390_vfeebs); 7647 INTRINSIC_WITH_CC(s390_vfeehs); 7648 INTRINSIC_WITH_CC(s390_vfeefs); 7649 7650 INTRINSIC_WITH_CC(s390_vfeezbs); 7651 INTRINSIC_WITH_CC(s390_vfeezhs); 7652 INTRINSIC_WITH_CC(s390_vfeezfs); 7653 7654 INTRINSIC_WITH_CC(s390_vfenebs); 7655 INTRINSIC_WITH_CC(s390_vfenehs); 7656 INTRINSIC_WITH_CC(s390_vfenefs); 7657 7658 INTRINSIC_WITH_CC(s390_vfenezbs); 7659 INTRINSIC_WITH_CC(s390_vfenezhs); 7660 INTRINSIC_WITH_CC(s390_vfenezfs); 7661 7662 INTRINSIC_WITH_CC(s390_vistrbs); 7663 INTRINSIC_WITH_CC(s390_vistrhs); 7664 INTRINSIC_WITH_CC(s390_vistrfs); 7665 7666 INTRINSIC_WITH_CC(s390_vstrcbs); 7667 INTRINSIC_WITH_CC(s390_vstrchs); 7668 INTRINSIC_WITH_CC(s390_vstrcfs); 7669 7670 INTRINSIC_WITH_CC(s390_vstrczbs); 7671 INTRINSIC_WITH_CC(s390_vstrczhs); 7672 INTRINSIC_WITH_CC(s390_vstrczfs); 7673 7674 INTRINSIC_WITH_CC(s390_vfcedbs); 7675 INTRINSIC_WITH_CC(s390_vfchdbs); 7676 INTRINSIC_WITH_CC(s390_vfchedbs); 7677 7678 INTRINSIC_WITH_CC(s390_vftcidb); 7679 7680 #undef INTRINSIC_WITH_CC 7681 7682 default: 7683 return nullptr; 7684 } 7685 } 7686 7687 Value *CodeGenFunction::EmitNVPTXBuiltinExpr(unsigned BuiltinID, 7688 const CallExpr *E) { 7689 auto MakeLdg = [&](unsigned IntrinsicID) { 7690 Value *Ptr = EmitScalarExpr(E->getArg(0)); 7691 AlignmentSource AlignSource; 7692 clang::CharUnits Align = 7693 getNaturalPointeeTypeAlignment(E->getArg(0)->getType(), &AlignSource); 7694 return Builder.CreateCall( 7695 CGM.getIntrinsic(IntrinsicID, {Ptr->getType()->getPointerElementType(), 7696 Ptr->getType()}), 7697 {Ptr, ConstantInt::get(Builder.getInt32Ty(), Align.getQuantity())}); 7698 }; 7699 7700 switch (BuiltinID) { 7701 case NVPTX::BI__nvvm_atom_add_gen_i: 7702 case NVPTX::BI__nvvm_atom_add_gen_l: 7703 case NVPTX::BI__nvvm_atom_add_gen_ll: 7704 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Add, E); 7705 7706 case NVPTX::BI__nvvm_atom_sub_gen_i: 7707 case NVPTX::BI__nvvm_atom_sub_gen_l: 7708 case NVPTX::BI__nvvm_atom_sub_gen_ll: 7709 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Sub, E); 7710 7711 case NVPTX::BI__nvvm_atom_and_gen_i: 7712 case NVPTX::BI__nvvm_atom_and_gen_l: 7713 case NVPTX::BI__nvvm_atom_and_gen_ll: 7714 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::And, E); 7715 7716 case NVPTX::BI__nvvm_atom_or_gen_i: 7717 case NVPTX::BI__nvvm_atom_or_gen_l: 7718 case NVPTX::BI__nvvm_atom_or_gen_ll: 7719 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Or, E); 7720 7721 case NVPTX::BI__nvvm_atom_xor_gen_i: 7722 case NVPTX::BI__nvvm_atom_xor_gen_l: 7723 case NVPTX::BI__nvvm_atom_xor_gen_ll: 7724 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Xor, E); 7725 7726 case NVPTX::BI__nvvm_atom_xchg_gen_i: 7727 case NVPTX::BI__nvvm_atom_xchg_gen_l: 7728 case NVPTX::BI__nvvm_atom_xchg_gen_ll: 7729 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Xchg, E); 7730 7731 case NVPTX::BI__nvvm_atom_max_gen_i: 7732 case NVPTX::BI__nvvm_atom_max_gen_l: 7733 case NVPTX::BI__nvvm_atom_max_gen_ll: 7734 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Max, E); 7735 7736 case NVPTX::BI__nvvm_atom_max_gen_ui: 7737 case NVPTX::BI__nvvm_atom_max_gen_ul: 7738 case NVPTX::BI__nvvm_atom_max_gen_ull: 7739 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::UMax, E); 7740 7741 case NVPTX::BI__nvvm_atom_min_gen_i: 7742 case NVPTX::BI__nvvm_atom_min_gen_l: 7743 case NVPTX::BI__nvvm_atom_min_gen_ll: 7744 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Min, E); 7745 7746 case NVPTX::BI__nvvm_atom_min_gen_ui: 7747 case NVPTX::BI__nvvm_atom_min_gen_ul: 7748 case NVPTX::BI__nvvm_atom_min_gen_ull: 7749 return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::UMin, E); 7750 7751 case NVPTX::BI__nvvm_atom_cas_gen_i: 7752 case NVPTX::BI__nvvm_atom_cas_gen_l: 7753 case NVPTX::BI__nvvm_atom_cas_gen_ll: 7754 // __nvvm_atom_cas_gen_* should return the old value rather than the 7755 // success flag. 7756 return MakeAtomicCmpXchgValue(*this, E, /*ReturnBool=*/false); 7757 7758 case NVPTX::BI__nvvm_atom_add_gen_f: { 7759 Value *Ptr = EmitScalarExpr(E->getArg(0)); 7760 Value *Val = EmitScalarExpr(E->getArg(1)); 7761 // atomicrmw only deals with integer arguments so we need to use 7762 // LLVM's nvvm_atomic_load_add_f32 intrinsic for that. 7763 Value *FnALAF32 = 7764 CGM.getIntrinsic(Intrinsic::nvvm_atomic_load_add_f32, Ptr->getType()); 7765 return Builder.CreateCall(FnALAF32, {Ptr, Val}); 7766 } 7767 7768 case NVPTX::BI__nvvm_atom_inc_gen_ui: { 7769 Value *Ptr = EmitScalarExpr(E->getArg(0)); 7770 Value *Val = EmitScalarExpr(E->getArg(1)); 7771 Value *FnALI32 = 7772 CGM.getIntrinsic(Intrinsic::nvvm_atomic_load_inc_32, Ptr->getType()); 7773 return Builder.CreateCall(FnALI32, {Ptr, Val}); 7774 } 7775 7776 case NVPTX::BI__nvvm_atom_dec_gen_ui: { 7777 Value *Ptr = EmitScalarExpr(E->getArg(0)); 7778 Value *Val = EmitScalarExpr(E->getArg(1)); 7779 Value *FnALD32 = 7780 CGM.getIntrinsic(Intrinsic::nvvm_atomic_load_dec_32, Ptr->getType()); 7781 return Builder.CreateCall(FnALD32, {Ptr, Val}); 7782 } 7783 7784 case NVPTX::BI__nvvm_ldg_c: 7785 case NVPTX::BI__nvvm_ldg_c2: 7786 case NVPTX::BI__nvvm_ldg_c4: 7787 case NVPTX::BI__nvvm_ldg_s: 7788 case NVPTX::BI__nvvm_ldg_s2: 7789 case NVPTX::BI__nvvm_ldg_s4: 7790 case NVPTX::BI__nvvm_ldg_i: 7791 case NVPTX::BI__nvvm_ldg_i2: 7792 case NVPTX::BI__nvvm_ldg_i4: 7793 case NVPTX::BI__nvvm_ldg_l: 7794 case NVPTX::BI__nvvm_ldg_ll: 7795 case NVPTX::BI__nvvm_ldg_ll2: 7796 case NVPTX::BI__nvvm_ldg_uc: 7797 case NVPTX::BI__nvvm_ldg_uc2: 7798 case NVPTX::BI__nvvm_ldg_uc4: 7799 case NVPTX::BI__nvvm_ldg_us: 7800 case NVPTX::BI__nvvm_ldg_us2: 7801 case NVPTX::BI__nvvm_ldg_us4: 7802 case NVPTX::BI__nvvm_ldg_ui: 7803 case NVPTX::BI__nvvm_ldg_ui2: 7804 case NVPTX::BI__nvvm_ldg_ui4: 7805 case NVPTX::BI__nvvm_ldg_ul: 7806 case NVPTX::BI__nvvm_ldg_ull: 7807 case NVPTX::BI__nvvm_ldg_ull2: 7808 // PTX Interoperability section 2.2: "For a vector with an even number of 7809 // elements, its alignment is set to number of elements times the alignment 7810 // of its member: n*alignof(t)." 7811 return MakeLdg(Intrinsic::nvvm_ldg_global_i); 7812 case NVPTX::BI__nvvm_ldg_f: 7813 case NVPTX::BI__nvvm_ldg_f2: 7814 case NVPTX::BI__nvvm_ldg_f4: 7815 case NVPTX::BI__nvvm_ldg_d: 7816 case NVPTX::BI__nvvm_ldg_d2: 7817 return MakeLdg(Intrinsic::nvvm_ldg_global_f); 7818 default: 7819 return nullptr; 7820 } 7821 } 7822 7823 Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID, 7824 const CallExpr *E) { 7825 switch (BuiltinID) { 7826 case WebAssembly::BI__builtin_wasm_current_memory: { 7827 llvm::Type *ResultType = ConvertType(E->getType()); 7828 Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_current_memory, ResultType); 7829 return Builder.CreateCall(Callee); 7830 } 7831 case WebAssembly::BI__builtin_wasm_grow_memory: { 7832 Value *X = EmitScalarExpr(E->getArg(0)); 7833 Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_grow_memory, X->getType()); 7834 return Builder.CreateCall(Callee, X); 7835 } 7836 7837 default: 7838 return nullptr; 7839 } 7840 } 7841