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