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