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,
7379       AVX5124FMAPS,
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("avx5124vnniw", X86Features::AVX5124VNNIW)
7415             .Case("avx5124fmaps", X86Features::AVX5124FMAPS)
7416             .Case("avx512vpopcntdq", X86Features::AVX512VPOPCNTDQ)
7417             .Default(X86Features::MAX);
7418     assert(Feature != X86Features::MAX && "Invalid feature!");
7419 
7420     // Matching the struct layout from the compiler-rt/libgcc structure that is
7421     // filled in:
7422     // unsigned int __cpu_vendor;
7423     // unsigned int __cpu_type;
7424     // unsigned int __cpu_subtype;
7425     // unsigned int __cpu_features[1];
7426     llvm::Type *STy = llvm::StructType::get(Int32Ty, Int32Ty, Int32Ty,
7427                                             llvm::ArrayType::get(Int32Ty, 1));
7428 
7429     // Grab the global __cpu_model.
7430     llvm::Constant *CpuModel = CGM.CreateRuntimeVariable(STy, "__cpu_model");
7431 
7432     // Grab the first (0th) element from the field __cpu_features off of the
7433     // global in the struct STy.
7434     Value *Idxs[] = {
7435       ConstantInt::get(Int32Ty, 0),
7436       ConstantInt::get(Int32Ty, 3),
7437       ConstantInt::get(Int32Ty, 0)
7438     };
7439     Value *CpuFeatures = Builder.CreateGEP(STy, CpuModel, Idxs);
7440     Value *Features = Builder.CreateAlignedLoad(CpuFeatures,
7441                                                 CharUnits::fromQuantity(4));
7442 
7443     // Check the value of the bit corresponding to the feature requested.
7444     Value *Bitset = Builder.CreateAnd(
7445         Features, llvm::ConstantInt::get(Int32Ty, 1ULL << Feature));
7446     return Builder.CreateICmpNE(Bitset, llvm::ConstantInt::get(Int32Ty, 0));
7447   }
7448   case X86::BI_mm_prefetch: {
7449     Value *Address = Ops[0];
7450     Value *RW = ConstantInt::get(Int32Ty, 0);
7451     Value *Locality = Ops[1];
7452     Value *Data = ConstantInt::get(Int32Ty, 1);
7453     Value *F = CGM.getIntrinsic(Intrinsic::prefetch);
7454     return Builder.CreateCall(F, {Address, RW, Locality, Data});
7455   }
7456   case X86::BI_mm_clflush: {
7457     return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse2_clflush),
7458                               Ops[0]);
7459   }
7460   case X86::BI_mm_lfence: {
7461     return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse2_lfence));
7462   }
7463   case X86::BI_mm_mfence: {
7464     return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse2_mfence));
7465   }
7466   case X86::BI_mm_sfence: {
7467     return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_sfence));
7468   }
7469   case X86::BI_mm_pause: {
7470     return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse2_pause));
7471   }
7472   case X86::BI__rdtsc: {
7473     return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_rdtsc));
7474   }
7475   case X86::BI__builtin_ia32_undef128:
7476   case X86::BI__builtin_ia32_undef256:
7477   case X86::BI__builtin_ia32_undef512:
7478     // The x86 definition of "undef" is not the same as the LLVM definition
7479     // (PR32176). We leave optimizing away an unnecessary zero constant to the
7480     // IR optimizer and backend.
7481     // TODO: If we had a "freeze" IR instruction to generate a fixed undef
7482     // value, we should use that here instead of a zero.
7483     return llvm::Constant::getNullValue(ConvertType(E->getType()));
7484   case X86::BI__builtin_ia32_vec_init_v8qi:
7485   case X86::BI__builtin_ia32_vec_init_v4hi:
7486   case X86::BI__builtin_ia32_vec_init_v2si:
7487     return Builder.CreateBitCast(BuildVector(Ops),
7488                                  llvm::Type::getX86_MMXTy(getLLVMContext()));
7489   case X86::BI__builtin_ia32_vec_ext_v2si:
7490     return Builder.CreateExtractElement(Ops[0],
7491                                   llvm::ConstantInt::get(Ops[1]->getType(), 0));
7492   case X86::BI_mm_setcsr:
7493   case X86::BI__builtin_ia32_ldmxcsr: {
7494     Address Tmp = CreateMemTemp(E->getArg(0)->getType());
7495     Builder.CreateStore(Ops[0], Tmp);
7496     return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_ldmxcsr),
7497                           Builder.CreateBitCast(Tmp.getPointer(), Int8PtrTy));
7498   }
7499   case X86::BI_mm_getcsr:
7500   case X86::BI__builtin_ia32_stmxcsr: {
7501     Address Tmp = CreateMemTemp(E->getType());
7502     Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_stmxcsr),
7503                        Builder.CreateBitCast(Tmp.getPointer(), Int8PtrTy));
7504     return Builder.CreateLoad(Tmp, "stmxcsr");
7505   }
7506   case X86::BI__builtin_ia32_xsave:
7507   case X86::BI__builtin_ia32_xsave64:
7508   case X86::BI__builtin_ia32_xrstor:
7509   case X86::BI__builtin_ia32_xrstor64:
7510   case X86::BI__builtin_ia32_xsaveopt:
7511   case X86::BI__builtin_ia32_xsaveopt64:
7512   case X86::BI__builtin_ia32_xrstors:
7513   case X86::BI__builtin_ia32_xrstors64:
7514   case X86::BI__builtin_ia32_xsavec:
7515   case X86::BI__builtin_ia32_xsavec64:
7516   case X86::BI__builtin_ia32_xsaves:
7517   case X86::BI__builtin_ia32_xsaves64: {
7518     Intrinsic::ID ID;
7519 #define INTRINSIC_X86_XSAVE_ID(NAME) \
7520     case X86::BI__builtin_ia32_##NAME: \
7521       ID = Intrinsic::x86_##NAME; \
7522       break
7523     switch (BuiltinID) {
7524     default: llvm_unreachable("Unsupported intrinsic!");
7525     INTRINSIC_X86_XSAVE_ID(xsave);
7526     INTRINSIC_X86_XSAVE_ID(xsave64);
7527     INTRINSIC_X86_XSAVE_ID(xrstor);
7528     INTRINSIC_X86_XSAVE_ID(xrstor64);
7529     INTRINSIC_X86_XSAVE_ID(xsaveopt);
7530     INTRINSIC_X86_XSAVE_ID(xsaveopt64);
7531     INTRINSIC_X86_XSAVE_ID(xrstors);
7532     INTRINSIC_X86_XSAVE_ID(xrstors64);
7533     INTRINSIC_X86_XSAVE_ID(xsavec);
7534     INTRINSIC_X86_XSAVE_ID(xsavec64);
7535     INTRINSIC_X86_XSAVE_ID(xsaves);
7536     INTRINSIC_X86_XSAVE_ID(xsaves64);
7537     }
7538 #undef INTRINSIC_X86_XSAVE_ID
7539     Value *Mhi = Builder.CreateTrunc(
7540       Builder.CreateLShr(Ops[1], ConstantInt::get(Int64Ty, 32)), Int32Ty);
7541     Value *Mlo = Builder.CreateTrunc(Ops[1], Int32Ty);
7542     Ops[1] = Mhi;
7543     Ops.push_back(Mlo);
7544     return Builder.CreateCall(CGM.getIntrinsic(ID), Ops);
7545   }
7546   case X86::BI__builtin_ia32_storedqudi128_mask:
7547   case X86::BI__builtin_ia32_storedqusi128_mask:
7548   case X86::BI__builtin_ia32_storedquhi128_mask:
7549   case X86::BI__builtin_ia32_storedquqi128_mask:
7550   case X86::BI__builtin_ia32_storeupd128_mask:
7551   case X86::BI__builtin_ia32_storeups128_mask:
7552   case X86::BI__builtin_ia32_storedqudi256_mask:
7553   case X86::BI__builtin_ia32_storedqusi256_mask:
7554   case X86::BI__builtin_ia32_storedquhi256_mask:
7555   case X86::BI__builtin_ia32_storedquqi256_mask:
7556   case X86::BI__builtin_ia32_storeupd256_mask:
7557   case X86::BI__builtin_ia32_storeups256_mask:
7558   case X86::BI__builtin_ia32_storedqudi512_mask:
7559   case X86::BI__builtin_ia32_storedqusi512_mask:
7560   case X86::BI__builtin_ia32_storedquhi512_mask:
7561   case X86::BI__builtin_ia32_storedquqi512_mask:
7562   case X86::BI__builtin_ia32_storeupd512_mask:
7563   case X86::BI__builtin_ia32_storeups512_mask:
7564     return EmitX86MaskedStore(*this, Ops, 1);
7565 
7566   case X86::BI__builtin_ia32_storess128_mask:
7567   case X86::BI__builtin_ia32_storesd128_mask: {
7568     return EmitX86MaskedStore(*this, Ops, 16);
7569   }
7570   case X86::BI__builtin_ia32_vpopcntd_512:
7571   case X86::BI__builtin_ia32_vpopcntq_512: {
7572     llvm::Type *ResultType = ConvertType(E->getType());
7573     llvm::Function *F = CGM.getIntrinsic(Intrinsic::ctpop, ResultType);
7574     return Builder.CreateCall(F, Ops);
7575   }
7576   case X86::BI__builtin_ia32_cvtmask2b128:
7577   case X86::BI__builtin_ia32_cvtmask2b256:
7578   case X86::BI__builtin_ia32_cvtmask2b512:
7579   case X86::BI__builtin_ia32_cvtmask2w128:
7580   case X86::BI__builtin_ia32_cvtmask2w256:
7581   case X86::BI__builtin_ia32_cvtmask2w512:
7582   case X86::BI__builtin_ia32_cvtmask2d128:
7583   case X86::BI__builtin_ia32_cvtmask2d256:
7584   case X86::BI__builtin_ia32_cvtmask2d512:
7585   case X86::BI__builtin_ia32_cvtmask2q128:
7586   case X86::BI__builtin_ia32_cvtmask2q256:
7587   case X86::BI__builtin_ia32_cvtmask2q512:
7588     return EmitX86SExtMask(*this, Ops[0], ConvertType(E->getType()));
7589 
7590   case X86::BI__builtin_ia32_movdqa32store128_mask:
7591   case X86::BI__builtin_ia32_movdqa64store128_mask:
7592   case X86::BI__builtin_ia32_storeaps128_mask:
7593   case X86::BI__builtin_ia32_storeapd128_mask:
7594   case X86::BI__builtin_ia32_movdqa32store256_mask:
7595   case X86::BI__builtin_ia32_movdqa64store256_mask:
7596   case X86::BI__builtin_ia32_storeaps256_mask:
7597   case X86::BI__builtin_ia32_storeapd256_mask:
7598   case X86::BI__builtin_ia32_movdqa32store512_mask:
7599   case X86::BI__builtin_ia32_movdqa64store512_mask:
7600   case X86::BI__builtin_ia32_storeaps512_mask:
7601   case X86::BI__builtin_ia32_storeapd512_mask: {
7602     unsigned Align =
7603       getContext().getTypeAlignInChars(E->getArg(1)->getType()).getQuantity();
7604     return EmitX86MaskedStore(*this, Ops, Align);
7605   }
7606   case X86::BI__builtin_ia32_loadups128_mask:
7607   case X86::BI__builtin_ia32_loadups256_mask:
7608   case X86::BI__builtin_ia32_loadups512_mask:
7609   case X86::BI__builtin_ia32_loadupd128_mask:
7610   case X86::BI__builtin_ia32_loadupd256_mask:
7611   case X86::BI__builtin_ia32_loadupd512_mask:
7612   case X86::BI__builtin_ia32_loaddquqi128_mask:
7613   case X86::BI__builtin_ia32_loaddquqi256_mask:
7614   case X86::BI__builtin_ia32_loaddquqi512_mask:
7615   case X86::BI__builtin_ia32_loaddquhi128_mask:
7616   case X86::BI__builtin_ia32_loaddquhi256_mask:
7617   case X86::BI__builtin_ia32_loaddquhi512_mask:
7618   case X86::BI__builtin_ia32_loaddqusi128_mask:
7619   case X86::BI__builtin_ia32_loaddqusi256_mask:
7620   case X86::BI__builtin_ia32_loaddqusi512_mask:
7621   case X86::BI__builtin_ia32_loaddqudi128_mask:
7622   case X86::BI__builtin_ia32_loaddqudi256_mask:
7623   case X86::BI__builtin_ia32_loaddqudi512_mask:
7624     return EmitX86MaskedLoad(*this, Ops, 1);
7625 
7626   case X86::BI__builtin_ia32_loadss128_mask:
7627   case X86::BI__builtin_ia32_loadsd128_mask:
7628     return EmitX86MaskedLoad(*this, Ops, 16);
7629 
7630   case X86::BI__builtin_ia32_loadaps128_mask:
7631   case X86::BI__builtin_ia32_loadaps256_mask:
7632   case X86::BI__builtin_ia32_loadaps512_mask:
7633   case X86::BI__builtin_ia32_loadapd128_mask:
7634   case X86::BI__builtin_ia32_loadapd256_mask:
7635   case X86::BI__builtin_ia32_loadapd512_mask:
7636   case X86::BI__builtin_ia32_movdqa32load128_mask:
7637   case X86::BI__builtin_ia32_movdqa32load256_mask:
7638   case X86::BI__builtin_ia32_movdqa32load512_mask:
7639   case X86::BI__builtin_ia32_movdqa64load128_mask:
7640   case X86::BI__builtin_ia32_movdqa64load256_mask:
7641   case X86::BI__builtin_ia32_movdqa64load512_mask: {
7642     unsigned Align =
7643       getContext().getTypeAlignInChars(E->getArg(1)->getType()).getQuantity();
7644     return EmitX86MaskedLoad(*this, Ops, Align);
7645   }
7646 
7647   case X86::BI__builtin_ia32_vbroadcastf128_pd256:
7648   case X86::BI__builtin_ia32_vbroadcastf128_ps256: {
7649     llvm::Type *DstTy = ConvertType(E->getType());
7650     return EmitX86SubVectorBroadcast(*this, Ops, DstTy, 128, 1);
7651   }
7652 
7653   case X86::BI__builtin_ia32_storehps:
7654   case X86::BI__builtin_ia32_storelps: {
7655     llvm::Type *PtrTy = llvm::PointerType::getUnqual(Int64Ty);
7656     llvm::Type *VecTy = llvm::VectorType::get(Int64Ty, 2);
7657 
7658     // cast val v2i64
7659     Ops[1] = Builder.CreateBitCast(Ops[1], VecTy, "cast");
7660 
7661     // extract (0, 1)
7662     unsigned Index = BuiltinID == X86::BI__builtin_ia32_storelps ? 0 : 1;
7663     llvm::Value *Idx = llvm::ConstantInt::get(SizeTy, Index);
7664     Ops[1] = Builder.CreateExtractElement(Ops[1], Idx, "extract");
7665 
7666     // cast pointer to i64 & store
7667     Ops[0] = Builder.CreateBitCast(Ops[0], PtrTy);
7668     return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]);
7669   }
7670   case X86::BI__builtin_ia32_palignr128:
7671   case X86::BI__builtin_ia32_palignr256:
7672   case X86::BI__builtin_ia32_palignr512_mask: {
7673     unsigned ShiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
7674 
7675     unsigned NumElts = Ops[0]->getType()->getVectorNumElements();
7676     assert(NumElts % 16 == 0);
7677 
7678     // If palignr is shifting the pair of vectors more than the size of two
7679     // lanes, emit zero.
7680     if (ShiftVal >= 32)
7681       return llvm::Constant::getNullValue(ConvertType(E->getType()));
7682 
7683     // If palignr is shifting the pair of input vectors more than one lane,
7684     // but less than two lanes, convert to shifting in zeroes.
7685     if (ShiftVal > 16) {
7686       ShiftVal -= 16;
7687       Ops[1] = Ops[0];
7688       Ops[0] = llvm::Constant::getNullValue(Ops[0]->getType());
7689     }
7690 
7691     uint32_t Indices[64];
7692     // 256-bit palignr operates on 128-bit lanes so we need to handle that
7693     for (unsigned l = 0; l != NumElts; l += 16) {
7694       for (unsigned i = 0; i != 16; ++i) {
7695         unsigned Idx = ShiftVal + i;
7696         if (Idx >= 16)
7697           Idx += NumElts - 16; // End of lane, switch operand.
7698         Indices[l + i] = Idx + l;
7699       }
7700     }
7701 
7702     Value *Align = Builder.CreateShuffleVector(Ops[1], Ops[0],
7703                                                makeArrayRef(Indices, NumElts),
7704                                                "palignr");
7705 
7706     // If this isn't a masked builtin, just return the align operation.
7707     if (Ops.size() == 3)
7708       return Align;
7709 
7710     return EmitX86Select(*this, Ops[4], Align, Ops[3]);
7711   }
7712 
7713   case X86::BI__builtin_ia32_movnti:
7714   case X86::BI__builtin_ia32_movnti64:
7715   case X86::BI__builtin_ia32_movntsd:
7716   case X86::BI__builtin_ia32_movntss: {
7717     llvm::MDNode *Node = llvm::MDNode::get(
7718         getLLVMContext(), llvm::ConstantAsMetadata::get(Builder.getInt32(1)));
7719 
7720     Value *Ptr = Ops[0];
7721     Value *Src = Ops[1];
7722 
7723     // Extract the 0'th element of the source vector.
7724     if (BuiltinID == X86::BI__builtin_ia32_movntsd ||
7725         BuiltinID == X86::BI__builtin_ia32_movntss)
7726       Src = Builder.CreateExtractElement(Src, (uint64_t)0, "extract");
7727 
7728     // Convert the type of the pointer to a pointer to the stored type.
7729     Value *BC = Builder.CreateBitCast(
7730         Ptr, llvm::PointerType::getUnqual(Src->getType()), "cast");
7731 
7732     // Unaligned nontemporal store of the scalar value.
7733     StoreInst *SI = Builder.CreateDefaultAlignedStore(Src, BC);
7734     SI->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node);
7735     SI->setAlignment(1);
7736     return SI;
7737   }
7738 
7739   case X86::BI__builtin_ia32_selectb_128:
7740   case X86::BI__builtin_ia32_selectb_256:
7741   case X86::BI__builtin_ia32_selectb_512:
7742   case X86::BI__builtin_ia32_selectw_128:
7743   case X86::BI__builtin_ia32_selectw_256:
7744   case X86::BI__builtin_ia32_selectw_512:
7745   case X86::BI__builtin_ia32_selectd_128:
7746   case X86::BI__builtin_ia32_selectd_256:
7747   case X86::BI__builtin_ia32_selectd_512:
7748   case X86::BI__builtin_ia32_selectq_128:
7749   case X86::BI__builtin_ia32_selectq_256:
7750   case X86::BI__builtin_ia32_selectq_512:
7751   case X86::BI__builtin_ia32_selectps_128:
7752   case X86::BI__builtin_ia32_selectps_256:
7753   case X86::BI__builtin_ia32_selectps_512:
7754   case X86::BI__builtin_ia32_selectpd_128:
7755   case X86::BI__builtin_ia32_selectpd_256:
7756   case X86::BI__builtin_ia32_selectpd_512:
7757     return EmitX86Select(*this, Ops[0], Ops[1], Ops[2]);
7758   case X86::BI__builtin_ia32_pcmpeqb128_mask:
7759   case X86::BI__builtin_ia32_pcmpeqb256_mask:
7760   case X86::BI__builtin_ia32_pcmpeqb512_mask:
7761   case X86::BI__builtin_ia32_pcmpeqw128_mask:
7762   case X86::BI__builtin_ia32_pcmpeqw256_mask:
7763   case X86::BI__builtin_ia32_pcmpeqw512_mask:
7764   case X86::BI__builtin_ia32_pcmpeqd128_mask:
7765   case X86::BI__builtin_ia32_pcmpeqd256_mask:
7766   case X86::BI__builtin_ia32_pcmpeqd512_mask:
7767   case X86::BI__builtin_ia32_pcmpeqq128_mask:
7768   case X86::BI__builtin_ia32_pcmpeqq256_mask:
7769   case X86::BI__builtin_ia32_pcmpeqq512_mask:
7770     return EmitX86MaskedCompare(*this, 0, false, Ops);
7771   case X86::BI__builtin_ia32_pcmpgtb128_mask:
7772   case X86::BI__builtin_ia32_pcmpgtb256_mask:
7773   case X86::BI__builtin_ia32_pcmpgtb512_mask:
7774   case X86::BI__builtin_ia32_pcmpgtw128_mask:
7775   case X86::BI__builtin_ia32_pcmpgtw256_mask:
7776   case X86::BI__builtin_ia32_pcmpgtw512_mask:
7777   case X86::BI__builtin_ia32_pcmpgtd128_mask:
7778   case X86::BI__builtin_ia32_pcmpgtd256_mask:
7779   case X86::BI__builtin_ia32_pcmpgtd512_mask:
7780   case X86::BI__builtin_ia32_pcmpgtq128_mask:
7781   case X86::BI__builtin_ia32_pcmpgtq256_mask:
7782   case X86::BI__builtin_ia32_pcmpgtq512_mask:
7783     return EmitX86MaskedCompare(*this, 6, true, Ops);
7784   case X86::BI__builtin_ia32_cmpb128_mask:
7785   case X86::BI__builtin_ia32_cmpb256_mask:
7786   case X86::BI__builtin_ia32_cmpb512_mask:
7787   case X86::BI__builtin_ia32_cmpw128_mask:
7788   case X86::BI__builtin_ia32_cmpw256_mask:
7789   case X86::BI__builtin_ia32_cmpw512_mask:
7790   case X86::BI__builtin_ia32_cmpd128_mask:
7791   case X86::BI__builtin_ia32_cmpd256_mask:
7792   case X86::BI__builtin_ia32_cmpd512_mask:
7793   case X86::BI__builtin_ia32_cmpq128_mask:
7794   case X86::BI__builtin_ia32_cmpq256_mask:
7795   case X86::BI__builtin_ia32_cmpq512_mask: {
7796     unsigned CC = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0x7;
7797     return EmitX86MaskedCompare(*this, CC, true, Ops);
7798   }
7799   case X86::BI__builtin_ia32_ucmpb128_mask:
7800   case X86::BI__builtin_ia32_ucmpb256_mask:
7801   case X86::BI__builtin_ia32_ucmpb512_mask:
7802   case X86::BI__builtin_ia32_ucmpw128_mask:
7803   case X86::BI__builtin_ia32_ucmpw256_mask:
7804   case X86::BI__builtin_ia32_ucmpw512_mask:
7805   case X86::BI__builtin_ia32_ucmpd128_mask:
7806   case X86::BI__builtin_ia32_ucmpd256_mask:
7807   case X86::BI__builtin_ia32_ucmpd512_mask:
7808   case X86::BI__builtin_ia32_ucmpq128_mask:
7809   case X86::BI__builtin_ia32_ucmpq256_mask:
7810   case X86::BI__builtin_ia32_ucmpq512_mask: {
7811     unsigned CC = cast<llvm::ConstantInt>(Ops[2])->getZExtValue() & 0x7;
7812     return EmitX86MaskedCompare(*this, CC, false, Ops);
7813   }
7814 
7815   case X86::BI__builtin_ia32_vplzcntd_128_mask:
7816   case X86::BI__builtin_ia32_vplzcntd_256_mask:
7817   case X86::BI__builtin_ia32_vplzcntd_512_mask:
7818   case X86::BI__builtin_ia32_vplzcntq_128_mask:
7819   case X86::BI__builtin_ia32_vplzcntq_256_mask:
7820   case X86::BI__builtin_ia32_vplzcntq_512_mask: {
7821     Function *F = CGM.getIntrinsic(Intrinsic::ctlz, Ops[0]->getType());
7822     return EmitX86Select(*this, Ops[2],
7823                          Builder.CreateCall(F, {Ops[0],Builder.getInt1(false)}),
7824                          Ops[1]);
7825   }
7826 
7827   case X86::BI__builtin_ia32_pmaxsb128:
7828   case X86::BI__builtin_ia32_pmaxsw128:
7829   case X86::BI__builtin_ia32_pmaxsd128:
7830   case X86::BI__builtin_ia32_pmaxsq128_mask:
7831   case X86::BI__builtin_ia32_pmaxsb256:
7832   case X86::BI__builtin_ia32_pmaxsw256:
7833   case X86::BI__builtin_ia32_pmaxsd256:
7834   case X86::BI__builtin_ia32_pmaxsq256_mask:
7835   case X86::BI__builtin_ia32_pmaxsb512_mask:
7836   case X86::BI__builtin_ia32_pmaxsw512_mask:
7837   case X86::BI__builtin_ia32_pmaxsd512_mask:
7838   case X86::BI__builtin_ia32_pmaxsq512_mask:
7839     return EmitX86MinMax(*this, ICmpInst::ICMP_SGT, Ops);
7840   case X86::BI__builtin_ia32_pmaxub128:
7841   case X86::BI__builtin_ia32_pmaxuw128:
7842   case X86::BI__builtin_ia32_pmaxud128:
7843   case X86::BI__builtin_ia32_pmaxuq128_mask:
7844   case X86::BI__builtin_ia32_pmaxub256:
7845   case X86::BI__builtin_ia32_pmaxuw256:
7846   case X86::BI__builtin_ia32_pmaxud256:
7847   case X86::BI__builtin_ia32_pmaxuq256_mask:
7848   case X86::BI__builtin_ia32_pmaxub512_mask:
7849   case X86::BI__builtin_ia32_pmaxuw512_mask:
7850   case X86::BI__builtin_ia32_pmaxud512_mask:
7851   case X86::BI__builtin_ia32_pmaxuq512_mask:
7852     return EmitX86MinMax(*this, ICmpInst::ICMP_UGT, Ops);
7853   case X86::BI__builtin_ia32_pminsb128:
7854   case X86::BI__builtin_ia32_pminsw128:
7855   case X86::BI__builtin_ia32_pminsd128:
7856   case X86::BI__builtin_ia32_pminsq128_mask:
7857   case X86::BI__builtin_ia32_pminsb256:
7858   case X86::BI__builtin_ia32_pminsw256:
7859   case X86::BI__builtin_ia32_pminsd256:
7860   case X86::BI__builtin_ia32_pminsq256_mask:
7861   case X86::BI__builtin_ia32_pminsb512_mask:
7862   case X86::BI__builtin_ia32_pminsw512_mask:
7863   case X86::BI__builtin_ia32_pminsd512_mask:
7864   case X86::BI__builtin_ia32_pminsq512_mask:
7865     return EmitX86MinMax(*this, ICmpInst::ICMP_SLT, Ops);
7866   case X86::BI__builtin_ia32_pminub128:
7867   case X86::BI__builtin_ia32_pminuw128:
7868   case X86::BI__builtin_ia32_pminud128:
7869   case X86::BI__builtin_ia32_pminuq128_mask:
7870   case X86::BI__builtin_ia32_pminub256:
7871   case X86::BI__builtin_ia32_pminuw256:
7872   case X86::BI__builtin_ia32_pminud256:
7873   case X86::BI__builtin_ia32_pminuq256_mask:
7874   case X86::BI__builtin_ia32_pminub512_mask:
7875   case X86::BI__builtin_ia32_pminuw512_mask:
7876   case X86::BI__builtin_ia32_pminud512_mask:
7877   case X86::BI__builtin_ia32_pminuq512_mask:
7878     return EmitX86MinMax(*this, ICmpInst::ICMP_ULT, Ops);
7879 
7880   // 3DNow!
7881   case X86::BI__builtin_ia32_pswapdsf:
7882   case X86::BI__builtin_ia32_pswapdsi: {
7883     llvm::Type *MMXTy = llvm::Type::getX86_MMXTy(getLLVMContext());
7884     Ops[0] = Builder.CreateBitCast(Ops[0], MMXTy, "cast");
7885     llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_3dnowa_pswapd);
7886     return Builder.CreateCall(F, Ops, "pswapd");
7887   }
7888   case X86::BI__builtin_ia32_rdrand16_step:
7889   case X86::BI__builtin_ia32_rdrand32_step:
7890   case X86::BI__builtin_ia32_rdrand64_step:
7891   case X86::BI__builtin_ia32_rdseed16_step:
7892   case X86::BI__builtin_ia32_rdseed32_step:
7893   case X86::BI__builtin_ia32_rdseed64_step: {
7894     Intrinsic::ID ID;
7895     switch (BuiltinID) {
7896     default: llvm_unreachable("Unsupported intrinsic!");
7897     case X86::BI__builtin_ia32_rdrand16_step:
7898       ID = Intrinsic::x86_rdrand_16;
7899       break;
7900     case X86::BI__builtin_ia32_rdrand32_step:
7901       ID = Intrinsic::x86_rdrand_32;
7902       break;
7903     case X86::BI__builtin_ia32_rdrand64_step:
7904       ID = Intrinsic::x86_rdrand_64;
7905       break;
7906     case X86::BI__builtin_ia32_rdseed16_step:
7907       ID = Intrinsic::x86_rdseed_16;
7908       break;
7909     case X86::BI__builtin_ia32_rdseed32_step:
7910       ID = Intrinsic::x86_rdseed_32;
7911       break;
7912     case X86::BI__builtin_ia32_rdseed64_step:
7913       ID = Intrinsic::x86_rdseed_64;
7914       break;
7915     }
7916 
7917     Value *Call = Builder.CreateCall(CGM.getIntrinsic(ID));
7918     Builder.CreateDefaultAlignedStore(Builder.CreateExtractValue(Call, 0),
7919                                       Ops[0]);
7920     return Builder.CreateExtractValue(Call, 1);
7921   }
7922 
7923   // SSE packed comparison intrinsics
7924   case X86::BI__builtin_ia32_cmpeqps:
7925   case X86::BI__builtin_ia32_cmpeqpd:
7926     return getVectorFCmpIR(CmpInst::FCMP_OEQ);
7927   case X86::BI__builtin_ia32_cmpltps:
7928   case X86::BI__builtin_ia32_cmpltpd:
7929     return getVectorFCmpIR(CmpInst::FCMP_OLT);
7930   case X86::BI__builtin_ia32_cmpleps:
7931   case X86::BI__builtin_ia32_cmplepd:
7932     return getVectorFCmpIR(CmpInst::FCMP_OLE);
7933   case X86::BI__builtin_ia32_cmpunordps:
7934   case X86::BI__builtin_ia32_cmpunordpd:
7935     return getVectorFCmpIR(CmpInst::FCMP_UNO);
7936   case X86::BI__builtin_ia32_cmpneqps:
7937   case X86::BI__builtin_ia32_cmpneqpd:
7938     return getVectorFCmpIR(CmpInst::FCMP_UNE);
7939   case X86::BI__builtin_ia32_cmpnltps:
7940   case X86::BI__builtin_ia32_cmpnltpd:
7941     return getVectorFCmpIR(CmpInst::FCMP_UGE);
7942   case X86::BI__builtin_ia32_cmpnleps:
7943   case X86::BI__builtin_ia32_cmpnlepd:
7944     return getVectorFCmpIR(CmpInst::FCMP_UGT);
7945   case X86::BI__builtin_ia32_cmpordps:
7946   case X86::BI__builtin_ia32_cmpordpd:
7947     return getVectorFCmpIR(CmpInst::FCMP_ORD);
7948   case X86::BI__builtin_ia32_cmpps:
7949   case X86::BI__builtin_ia32_cmpps256:
7950   case X86::BI__builtin_ia32_cmppd:
7951   case X86::BI__builtin_ia32_cmppd256: {
7952     unsigned CC = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
7953     // If this one of the SSE immediates, we can use native IR.
7954     if (CC < 8) {
7955       FCmpInst::Predicate Pred;
7956       switch (CC) {
7957       case 0: Pred = FCmpInst::FCMP_OEQ; break;
7958       case 1: Pred = FCmpInst::FCMP_OLT; break;
7959       case 2: Pred = FCmpInst::FCMP_OLE; break;
7960       case 3: Pred = FCmpInst::FCMP_UNO; break;
7961       case 4: Pred = FCmpInst::FCMP_UNE; break;
7962       case 5: Pred = FCmpInst::FCMP_UGE; break;
7963       case 6: Pred = FCmpInst::FCMP_UGT; break;
7964       case 7: Pred = FCmpInst::FCMP_ORD; break;
7965       }
7966       return getVectorFCmpIR(Pred);
7967     }
7968 
7969     // We can't handle 8-31 immediates with native IR, use the intrinsic.
7970     // Except for predicates that create constants.
7971     Intrinsic::ID ID;
7972     switch (BuiltinID) {
7973     default: llvm_unreachable("Unsupported intrinsic!");
7974     case X86::BI__builtin_ia32_cmpps:
7975       ID = Intrinsic::x86_sse_cmp_ps;
7976       break;
7977     case X86::BI__builtin_ia32_cmpps256:
7978       // _CMP_TRUE_UQ, _CMP_TRUE_US produce -1,-1... vector
7979       // on any input and _CMP_FALSE_OQ, _CMP_FALSE_OS produce 0, 0...
7980       if (CC == 0xf || CC == 0xb || CC == 0x1b || CC == 0x1f) {
7981          Value *Constant = (CC == 0xf || CC == 0x1f) ?
7982                 llvm::Constant::getAllOnesValue(Builder.getInt32Ty()) :
7983                 llvm::Constant::getNullValue(Builder.getInt32Ty());
7984          Value *Vec = Builder.CreateVectorSplat(
7985                         Ops[0]->getType()->getVectorNumElements(), Constant);
7986          return Builder.CreateBitCast(Vec, Ops[0]->getType());
7987       }
7988       ID = Intrinsic::x86_avx_cmp_ps_256;
7989       break;
7990     case X86::BI__builtin_ia32_cmppd:
7991       ID = Intrinsic::x86_sse2_cmp_pd;
7992       break;
7993     case X86::BI__builtin_ia32_cmppd256:
7994       // _CMP_TRUE_UQ, _CMP_TRUE_US produce -1,-1... vector
7995       // on any input and _CMP_FALSE_OQ, _CMP_FALSE_OS produce 0, 0...
7996       if (CC == 0xf || CC == 0xb || CC == 0x1b || CC == 0x1f) {
7997          Value *Constant = (CC == 0xf || CC == 0x1f) ?
7998                 llvm::Constant::getAllOnesValue(Builder.getInt64Ty()) :
7999                 llvm::Constant::getNullValue(Builder.getInt64Ty());
8000          Value *Vec = Builder.CreateVectorSplat(
8001                         Ops[0]->getType()->getVectorNumElements(), Constant);
8002          return Builder.CreateBitCast(Vec, Ops[0]->getType());
8003       }
8004       ID = Intrinsic::x86_avx_cmp_pd_256;
8005       break;
8006     }
8007 
8008     return Builder.CreateCall(CGM.getIntrinsic(ID), Ops);
8009   }
8010 
8011   // SSE scalar comparison intrinsics
8012   case X86::BI__builtin_ia32_cmpeqss:
8013     return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 0);
8014   case X86::BI__builtin_ia32_cmpltss:
8015     return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 1);
8016   case X86::BI__builtin_ia32_cmpless:
8017     return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 2);
8018   case X86::BI__builtin_ia32_cmpunordss:
8019     return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 3);
8020   case X86::BI__builtin_ia32_cmpneqss:
8021     return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 4);
8022   case X86::BI__builtin_ia32_cmpnltss:
8023     return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 5);
8024   case X86::BI__builtin_ia32_cmpnless:
8025     return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 6);
8026   case X86::BI__builtin_ia32_cmpordss:
8027     return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 7);
8028   case X86::BI__builtin_ia32_cmpeqsd:
8029     return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 0);
8030   case X86::BI__builtin_ia32_cmpltsd:
8031     return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 1);
8032   case X86::BI__builtin_ia32_cmplesd:
8033     return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 2);
8034   case X86::BI__builtin_ia32_cmpunordsd:
8035     return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 3);
8036   case X86::BI__builtin_ia32_cmpneqsd:
8037     return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 4);
8038   case X86::BI__builtin_ia32_cmpnltsd:
8039     return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 5);
8040   case X86::BI__builtin_ia32_cmpnlesd:
8041     return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 6);
8042   case X86::BI__builtin_ia32_cmpordsd:
8043     return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 7);
8044 
8045   case X86::BI__emul:
8046   case X86::BI__emulu: {
8047     llvm::Type *Int64Ty = llvm::IntegerType::get(getLLVMContext(), 64);
8048     bool isSigned = (BuiltinID == X86::BI__emul);
8049     Value *LHS = Builder.CreateIntCast(Ops[0], Int64Ty, isSigned);
8050     Value *RHS = Builder.CreateIntCast(Ops[1], Int64Ty, isSigned);
8051     return Builder.CreateMul(LHS, RHS, "", !isSigned, isSigned);
8052   }
8053   case X86::BI__mulh:
8054   case X86::BI__umulh:
8055   case X86::BI_mul128:
8056   case X86::BI_umul128: {
8057     llvm::Type *ResType = ConvertType(E->getType());
8058     llvm::Type *Int128Ty = llvm::IntegerType::get(getLLVMContext(), 128);
8059 
8060     bool IsSigned = (BuiltinID == X86::BI__mulh || BuiltinID == X86::BI_mul128);
8061     Value *LHS = Builder.CreateIntCast(Ops[0], Int128Ty, IsSigned);
8062     Value *RHS = Builder.CreateIntCast(Ops[1], Int128Ty, IsSigned);
8063 
8064     Value *MulResult, *HigherBits;
8065     if (IsSigned) {
8066       MulResult = Builder.CreateNSWMul(LHS, RHS);
8067       HigherBits = Builder.CreateAShr(MulResult, 64);
8068     } else {
8069       MulResult = Builder.CreateNUWMul(LHS, RHS);
8070       HigherBits = Builder.CreateLShr(MulResult, 64);
8071     }
8072     HigherBits = Builder.CreateIntCast(HigherBits, ResType, IsSigned);
8073 
8074     if (BuiltinID == X86::BI__mulh || BuiltinID == X86::BI__umulh)
8075       return HigherBits;
8076 
8077     Address HighBitsAddress = EmitPointerWithAlignment(E->getArg(2));
8078     Builder.CreateStore(HigherBits, HighBitsAddress);
8079     return Builder.CreateIntCast(MulResult, ResType, IsSigned);
8080   }
8081 
8082   case X86::BI__faststorefence: {
8083     return Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent,
8084                                llvm::SyncScope::System);
8085   }
8086   case X86::BI_ReadWriteBarrier:
8087   case X86::BI_ReadBarrier:
8088   case X86::BI_WriteBarrier: {
8089     return Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent,
8090                                llvm::SyncScope::SingleThread);
8091   }
8092   case X86::BI_BitScanForward:
8093   case X86::BI_BitScanForward64:
8094     return EmitMSVCBuiltinExpr(MSVCIntrin::_BitScanForward, E);
8095   case X86::BI_BitScanReverse:
8096   case X86::BI_BitScanReverse64:
8097     return EmitMSVCBuiltinExpr(MSVCIntrin::_BitScanReverse, E);
8098 
8099   case X86::BI_InterlockedAnd64:
8100     return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedAnd, E);
8101   case X86::BI_InterlockedExchange64:
8102     return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchange, E);
8103   case X86::BI_InterlockedExchangeAdd64:
8104     return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeAdd, E);
8105   case X86::BI_InterlockedExchangeSub64:
8106     return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeSub, E);
8107   case X86::BI_InterlockedOr64:
8108     return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedOr, E);
8109   case X86::BI_InterlockedXor64:
8110     return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedXor, E);
8111   case X86::BI_InterlockedDecrement64:
8112     return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedDecrement, E);
8113   case X86::BI_InterlockedIncrement64:
8114     return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedIncrement, E);
8115 
8116   case X86::BI_AddressOfReturnAddress: {
8117     Value *F = CGM.getIntrinsic(Intrinsic::addressofreturnaddress);
8118     return Builder.CreateCall(F);
8119   }
8120   case X86::BI__stosb: {
8121     // We treat __stosb as a volatile memset - it may not generate "rep stosb"
8122     // instruction, but it will create a memset that won't be optimized away.
8123     return Builder.CreateMemSet(Ops[0], Ops[1], Ops[2], 1, true);
8124   }
8125   case X86::BI__ud2:
8126     // llvm.trap makes a ud2a instruction on x86.
8127     return EmitTrapCall(Intrinsic::trap);
8128   case X86::BI__int2c: {
8129     // This syscall signals a driver assertion failure in x86 NT kernels.
8130     llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
8131     llvm::InlineAsm *IA =
8132         llvm::InlineAsm::get(FTy, "int $$0x2c", "", /*SideEffects=*/true);
8133     llvm::AttributeList NoReturnAttr = llvm::AttributeList::get(
8134         getLLVMContext(), llvm::AttributeList::FunctionIndex,
8135         llvm::Attribute::NoReturn);
8136     CallSite CS = Builder.CreateCall(IA);
8137     CS.setAttributes(NoReturnAttr);
8138     return CS.getInstruction();
8139   }
8140   case X86::BI__readfsbyte:
8141   case X86::BI__readfsword:
8142   case X86::BI__readfsdword:
8143   case X86::BI__readfsqword: {
8144     llvm::Type *IntTy = ConvertType(E->getType());
8145     Value *Ptr = Builder.CreateIntToPtr(EmitScalarExpr(E->getArg(0)),
8146                                         llvm::PointerType::get(IntTy, 257));
8147     LoadInst *Load = Builder.CreateAlignedLoad(
8148         IntTy, Ptr, getContext().getTypeAlignInChars(E->getType()));
8149     Load->setVolatile(true);
8150     return Load;
8151   }
8152   case X86::BI__readgsbyte:
8153   case X86::BI__readgsword:
8154   case X86::BI__readgsdword:
8155   case X86::BI__readgsqword: {
8156     llvm::Type *IntTy = ConvertType(E->getType());
8157     Value *Ptr = Builder.CreateIntToPtr(EmitScalarExpr(E->getArg(0)),
8158                                         llvm::PointerType::get(IntTy, 256));
8159     LoadInst *Load = Builder.CreateAlignedLoad(
8160         IntTy, Ptr, getContext().getTypeAlignInChars(E->getType()));
8161     Load->setVolatile(true);
8162     return Load;
8163   }
8164   }
8165 }
8166 
8167 
8168 Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
8169                                            const CallExpr *E) {
8170   SmallVector<Value*, 4> Ops;
8171 
8172   for (unsigned i = 0, e = E->getNumArgs(); i != e; i++)
8173     Ops.push_back(EmitScalarExpr(E->getArg(i)));
8174 
8175   Intrinsic::ID ID = Intrinsic::not_intrinsic;
8176 
8177   switch (BuiltinID) {
8178   default: return nullptr;
8179 
8180   // __builtin_ppc_get_timebase is GCC 4.8+'s PowerPC-specific name for what we
8181   // call __builtin_readcyclecounter.
8182   case PPC::BI__builtin_ppc_get_timebase:
8183     return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::readcyclecounter));
8184 
8185   // vec_ld, vec_xl_be, vec_lvsl, vec_lvsr
8186   case PPC::BI__builtin_altivec_lvx:
8187   case PPC::BI__builtin_altivec_lvxl:
8188   case PPC::BI__builtin_altivec_lvebx:
8189   case PPC::BI__builtin_altivec_lvehx:
8190   case PPC::BI__builtin_altivec_lvewx:
8191   case PPC::BI__builtin_altivec_lvsl:
8192   case PPC::BI__builtin_altivec_lvsr:
8193   case PPC::BI__builtin_vsx_lxvd2x:
8194   case PPC::BI__builtin_vsx_lxvw4x:
8195   case PPC::BI__builtin_vsx_lxvd2x_be:
8196   case PPC::BI__builtin_vsx_lxvw4x_be:
8197   case PPC::BI__builtin_vsx_lxvl:
8198   case PPC::BI__builtin_vsx_lxvll:
8199   {
8200     if(BuiltinID == PPC::BI__builtin_vsx_lxvl ||
8201        BuiltinID == PPC::BI__builtin_vsx_lxvll){
8202       Ops[0] = Builder.CreateBitCast(Ops[0], Int8PtrTy);
8203     }else {
8204       Ops[1] = Builder.CreateBitCast(Ops[1], Int8PtrTy);
8205       Ops[0] = Builder.CreateGEP(Ops[1], Ops[0]);
8206       Ops.pop_back();
8207     }
8208 
8209     switch (BuiltinID) {
8210     default: llvm_unreachable("Unsupported ld/lvsl/lvsr intrinsic!");
8211     case PPC::BI__builtin_altivec_lvx:
8212       ID = Intrinsic::ppc_altivec_lvx;
8213       break;
8214     case PPC::BI__builtin_altivec_lvxl:
8215       ID = Intrinsic::ppc_altivec_lvxl;
8216       break;
8217     case PPC::BI__builtin_altivec_lvebx:
8218       ID = Intrinsic::ppc_altivec_lvebx;
8219       break;
8220     case PPC::BI__builtin_altivec_lvehx:
8221       ID = Intrinsic::ppc_altivec_lvehx;
8222       break;
8223     case PPC::BI__builtin_altivec_lvewx:
8224       ID = Intrinsic::ppc_altivec_lvewx;
8225       break;
8226     case PPC::BI__builtin_altivec_lvsl:
8227       ID = Intrinsic::ppc_altivec_lvsl;
8228       break;
8229     case PPC::BI__builtin_altivec_lvsr:
8230       ID = Intrinsic::ppc_altivec_lvsr;
8231       break;
8232     case PPC::BI__builtin_vsx_lxvd2x:
8233       ID = Intrinsic::ppc_vsx_lxvd2x;
8234       break;
8235     case PPC::BI__builtin_vsx_lxvw4x:
8236       ID = Intrinsic::ppc_vsx_lxvw4x;
8237       break;
8238     case PPC::BI__builtin_vsx_lxvd2x_be:
8239       ID = Intrinsic::ppc_vsx_lxvd2x_be;
8240       break;
8241     case PPC::BI__builtin_vsx_lxvw4x_be:
8242       ID = Intrinsic::ppc_vsx_lxvw4x_be;
8243       break;
8244     case PPC::BI__builtin_vsx_lxvl:
8245       ID = Intrinsic::ppc_vsx_lxvl;
8246       break;
8247     case PPC::BI__builtin_vsx_lxvll:
8248       ID = Intrinsic::ppc_vsx_lxvll;
8249       break;
8250     }
8251     llvm::Function *F = CGM.getIntrinsic(ID);
8252     return Builder.CreateCall(F, Ops, "");
8253   }
8254 
8255   // vec_st, vec_xst_be
8256   case PPC::BI__builtin_altivec_stvx:
8257   case PPC::BI__builtin_altivec_stvxl:
8258   case PPC::BI__builtin_altivec_stvebx:
8259   case PPC::BI__builtin_altivec_stvehx:
8260   case PPC::BI__builtin_altivec_stvewx:
8261   case PPC::BI__builtin_vsx_stxvd2x:
8262   case PPC::BI__builtin_vsx_stxvw4x:
8263   case PPC::BI__builtin_vsx_stxvd2x_be:
8264   case PPC::BI__builtin_vsx_stxvw4x_be:
8265   case PPC::BI__builtin_vsx_stxvl:
8266   case PPC::BI__builtin_vsx_stxvll:
8267   {
8268     if(BuiltinID == PPC::BI__builtin_vsx_stxvl ||
8269       BuiltinID == PPC::BI__builtin_vsx_stxvll ){
8270       Ops[1] = Builder.CreateBitCast(Ops[1], Int8PtrTy);
8271     }else {
8272       Ops[2] = Builder.CreateBitCast(Ops[2], Int8PtrTy);
8273       Ops[1] = Builder.CreateGEP(Ops[2], Ops[1]);
8274       Ops.pop_back();
8275     }
8276 
8277     switch (BuiltinID) {
8278     default: llvm_unreachable("Unsupported st intrinsic!");
8279     case PPC::BI__builtin_altivec_stvx:
8280       ID = Intrinsic::ppc_altivec_stvx;
8281       break;
8282     case PPC::BI__builtin_altivec_stvxl:
8283       ID = Intrinsic::ppc_altivec_stvxl;
8284       break;
8285     case PPC::BI__builtin_altivec_stvebx:
8286       ID = Intrinsic::ppc_altivec_stvebx;
8287       break;
8288     case PPC::BI__builtin_altivec_stvehx:
8289       ID = Intrinsic::ppc_altivec_stvehx;
8290       break;
8291     case PPC::BI__builtin_altivec_stvewx:
8292       ID = Intrinsic::ppc_altivec_stvewx;
8293       break;
8294     case PPC::BI__builtin_vsx_stxvd2x:
8295       ID = Intrinsic::ppc_vsx_stxvd2x;
8296       break;
8297     case PPC::BI__builtin_vsx_stxvw4x:
8298       ID = Intrinsic::ppc_vsx_stxvw4x;
8299       break;
8300     case PPC::BI__builtin_vsx_stxvd2x_be:
8301       ID = Intrinsic::ppc_vsx_stxvd2x_be;
8302       break;
8303     case PPC::BI__builtin_vsx_stxvw4x_be:
8304       ID = Intrinsic::ppc_vsx_stxvw4x_be;
8305       break;
8306     case PPC::BI__builtin_vsx_stxvl:
8307       ID = Intrinsic::ppc_vsx_stxvl;
8308       break;
8309     case PPC::BI__builtin_vsx_stxvll:
8310       ID = Intrinsic::ppc_vsx_stxvll;
8311       break;
8312     }
8313     llvm::Function *F = CGM.getIntrinsic(ID);
8314     return Builder.CreateCall(F, Ops, "");
8315   }
8316   // Square root
8317   case PPC::BI__builtin_vsx_xvsqrtsp:
8318   case PPC::BI__builtin_vsx_xvsqrtdp: {
8319     llvm::Type *ResultType = ConvertType(E->getType());
8320     Value *X = EmitScalarExpr(E->getArg(0));
8321     ID = Intrinsic::sqrt;
8322     llvm::Function *F = CGM.getIntrinsic(ID, ResultType);
8323     return Builder.CreateCall(F, X);
8324   }
8325   // Count leading zeros
8326   case PPC::BI__builtin_altivec_vclzb:
8327   case PPC::BI__builtin_altivec_vclzh:
8328   case PPC::BI__builtin_altivec_vclzw:
8329   case PPC::BI__builtin_altivec_vclzd: {
8330     llvm::Type *ResultType = ConvertType(E->getType());
8331     Value *X = EmitScalarExpr(E->getArg(0));
8332     Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false);
8333     Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ResultType);
8334     return Builder.CreateCall(F, {X, Undef});
8335   }
8336   case PPC::BI__builtin_altivec_vctzb:
8337   case PPC::BI__builtin_altivec_vctzh:
8338   case PPC::BI__builtin_altivec_vctzw:
8339   case PPC::BI__builtin_altivec_vctzd: {
8340     llvm::Type *ResultType = ConvertType(E->getType());
8341     Value *X = EmitScalarExpr(E->getArg(0));
8342     Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false);
8343     Function *F = CGM.getIntrinsic(Intrinsic::cttz, ResultType);
8344     return Builder.CreateCall(F, {X, Undef});
8345   }
8346   case PPC::BI__builtin_altivec_vpopcntb:
8347   case PPC::BI__builtin_altivec_vpopcnth:
8348   case PPC::BI__builtin_altivec_vpopcntw:
8349   case PPC::BI__builtin_altivec_vpopcntd: {
8350     llvm::Type *ResultType = ConvertType(E->getType());
8351     Value *X = EmitScalarExpr(E->getArg(0));
8352     llvm::Function *F = CGM.getIntrinsic(Intrinsic::ctpop, ResultType);
8353     return Builder.CreateCall(F, X);
8354   }
8355   // Copy sign
8356   case PPC::BI__builtin_vsx_xvcpsgnsp:
8357   case PPC::BI__builtin_vsx_xvcpsgndp: {
8358     llvm::Type *ResultType = ConvertType(E->getType());
8359     Value *X = EmitScalarExpr(E->getArg(0));
8360     Value *Y = EmitScalarExpr(E->getArg(1));
8361     ID = Intrinsic::copysign;
8362     llvm::Function *F = CGM.getIntrinsic(ID, ResultType);
8363     return Builder.CreateCall(F, {X, Y});
8364   }
8365   // Rounding/truncation
8366   case PPC::BI__builtin_vsx_xvrspip:
8367   case PPC::BI__builtin_vsx_xvrdpip:
8368   case PPC::BI__builtin_vsx_xvrdpim:
8369   case PPC::BI__builtin_vsx_xvrspim:
8370   case PPC::BI__builtin_vsx_xvrdpi:
8371   case PPC::BI__builtin_vsx_xvrspi:
8372   case PPC::BI__builtin_vsx_xvrdpic:
8373   case PPC::BI__builtin_vsx_xvrspic:
8374   case PPC::BI__builtin_vsx_xvrdpiz:
8375   case PPC::BI__builtin_vsx_xvrspiz: {
8376     llvm::Type *ResultType = ConvertType(E->getType());
8377     Value *X = EmitScalarExpr(E->getArg(0));
8378     if (BuiltinID == PPC::BI__builtin_vsx_xvrdpim ||
8379         BuiltinID == PPC::BI__builtin_vsx_xvrspim)
8380       ID = Intrinsic::floor;
8381     else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpi ||
8382              BuiltinID == PPC::BI__builtin_vsx_xvrspi)
8383       ID = Intrinsic::round;
8384     else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpic ||
8385              BuiltinID == PPC::BI__builtin_vsx_xvrspic)
8386       ID = Intrinsic::nearbyint;
8387     else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpip ||
8388              BuiltinID == PPC::BI__builtin_vsx_xvrspip)
8389       ID = Intrinsic::ceil;
8390     else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpiz ||
8391              BuiltinID == PPC::BI__builtin_vsx_xvrspiz)
8392       ID = Intrinsic::trunc;
8393     llvm::Function *F = CGM.getIntrinsic(ID, ResultType);
8394     return Builder.CreateCall(F, X);
8395   }
8396 
8397   // Absolute value
8398   case PPC::BI__builtin_vsx_xvabsdp:
8399   case PPC::BI__builtin_vsx_xvabssp: {
8400     llvm::Type *ResultType = ConvertType(E->getType());
8401     Value *X = EmitScalarExpr(E->getArg(0));
8402     llvm::Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType);
8403     return Builder.CreateCall(F, X);
8404   }
8405 
8406   // FMA variations
8407   case PPC::BI__builtin_vsx_xvmaddadp:
8408   case PPC::BI__builtin_vsx_xvmaddasp:
8409   case PPC::BI__builtin_vsx_xvnmaddadp:
8410   case PPC::BI__builtin_vsx_xvnmaddasp:
8411   case PPC::BI__builtin_vsx_xvmsubadp:
8412   case PPC::BI__builtin_vsx_xvmsubasp:
8413   case PPC::BI__builtin_vsx_xvnmsubadp:
8414   case PPC::BI__builtin_vsx_xvnmsubasp: {
8415     llvm::Type *ResultType = ConvertType(E->getType());
8416     Value *X = EmitScalarExpr(E->getArg(0));
8417     Value *Y = EmitScalarExpr(E->getArg(1));
8418     Value *Z = EmitScalarExpr(E->getArg(2));
8419     Value *Zero = llvm::ConstantFP::getZeroValueForNegation(ResultType);
8420     llvm::Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
8421     switch (BuiltinID) {
8422       case PPC::BI__builtin_vsx_xvmaddadp:
8423       case PPC::BI__builtin_vsx_xvmaddasp:
8424         return Builder.CreateCall(F, {X, Y, Z});
8425       case PPC::BI__builtin_vsx_xvnmaddadp:
8426       case PPC::BI__builtin_vsx_xvnmaddasp:
8427         return Builder.CreateFSub(Zero,
8428                                   Builder.CreateCall(F, {X, Y, Z}), "sub");
8429       case PPC::BI__builtin_vsx_xvmsubadp:
8430       case PPC::BI__builtin_vsx_xvmsubasp:
8431         return Builder.CreateCall(F,
8432                                   {X, Y, Builder.CreateFSub(Zero, Z, "sub")});
8433       case PPC::BI__builtin_vsx_xvnmsubadp:
8434       case PPC::BI__builtin_vsx_xvnmsubasp:
8435         Value *FsubRes =
8436           Builder.CreateCall(F, {X, Y, Builder.CreateFSub(Zero, Z, "sub")});
8437         return Builder.CreateFSub(Zero, FsubRes, "sub");
8438     }
8439     llvm_unreachable("Unknown FMA operation");
8440     return nullptr; // Suppress no-return warning
8441   }
8442 
8443   case PPC::BI__builtin_vsx_insertword: {
8444     llvm::Function *F = CGM.getIntrinsic(Intrinsic::ppc_vsx_xxinsertw);
8445 
8446     // Third argument is a compile time constant int. It must be clamped to
8447     // to the range [0, 12].
8448     ConstantInt *ArgCI = dyn_cast<ConstantInt>(Ops[2]);
8449     assert(ArgCI &&
8450            "Third arg to xxinsertw intrinsic must be constant integer");
8451     const int64_t MaxIndex = 12;
8452     int64_t Index = clamp(ArgCI->getSExtValue(), 0, MaxIndex);
8453 
8454     // The builtin semantics don't exactly match the xxinsertw instructions
8455     // semantics (which ppc_vsx_xxinsertw follows). The builtin extracts the
8456     // word from the first argument, and inserts it in the second argument. The
8457     // instruction extracts the word from its second input register and inserts
8458     // it into its first input register, so swap the first and second arguments.
8459     std::swap(Ops[0], Ops[1]);
8460 
8461     // Need to cast the second argument from a vector of unsigned int to a
8462     // vector of long long.
8463     Ops[1] = Builder.CreateBitCast(Ops[1], llvm::VectorType::get(Int64Ty, 2));
8464 
8465     if (getTarget().isLittleEndian()) {
8466       // Create a shuffle mask of (1, 0)
8467       Constant *ShuffleElts[2] = { ConstantInt::get(Int32Ty, 1),
8468                                    ConstantInt::get(Int32Ty, 0)
8469                                  };
8470       Constant *ShuffleMask = llvm::ConstantVector::get(ShuffleElts);
8471 
8472       // Reverse the double words in the vector we will extract from.
8473       Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int64Ty, 2));
8474       Ops[0] = Builder.CreateShuffleVector(Ops[0], Ops[0], ShuffleMask);
8475 
8476       // Reverse the index.
8477       Index = MaxIndex - Index;
8478     }
8479 
8480     // Intrinsic expects the first arg to be a vector of int.
8481     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int32Ty, 4));
8482     Ops[2] = ConstantInt::getSigned(Int32Ty, Index);
8483     return Builder.CreateCall(F, Ops);
8484   }
8485 
8486   case PPC::BI__builtin_vsx_extractuword: {
8487     llvm::Function *F = CGM.getIntrinsic(Intrinsic::ppc_vsx_xxextractuw);
8488 
8489     // Intrinsic expects the first argument to be a vector of doublewords.
8490     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int64Ty, 2));
8491 
8492     // The second argument is a compile time constant int that needs to
8493     // be clamped to the range [0, 12].
8494     ConstantInt *ArgCI = dyn_cast<ConstantInt>(Ops[1]);
8495     assert(ArgCI &&
8496            "Second Arg to xxextractuw intrinsic must be a constant integer!");
8497     const int64_t MaxIndex = 12;
8498     int64_t Index = clamp(ArgCI->getSExtValue(), 0, MaxIndex);
8499 
8500     if (getTarget().isLittleEndian()) {
8501       // Reverse the index.
8502       Index = MaxIndex - Index;
8503       Ops[1] = ConstantInt::getSigned(Int32Ty, Index);
8504 
8505       // Emit the call, then reverse the double words of the results vector.
8506       Value *Call = Builder.CreateCall(F, Ops);
8507 
8508       // Create a shuffle mask of (1, 0)
8509       Constant *ShuffleElts[2] = { ConstantInt::get(Int32Ty, 1),
8510                                    ConstantInt::get(Int32Ty, 0)
8511                                  };
8512       Constant *ShuffleMask = llvm::ConstantVector::get(ShuffleElts);
8513 
8514       Value *ShuffleCall = Builder.CreateShuffleVector(Call, Call, ShuffleMask);
8515       return ShuffleCall;
8516     } else {
8517       Ops[1] = ConstantInt::getSigned(Int32Ty, Index);
8518       return Builder.CreateCall(F, Ops);
8519     }
8520   }
8521 
8522   case PPC::BI__builtin_vsx_xxpermdi: {
8523     ConstantInt *ArgCI = dyn_cast<ConstantInt>(Ops[2]);
8524     assert(ArgCI && "Third arg must be constant integer!");
8525 
8526     unsigned Index = ArgCI->getZExtValue();
8527     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int64Ty, 2));
8528     Ops[1] = Builder.CreateBitCast(Ops[1], llvm::VectorType::get(Int64Ty, 2));
8529 
8530     // Element zero comes from the first input vector and element one comes from
8531     // the second. The element indices within each vector are numbered in big
8532     // endian order so the shuffle mask must be adjusted for this on little
8533     // endian platforms (i.e. index is complemented and source vector reversed).
8534     unsigned ElemIdx0;
8535     unsigned ElemIdx1;
8536     if (getTarget().isLittleEndian()) {
8537       ElemIdx0 = (~Index & 1) + 2;
8538       ElemIdx1 = (~Index & 2) >> 1;
8539     } else { // BigEndian
8540       ElemIdx0 = (Index & 2) >> 1;
8541       ElemIdx1 = 2 + (Index & 1);
8542     }
8543 
8544     Constant *ShuffleElts[2] = {ConstantInt::get(Int32Ty, ElemIdx0),
8545                                 ConstantInt::get(Int32Ty, ElemIdx1)};
8546     Constant *ShuffleMask = llvm::ConstantVector::get(ShuffleElts);
8547 
8548     Value *ShuffleCall =
8549         Builder.CreateShuffleVector(Ops[0], Ops[1], ShuffleMask);
8550     QualType BIRetType = E->getType();
8551     auto RetTy = ConvertType(BIRetType);
8552     return Builder.CreateBitCast(ShuffleCall, RetTy);
8553   }
8554 
8555   case PPC::BI__builtin_vsx_xxsldwi: {
8556     ConstantInt *ArgCI = dyn_cast<ConstantInt>(Ops[2]);
8557     assert(ArgCI && "Third argument must be a compile time constant");
8558     unsigned Index = ArgCI->getZExtValue() & 0x3;
8559     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int32Ty, 4));
8560     Ops[1] = Builder.CreateBitCast(Ops[1], llvm::VectorType::get(Int32Ty, 4));
8561 
8562     // Create a shuffle mask
8563     unsigned ElemIdx0;
8564     unsigned ElemIdx1;
8565     unsigned ElemIdx2;
8566     unsigned ElemIdx3;
8567     if (getTarget().isLittleEndian()) {
8568       // Little endian element N comes from element 8+N-Index of the
8569       // concatenated wide vector (of course, using modulo arithmetic on
8570       // the total number of elements).
8571       ElemIdx0 = (8 - Index) % 8;
8572       ElemIdx1 = (9 - Index) % 8;
8573       ElemIdx2 = (10 - Index) % 8;
8574       ElemIdx3 = (11 - Index) % 8;
8575     } else {
8576       // Big endian ElemIdx<N> = Index + N
8577       ElemIdx0 = Index;
8578       ElemIdx1 = Index + 1;
8579       ElemIdx2 = Index + 2;
8580       ElemIdx3 = Index + 3;
8581     }
8582 
8583     Constant *ShuffleElts[4] = {ConstantInt::get(Int32Ty, ElemIdx0),
8584                                 ConstantInt::get(Int32Ty, ElemIdx1),
8585                                 ConstantInt::get(Int32Ty, ElemIdx2),
8586                                 ConstantInt::get(Int32Ty, ElemIdx3)};
8587 
8588     Constant *ShuffleMask = llvm::ConstantVector::get(ShuffleElts);
8589     Value *ShuffleCall =
8590         Builder.CreateShuffleVector(Ops[0], Ops[1], ShuffleMask);
8591     QualType BIRetType = E->getType();
8592     auto RetTy = ConvertType(BIRetType);
8593     return Builder.CreateBitCast(ShuffleCall, RetTy);
8594   }
8595   }
8596 }
8597 
8598 Value *CodeGenFunction::EmitAMDGPUBuiltinExpr(unsigned BuiltinID,
8599                                               const CallExpr *E) {
8600   switch (BuiltinID) {
8601   case AMDGPU::BI__builtin_amdgcn_div_scale:
8602   case AMDGPU::BI__builtin_amdgcn_div_scalef: {
8603     // Translate from the intrinsics's struct return to the builtin's out
8604     // argument.
8605 
8606     Address FlagOutPtr = EmitPointerWithAlignment(E->getArg(3));
8607 
8608     llvm::Value *X = EmitScalarExpr(E->getArg(0));
8609     llvm::Value *Y = EmitScalarExpr(E->getArg(1));
8610     llvm::Value *Z = EmitScalarExpr(E->getArg(2));
8611 
8612     llvm::Value *Callee = CGM.getIntrinsic(Intrinsic::amdgcn_div_scale,
8613                                            X->getType());
8614 
8615     llvm::Value *Tmp = Builder.CreateCall(Callee, {X, Y, Z});
8616 
8617     llvm::Value *Result = Builder.CreateExtractValue(Tmp, 0);
8618     llvm::Value *Flag = Builder.CreateExtractValue(Tmp, 1);
8619 
8620     llvm::Type *RealFlagType
8621       = FlagOutPtr.getPointer()->getType()->getPointerElementType();
8622 
8623     llvm::Value *FlagExt = Builder.CreateZExt(Flag, RealFlagType);
8624     Builder.CreateStore(FlagExt, FlagOutPtr);
8625     return Result;
8626   }
8627   case AMDGPU::BI__builtin_amdgcn_div_fmas:
8628   case AMDGPU::BI__builtin_amdgcn_div_fmasf: {
8629     llvm::Value *Src0 = EmitScalarExpr(E->getArg(0));
8630     llvm::Value *Src1 = EmitScalarExpr(E->getArg(1));
8631     llvm::Value *Src2 = EmitScalarExpr(E->getArg(2));
8632     llvm::Value *Src3 = EmitScalarExpr(E->getArg(3));
8633 
8634     llvm::Value *F = CGM.getIntrinsic(Intrinsic::amdgcn_div_fmas,
8635                                       Src0->getType());
8636     llvm::Value *Src3ToBool = Builder.CreateIsNotNull(Src3);
8637     return Builder.CreateCall(F, {Src0, Src1, Src2, Src3ToBool});
8638   }
8639 
8640   case AMDGPU::BI__builtin_amdgcn_ds_swizzle:
8641     return emitBinaryBuiltin(*this, E, Intrinsic::amdgcn_ds_swizzle);
8642   case AMDGPU::BI__builtin_amdgcn_mov_dpp: {
8643     llvm::SmallVector<llvm::Value *, 5> Args;
8644     for (unsigned I = 0; I != 5; ++I)
8645       Args.push_back(EmitScalarExpr(E->getArg(I)));
8646     Value *F = CGM.getIntrinsic(Intrinsic::amdgcn_mov_dpp,
8647                                     Args[0]->getType());
8648     return Builder.CreateCall(F, Args);
8649   }
8650   case AMDGPU::BI__builtin_amdgcn_div_fixup:
8651   case AMDGPU::BI__builtin_amdgcn_div_fixupf:
8652   case AMDGPU::BI__builtin_amdgcn_div_fixuph:
8653     return emitTernaryBuiltin(*this, E, Intrinsic::amdgcn_div_fixup);
8654   case AMDGPU::BI__builtin_amdgcn_trig_preop:
8655   case AMDGPU::BI__builtin_amdgcn_trig_preopf:
8656     return emitFPIntBuiltin(*this, E, Intrinsic::amdgcn_trig_preop);
8657   case AMDGPU::BI__builtin_amdgcn_rcp:
8658   case AMDGPU::BI__builtin_amdgcn_rcpf:
8659   case AMDGPU::BI__builtin_amdgcn_rcph:
8660     return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_rcp);
8661   case AMDGPU::BI__builtin_amdgcn_rsq:
8662   case AMDGPU::BI__builtin_amdgcn_rsqf:
8663   case AMDGPU::BI__builtin_amdgcn_rsqh:
8664     return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_rsq);
8665   case AMDGPU::BI__builtin_amdgcn_rsq_clamp:
8666   case AMDGPU::BI__builtin_amdgcn_rsq_clampf:
8667     return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_rsq_clamp);
8668   case AMDGPU::BI__builtin_amdgcn_sinf:
8669   case AMDGPU::BI__builtin_amdgcn_sinh:
8670     return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_sin);
8671   case AMDGPU::BI__builtin_amdgcn_cosf:
8672   case AMDGPU::BI__builtin_amdgcn_cosh:
8673     return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_cos);
8674   case AMDGPU::BI__builtin_amdgcn_log_clampf:
8675     return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_log_clamp);
8676   case AMDGPU::BI__builtin_amdgcn_ldexp:
8677   case AMDGPU::BI__builtin_amdgcn_ldexpf:
8678   case AMDGPU::BI__builtin_amdgcn_ldexph:
8679     return emitFPIntBuiltin(*this, E, Intrinsic::amdgcn_ldexp);
8680   case AMDGPU::BI__builtin_amdgcn_frexp_mant:
8681   case AMDGPU::BI__builtin_amdgcn_frexp_mantf:
8682   case AMDGPU::BI__builtin_amdgcn_frexp_manth:
8683     return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_frexp_mant);
8684   case AMDGPU::BI__builtin_amdgcn_frexp_exp:
8685   case AMDGPU::BI__builtin_amdgcn_frexp_expf: {
8686     Value *Src0 = EmitScalarExpr(E->getArg(0));
8687     Value *F = CGM.getIntrinsic(Intrinsic::amdgcn_frexp_exp,
8688                                 { Builder.getInt32Ty(), Src0->getType() });
8689     return Builder.CreateCall(F, Src0);
8690   }
8691   case AMDGPU::BI__builtin_amdgcn_frexp_exph: {
8692     Value *Src0 = EmitScalarExpr(E->getArg(0));
8693     Value *F = CGM.getIntrinsic(Intrinsic::amdgcn_frexp_exp,
8694                                 { Builder.getInt16Ty(), Src0->getType() });
8695     return Builder.CreateCall(F, Src0);
8696   }
8697   case AMDGPU::BI__builtin_amdgcn_fract:
8698   case AMDGPU::BI__builtin_amdgcn_fractf:
8699   case AMDGPU::BI__builtin_amdgcn_fracth:
8700     return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_fract);
8701   case AMDGPU::BI__builtin_amdgcn_lerp:
8702     return emitTernaryBuiltin(*this, E, Intrinsic::amdgcn_lerp);
8703   case AMDGPU::BI__builtin_amdgcn_uicmp:
8704   case AMDGPU::BI__builtin_amdgcn_uicmpl:
8705   case AMDGPU::BI__builtin_amdgcn_sicmp:
8706   case AMDGPU::BI__builtin_amdgcn_sicmpl:
8707     return emitTernaryBuiltin(*this, E, Intrinsic::amdgcn_icmp);
8708   case AMDGPU::BI__builtin_amdgcn_fcmp:
8709   case AMDGPU::BI__builtin_amdgcn_fcmpf:
8710     return emitTernaryBuiltin(*this, E, Intrinsic::amdgcn_fcmp);
8711   case AMDGPU::BI__builtin_amdgcn_class:
8712   case AMDGPU::BI__builtin_amdgcn_classf:
8713   case AMDGPU::BI__builtin_amdgcn_classh:
8714     return emitFPIntBuiltin(*this, E, Intrinsic::amdgcn_class);
8715   case AMDGPU::BI__builtin_amdgcn_fmed3f:
8716   case AMDGPU::BI__builtin_amdgcn_fmed3h:
8717     return emitTernaryBuiltin(*this, E, Intrinsic::amdgcn_fmed3);
8718   case AMDGPU::BI__builtin_amdgcn_read_exec: {
8719     CallInst *CI = cast<CallInst>(
8720       EmitSpecialRegisterBuiltin(*this, E, Int64Ty, Int64Ty, true, "exec"));
8721     CI->setConvergent();
8722     return CI;
8723   }
8724 
8725   // amdgcn workitem
8726   case AMDGPU::BI__builtin_amdgcn_workitem_id_x:
8727     return emitRangedBuiltin(*this, Intrinsic::amdgcn_workitem_id_x, 0, 1024);
8728   case AMDGPU::BI__builtin_amdgcn_workitem_id_y:
8729     return emitRangedBuiltin(*this, Intrinsic::amdgcn_workitem_id_y, 0, 1024);
8730   case AMDGPU::BI__builtin_amdgcn_workitem_id_z:
8731     return emitRangedBuiltin(*this, Intrinsic::amdgcn_workitem_id_z, 0, 1024);
8732 
8733   // r600 intrinsics
8734   case AMDGPU::BI__builtin_r600_recipsqrt_ieee:
8735   case AMDGPU::BI__builtin_r600_recipsqrt_ieeef:
8736     return emitUnaryBuiltin(*this, E, Intrinsic::r600_recipsqrt_ieee);
8737   case AMDGPU::BI__builtin_r600_read_tidig_x:
8738     return emitRangedBuiltin(*this, Intrinsic::r600_read_tidig_x, 0, 1024);
8739   case AMDGPU::BI__builtin_r600_read_tidig_y:
8740     return emitRangedBuiltin(*this, Intrinsic::r600_read_tidig_y, 0, 1024);
8741   case AMDGPU::BI__builtin_r600_read_tidig_z:
8742     return emitRangedBuiltin(*this, Intrinsic::r600_read_tidig_z, 0, 1024);
8743   default:
8744     return nullptr;
8745   }
8746 }
8747 
8748 /// Handle a SystemZ function in which the final argument is a pointer
8749 /// to an int that receives the post-instruction CC value.  At the LLVM level
8750 /// this is represented as a function that returns a {result, cc} pair.
8751 static Value *EmitSystemZIntrinsicWithCC(CodeGenFunction &CGF,
8752                                          unsigned IntrinsicID,
8753                                          const CallExpr *E) {
8754   unsigned NumArgs = E->getNumArgs() - 1;
8755   SmallVector<Value *, 8> Args(NumArgs);
8756   for (unsigned I = 0; I < NumArgs; ++I)
8757     Args[I] = CGF.EmitScalarExpr(E->getArg(I));
8758   Address CCPtr = CGF.EmitPointerWithAlignment(E->getArg(NumArgs));
8759   Value *F = CGF.CGM.getIntrinsic(IntrinsicID);
8760   Value *Call = CGF.Builder.CreateCall(F, Args);
8761   Value *CC = CGF.Builder.CreateExtractValue(Call, 1);
8762   CGF.Builder.CreateStore(CC, CCPtr);
8763   return CGF.Builder.CreateExtractValue(Call, 0);
8764 }
8765 
8766 Value *CodeGenFunction::EmitSystemZBuiltinExpr(unsigned BuiltinID,
8767                                                const CallExpr *E) {
8768   switch (BuiltinID) {
8769   case SystemZ::BI__builtin_tbegin: {
8770     Value *TDB = EmitScalarExpr(E->getArg(0));
8771     Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff0c);
8772     Value *F = CGM.getIntrinsic(Intrinsic::s390_tbegin);
8773     return Builder.CreateCall(F, {TDB, Control});
8774   }
8775   case SystemZ::BI__builtin_tbegin_nofloat: {
8776     Value *TDB = EmitScalarExpr(E->getArg(0));
8777     Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff0c);
8778     Value *F = CGM.getIntrinsic(Intrinsic::s390_tbegin_nofloat);
8779     return Builder.CreateCall(F, {TDB, Control});
8780   }
8781   case SystemZ::BI__builtin_tbeginc: {
8782     Value *TDB = llvm::ConstantPointerNull::get(Int8PtrTy);
8783     Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff08);
8784     Value *F = CGM.getIntrinsic(Intrinsic::s390_tbeginc);
8785     return Builder.CreateCall(F, {TDB, Control});
8786   }
8787   case SystemZ::BI__builtin_tabort: {
8788     Value *Data = EmitScalarExpr(E->getArg(0));
8789     Value *F = CGM.getIntrinsic(Intrinsic::s390_tabort);
8790     return Builder.CreateCall(F, Builder.CreateSExt(Data, Int64Ty, "tabort"));
8791   }
8792   case SystemZ::BI__builtin_non_tx_store: {
8793     Value *Address = EmitScalarExpr(E->getArg(0));
8794     Value *Data = EmitScalarExpr(E->getArg(1));
8795     Value *F = CGM.getIntrinsic(Intrinsic::s390_ntstg);
8796     return Builder.CreateCall(F, {Data, Address});
8797   }
8798 
8799   // Vector builtins.  Note that most vector builtins are mapped automatically
8800   // to target-specific LLVM intrinsics.  The ones handled specially here can
8801   // be represented via standard LLVM IR, which is preferable to enable common
8802   // LLVM optimizations.
8803 
8804   case SystemZ::BI__builtin_s390_vpopctb:
8805   case SystemZ::BI__builtin_s390_vpopcth:
8806   case SystemZ::BI__builtin_s390_vpopctf:
8807   case SystemZ::BI__builtin_s390_vpopctg: {
8808     llvm::Type *ResultType = ConvertType(E->getType());
8809     Value *X = EmitScalarExpr(E->getArg(0));
8810     Function *F = CGM.getIntrinsic(Intrinsic::ctpop, ResultType);
8811     return Builder.CreateCall(F, X);
8812   }
8813 
8814   case SystemZ::BI__builtin_s390_vclzb:
8815   case SystemZ::BI__builtin_s390_vclzh:
8816   case SystemZ::BI__builtin_s390_vclzf:
8817   case SystemZ::BI__builtin_s390_vclzg: {
8818     llvm::Type *ResultType = ConvertType(E->getType());
8819     Value *X = EmitScalarExpr(E->getArg(0));
8820     Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false);
8821     Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ResultType);
8822     return Builder.CreateCall(F, {X, Undef});
8823   }
8824 
8825   case SystemZ::BI__builtin_s390_vctzb:
8826   case SystemZ::BI__builtin_s390_vctzh:
8827   case SystemZ::BI__builtin_s390_vctzf:
8828   case SystemZ::BI__builtin_s390_vctzg: {
8829     llvm::Type *ResultType = ConvertType(E->getType());
8830     Value *X = EmitScalarExpr(E->getArg(0));
8831     Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false);
8832     Function *F = CGM.getIntrinsic(Intrinsic::cttz, ResultType);
8833     return Builder.CreateCall(F, {X, Undef});
8834   }
8835 
8836   case SystemZ::BI__builtin_s390_vfsqsb:
8837   case SystemZ::BI__builtin_s390_vfsqdb: {
8838     llvm::Type *ResultType = ConvertType(E->getType());
8839     Value *X = EmitScalarExpr(E->getArg(0));
8840     Function *F = CGM.getIntrinsic(Intrinsic::sqrt, ResultType);
8841     return Builder.CreateCall(F, X);
8842   }
8843   case SystemZ::BI__builtin_s390_vfmasb:
8844   case SystemZ::BI__builtin_s390_vfmadb: {
8845     llvm::Type *ResultType = ConvertType(E->getType());
8846     Value *X = EmitScalarExpr(E->getArg(0));
8847     Value *Y = EmitScalarExpr(E->getArg(1));
8848     Value *Z = EmitScalarExpr(E->getArg(2));
8849     Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
8850     return Builder.CreateCall(F, {X, Y, Z});
8851   }
8852   case SystemZ::BI__builtin_s390_vfmssb:
8853   case SystemZ::BI__builtin_s390_vfmsdb: {
8854     llvm::Type *ResultType = ConvertType(E->getType());
8855     Value *X = EmitScalarExpr(E->getArg(0));
8856     Value *Y = EmitScalarExpr(E->getArg(1));
8857     Value *Z = EmitScalarExpr(E->getArg(2));
8858     Value *Zero = llvm::ConstantFP::getZeroValueForNegation(ResultType);
8859     Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
8860     return Builder.CreateCall(F, {X, Y, Builder.CreateFSub(Zero, Z, "sub")});
8861   }
8862   case SystemZ::BI__builtin_s390_vfnmasb:
8863   case SystemZ::BI__builtin_s390_vfnmadb: {
8864     llvm::Type *ResultType = ConvertType(E->getType());
8865     Value *X = EmitScalarExpr(E->getArg(0));
8866     Value *Y = EmitScalarExpr(E->getArg(1));
8867     Value *Z = EmitScalarExpr(E->getArg(2));
8868     Value *Zero = llvm::ConstantFP::getZeroValueForNegation(ResultType);
8869     Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
8870     return Builder.CreateFSub(Zero, Builder.CreateCall(F, {X, Y, Z}), "sub");
8871   }
8872   case SystemZ::BI__builtin_s390_vfnmssb:
8873   case SystemZ::BI__builtin_s390_vfnmsdb: {
8874     llvm::Type *ResultType = ConvertType(E->getType());
8875     Value *X = EmitScalarExpr(E->getArg(0));
8876     Value *Y = EmitScalarExpr(E->getArg(1));
8877     Value *Z = EmitScalarExpr(E->getArg(2));
8878     Value *Zero = llvm::ConstantFP::getZeroValueForNegation(ResultType);
8879     Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
8880     Value *NegZ = Builder.CreateFSub(Zero, Z, "sub");
8881     return Builder.CreateFSub(Zero, Builder.CreateCall(F, {X, Y, NegZ}));
8882   }
8883   case SystemZ::BI__builtin_s390_vflpsb:
8884   case SystemZ::BI__builtin_s390_vflpdb: {
8885     llvm::Type *ResultType = ConvertType(E->getType());
8886     Value *X = EmitScalarExpr(E->getArg(0));
8887     Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType);
8888     return Builder.CreateCall(F, X);
8889   }
8890   case SystemZ::BI__builtin_s390_vflnsb:
8891   case SystemZ::BI__builtin_s390_vflndb: {
8892     llvm::Type *ResultType = ConvertType(E->getType());
8893     Value *X = EmitScalarExpr(E->getArg(0));
8894     Value *Zero = llvm::ConstantFP::getZeroValueForNegation(ResultType);
8895     Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType);
8896     return Builder.CreateFSub(Zero, Builder.CreateCall(F, X), "sub");
8897   }
8898   case SystemZ::BI__builtin_s390_vfisb:
8899   case SystemZ::BI__builtin_s390_vfidb: {
8900     llvm::Type *ResultType = ConvertType(E->getType());
8901     Value *X = EmitScalarExpr(E->getArg(0));
8902     // Constant-fold the M4 and M5 mask arguments.
8903     llvm::APSInt M4, M5;
8904     bool IsConstM4 = E->getArg(1)->isIntegerConstantExpr(M4, getContext());
8905     bool IsConstM5 = E->getArg(2)->isIntegerConstantExpr(M5, getContext());
8906     assert(IsConstM4 && IsConstM5 && "Constant arg isn't actually constant?");
8907     (void)IsConstM4; (void)IsConstM5;
8908     // Check whether this instance can be represented via a LLVM standard
8909     // intrinsic.  We only support some combinations of M4 and M5.
8910     Intrinsic::ID ID = Intrinsic::not_intrinsic;
8911     switch (M4.getZExtValue()) {
8912     default: break;
8913     case 0:  // IEEE-inexact exception allowed
8914       switch (M5.getZExtValue()) {
8915       default: break;
8916       case 0: ID = Intrinsic::rint; break;
8917       }
8918       break;
8919     case 4:  // IEEE-inexact exception suppressed
8920       switch (M5.getZExtValue()) {
8921       default: break;
8922       case 0: ID = Intrinsic::nearbyint; break;
8923       case 1: ID = Intrinsic::round; break;
8924       case 5: ID = Intrinsic::trunc; break;
8925       case 6: ID = Intrinsic::ceil; break;
8926       case 7: ID = Intrinsic::floor; break;
8927       }
8928       break;
8929     }
8930     if (ID != Intrinsic::not_intrinsic) {
8931       Function *F = CGM.getIntrinsic(ID, ResultType);
8932       return Builder.CreateCall(F, X);
8933     }
8934     switch (BuiltinID) {
8935       case SystemZ::BI__builtin_s390_vfisb: ID = Intrinsic::s390_vfisb; break;
8936       case SystemZ::BI__builtin_s390_vfidb: ID = Intrinsic::s390_vfidb; break;
8937       default: llvm_unreachable("Unknown BuiltinID");
8938     }
8939     Function *F = CGM.getIntrinsic(ID);
8940     Value *M4Value = llvm::ConstantInt::get(getLLVMContext(), M4);
8941     Value *M5Value = llvm::ConstantInt::get(getLLVMContext(), M5);
8942     return Builder.CreateCall(F, {X, M4Value, M5Value});
8943   }
8944   case SystemZ::BI__builtin_s390_vfmaxsb:
8945   case SystemZ::BI__builtin_s390_vfmaxdb: {
8946     llvm::Type *ResultType = ConvertType(E->getType());
8947     Value *X = EmitScalarExpr(E->getArg(0));
8948     Value *Y = EmitScalarExpr(E->getArg(1));
8949     // Constant-fold the M4 mask argument.
8950     llvm::APSInt M4;
8951     bool IsConstM4 = E->getArg(2)->isIntegerConstantExpr(M4, getContext());
8952     assert(IsConstM4 && "Constant arg isn't actually constant?");
8953     (void)IsConstM4;
8954     // Check whether this instance can be represented via a LLVM standard
8955     // intrinsic.  We only support some values of M4.
8956     Intrinsic::ID ID = Intrinsic::not_intrinsic;
8957     switch (M4.getZExtValue()) {
8958     default: break;
8959     case 4: ID = Intrinsic::maxnum; break;
8960     }
8961     if (ID != Intrinsic::not_intrinsic) {
8962       Function *F = CGM.getIntrinsic(ID, ResultType);
8963       return Builder.CreateCall(F, {X, Y});
8964     }
8965     switch (BuiltinID) {
8966       case SystemZ::BI__builtin_s390_vfmaxsb: ID = Intrinsic::s390_vfmaxsb; break;
8967       case SystemZ::BI__builtin_s390_vfmaxdb: ID = Intrinsic::s390_vfmaxdb; break;
8968       default: llvm_unreachable("Unknown BuiltinID");
8969     }
8970     Function *F = CGM.getIntrinsic(ID);
8971     Value *M4Value = llvm::ConstantInt::get(getLLVMContext(), M4);
8972     return Builder.CreateCall(F, {X, Y, M4Value});
8973   }
8974   case SystemZ::BI__builtin_s390_vfminsb:
8975   case SystemZ::BI__builtin_s390_vfmindb: {
8976     llvm::Type *ResultType = ConvertType(E->getType());
8977     Value *X = EmitScalarExpr(E->getArg(0));
8978     Value *Y = EmitScalarExpr(E->getArg(1));
8979     // Constant-fold the M4 mask argument.
8980     llvm::APSInt M4;
8981     bool IsConstM4 = E->getArg(2)->isIntegerConstantExpr(M4, getContext());
8982     assert(IsConstM4 && "Constant arg isn't actually constant?");
8983     (void)IsConstM4;
8984     // Check whether this instance can be represented via a LLVM standard
8985     // intrinsic.  We only support some values of M4.
8986     Intrinsic::ID ID = Intrinsic::not_intrinsic;
8987     switch (M4.getZExtValue()) {
8988     default: break;
8989     case 4: ID = Intrinsic::minnum; break;
8990     }
8991     if (ID != Intrinsic::not_intrinsic) {
8992       Function *F = CGM.getIntrinsic(ID, ResultType);
8993       return Builder.CreateCall(F, {X, Y});
8994     }
8995     switch (BuiltinID) {
8996       case SystemZ::BI__builtin_s390_vfminsb: ID = Intrinsic::s390_vfminsb; break;
8997       case SystemZ::BI__builtin_s390_vfmindb: ID = Intrinsic::s390_vfmindb; break;
8998       default: llvm_unreachable("Unknown BuiltinID");
8999     }
9000     Function *F = CGM.getIntrinsic(ID);
9001     Value *M4Value = llvm::ConstantInt::get(getLLVMContext(), M4);
9002     return Builder.CreateCall(F, {X, Y, M4Value});
9003   }
9004 
9005   // Vector intrisincs that output the post-instruction CC value.
9006 
9007 #define INTRINSIC_WITH_CC(NAME) \
9008     case SystemZ::BI__builtin_##NAME: \
9009       return EmitSystemZIntrinsicWithCC(*this, Intrinsic::NAME, E)
9010 
9011   INTRINSIC_WITH_CC(s390_vpkshs);
9012   INTRINSIC_WITH_CC(s390_vpksfs);
9013   INTRINSIC_WITH_CC(s390_vpksgs);
9014 
9015   INTRINSIC_WITH_CC(s390_vpklshs);
9016   INTRINSIC_WITH_CC(s390_vpklsfs);
9017   INTRINSIC_WITH_CC(s390_vpklsgs);
9018 
9019   INTRINSIC_WITH_CC(s390_vceqbs);
9020   INTRINSIC_WITH_CC(s390_vceqhs);
9021   INTRINSIC_WITH_CC(s390_vceqfs);
9022   INTRINSIC_WITH_CC(s390_vceqgs);
9023 
9024   INTRINSIC_WITH_CC(s390_vchbs);
9025   INTRINSIC_WITH_CC(s390_vchhs);
9026   INTRINSIC_WITH_CC(s390_vchfs);
9027   INTRINSIC_WITH_CC(s390_vchgs);
9028 
9029   INTRINSIC_WITH_CC(s390_vchlbs);
9030   INTRINSIC_WITH_CC(s390_vchlhs);
9031   INTRINSIC_WITH_CC(s390_vchlfs);
9032   INTRINSIC_WITH_CC(s390_vchlgs);
9033 
9034   INTRINSIC_WITH_CC(s390_vfaebs);
9035   INTRINSIC_WITH_CC(s390_vfaehs);
9036   INTRINSIC_WITH_CC(s390_vfaefs);
9037 
9038   INTRINSIC_WITH_CC(s390_vfaezbs);
9039   INTRINSIC_WITH_CC(s390_vfaezhs);
9040   INTRINSIC_WITH_CC(s390_vfaezfs);
9041 
9042   INTRINSIC_WITH_CC(s390_vfeebs);
9043   INTRINSIC_WITH_CC(s390_vfeehs);
9044   INTRINSIC_WITH_CC(s390_vfeefs);
9045 
9046   INTRINSIC_WITH_CC(s390_vfeezbs);
9047   INTRINSIC_WITH_CC(s390_vfeezhs);
9048   INTRINSIC_WITH_CC(s390_vfeezfs);
9049 
9050   INTRINSIC_WITH_CC(s390_vfenebs);
9051   INTRINSIC_WITH_CC(s390_vfenehs);
9052   INTRINSIC_WITH_CC(s390_vfenefs);
9053 
9054   INTRINSIC_WITH_CC(s390_vfenezbs);
9055   INTRINSIC_WITH_CC(s390_vfenezhs);
9056   INTRINSIC_WITH_CC(s390_vfenezfs);
9057 
9058   INTRINSIC_WITH_CC(s390_vistrbs);
9059   INTRINSIC_WITH_CC(s390_vistrhs);
9060   INTRINSIC_WITH_CC(s390_vistrfs);
9061 
9062   INTRINSIC_WITH_CC(s390_vstrcbs);
9063   INTRINSIC_WITH_CC(s390_vstrchs);
9064   INTRINSIC_WITH_CC(s390_vstrcfs);
9065 
9066   INTRINSIC_WITH_CC(s390_vstrczbs);
9067   INTRINSIC_WITH_CC(s390_vstrczhs);
9068   INTRINSIC_WITH_CC(s390_vstrczfs);
9069 
9070   INTRINSIC_WITH_CC(s390_vfcesbs);
9071   INTRINSIC_WITH_CC(s390_vfcedbs);
9072   INTRINSIC_WITH_CC(s390_vfchsbs);
9073   INTRINSIC_WITH_CC(s390_vfchdbs);
9074   INTRINSIC_WITH_CC(s390_vfchesbs);
9075   INTRINSIC_WITH_CC(s390_vfchedbs);
9076 
9077   INTRINSIC_WITH_CC(s390_vftcisb);
9078   INTRINSIC_WITH_CC(s390_vftcidb);
9079 
9080 #undef INTRINSIC_WITH_CC
9081 
9082   default:
9083     return nullptr;
9084   }
9085 }
9086 
9087 Value *CodeGenFunction::EmitNVPTXBuiltinExpr(unsigned BuiltinID,
9088                                              const CallExpr *E) {
9089   auto MakeLdg = [&](unsigned IntrinsicID) {
9090     Value *Ptr = EmitScalarExpr(E->getArg(0));
9091     clang::CharUnits Align =
9092         getNaturalPointeeTypeAlignment(E->getArg(0)->getType());
9093     return Builder.CreateCall(
9094         CGM.getIntrinsic(IntrinsicID, {Ptr->getType()->getPointerElementType(),
9095                                        Ptr->getType()}),
9096         {Ptr, ConstantInt::get(Builder.getInt32Ty(), Align.getQuantity())});
9097   };
9098   auto MakeScopedAtomic = [&](unsigned IntrinsicID) {
9099     Value *Ptr = EmitScalarExpr(E->getArg(0));
9100     return Builder.CreateCall(
9101         CGM.getIntrinsic(IntrinsicID, {Ptr->getType()->getPointerElementType(),
9102                                        Ptr->getType()}),
9103         {Ptr, EmitScalarExpr(E->getArg(1))});
9104   };
9105   switch (BuiltinID) {
9106   case NVPTX::BI__nvvm_atom_add_gen_i:
9107   case NVPTX::BI__nvvm_atom_add_gen_l:
9108   case NVPTX::BI__nvvm_atom_add_gen_ll:
9109     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Add, E);
9110 
9111   case NVPTX::BI__nvvm_atom_sub_gen_i:
9112   case NVPTX::BI__nvvm_atom_sub_gen_l:
9113   case NVPTX::BI__nvvm_atom_sub_gen_ll:
9114     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Sub, E);
9115 
9116   case NVPTX::BI__nvvm_atom_and_gen_i:
9117   case NVPTX::BI__nvvm_atom_and_gen_l:
9118   case NVPTX::BI__nvvm_atom_and_gen_ll:
9119     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::And, E);
9120 
9121   case NVPTX::BI__nvvm_atom_or_gen_i:
9122   case NVPTX::BI__nvvm_atom_or_gen_l:
9123   case NVPTX::BI__nvvm_atom_or_gen_ll:
9124     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Or, E);
9125 
9126   case NVPTX::BI__nvvm_atom_xor_gen_i:
9127   case NVPTX::BI__nvvm_atom_xor_gen_l:
9128   case NVPTX::BI__nvvm_atom_xor_gen_ll:
9129     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Xor, E);
9130 
9131   case NVPTX::BI__nvvm_atom_xchg_gen_i:
9132   case NVPTX::BI__nvvm_atom_xchg_gen_l:
9133   case NVPTX::BI__nvvm_atom_xchg_gen_ll:
9134     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Xchg, E);
9135 
9136   case NVPTX::BI__nvvm_atom_max_gen_i:
9137   case NVPTX::BI__nvvm_atom_max_gen_l:
9138   case NVPTX::BI__nvvm_atom_max_gen_ll:
9139     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Max, E);
9140 
9141   case NVPTX::BI__nvvm_atom_max_gen_ui:
9142   case NVPTX::BI__nvvm_atom_max_gen_ul:
9143   case NVPTX::BI__nvvm_atom_max_gen_ull:
9144     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::UMax, E);
9145 
9146   case NVPTX::BI__nvvm_atom_min_gen_i:
9147   case NVPTX::BI__nvvm_atom_min_gen_l:
9148   case NVPTX::BI__nvvm_atom_min_gen_ll:
9149     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Min, E);
9150 
9151   case NVPTX::BI__nvvm_atom_min_gen_ui:
9152   case NVPTX::BI__nvvm_atom_min_gen_ul:
9153   case NVPTX::BI__nvvm_atom_min_gen_ull:
9154     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::UMin, E);
9155 
9156   case NVPTX::BI__nvvm_atom_cas_gen_i:
9157   case NVPTX::BI__nvvm_atom_cas_gen_l:
9158   case NVPTX::BI__nvvm_atom_cas_gen_ll:
9159     // __nvvm_atom_cas_gen_* should return the old value rather than the
9160     // success flag.
9161     return MakeAtomicCmpXchgValue(*this, E, /*ReturnBool=*/false);
9162 
9163   case NVPTX::BI__nvvm_atom_add_gen_f: {
9164     Value *Ptr = EmitScalarExpr(E->getArg(0));
9165     Value *Val = EmitScalarExpr(E->getArg(1));
9166     // atomicrmw only deals with integer arguments so we need to use
9167     // LLVM's nvvm_atomic_load_add_f32 intrinsic for that.
9168     Value *FnALAF32 =
9169         CGM.getIntrinsic(Intrinsic::nvvm_atomic_load_add_f32, Ptr->getType());
9170     return Builder.CreateCall(FnALAF32, {Ptr, Val});
9171   }
9172 
9173   case NVPTX::BI__nvvm_atom_inc_gen_ui: {
9174     Value *Ptr = EmitScalarExpr(E->getArg(0));
9175     Value *Val = EmitScalarExpr(E->getArg(1));
9176     Value *FnALI32 =
9177         CGM.getIntrinsic(Intrinsic::nvvm_atomic_load_inc_32, Ptr->getType());
9178     return Builder.CreateCall(FnALI32, {Ptr, Val});
9179   }
9180 
9181   case NVPTX::BI__nvvm_atom_dec_gen_ui: {
9182     Value *Ptr = EmitScalarExpr(E->getArg(0));
9183     Value *Val = EmitScalarExpr(E->getArg(1));
9184     Value *FnALD32 =
9185         CGM.getIntrinsic(Intrinsic::nvvm_atomic_load_dec_32, Ptr->getType());
9186     return Builder.CreateCall(FnALD32, {Ptr, Val});
9187   }
9188 
9189   case NVPTX::BI__nvvm_ldg_c:
9190   case NVPTX::BI__nvvm_ldg_c2:
9191   case NVPTX::BI__nvvm_ldg_c4:
9192   case NVPTX::BI__nvvm_ldg_s:
9193   case NVPTX::BI__nvvm_ldg_s2:
9194   case NVPTX::BI__nvvm_ldg_s4:
9195   case NVPTX::BI__nvvm_ldg_i:
9196   case NVPTX::BI__nvvm_ldg_i2:
9197   case NVPTX::BI__nvvm_ldg_i4:
9198   case NVPTX::BI__nvvm_ldg_l:
9199   case NVPTX::BI__nvvm_ldg_ll:
9200   case NVPTX::BI__nvvm_ldg_ll2:
9201   case NVPTX::BI__nvvm_ldg_uc:
9202   case NVPTX::BI__nvvm_ldg_uc2:
9203   case NVPTX::BI__nvvm_ldg_uc4:
9204   case NVPTX::BI__nvvm_ldg_us:
9205   case NVPTX::BI__nvvm_ldg_us2:
9206   case NVPTX::BI__nvvm_ldg_us4:
9207   case NVPTX::BI__nvvm_ldg_ui:
9208   case NVPTX::BI__nvvm_ldg_ui2:
9209   case NVPTX::BI__nvvm_ldg_ui4:
9210   case NVPTX::BI__nvvm_ldg_ul:
9211   case NVPTX::BI__nvvm_ldg_ull:
9212   case NVPTX::BI__nvvm_ldg_ull2:
9213     // PTX Interoperability section 2.2: "For a vector with an even number of
9214     // elements, its alignment is set to number of elements times the alignment
9215     // of its member: n*alignof(t)."
9216     return MakeLdg(Intrinsic::nvvm_ldg_global_i);
9217   case NVPTX::BI__nvvm_ldg_f:
9218   case NVPTX::BI__nvvm_ldg_f2:
9219   case NVPTX::BI__nvvm_ldg_f4:
9220   case NVPTX::BI__nvvm_ldg_d:
9221   case NVPTX::BI__nvvm_ldg_d2:
9222     return MakeLdg(Intrinsic::nvvm_ldg_global_f);
9223 
9224   case NVPTX::BI__nvvm_atom_cta_add_gen_i:
9225   case NVPTX::BI__nvvm_atom_cta_add_gen_l:
9226   case NVPTX::BI__nvvm_atom_cta_add_gen_ll:
9227     return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_i_cta);
9228   case NVPTX::BI__nvvm_atom_sys_add_gen_i:
9229   case NVPTX::BI__nvvm_atom_sys_add_gen_l:
9230   case NVPTX::BI__nvvm_atom_sys_add_gen_ll:
9231     return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_i_sys);
9232   case NVPTX::BI__nvvm_atom_cta_add_gen_f:
9233   case NVPTX::BI__nvvm_atom_cta_add_gen_d:
9234     return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_f_cta);
9235   case NVPTX::BI__nvvm_atom_sys_add_gen_f:
9236   case NVPTX::BI__nvvm_atom_sys_add_gen_d:
9237     return MakeScopedAtomic(Intrinsic::nvvm_atomic_add_gen_f_sys);
9238   case NVPTX::BI__nvvm_atom_cta_xchg_gen_i:
9239   case NVPTX::BI__nvvm_atom_cta_xchg_gen_l:
9240   case NVPTX::BI__nvvm_atom_cta_xchg_gen_ll:
9241     return MakeScopedAtomic(Intrinsic::nvvm_atomic_exch_gen_i_cta);
9242   case NVPTX::BI__nvvm_atom_sys_xchg_gen_i:
9243   case NVPTX::BI__nvvm_atom_sys_xchg_gen_l:
9244   case NVPTX::BI__nvvm_atom_sys_xchg_gen_ll:
9245     return MakeScopedAtomic(Intrinsic::nvvm_atomic_exch_gen_i_sys);
9246   case NVPTX::BI__nvvm_atom_cta_max_gen_i:
9247   case NVPTX::BI__nvvm_atom_cta_max_gen_ui:
9248   case NVPTX::BI__nvvm_atom_cta_max_gen_l:
9249   case NVPTX::BI__nvvm_atom_cta_max_gen_ul:
9250   case NVPTX::BI__nvvm_atom_cta_max_gen_ll:
9251   case NVPTX::BI__nvvm_atom_cta_max_gen_ull:
9252     return MakeScopedAtomic(Intrinsic::nvvm_atomic_max_gen_i_cta);
9253   case NVPTX::BI__nvvm_atom_sys_max_gen_i:
9254   case NVPTX::BI__nvvm_atom_sys_max_gen_ui:
9255   case NVPTX::BI__nvvm_atom_sys_max_gen_l:
9256   case NVPTX::BI__nvvm_atom_sys_max_gen_ul:
9257   case NVPTX::BI__nvvm_atom_sys_max_gen_ll:
9258   case NVPTX::BI__nvvm_atom_sys_max_gen_ull:
9259     return MakeScopedAtomic(Intrinsic::nvvm_atomic_max_gen_i_sys);
9260   case NVPTX::BI__nvvm_atom_cta_min_gen_i:
9261   case NVPTX::BI__nvvm_atom_cta_min_gen_ui:
9262   case NVPTX::BI__nvvm_atom_cta_min_gen_l:
9263   case NVPTX::BI__nvvm_atom_cta_min_gen_ul:
9264   case NVPTX::BI__nvvm_atom_cta_min_gen_ll:
9265   case NVPTX::BI__nvvm_atom_cta_min_gen_ull:
9266     return MakeScopedAtomic(Intrinsic::nvvm_atomic_min_gen_i_cta);
9267   case NVPTX::BI__nvvm_atom_sys_min_gen_i:
9268   case NVPTX::BI__nvvm_atom_sys_min_gen_ui:
9269   case NVPTX::BI__nvvm_atom_sys_min_gen_l:
9270   case NVPTX::BI__nvvm_atom_sys_min_gen_ul:
9271   case NVPTX::BI__nvvm_atom_sys_min_gen_ll:
9272   case NVPTX::BI__nvvm_atom_sys_min_gen_ull:
9273     return MakeScopedAtomic(Intrinsic::nvvm_atomic_min_gen_i_sys);
9274   case NVPTX::BI__nvvm_atom_cta_inc_gen_ui:
9275     return MakeScopedAtomic(Intrinsic::nvvm_atomic_inc_gen_i_cta);
9276   case NVPTX::BI__nvvm_atom_cta_dec_gen_ui:
9277     return MakeScopedAtomic(Intrinsic::nvvm_atomic_dec_gen_i_cta);
9278   case NVPTX::BI__nvvm_atom_sys_inc_gen_ui:
9279     return MakeScopedAtomic(Intrinsic::nvvm_atomic_inc_gen_i_sys);
9280   case NVPTX::BI__nvvm_atom_sys_dec_gen_ui:
9281     return MakeScopedAtomic(Intrinsic::nvvm_atomic_dec_gen_i_sys);
9282   case NVPTX::BI__nvvm_atom_cta_and_gen_i:
9283   case NVPTX::BI__nvvm_atom_cta_and_gen_l:
9284   case NVPTX::BI__nvvm_atom_cta_and_gen_ll:
9285     return MakeScopedAtomic(Intrinsic::nvvm_atomic_and_gen_i_cta);
9286   case NVPTX::BI__nvvm_atom_sys_and_gen_i:
9287   case NVPTX::BI__nvvm_atom_sys_and_gen_l:
9288   case NVPTX::BI__nvvm_atom_sys_and_gen_ll:
9289     return MakeScopedAtomic(Intrinsic::nvvm_atomic_and_gen_i_sys);
9290   case NVPTX::BI__nvvm_atom_cta_or_gen_i:
9291   case NVPTX::BI__nvvm_atom_cta_or_gen_l:
9292   case NVPTX::BI__nvvm_atom_cta_or_gen_ll:
9293     return MakeScopedAtomic(Intrinsic::nvvm_atomic_or_gen_i_cta);
9294   case NVPTX::BI__nvvm_atom_sys_or_gen_i:
9295   case NVPTX::BI__nvvm_atom_sys_or_gen_l:
9296   case NVPTX::BI__nvvm_atom_sys_or_gen_ll:
9297     return MakeScopedAtomic(Intrinsic::nvvm_atomic_or_gen_i_sys);
9298   case NVPTX::BI__nvvm_atom_cta_xor_gen_i:
9299   case NVPTX::BI__nvvm_atom_cta_xor_gen_l:
9300   case NVPTX::BI__nvvm_atom_cta_xor_gen_ll:
9301     return MakeScopedAtomic(Intrinsic::nvvm_atomic_xor_gen_i_cta);
9302   case NVPTX::BI__nvvm_atom_sys_xor_gen_i:
9303   case NVPTX::BI__nvvm_atom_sys_xor_gen_l:
9304   case NVPTX::BI__nvvm_atom_sys_xor_gen_ll:
9305     return MakeScopedAtomic(Intrinsic::nvvm_atomic_xor_gen_i_sys);
9306   case NVPTX::BI__nvvm_atom_cta_cas_gen_i:
9307   case NVPTX::BI__nvvm_atom_cta_cas_gen_l:
9308   case NVPTX::BI__nvvm_atom_cta_cas_gen_ll: {
9309     Value *Ptr = EmitScalarExpr(E->getArg(0));
9310     return Builder.CreateCall(
9311         CGM.getIntrinsic(
9312             Intrinsic::nvvm_atomic_cas_gen_i_cta,
9313             {Ptr->getType()->getPointerElementType(), Ptr->getType()}),
9314         {Ptr, EmitScalarExpr(E->getArg(1)), EmitScalarExpr(E->getArg(2))});
9315   }
9316   case NVPTX::BI__nvvm_atom_sys_cas_gen_i:
9317   case NVPTX::BI__nvvm_atom_sys_cas_gen_l:
9318   case NVPTX::BI__nvvm_atom_sys_cas_gen_ll: {
9319     Value *Ptr = EmitScalarExpr(E->getArg(0));
9320     return Builder.CreateCall(
9321         CGM.getIntrinsic(
9322             Intrinsic::nvvm_atomic_cas_gen_i_sys,
9323             {Ptr->getType()->getPointerElementType(), Ptr->getType()}),
9324         {Ptr, EmitScalarExpr(E->getArg(1)), EmitScalarExpr(E->getArg(2))});
9325   }
9326   default:
9327     return nullptr;
9328   }
9329 }
9330 
9331 Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID,
9332                                                    const CallExpr *E) {
9333   switch (BuiltinID) {
9334   case WebAssembly::BI__builtin_wasm_current_memory: {
9335     llvm::Type *ResultType = ConvertType(E->getType());
9336     Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_current_memory, ResultType);
9337     return Builder.CreateCall(Callee);
9338   }
9339   case WebAssembly::BI__builtin_wasm_grow_memory: {
9340     Value *X = EmitScalarExpr(E->getArg(0));
9341     Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_grow_memory, X->getType());
9342     return Builder.CreateCall(Callee, X);
9343   }
9344   case WebAssembly::BI__builtin_wasm_throw: {
9345     Value *Tag = EmitScalarExpr(E->getArg(0));
9346     Value *Obj = EmitScalarExpr(E->getArg(1));
9347     Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_throw);
9348     return Builder.CreateCall(Callee, {Tag, Obj});
9349   }
9350   case WebAssembly::BI__builtin_wasm_rethrow: {
9351     Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_rethrow);
9352     return Builder.CreateCall(Callee);
9353   }
9354 
9355   default:
9356     return nullptr;
9357   }
9358 }
9359