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