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