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