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, bool IsRead) {
3654   // write and register intrinsics only support 32 and 64 bit operations.
3655   assert((RegisterType->isIntegerTy(32) || RegisterType->isIntegerTy(64))
3656           && "Unsupported size for register.");
3657 
3658   CodeGen::CGBuilderTy &Builder = CGF.Builder;
3659   CodeGen::CodeGenModule &CGM = CGF.CGM;
3660   LLVMContext &Context = CGM.getLLVMContext();
3661 
3662   const Expr *SysRegStrExpr = E->getArg(0)->IgnoreParenCasts();
3663   StringRef SysReg = cast<StringLiteral>(SysRegStrExpr)->getString();
3664 
3665   llvm::Metadata *Ops[] = { llvm::MDString::get(Context, SysReg) };
3666   llvm::MDNode *RegName = llvm::MDNode::get(Context, Ops);
3667   llvm::Value *Metadata = llvm::MetadataAsValue::get(Context, RegName);
3668 
3669   llvm::Type *Types[] = { RegisterType };
3670 
3671   bool MixedTypes = RegisterType->isIntegerTy(64) && ValueType->isIntegerTy(32);
3672   assert(!(RegisterType->isIntegerTy(32) && ValueType->isIntegerTy(64))
3673             && "Can't fit 64-bit value in 32-bit register");
3674 
3675   if (IsRead) {
3676     llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::read_register, Types);
3677     llvm::Value *Call = Builder.CreateCall(F, Metadata);
3678 
3679     if (MixedTypes)
3680       // Read into 64 bit register and then truncate result to 32 bit.
3681       return Builder.CreateTrunc(Call, ValueType);
3682 
3683     if (ValueType->isPointerTy())
3684       // Have i32/i64 result (Call) but want to return a VoidPtrTy (i8*).
3685       return Builder.CreateIntToPtr(Call, ValueType);
3686 
3687     return Call;
3688   }
3689 
3690   llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::write_register, Types);
3691   llvm::Value *ArgValue = CGF.EmitScalarExpr(E->getArg(1));
3692   if (MixedTypes) {
3693     // Extend 32 bit write value to 64 bit to pass to write.
3694     ArgValue = Builder.CreateZExt(ArgValue, RegisterType);
3695     return Builder.CreateCall(F, { Metadata, ArgValue });
3696   }
3697 
3698   if (ValueType->isPointerTy()) {
3699     // Have VoidPtrTy ArgValue but want to return an i32/i64.
3700     ArgValue = Builder.CreatePtrToInt(ArgValue, RegisterType);
3701     return Builder.CreateCall(F, { Metadata, ArgValue });
3702   }
3703 
3704   return Builder.CreateCall(F, { Metadata, ArgValue });
3705 }
3706 
3707 /// Return true if BuiltinID is an overloaded Neon intrinsic with an extra
3708 /// argument that specifies the vector type.
3709 static bool HasExtraNeonArgument(unsigned BuiltinID) {
3710   switch (BuiltinID) {
3711   default: break;
3712   case NEON::BI__builtin_neon_vget_lane_i8:
3713   case NEON::BI__builtin_neon_vget_lane_i16:
3714   case NEON::BI__builtin_neon_vget_lane_i32:
3715   case NEON::BI__builtin_neon_vget_lane_i64:
3716   case NEON::BI__builtin_neon_vget_lane_f32:
3717   case NEON::BI__builtin_neon_vgetq_lane_i8:
3718   case NEON::BI__builtin_neon_vgetq_lane_i16:
3719   case NEON::BI__builtin_neon_vgetq_lane_i32:
3720   case NEON::BI__builtin_neon_vgetq_lane_i64:
3721   case NEON::BI__builtin_neon_vgetq_lane_f32:
3722   case NEON::BI__builtin_neon_vset_lane_i8:
3723   case NEON::BI__builtin_neon_vset_lane_i16:
3724   case NEON::BI__builtin_neon_vset_lane_i32:
3725   case NEON::BI__builtin_neon_vset_lane_i64:
3726   case NEON::BI__builtin_neon_vset_lane_f32:
3727   case NEON::BI__builtin_neon_vsetq_lane_i8:
3728   case NEON::BI__builtin_neon_vsetq_lane_i16:
3729   case NEON::BI__builtin_neon_vsetq_lane_i32:
3730   case NEON::BI__builtin_neon_vsetq_lane_i64:
3731   case NEON::BI__builtin_neon_vsetq_lane_f32:
3732   case NEON::BI__builtin_neon_vsha1h_u32:
3733   case NEON::BI__builtin_neon_vsha1cq_u32:
3734   case NEON::BI__builtin_neon_vsha1pq_u32:
3735   case NEON::BI__builtin_neon_vsha1mq_u32:
3736   case ARM::BI_MoveToCoprocessor:
3737   case ARM::BI_MoveToCoprocessor2:
3738     return false;
3739   }
3740   return true;
3741 }
3742 
3743 Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
3744                                            const CallExpr *E) {
3745   if (auto Hint = GetValueForARMHint(BuiltinID))
3746     return Hint;
3747 
3748   if (BuiltinID == ARM::BI__emit) {
3749     bool IsThumb = getTarget().getTriple().getArch() == llvm::Triple::thumb;
3750     llvm::FunctionType *FTy =
3751         llvm::FunctionType::get(VoidTy, /*Variadic=*/false);
3752 
3753     APSInt Value;
3754     if (!E->getArg(0)->EvaluateAsInt(Value, CGM.getContext()))
3755       llvm_unreachable("Sema will ensure that the parameter is constant");
3756 
3757     uint64_t ZExtValue = Value.zextOrTrunc(IsThumb ? 16 : 32).getZExtValue();
3758 
3759     llvm::InlineAsm *Emit =
3760         IsThumb ? InlineAsm::get(FTy, ".inst.n 0x" + utohexstr(ZExtValue), "",
3761                                  /*SideEffects=*/true)
3762                 : InlineAsm::get(FTy, ".inst 0x" + utohexstr(ZExtValue), "",
3763                                  /*SideEffects=*/true);
3764 
3765     return Builder.CreateCall(Emit);
3766   }
3767 
3768   if (BuiltinID == ARM::BI__builtin_arm_dbg) {
3769     Value *Option = EmitScalarExpr(E->getArg(0));
3770     return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_dbg), Option);
3771   }
3772 
3773   if (BuiltinID == ARM::BI__builtin_arm_prefetch) {
3774     Value *Address = EmitScalarExpr(E->getArg(0));
3775     Value *RW      = EmitScalarExpr(E->getArg(1));
3776     Value *IsData  = EmitScalarExpr(E->getArg(2));
3777 
3778     // Locality is not supported on ARM target
3779     Value *Locality = llvm::ConstantInt::get(Int32Ty, 3);
3780 
3781     Value *F = CGM.getIntrinsic(Intrinsic::prefetch);
3782     return Builder.CreateCall(F, {Address, RW, Locality, IsData});
3783   }
3784 
3785   if (BuiltinID == ARM::BI__builtin_arm_rbit) {
3786     return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_rbit),
3787                                                EmitScalarExpr(E->getArg(0)),
3788                               "rbit");
3789   }
3790 
3791   if (BuiltinID == ARM::BI__clear_cache) {
3792     assert(E->getNumArgs() == 2 && "__clear_cache takes 2 arguments");
3793     const FunctionDecl *FD = E->getDirectCallee();
3794     Value *Ops[2];
3795     for (unsigned i = 0; i < 2; i++)
3796       Ops[i] = EmitScalarExpr(E->getArg(i));
3797     llvm::Type *Ty = CGM.getTypes().ConvertType(FD->getType());
3798     llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty);
3799     StringRef Name = FD->getName();
3800     return EmitNounwindRuntimeCall(CGM.CreateRuntimeFunction(FTy, Name), Ops);
3801   }
3802 
3803   if (BuiltinID == ARM::BI__builtin_arm_mcrr ||
3804       BuiltinID == ARM::BI__builtin_arm_mcrr2) {
3805     Function *F;
3806 
3807     switch (BuiltinID) {
3808     default: llvm_unreachable("unexpected builtin");
3809     case ARM::BI__builtin_arm_mcrr:
3810       F = CGM.getIntrinsic(Intrinsic::arm_mcrr);
3811       break;
3812     case ARM::BI__builtin_arm_mcrr2:
3813       F = CGM.getIntrinsic(Intrinsic::arm_mcrr2);
3814       break;
3815     }
3816 
3817     // MCRR{2} instruction has 5 operands but
3818     // the intrinsic has 4 because Rt and Rt2
3819     // are represented as a single unsigned 64
3820     // bit integer in the intrinsic definition
3821     // but internally it's represented as 2 32
3822     // bit integers.
3823 
3824     Value *Coproc = EmitScalarExpr(E->getArg(0));
3825     Value *Opc1 = EmitScalarExpr(E->getArg(1));
3826     Value *RtAndRt2 = EmitScalarExpr(E->getArg(2));
3827     Value *CRm = EmitScalarExpr(E->getArg(3));
3828 
3829     Value *C1 = llvm::ConstantInt::get(Int64Ty, 32);
3830     Value *Rt = Builder.CreateTruncOrBitCast(RtAndRt2, Int32Ty);
3831     Value *Rt2 = Builder.CreateLShr(RtAndRt2, C1);
3832     Rt2 = Builder.CreateTruncOrBitCast(Rt2, Int32Ty);
3833 
3834     return Builder.CreateCall(F, {Coproc, Opc1, Rt, Rt2, CRm});
3835   }
3836 
3837   if (BuiltinID == ARM::BI__builtin_arm_mrrc ||
3838       BuiltinID == ARM::BI__builtin_arm_mrrc2) {
3839     Function *F;
3840 
3841     switch (BuiltinID) {
3842     default: llvm_unreachable("unexpected builtin");
3843     case ARM::BI__builtin_arm_mrrc:
3844       F = CGM.getIntrinsic(Intrinsic::arm_mrrc);
3845       break;
3846     case ARM::BI__builtin_arm_mrrc2:
3847       F = CGM.getIntrinsic(Intrinsic::arm_mrrc2);
3848       break;
3849     }
3850 
3851     Value *Coproc = EmitScalarExpr(E->getArg(0));
3852     Value *Opc1 = EmitScalarExpr(E->getArg(1));
3853     Value *CRm  = EmitScalarExpr(E->getArg(2));
3854     Value *RtAndRt2 = Builder.CreateCall(F, {Coproc, Opc1, CRm});
3855 
3856     // Returns an unsigned 64 bit integer, represented
3857     // as two 32 bit integers.
3858 
3859     Value *Rt = Builder.CreateExtractValue(RtAndRt2, 1);
3860     Value *Rt1 = Builder.CreateExtractValue(RtAndRt2, 0);
3861     Rt = Builder.CreateZExt(Rt, Int64Ty);
3862     Rt1 = Builder.CreateZExt(Rt1, Int64Ty);
3863 
3864     Value *ShiftCast = llvm::ConstantInt::get(Int64Ty, 32);
3865     RtAndRt2 = Builder.CreateShl(Rt, ShiftCast, "shl", true);
3866     RtAndRt2 = Builder.CreateOr(RtAndRt2, Rt1);
3867 
3868     return Builder.CreateBitCast(RtAndRt2, ConvertType(E->getType()));
3869   }
3870 
3871   if (BuiltinID == ARM::BI__builtin_arm_ldrexd ||
3872       ((BuiltinID == ARM::BI__builtin_arm_ldrex ||
3873         BuiltinID == ARM::BI__builtin_arm_ldaex) &&
3874        getContext().getTypeSize(E->getType()) == 64) ||
3875       BuiltinID == ARM::BI__ldrexd) {
3876     Function *F;
3877 
3878     switch (BuiltinID) {
3879     default: llvm_unreachable("unexpected builtin");
3880     case ARM::BI__builtin_arm_ldaex:
3881       F = CGM.getIntrinsic(Intrinsic::arm_ldaexd);
3882       break;
3883     case ARM::BI__builtin_arm_ldrexd:
3884     case ARM::BI__builtin_arm_ldrex:
3885     case ARM::BI__ldrexd:
3886       F = CGM.getIntrinsic(Intrinsic::arm_ldrexd);
3887       break;
3888     }
3889 
3890     Value *LdPtr = EmitScalarExpr(E->getArg(0));
3891     Value *Val = Builder.CreateCall(F, Builder.CreateBitCast(LdPtr, Int8PtrTy),
3892                                     "ldrexd");
3893 
3894     Value *Val0 = Builder.CreateExtractValue(Val, 1);
3895     Value *Val1 = Builder.CreateExtractValue(Val, 0);
3896     Val0 = Builder.CreateZExt(Val0, Int64Ty);
3897     Val1 = Builder.CreateZExt(Val1, Int64Ty);
3898 
3899     Value *ShiftCst = llvm::ConstantInt::get(Int64Ty, 32);
3900     Val = Builder.CreateShl(Val0, ShiftCst, "shl", true /* nuw */);
3901     Val = Builder.CreateOr(Val, Val1);
3902     return Builder.CreateBitCast(Val, ConvertType(E->getType()));
3903   }
3904 
3905   if (BuiltinID == ARM::BI__builtin_arm_ldrex ||
3906       BuiltinID == ARM::BI__builtin_arm_ldaex) {
3907     Value *LoadAddr = EmitScalarExpr(E->getArg(0));
3908 
3909     QualType Ty = E->getType();
3910     llvm::Type *RealResTy = ConvertType(Ty);
3911     llvm::Type *IntResTy = llvm::IntegerType::get(getLLVMContext(),
3912                                                   getContext().getTypeSize(Ty));
3913     LoadAddr = Builder.CreateBitCast(LoadAddr, IntResTy->getPointerTo());
3914 
3915     Function *F = CGM.getIntrinsic(BuiltinID == ARM::BI__builtin_arm_ldaex
3916                                        ? Intrinsic::arm_ldaex
3917                                        : Intrinsic::arm_ldrex,
3918                                    LoadAddr->getType());
3919     Value *Val = Builder.CreateCall(F, LoadAddr, "ldrex");
3920 
3921     if (RealResTy->isPointerTy())
3922       return Builder.CreateIntToPtr(Val, RealResTy);
3923     else {
3924       Val = Builder.CreateTruncOrBitCast(Val, IntResTy);
3925       return Builder.CreateBitCast(Val, RealResTy);
3926     }
3927   }
3928 
3929   if (BuiltinID == ARM::BI__builtin_arm_strexd ||
3930       ((BuiltinID == ARM::BI__builtin_arm_stlex ||
3931         BuiltinID == ARM::BI__builtin_arm_strex) &&
3932        getContext().getTypeSize(E->getArg(0)->getType()) == 64)) {
3933     Function *F = CGM.getIntrinsic(BuiltinID == ARM::BI__builtin_arm_stlex
3934                                        ? Intrinsic::arm_stlexd
3935                                        : Intrinsic::arm_strexd);
3936     llvm::Type *STy = llvm::StructType::get(Int32Ty, Int32Ty, nullptr);
3937 
3938     Address Tmp = CreateMemTemp(E->getArg(0)->getType());
3939     Value *Val = EmitScalarExpr(E->getArg(0));
3940     Builder.CreateStore(Val, Tmp);
3941 
3942     Address LdPtr = Builder.CreateBitCast(Tmp,llvm::PointerType::getUnqual(STy));
3943     Val = Builder.CreateLoad(LdPtr);
3944 
3945     Value *Arg0 = Builder.CreateExtractValue(Val, 0);
3946     Value *Arg1 = Builder.CreateExtractValue(Val, 1);
3947     Value *StPtr = Builder.CreateBitCast(EmitScalarExpr(E->getArg(1)), Int8PtrTy);
3948     return Builder.CreateCall(F, {Arg0, Arg1, StPtr}, "strexd");
3949   }
3950 
3951   if (BuiltinID == ARM::BI__builtin_arm_strex ||
3952       BuiltinID == ARM::BI__builtin_arm_stlex) {
3953     Value *StoreVal = EmitScalarExpr(E->getArg(0));
3954     Value *StoreAddr = EmitScalarExpr(E->getArg(1));
3955 
3956     QualType Ty = E->getArg(0)->getType();
3957     llvm::Type *StoreTy = llvm::IntegerType::get(getLLVMContext(),
3958                                                  getContext().getTypeSize(Ty));
3959     StoreAddr = Builder.CreateBitCast(StoreAddr, StoreTy->getPointerTo());
3960 
3961     if (StoreVal->getType()->isPointerTy())
3962       StoreVal = Builder.CreatePtrToInt(StoreVal, Int32Ty);
3963     else {
3964       StoreVal = Builder.CreateBitCast(StoreVal, StoreTy);
3965       StoreVal = Builder.CreateZExtOrBitCast(StoreVal, Int32Ty);
3966     }
3967 
3968     Function *F = CGM.getIntrinsic(BuiltinID == ARM::BI__builtin_arm_stlex
3969                                        ? Intrinsic::arm_stlex
3970                                        : Intrinsic::arm_strex,
3971                                    StoreAddr->getType());
3972     return Builder.CreateCall(F, {StoreVal, StoreAddr}, "strex");
3973   }
3974 
3975   if (BuiltinID == ARM::BI__builtin_arm_clrex) {
3976     Function *F = CGM.getIntrinsic(Intrinsic::arm_clrex);
3977     return Builder.CreateCall(F);
3978   }
3979 
3980   // CRC32
3981   Intrinsic::ID CRCIntrinsicID = Intrinsic::not_intrinsic;
3982   switch (BuiltinID) {
3983   case ARM::BI__builtin_arm_crc32b:
3984     CRCIntrinsicID = Intrinsic::arm_crc32b; break;
3985   case ARM::BI__builtin_arm_crc32cb:
3986     CRCIntrinsicID = Intrinsic::arm_crc32cb; break;
3987   case ARM::BI__builtin_arm_crc32h:
3988     CRCIntrinsicID = Intrinsic::arm_crc32h; break;
3989   case ARM::BI__builtin_arm_crc32ch:
3990     CRCIntrinsicID = Intrinsic::arm_crc32ch; break;
3991   case ARM::BI__builtin_arm_crc32w:
3992   case ARM::BI__builtin_arm_crc32d:
3993     CRCIntrinsicID = Intrinsic::arm_crc32w; break;
3994   case ARM::BI__builtin_arm_crc32cw:
3995   case ARM::BI__builtin_arm_crc32cd:
3996     CRCIntrinsicID = Intrinsic::arm_crc32cw; break;
3997   }
3998 
3999   if (CRCIntrinsicID != Intrinsic::not_intrinsic) {
4000     Value *Arg0 = EmitScalarExpr(E->getArg(0));
4001     Value *Arg1 = EmitScalarExpr(E->getArg(1));
4002 
4003     // crc32{c,}d intrinsics are implemnted as two calls to crc32{c,}w
4004     // intrinsics, hence we need different codegen for these cases.
4005     if (BuiltinID == ARM::BI__builtin_arm_crc32d ||
4006         BuiltinID == ARM::BI__builtin_arm_crc32cd) {
4007       Value *C1 = llvm::ConstantInt::get(Int64Ty, 32);
4008       Value *Arg1a = Builder.CreateTruncOrBitCast(Arg1, Int32Ty);
4009       Value *Arg1b = Builder.CreateLShr(Arg1, C1);
4010       Arg1b = Builder.CreateTruncOrBitCast(Arg1b, Int32Ty);
4011 
4012       Function *F = CGM.getIntrinsic(CRCIntrinsicID);
4013       Value *Res = Builder.CreateCall(F, {Arg0, Arg1a});
4014       return Builder.CreateCall(F, {Res, Arg1b});
4015     } else {
4016       Arg1 = Builder.CreateZExtOrBitCast(Arg1, Int32Ty);
4017 
4018       Function *F = CGM.getIntrinsic(CRCIntrinsicID);
4019       return Builder.CreateCall(F, {Arg0, Arg1});
4020     }
4021   }
4022 
4023   if (BuiltinID == ARM::BI__builtin_arm_rsr ||
4024       BuiltinID == ARM::BI__builtin_arm_rsr64 ||
4025       BuiltinID == ARM::BI__builtin_arm_rsrp ||
4026       BuiltinID == ARM::BI__builtin_arm_wsr ||
4027       BuiltinID == ARM::BI__builtin_arm_wsr64 ||
4028       BuiltinID == ARM::BI__builtin_arm_wsrp) {
4029 
4030     bool IsRead = BuiltinID == ARM::BI__builtin_arm_rsr ||
4031                   BuiltinID == ARM::BI__builtin_arm_rsr64 ||
4032                   BuiltinID == ARM::BI__builtin_arm_rsrp;
4033 
4034     bool IsPointerBuiltin = BuiltinID == ARM::BI__builtin_arm_rsrp ||
4035                             BuiltinID == ARM::BI__builtin_arm_wsrp;
4036 
4037     bool Is64Bit = BuiltinID == ARM::BI__builtin_arm_rsr64 ||
4038                    BuiltinID == ARM::BI__builtin_arm_wsr64;
4039 
4040     llvm::Type *ValueType;
4041     llvm::Type *RegisterType;
4042     if (IsPointerBuiltin) {
4043       ValueType = VoidPtrTy;
4044       RegisterType = Int32Ty;
4045     } else if (Is64Bit) {
4046       ValueType = RegisterType = Int64Ty;
4047     } else {
4048       ValueType = RegisterType = Int32Ty;
4049     }
4050 
4051     return EmitSpecialRegisterBuiltin(*this, E, RegisterType, ValueType, IsRead);
4052   }
4053 
4054   // Find out if any arguments are required to be integer constant
4055   // expressions.
4056   unsigned ICEArguments = 0;
4057   ASTContext::GetBuiltinTypeError Error;
4058   getContext().GetBuiltinType(BuiltinID, Error, &ICEArguments);
4059   assert(Error == ASTContext::GE_None && "Should not codegen an error");
4060 
4061   auto getAlignmentValue32 = [&](Address addr) -> Value* {
4062     return Builder.getInt32(addr.getAlignment().getQuantity());
4063   };
4064 
4065   Address PtrOp0 = Address::invalid();
4066   Address PtrOp1 = Address::invalid();
4067   SmallVector<Value*, 4> Ops;
4068   bool HasExtraArg = HasExtraNeonArgument(BuiltinID);
4069   unsigned NumArgs = E->getNumArgs() - (HasExtraArg ? 1 : 0);
4070   for (unsigned i = 0, e = NumArgs; i != e; i++) {
4071     if (i == 0) {
4072       switch (BuiltinID) {
4073       case NEON::BI__builtin_neon_vld1_v:
4074       case NEON::BI__builtin_neon_vld1q_v:
4075       case NEON::BI__builtin_neon_vld1q_lane_v:
4076       case NEON::BI__builtin_neon_vld1_lane_v:
4077       case NEON::BI__builtin_neon_vld1_dup_v:
4078       case NEON::BI__builtin_neon_vld1q_dup_v:
4079       case NEON::BI__builtin_neon_vst1_v:
4080       case NEON::BI__builtin_neon_vst1q_v:
4081       case NEON::BI__builtin_neon_vst1q_lane_v:
4082       case NEON::BI__builtin_neon_vst1_lane_v:
4083       case NEON::BI__builtin_neon_vst2_v:
4084       case NEON::BI__builtin_neon_vst2q_v:
4085       case NEON::BI__builtin_neon_vst2_lane_v:
4086       case NEON::BI__builtin_neon_vst2q_lane_v:
4087       case NEON::BI__builtin_neon_vst3_v:
4088       case NEON::BI__builtin_neon_vst3q_v:
4089       case NEON::BI__builtin_neon_vst3_lane_v:
4090       case NEON::BI__builtin_neon_vst3q_lane_v:
4091       case NEON::BI__builtin_neon_vst4_v:
4092       case NEON::BI__builtin_neon_vst4q_v:
4093       case NEON::BI__builtin_neon_vst4_lane_v:
4094       case NEON::BI__builtin_neon_vst4q_lane_v:
4095         // Get the alignment for the argument in addition to the value;
4096         // we'll use it later.
4097         PtrOp0 = EmitPointerWithAlignment(E->getArg(0));
4098         Ops.push_back(PtrOp0.getPointer());
4099         continue;
4100       }
4101     }
4102     if (i == 1) {
4103       switch (BuiltinID) {
4104       case NEON::BI__builtin_neon_vld2_v:
4105       case NEON::BI__builtin_neon_vld2q_v:
4106       case NEON::BI__builtin_neon_vld3_v:
4107       case NEON::BI__builtin_neon_vld3q_v:
4108       case NEON::BI__builtin_neon_vld4_v:
4109       case NEON::BI__builtin_neon_vld4q_v:
4110       case NEON::BI__builtin_neon_vld2_lane_v:
4111       case NEON::BI__builtin_neon_vld2q_lane_v:
4112       case NEON::BI__builtin_neon_vld3_lane_v:
4113       case NEON::BI__builtin_neon_vld3q_lane_v:
4114       case NEON::BI__builtin_neon_vld4_lane_v:
4115       case NEON::BI__builtin_neon_vld4q_lane_v:
4116       case NEON::BI__builtin_neon_vld2_dup_v:
4117       case NEON::BI__builtin_neon_vld3_dup_v:
4118       case NEON::BI__builtin_neon_vld4_dup_v:
4119         // Get the alignment for the argument in addition to the value;
4120         // we'll use it later.
4121         PtrOp1 = EmitPointerWithAlignment(E->getArg(1));
4122         Ops.push_back(PtrOp1.getPointer());
4123         continue;
4124       }
4125     }
4126 
4127     if ((ICEArguments & (1 << i)) == 0) {
4128       Ops.push_back(EmitScalarExpr(E->getArg(i)));
4129     } else {
4130       // If this is required to be a constant, constant fold it so that we know
4131       // that the generated intrinsic gets a ConstantInt.
4132       llvm::APSInt Result;
4133       bool IsConst = E->getArg(i)->isIntegerConstantExpr(Result, getContext());
4134       assert(IsConst && "Constant arg isn't actually constant?"); (void)IsConst;
4135       Ops.push_back(llvm::ConstantInt::get(getLLVMContext(), Result));
4136     }
4137   }
4138 
4139   switch (BuiltinID) {
4140   default: break;
4141 
4142   case NEON::BI__builtin_neon_vget_lane_i8:
4143   case NEON::BI__builtin_neon_vget_lane_i16:
4144   case NEON::BI__builtin_neon_vget_lane_i32:
4145   case NEON::BI__builtin_neon_vget_lane_i64:
4146   case NEON::BI__builtin_neon_vget_lane_f32:
4147   case NEON::BI__builtin_neon_vgetq_lane_i8:
4148   case NEON::BI__builtin_neon_vgetq_lane_i16:
4149   case NEON::BI__builtin_neon_vgetq_lane_i32:
4150   case NEON::BI__builtin_neon_vgetq_lane_i64:
4151   case NEON::BI__builtin_neon_vgetq_lane_f32:
4152     return Builder.CreateExtractElement(Ops[0], Ops[1], "vget_lane");
4153 
4154   case NEON::BI__builtin_neon_vset_lane_i8:
4155   case NEON::BI__builtin_neon_vset_lane_i16:
4156   case NEON::BI__builtin_neon_vset_lane_i32:
4157   case NEON::BI__builtin_neon_vset_lane_i64:
4158   case NEON::BI__builtin_neon_vset_lane_f32:
4159   case NEON::BI__builtin_neon_vsetq_lane_i8:
4160   case NEON::BI__builtin_neon_vsetq_lane_i16:
4161   case NEON::BI__builtin_neon_vsetq_lane_i32:
4162   case NEON::BI__builtin_neon_vsetq_lane_i64:
4163   case NEON::BI__builtin_neon_vsetq_lane_f32:
4164     return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vset_lane");
4165 
4166   case NEON::BI__builtin_neon_vsha1h_u32:
4167     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_sha1h), Ops,
4168                         "vsha1h");
4169   case NEON::BI__builtin_neon_vsha1cq_u32:
4170     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_sha1c), Ops,
4171                         "vsha1h");
4172   case NEON::BI__builtin_neon_vsha1pq_u32:
4173     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_sha1p), Ops,
4174                         "vsha1h");
4175   case NEON::BI__builtin_neon_vsha1mq_u32:
4176     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_sha1m), Ops,
4177                         "vsha1h");
4178 
4179   // The ARM _MoveToCoprocessor builtins put the input register value as
4180   // the first argument, but the LLVM intrinsic expects it as the third one.
4181   case ARM::BI_MoveToCoprocessor:
4182   case ARM::BI_MoveToCoprocessor2: {
4183     Function *F = CGM.getIntrinsic(BuiltinID == ARM::BI_MoveToCoprocessor ?
4184                                    Intrinsic::arm_mcr : Intrinsic::arm_mcr2);
4185     return Builder.CreateCall(F, {Ops[1], Ops[2], Ops[0],
4186                                   Ops[3], Ops[4], Ops[5]});
4187   }
4188   }
4189 
4190   // Get the last argument, which specifies the vector type.
4191   assert(HasExtraArg);
4192   llvm::APSInt Result;
4193   const Expr *Arg = E->getArg(E->getNumArgs()-1);
4194   if (!Arg->isIntegerConstantExpr(Result, getContext()))
4195     return nullptr;
4196 
4197   if (BuiltinID == ARM::BI__builtin_arm_vcvtr_f ||
4198       BuiltinID == ARM::BI__builtin_arm_vcvtr_d) {
4199     // Determine the overloaded type of this builtin.
4200     llvm::Type *Ty;
4201     if (BuiltinID == ARM::BI__builtin_arm_vcvtr_f)
4202       Ty = FloatTy;
4203     else
4204       Ty = DoubleTy;
4205 
4206     // Determine whether this is an unsigned conversion or not.
4207     bool usgn = Result.getZExtValue() == 1;
4208     unsigned Int = usgn ? Intrinsic::arm_vcvtru : Intrinsic::arm_vcvtr;
4209 
4210     // Call the appropriate intrinsic.
4211     Function *F = CGM.getIntrinsic(Int, Ty);
4212     return Builder.CreateCall(F, Ops, "vcvtr");
4213   }
4214 
4215   // Determine the type of this overloaded NEON intrinsic.
4216   NeonTypeFlags Type(Result.getZExtValue());
4217   bool usgn = Type.isUnsigned();
4218   bool rightShift = false;
4219 
4220   llvm::VectorType *VTy = GetNeonType(this, Type);
4221   llvm::Type *Ty = VTy;
4222   if (!Ty)
4223     return nullptr;
4224 
4225   // Many NEON builtins have identical semantics and uses in ARM and
4226   // AArch64. Emit these in a single function.
4227   auto IntrinsicMap = makeArrayRef(ARMSIMDIntrinsicMap);
4228   const NeonIntrinsicInfo *Builtin = findNeonIntrinsicInMap(
4229       IntrinsicMap, BuiltinID, NEONSIMDIntrinsicsProvenSorted);
4230   if (Builtin)
4231     return EmitCommonNeonBuiltinExpr(
4232         Builtin->BuiltinID, Builtin->LLVMIntrinsic, Builtin->AltLLVMIntrinsic,
4233         Builtin->NameHint, Builtin->TypeModifier, E, Ops, PtrOp0, PtrOp1);
4234 
4235   unsigned Int;
4236   switch (BuiltinID) {
4237   default: return nullptr;
4238   case NEON::BI__builtin_neon_vld1q_lane_v:
4239     // Handle 64-bit integer elements as a special case.  Use shuffles of
4240     // one-element vectors to avoid poor code for i64 in the backend.
4241     if (VTy->getElementType()->isIntegerTy(64)) {
4242       // Extract the other lane.
4243       Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
4244       uint32_t Lane = cast<ConstantInt>(Ops[2])->getZExtValue();
4245       Value *SV = llvm::ConstantVector::get(ConstantInt::get(Int32Ty, 1-Lane));
4246       Ops[1] = Builder.CreateShuffleVector(Ops[1], Ops[1], SV);
4247       // Load the value as a one-element vector.
4248       Ty = llvm::VectorType::get(VTy->getElementType(), 1);
4249       llvm::Type *Tys[] = {Ty, Int8PtrTy};
4250       Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld1, Tys);
4251       Value *Align = getAlignmentValue32(PtrOp0);
4252       Value *Ld = Builder.CreateCall(F, {Ops[0], Align});
4253       // Combine them.
4254       uint32_t Indices[] = {1 - Lane, Lane};
4255       SV = llvm::ConstantDataVector::get(getLLVMContext(), Indices);
4256       return Builder.CreateShuffleVector(Ops[1], Ld, SV, "vld1q_lane");
4257     }
4258     // fall through
4259   case NEON::BI__builtin_neon_vld1_lane_v: {
4260     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
4261     PtrOp0 = Builder.CreateElementBitCast(PtrOp0, VTy->getElementType());
4262     Value *Ld = Builder.CreateLoad(PtrOp0);
4263     return Builder.CreateInsertElement(Ops[1], Ld, Ops[2], "vld1_lane");
4264   }
4265   case NEON::BI__builtin_neon_vld2_dup_v:
4266   case NEON::BI__builtin_neon_vld3_dup_v:
4267   case NEON::BI__builtin_neon_vld4_dup_v: {
4268     // Handle 64-bit elements as a special-case.  There is no "dup" needed.
4269     if (VTy->getElementType()->getPrimitiveSizeInBits() == 64) {
4270       switch (BuiltinID) {
4271       case NEON::BI__builtin_neon_vld2_dup_v:
4272         Int = Intrinsic::arm_neon_vld2;
4273         break;
4274       case NEON::BI__builtin_neon_vld3_dup_v:
4275         Int = Intrinsic::arm_neon_vld3;
4276         break;
4277       case NEON::BI__builtin_neon_vld4_dup_v:
4278         Int = Intrinsic::arm_neon_vld4;
4279         break;
4280       default: llvm_unreachable("unknown vld_dup intrinsic?");
4281       }
4282       llvm::Type *Tys[] = {Ty, Int8PtrTy};
4283       Function *F = CGM.getIntrinsic(Int, Tys);
4284       llvm::Value *Align = getAlignmentValue32(PtrOp1);
4285       Ops[1] = Builder.CreateCall(F, {Ops[1], Align}, "vld_dup");
4286       Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
4287       Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
4288       return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]);
4289     }
4290     switch (BuiltinID) {
4291     case NEON::BI__builtin_neon_vld2_dup_v:
4292       Int = Intrinsic::arm_neon_vld2lane;
4293       break;
4294     case NEON::BI__builtin_neon_vld3_dup_v:
4295       Int = Intrinsic::arm_neon_vld3lane;
4296       break;
4297     case NEON::BI__builtin_neon_vld4_dup_v:
4298       Int = Intrinsic::arm_neon_vld4lane;
4299       break;
4300     default: llvm_unreachable("unknown vld_dup intrinsic?");
4301     }
4302     llvm::Type *Tys[] = {Ty, Int8PtrTy};
4303     Function *F = CGM.getIntrinsic(Int, Tys);
4304     llvm::StructType *STy = cast<llvm::StructType>(F->getReturnType());
4305 
4306     SmallVector<Value*, 6> Args;
4307     Args.push_back(Ops[1]);
4308     Args.append(STy->getNumElements(), UndefValue::get(Ty));
4309 
4310     llvm::Constant *CI = ConstantInt::get(Int32Ty, 0);
4311     Args.push_back(CI);
4312     Args.push_back(getAlignmentValue32(PtrOp1));
4313 
4314     Ops[1] = Builder.CreateCall(F, Args, "vld_dup");
4315     // splat lane 0 to all elts in each vector of the result.
4316     for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
4317       Value *Val = Builder.CreateExtractValue(Ops[1], i);
4318       Value *Elt = Builder.CreateBitCast(Val, Ty);
4319       Elt = EmitNeonSplat(Elt, CI);
4320       Elt = Builder.CreateBitCast(Elt, Val->getType());
4321       Ops[1] = Builder.CreateInsertValue(Ops[1], Elt, i);
4322     }
4323     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
4324     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
4325     return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]);
4326   }
4327   case NEON::BI__builtin_neon_vqrshrn_n_v:
4328     Int =
4329       usgn ? Intrinsic::arm_neon_vqrshiftnu : Intrinsic::arm_neon_vqrshiftns;
4330     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqrshrn_n",
4331                         1, true);
4332   case NEON::BI__builtin_neon_vqrshrun_n_v:
4333     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqrshiftnsu, Ty),
4334                         Ops, "vqrshrun_n", 1, true);
4335   case NEON::BI__builtin_neon_vqshrn_n_v:
4336     Int = usgn ? Intrinsic::arm_neon_vqshiftnu : Intrinsic::arm_neon_vqshiftns;
4337     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshrn_n",
4338                         1, true);
4339   case NEON::BI__builtin_neon_vqshrun_n_v:
4340     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqshiftnsu, Ty),
4341                         Ops, "vqshrun_n", 1, true);
4342   case NEON::BI__builtin_neon_vrecpe_v:
4343   case NEON::BI__builtin_neon_vrecpeq_v:
4344     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrecpe, Ty),
4345                         Ops, "vrecpe");
4346   case NEON::BI__builtin_neon_vrshrn_n_v:
4347     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrshiftn, Ty),
4348                         Ops, "vrshrn_n", 1, true);
4349   case NEON::BI__builtin_neon_vrsra_n_v:
4350   case NEON::BI__builtin_neon_vrsraq_n_v:
4351     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
4352     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
4353     Ops[2] = EmitNeonShiftVector(Ops[2], Ty, true);
4354     Int = usgn ? Intrinsic::arm_neon_vrshiftu : Intrinsic::arm_neon_vrshifts;
4355     Ops[1] = Builder.CreateCall(CGM.getIntrinsic(Int, Ty), {Ops[1], Ops[2]});
4356     return Builder.CreateAdd(Ops[0], Ops[1], "vrsra_n");
4357   case NEON::BI__builtin_neon_vsri_n_v:
4358   case NEON::BI__builtin_neon_vsriq_n_v:
4359     rightShift = true;
4360   case NEON::BI__builtin_neon_vsli_n_v:
4361   case NEON::BI__builtin_neon_vsliq_n_v:
4362     Ops[2] = EmitNeonShiftVector(Ops[2], Ty, rightShift);
4363     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vshiftins, Ty),
4364                         Ops, "vsli_n");
4365   case NEON::BI__builtin_neon_vsra_n_v:
4366   case NEON::BI__builtin_neon_vsraq_n_v:
4367     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
4368     Ops[1] = EmitNeonRShiftImm(Ops[1], Ops[2], Ty, usgn, "vsra_n");
4369     return Builder.CreateAdd(Ops[0], Ops[1]);
4370   case NEON::BI__builtin_neon_vst1q_lane_v:
4371     // Handle 64-bit integer elements as a special case.  Use a shuffle to get
4372     // a one-element vector and avoid poor code for i64 in the backend.
4373     if (VTy->getElementType()->isIntegerTy(64)) {
4374       Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
4375       Value *SV = llvm::ConstantVector::get(cast<llvm::Constant>(Ops[2]));
4376       Ops[1] = Builder.CreateShuffleVector(Ops[1], Ops[1], SV);
4377       Ops[2] = getAlignmentValue32(PtrOp0);
4378       llvm::Type *Tys[] = {Int8PtrTy, Ops[1]->getType()};
4379       return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst1,
4380                                                  Tys), Ops);
4381     }
4382     // fall through
4383   case NEON::BI__builtin_neon_vst1_lane_v: {
4384     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
4385     Ops[1] = Builder.CreateExtractElement(Ops[1], Ops[2]);
4386     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
4387     auto St = Builder.CreateStore(Ops[1], Builder.CreateBitCast(PtrOp0, Ty));
4388     return St;
4389   }
4390   case NEON::BI__builtin_neon_vtbl1_v:
4391     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl1),
4392                         Ops, "vtbl1");
4393   case NEON::BI__builtin_neon_vtbl2_v:
4394     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl2),
4395                         Ops, "vtbl2");
4396   case NEON::BI__builtin_neon_vtbl3_v:
4397     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl3),
4398                         Ops, "vtbl3");
4399   case NEON::BI__builtin_neon_vtbl4_v:
4400     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl4),
4401                         Ops, "vtbl4");
4402   case NEON::BI__builtin_neon_vtbx1_v:
4403     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx1),
4404                         Ops, "vtbx1");
4405   case NEON::BI__builtin_neon_vtbx2_v:
4406     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx2),
4407                         Ops, "vtbx2");
4408   case NEON::BI__builtin_neon_vtbx3_v:
4409     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx3),
4410                         Ops, "vtbx3");
4411   case NEON::BI__builtin_neon_vtbx4_v:
4412     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx4),
4413                         Ops, "vtbx4");
4414   }
4415 }
4416 
4417 static Value *EmitAArch64TblBuiltinExpr(CodeGenFunction &CGF, unsigned BuiltinID,
4418                                       const CallExpr *E,
4419                                       SmallVectorImpl<Value *> &Ops) {
4420   unsigned int Int = 0;
4421   const char *s = nullptr;
4422 
4423   switch (BuiltinID) {
4424   default:
4425     return nullptr;
4426   case NEON::BI__builtin_neon_vtbl1_v:
4427   case NEON::BI__builtin_neon_vqtbl1_v:
4428   case NEON::BI__builtin_neon_vqtbl1q_v:
4429   case NEON::BI__builtin_neon_vtbl2_v:
4430   case NEON::BI__builtin_neon_vqtbl2_v:
4431   case NEON::BI__builtin_neon_vqtbl2q_v:
4432   case NEON::BI__builtin_neon_vtbl3_v:
4433   case NEON::BI__builtin_neon_vqtbl3_v:
4434   case NEON::BI__builtin_neon_vqtbl3q_v:
4435   case NEON::BI__builtin_neon_vtbl4_v:
4436   case NEON::BI__builtin_neon_vqtbl4_v:
4437   case NEON::BI__builtin_neon_vqtbl4q_v:
4438     break;
4439   case NEON::BI__builtin_neon_vtbx1_v:
4440   case NEON::BI__builtin_neon_vqtbx1_v:
4441   case NEON::BI__builtin_neon_vqtbx1q_v:
4442   case NEON::BI__builtin_neon_vtbx2_v:
4443   case NEON::BI__builtin_neon_vqtbx2_v:
4444   case NEON::BI__builtin_neon_vqtbx2q_v:
4445   case NEON::BI__builtin_neon_vtbx3_v:
4446   case NEON::BI__builtin_neon_vqtbx3_v:
4447   case NEON::BI__builtin_neon_vqtbx3q_v:
4448   case NEON::BI__builtin_neon_vtbx4_v:
4449   case NEON::BI__builtin_neon_vqtbx4_v:
4450   case NEON::BI__builtin_neon_vqtbx4q_v:
4451     break;
4452   }
4453 
4454   assert(E->getNumArgs() >= 3);
4455 
4456   // Get the last argument, which specifies the vector type.
4457   llvm::APSInt Result;
4458   const Expr *Arg = E->getArg(E->getNumArgs() - 1);
4459   if (!Arg->isIntegerConstantExpr(Result, CGF.getContext()))
4460     return nullptr;
4461 
4462   // Determine the type of this overloaded NEON intrinsic.
4463   NeonTypeFlags Type(Result.getZExtValue());
4464   llvm::VectorType *Ty = GetNeonType(&CGF, Type);
4465   if (!Ty)
4466     return nullptr;
4467 
4468   CodeGen::CGBuilderTy &Builder = CGF.Builder;
4469 
4470   // AArch64 scalar builtins are not overloaded, they do not have an extra
4471   // argument that specifies the vector type, need to handle each case.
4472   switch (BuiltinID) {
4473   case NEON::BI__builtin_neon_vtbl1_v: {
4474     return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 1), nullptr,
4475                               Ops[1], Ty, Intrinsic::aarch64_neon_tbl1,
4476                               "vtbl1");
4477   }
4478   case NEON::BI__builtin_neon_vtbl2_v: {
4479     return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 2), nullptr,
4480                               Ops[2], Ty, Intrinsic::aarch64_neon_tbl1,
4481                               "vtbl1");
4482   }
4483   case NEON::BI__builtin_neon_vtbl3_v: {
4484     return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 3), nullptr,
4485                               Ops[3], Ty, Intrinsic::aarch64_neon_tbl2,
4486                               "vtbl2");
4487   }
4488   case NEON::BI__builtin_neon_vtbl4_v: {
4489     return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 4), nullptr,
4490                               Ops[4], Ty, Intrinsic::aarch64_neon_tbl2,
4491                               "vtbl2");
4492   }
4493   case NEON::BI__builtin_neon_vtbx1_v: {
4494     Value *TblRes =
4495         packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 1), nullptr, Ops[2],
4496                            Ty, Intrinsic::aarch64_neon_tbl1, "vtbl1");
4497 
4498     llvm::Constant *EightV = ConstantInt::get(Ty, 8);
4499     Value *CmpRes = Builder.CreateICmp(ICmpInst::ICMP_UGE, Ops[2], EightV);
4500     CmpRes = Builder.CreateSExt(CmpRes, Ty);
4501 
4502     Value *EltsFromInput = Builder.CreateAnd(CmpRes, Ops[0]);
4503     Value *EltsFromTbl = Builder.CreateAnd(Builder.CreateNot(CmpRes), TblRes);
4504     return Builder.CreateOr(EltsFromInput, EltsFromTbl, "vtbx");
4505   }
4506   case NEON::BI__builtin_neon_vtbx2_v: {
4507     return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 2), Ops[0],
4508                               Ops[3], Ty, Intrinsic::aarch64_neon_tbx1,
4509                               "vtbx1");
4510   }
4511   case NEON::BI__builtin_neon_vtbx3_v: {
4512     Value *TblRes =
4513         packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 3), nullptr, Ops[4],
4514                            Ty, Intrinsic::aarch64_neon_tbl2, "vtbl2");
4515 
4516     llvm::Constant *TwentyFourV = ConstantInt::get(Ty, 24);
4517     Value *CmpRes = Builder.CreateICmp(ICmpInst::ICMP_UGE, Ops[4],
4518                                            TwentyFourV);
4519     CmpRes = Builder.CreateSExt(CmpRes, Ty);
4520 
4521     Value *EltsFromInput = Builder.CreateAnd(CmpRes, Ops[0]);
4522     Value *EltsFromTbl = Builder.CreateAnd(Builder.CreateNot(CmpRes), TblRes);
4523     return Builder.CreateOr(EltsFromInput, EltsFromTbl, "vtbx");
4524   }
4525   case NEON::BI__builtin_neon_vtbx4_v: {
4526     return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 4), Ops[0],
4527                               Ops[5], Ty, Intrinsic::aarch64_neon_tbx2,
4528                               "vtbx2");
4529   }
4530   case NEON::BI__builtin_neon_vqtbl1_v:
4531   case NEON::BI__builtin_neon_vqtbl1q_v:
4532     Int = Intrinsic::aarch64_neon_tbl1; s = "vtbl1"; break;
4533   case NEON::BI__builtin_neon_vqtbl2_v:
4534   case NEON::BI__builtin_neon_vqtbl2q_v: {
4535     Int = Intrinsic::aarch64_neon_tbl2; s = "vtbl2"; break;
4536   case NEON::BI__builtin_neon_vqtbl3_v:
4537   case NEON::BI__builtin_neon_vqtbl3q_v:
4538     Int = Intrinsic::aarch64_neon_tbl3; s = "vtbl3"; break;
4539   case NEON::BI__builtin_neon_vqtbl4_v:
4540   case NEON::BI__builtin_neon_vqtbl4q_v:
4541     Int = Intrinsic::aarch64_neon_tbl4; s = "vtbl4"; break;
4542   case NEON::BI__builtin_neon_vqtbx1_v:
4543   case NEON::BI__builtin_neon_vqtbx1q_v:
4544     Int = Intrinsic::aarch64_neon_tbx1; s = "vtbx1"; break;
4545   case NEON::BI__builtin_neon_vqtbx2_v:
4546   case NEON::BI__builtin_neon_vqtbx2q_v:
4547     Int = Intrinsic::aarch64_neon_tbx2; s = "vtbx2"; break;
4548   case NEON::BI__builtin_neon_vqtbx3_v:
4549   case NEON::BI__builtin_neon_vqtbx3q_v:
4550     Int = Intrinsic::aarch64_neon_tbx3; s = "vtbx3"; break;
4551   case NEON::BI__builtin_neon_vqtbx4_v:
4552   case NEON::BI__builtin_neon_vqtbx4q_v:
4553     Int = Intrinsic::aarch64_neon_tbx4; s = "vtbx4"; break;
4554   }
4555   }
4556 
4557   if (!Int)
4558     return nullptr;
4559 
4560   Function *F = CGF.CGM.getIntrinsic(Int, Ty);
4561   return CGF.EmitNeonCall(F, Ops, s);
4562 }
4563 
4564 Value *CodeGenFunction::vectorWrapScalar16(Value *Op) {
4565   llvm::Type *VTy = llvm::VectorType::get(Int16Ty, 4);
4566   Op = Builder.CreateBitCast(Op, Int16Ty);
4567   Value *V = UndefValue::get(VTy);
4568   llvm::Constant *CI = ConstantInt::get(SizeTy, 0);
4569   Op = Builder.CreateInsertElement(V, Op, CI);
4570   return Op;
4571 }
4572 
4573 Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
4574                                                const CallExpr *E) {
4575   unsigned HintID = static_cast<unsigned>(-1);
4576   switch (BuiltinID) {
4577   default: break;
4578   case AArch64::BI__builtin_arm_nop:
4579     HintID = 0;
4580     break;
4581   case AArch64::BI__builtin_arm_yield:
4582     HintID = 1;
4583     break;
4584   case AArch64::BI__builtin_arm_wfe:
4585     HintID = 2;
4586     break;
4587   case AArch64::BI__builtin_arm_wfi:
4588     HintID = 3;
4589     break;
4590   case AArch64::BI__builtin_arm_sev:
4591     HintID = 4;
4592     break;
4593   case AArch64::BI__builtin_arm_sevl:
4594     HintID = 5;
4595     break;
4596   }
4597 
4598   if (HintID != static_cast<unsigned>(-1)) {
4599     Function *F = CGM.getIntrinsic(Intrinsic::aarch64_hint);
4600     return Builder.CreateCall(F, llvm::ConstantInt::get(Int32Ty, HintID));
4601   }
4602 
4603   if (BuiltinID == AArch64::BI__builtin_arm_prefetch) {
4604     Value *Address         = EmitScalarExpr(E->getArg(0));
4605     Value *RW              = EmitScalarExpr(E->getArg(1));
4606     Value *CacheLevel      = EmitScalarExpr(E->getArg(2));
4607     Value *RetentionPolicy = EmitScalarExpr(E->getArg(3));
4608     Value *IsData          = EmitScalarExpr(E->getArg(4));
4609 
4610     Value *Locality = nullptr;
4611     if (cast<llvm::ConstantInt>(RetentionPolicy)->isZero()) {
4612       // Temporal fetch, needs to convert cache level to locality.
4613       Locality = llvm::ConstantInt::get(Int32Ty,
4614         -cast<llvm::ConstantInt>(CacheLevel)->getValue() + 3);
4615     } else {
4616       // Streaming fetch.
4617       Locality = llvm::ConstantInt::get(Int32Ty, 0);
4618     }
4619 
4620     // FIXME: We need AArch64 specific LLVM intrinsic if we want to specify
4621     // PLDL3STRM or PLDL2STRM.
4622     Value *F = CGM.getIntrinsic(Intrinsic::prefetch);
4623     return Builder.CreateCall(F, {Address, RW, Locality, IsData});
4624   }
4625 
4626   if (BuiltinID == AArch64::BI__builtin_arm_rbit) {
4627     assert((getContext().getTypeSize(E->getType()) == 32) &&
4628            "rbit of unusual size!");
4629     llvm::Value *Arg = EmitScalarExpr(E->getArg(0));
4630     return Builder.CreateCall(
4631         CGM.getIntrinsic(Intrinsic::aarch64_rbit, Arg->getType()), Arg, "rbit");
4632   }
4633   if (BuiltinID == AArch64::BI__builtin_arm_rbit64) {
4634     assert((getContext().getTypeSize(E->getType()) == 64) &&
4635            "rbit of unusual size!");
4636     llvm::Value *Arg = EmitScalarExpr(E->getArg(0));
4637     return Builder.CreateCall(
4638         CGM.getIntrinsic(Intrinsic::aarch64_rbit, Arg->getType()), Arg, "rbit");
4639   }
4640 
4641   if (BuiltinID == AArch64::BI__clear_cache) {
4642     assert(E->getNumArgs() == 2 && "__clear_cache takes 2 arguments");
4643     const FunctionDecl *FD = E->getDirectCallee();
4644     Value *Ops[2];
4645     for (unsigned i = 0; i < 2; i++)
4646       Ops[i] = EmitScalarExpr(E->getArg(i));
4647     llvm::Type *Ty = CGM.getTypes().ConvertType(FD->getType());
4648     llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty);
4649     StringRef Name = FD->getName();
4650     return EmitNounwindRuntimeCall(CGM.CreateRuntimeFunction(FTy, Name), Ops);
4651   }
4652 
4653   if ((BuiltinID == AArch64::BI__builtin_arm_ldrex ||
4654       BuiltinID == AArch64::BI__builtin_arm_ldaex) &&
4655       getContext().getTypeSize(E->getType()) == 128) {
4656     Function *F = CGM.getIntrinsic(BuiltinID == AArch64::BI__builtin_arm_ldaex
4657                                        ? Intrinsic::aarch64_ldaxp
4658                                        : Intrinsic::aarch64_ldxp);
4659 
4660     Value *LdPtr = EmitScalarExpr(E->getArg(0));
4661     Value *Val = Builder.CreateCall(F, Builder.CreateBitCast(LdPtr, Int8PtrTy),
4662                                     "ldxp");
4663 
4664     Value *Val0 = Builder.CreateExtractValue(Val, 1);
4665     Value *Val1 = Builder.CreateExtractValue(Val, 0);
4666     llvm::Type *Int128Ty = llvm::IntegerType::get(getLLVMContext(), 128);
4667     Val0 = Builder.CreateZExt(Val0, Int128Ty);
4668     Val1 = Builder.CreateZExt(Val1, Int128Ty);
4669 
4670     Value *ShiftCst = llvm::ConstantInt::get(Int128Ty, 64);
4671     Val = Builder.CreateShl(Val0, ShiftCst, "shl", true /* nuw */);
4672     Val = Builder.CreateOr(Val, Val1);
4673     return Builder.CreateBitCast(Val, ConvertType(E->getType()));
4674   } else if (BuiltinID == AArch64::BI__builtin_arm_ldrex ||
4675              BuiltinID == AArch64::BI__builtin_arm_ldaex) {
4676     Value *LoadAddr = EmitScalarExpr(E->getArg(0));
4677 
4678     QualType Ty = E->getType();
4679     llvm::Type *RealResTy = ConvertType(Ty);
4680     llvm::Type *IntResTy = llvm::IntegerType::get(getLLVMContext(),
4681                                                   getContext().getTypeSize(Ty));
4682     LoadAddr = Builder.CreateBitCast(LoadAddr, IntResTy->getPointerTo());
4683 
4684     Function *F = CGM.getIntrinsic(BuiltinID == AArch64::BI__builtin_arm_ldaex
4685                                        ? Intrinsic::aarch64_ldaxr
4686                                        : Intrinsic::aarch64_ldxr,
4687                                    LoadAddr->getType());
4688     Value *Val = Builder.CreateCall(F, LoadAddr, "ldxr");
4689 
4690     if (RealResTy->isPointerTy())
4691       return Builder.CreateIntToPtr(Val, RealResTy);
4692 
4693     Val = Builder.CreateTruncOrBitCast(Val, IntResTy);
4694     return Builder.CreateBitCast(Val, RealResTy);
4695   }
4696 
4697   if ((BuiltinID == AArch64::BI__builtin_arm_strex ||
4698        BuiltinID == AArch64::BI__builtin_arm_stlex) &&
4699       getContext().getTypeSize(E->getArg(0)->getType()) == 128) {
4700     Function *F = CGM.getIntrinsic(BuiltinID == AArch64::BI__builtin_arm_stlex
4701                                        ? Intrinsic::aarch64_stlxp
4702                                        : Intrinsic::aarch64_stxp);
4703     llvm::Type *STy = llvm::StructType::get(Int64Ty, Int64Ty, nullptr);
4704 
4705     Address Tmp = CreateMemTemp(E->getArg(0)->getType());
4706     EmitAnyExprToMem(E->getArg(0), Tmp, Qualifiers(), /*init*/ true);
4707 
4708     Tmp = Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(STy));
4709     llvm::Value *Val = Builder.CreateLoad(Tmp);
4710 
4711     Value *Arg0 = Builder.CreateExtractValue(Val, 0);
4712     Value *Arg1 = Builder.CreateExtractValue(Val, 1);
4713     Value *StPtr = Builder.CreateBitCast(EmitScalarExpr(E->getArg(1)),
4714                                          Int8PtrTy);
4715     return Builder.CreateCall(F, {Arg0, Arg1, StPtr}, "stxp");
4716   }
4717 
4718   if (BuiltinID == AArch64::BI__builtin_arm_strex ||
4719       BuiltinID == AArch64::BI__builtin_arm_stlex) {
4720     Value *StoreVal = EmitScalarExpr(E->getArg(0));
4721     Value *StoreAddr = EmitScalarExpr(E->getArg(1));
4722 
4723     QualType Ty = E->getArg(0)->getType();
4724     llvm::Type *StoreTy = llvm::IntegerType::get(getLLVMContext(),
4725                                                  getContext().getTypeSize(Ty));
4726     StoreAddr = Builder.CreateBitCast(StoreAddr, StoreTy->getPointerTo());
4727 
4728     if (StoreVal->getType()->isPointerTy())
4729       StoreVal = Builder.CreatePtrToInt(StoreVal, Int64Ty);
4730     else {
4731       StoreVal = Builder.CreateBitCast(StoreVal, StoreTy);
4732       StoreVal = Builder.CreateZExtOrBitCast(StoreVal, Int64Ty);
4733     }
4734 
4735     Function *F = CGM.getIntrinsic(BuiltinID == AArch64::BI__builtin_arm_stlex
4736                                        ? Intrinsic::aarch64_stlxr
4737                                        : Intrinsic::aarch64_stxr,
4738                                    StoreAddr->getType());
4739     return Builder.CreateCall(F, {StoreVal, StoreAddr}, "stxr");
4740   }
4741 
4742   if (BuiltinID == AArch64::BI__builtin_arm_clrex) {
4743     Function *F = CGM.getIntrinsic(Intrinsic::aarch64_clrex);
4744     return Builder.CreateCall(F);
4745   }
4746 
4747   // CRC32
4748   Intrinsic::ID CRCIntrinsicID = Intrinsic::not_intrinsic;
4749   switch (BuiltinID) {
4750   case AArch64::BI__builtin_arm_crc32b:
4751     CRCIntrinsicID = Intrinsic::aarch64_crc32b; break;
4752   case AArch64::BI__builtin_arm_crc32cb:
4753     CRCIntrinsicID = Intrinsic::aarch64_crc32cb; break;
4754   case AArch64::BI__builtin_arm_crc32h:
4755     CRCIntrinsicID = Intrinsic::aarch64_crc32h; break;
4756   case AArch64::BI__builtin_arm_crc32ch:
4757     CRCIntrinsicID = Intrinsic::aarch64_crc32ch; break;
4758   case AArch64::BI__builtin_arm_crc32w:
4759     CRCIntrinsicID = Intrinsic::aarch64_crc32w; break;
4760   case AArch64::BI__builtin_arm_crc32cw:
4761     CRCIntrinsicID = Intrinsic::aarch64_crc32cw; break;
4762   case AArch64::BI__builtin_arm_crc32d:
4763     CRCIntrinsicID = Intrinsic::aarch64_crc32x; break;
4764   case AArch64::BI__builtin_arm_crc32cd:
4765     CRCIntrinsicID = Intrinsic::aarch64_crc32cx; break;
4766   }
4767 
4768   if (CRCIntrinsicID != Intrinsic::not_intrinsic) {
4769     Value *Arg0 = EmitScalarExpr(E->getArg(0));
4770     Value *Arg1 = EmitScalarExpr(E->getArg(1));
4771     Function *F = CGM.getIntrinsic(CRCIntrinsicID);
4772 
4773     llvm::Type *DataTy = F->getFunctionType()->getParamType(1);
4774     Arg1 = Builder.CreateZExtOrBitCast(Arg1, DataTy);
4775 
4776     return Builder.CreateCall(F, {Arg0, Arg1});
4777   }
4778 
4779   if (BuiltinID == AArch64::BI__builtin_arm_rsr ||
4780       BuiltinID == AArch64::BI__builtin_arm_rsr64 ||
4781       BuiltinID == AArch64::BI__builtin_arm_rsrp ||
4782       BuiltinID == AArch64::BI__builtin_arm_wsr ||
4783       BuiltinID == AArch64::BI__builtin_arm_wsr64 ||
4784       BuiltinID == AArch64::BI__builtin_arm_wsrp) {
4785 
4786     bool IsRead = BuiltinID == AArch64::BI__builtin_arm_rsr ||
4787                   BuiltinID == AArch64::BI__builtin_arm_rsr64 ||
4788                   BuiltinID == AArch64::BI__builtin_arm_rsrp;
4789 
4790     bool IsPointerBuiltin = BuiltinID == AArch64::BI__builtin_arm_rsrp ||
4791                             BuiltinID == AArch64::BI__builtin_arm_wsrp;
4792 
4793     bool Is64Bit = BuiltinID != AArch64::BI__builtin_arm_rsr &&
4794                    BuiltinID != AArch64::BI__builtin_arm_wsr;
4795 
4796     llvm::Type *ValueType;
4797     llvm::Type *RegisterType = Int64Ty;
4798     if (IsPointerBuiltin) {
4799       ValueType = VoidPtrTy;
4800     } else if (Is64Bit) {
4801       ValueType = Int64Ty;
4802     } else {
4803       ValueType = Int32Ty;
4804     }
4805 
4806     return EmitSpecialRegisterBuiltin(*this, E, RegisterType, ValueType, IsRead);
4807   }
4808 
4809   // Find out if any arguments are required to be integer constant
4810   // expressions.
4811   unsigned ICEArguments = 0;
4812   ASTContext::GetBuiltinTypeError Error;
4813   getContext().GetBuiltinType(BuiltinID, Error, &ICEArguments);
4814   assert(Error == ASTContext::GE_None && "Should not codegen an error");
4815 
4816   llvm::SmallVector<Value*, 4> Ops;
4817   for (unsigned i = 0, e = E->getNumArgs() - 1; i != e; i++) {
4818     if ((ICEArguments & (1 << i)) == 0) {
4819       Ops.push_back(EmitScalarExpr(E->getArg(i)));
4820     } else {
4821       // If this is required to be a constant, constant fold it so that we know
4822       // that the generated intrinsic gets a ConstantInt.
4823       llvm::APSInt Result;
4824       bool IsConst = E->getArg(i)->isIntegerConstantExpr(Result, getContext());
4825       assert(IsConst && "Constant arg isn't actually constant?");
4826       (void)IsConst;
4827       Ops.push_back(llvm::ConstantInt::get(getLLVMContext(), Result));
4828     }
4829   }
4830 
4831   auto SISDMap = makeArrayRef(AArch64SISDIntrinsicMap);
4832   const NeonIntrinsicInfo *Builtin = findNeonIntrinsicInMap(
4833       SISDMap, BuiltinID, AArch64SISDIntrinsicsProvenSorted);
4834 
4835   if (Builtin) {
4836     Ops.push_back(EmitScalarExpr(E->getArg(E->getNumArgs() - 1)));
4837     Value *Result = EmitCommonNeonSISDBuiltinExpr(*this, *Builtin, Ops, E);
4838     assert(Result && "SISD intrinsic should have been handled");
4839     return Result;
4840   }
4841 
4842   llvm::APSInt Result;
4843   const Expr *Arg = E->getArg(E->getNumArgs()-1);
4844   NeonTypeFlags Type(0);
4845   if (Arg->isIntegerConstantExpr(Result, getContext()))
4846     // Determine the type of this overloaded NEON intrinsic.
4847     Type = NeonTypeFlags(Result.getZExtValue());
4848 
4849   bool usgn = Type.isUnsigned();
4850   bool quad = Type.isQuad();
4851 
4852   // Handle non-overloaded intrinsics first.
4853   switch (BuiltinID) {
4854   default: break;
4855   case NEON::BI__builtin_neon_vldrq_p128: {
4856     llvm::Type *Int128PTy = llvm::Type::getIntNPtrTy(getLLVMContext(), 128);
4857     Value *Ptr = Builder.CreateBitCast(EmitScalarExpr(E->getArg(0)), Int128PTy);
4858     return Builder.CreateDefaultAlignedLoad(Ptr);
4859   }
4860   case NEON::BI__builtin_neon_vstrq_p128: {
4861     llvm::Type *Int128PTy = llvm::Type::getIntNPtrTy(getLLVMContext(), 128);
4862     Value *Ptr = Builder.CreateBitCast(Ops[0], Int128PTy);
4863     return Builder.CreateDefaultAlignedStore(EmitScalarExpr(E->getArg(1)), Ptr);
4864   }
4865   case NEON::BI__builtin_neon_vcvts_u32_f32:
4866   case NEON::BI__builtin_neon_vcvtd_u64_f64:
4867     usgn = true;
4868     // FALL THROUGH
4869   case NEON::BI__builtin_neon_vcvts_s32_f32:
4870   case NEON::BI__builtin_neon_vcvtd_s64_f64: {
4871     Ops.push_back(EmitScalarExpr(E->getArg(0)));
4872     bool Is64 = Ops[0]->getType()->getPrimitiveSizeInBits() == 64;
4873     llvm::Type *InTy = Is64 ? Int64Ty : Int32Ty;
4874     llvm::Type *FTy = Is64 ? DoubleTy : FloatTy;
4875     Ops[0] = Builder.CreateBitCast(Ops[0], FTy);
4876     if (usgn)
4877       return Builder.CreateFPToUI(Ops[0], InTy);
4878     return Builder.CreateFPToSI(Ops[0], InTy);
4879   }
4880   case NEON::BI__builtin_neon_vcvts_f32_u32:
4881   case NEON::BI__builtin_neon_vcvtd_f64_u64:
4882     usgn = true;
4883     // FALL THROUGH
4884   case NEON::BI__builtin_neon_vcvts_f32_s32:
4885   case NEON::BI__builtin_neon_vcvtd_f64_s64: {
4886     Ops.push_back(EmitScalarExpr(E->getArg(0)));
4887     bool Is64 = Ops[0]->getType()->getPrimitiveSizeInBits() == 64;
4888     llvm::Type *InTy = Is64 ? Int64Ty : Int32Ty;
4889     llvm::Type *FTy = Is64 ? DoubleTy : FloatTy;
4890     Ops[0] = Builder.CreateBitCast(Ops[0], InTy);
4891     if (usgn)
4892       return Builder.CreateUIToFP(Ops[0], FTy);
4893     return Builder.CreateSIToFP(Ops[0], FTy);
4894   }
4895   case NEON::BI__builtin_neon_vpaddd_s64: {
4896     llvm::Type *Ty = llvm::VectorType::get(Int64Ty, 2);
4897     Value *Vec = EmitScalarExpr(E->getArg(0));
4898     // The vector is v2f64, so make sure it's bitcast to that.
4899     Vec = Builder.CreateBitCast(Vec, Ty, "v2i64");
4900     llvm::Value *Idx0 = llvm::ConstantInt::get(SizeTy, 0);
4901     llvm::Value *Idx1 = llvm::ConstantInt::get(SizeTy, 1);
4902     Value *Op0 = Builder.CreateExtractElement(Vec, Idx0, "lane0");
4903     Value *Op1 = Builder.CreateExtractElement(Vec, Idx1, "lane1");
4904     // Pairwise addition of a v2f64 into a scalar f64.
4905     return Builder.CreateAdd(Op0, Op1, "vpaddd");
4906   }
4907   case NEON::BI__builtin_neon_vpaddd_f64: {
4908     llvm::Type *Ty =
4909       llvm::VectorType::get(DoubleTy, 2);
4910     Value *Vec = EmitScalarExpr(E->getArg(0));
4911     // The vector is v2f64, so make sure it's bitcast to that.
4912     Vec = Builder.CreateBitCast(Vec, Ty, "v2f64");
4913     llvm::Value *Idx0 = llvm::ConstantInt::get(SizeTy, 0);
4914     llvm::Value *Idx1 = llvm::ConstantInt::get(SizeTy, 1);
4915     Value *Op0 = Builder.CreateExtractElement(Vec, Idx0, "lane0");
4916     Value *Op1 = Builder.CreateExtractElement(Vec, Idx1, "lane1");
4917     // Pairwise addition of a v2f64 into a scalar f64.
4918     return Builder.CreateFAdd(Op0, Op1, "vpaddd");
4919   }
4920   case NEON::BI__builtin_neon_vpadds_f32: {
4921     llvm::Type *Ty =
4922       llvm::VectorType::get(FloatTy, 2);
4923     Value *Vec = EmitScalarExpr(E->getArg(0));
4924     // The vector is v2f32, so make sure it's bitcast to that.
4925     Vec = Builder.CreateBitCast(Vec, Ty, "v2f32");
4926     llvm::Value *Idx0 = llvm::ConstantInt::get(SizeTy, 0);
4927     llvm::Value *Idx1 = llvm::ConstantInt::get(SizeTy, 1);
4928     Value *Op0 = Builder.CreateExtractElement(Vec, Idx0, "lane0");
4929     Value *Op1 = Builder.CreateExtractElement(Vec, Idx1, "lane1");
4930     // Pairwise addition of a v2f32 into a scalar f32.
4931     return Builder.CreateFAdd(Op0, Op1, "vpaddd");
4932   }
4933   case NEON::BI__builtin_neon_vceqzd_s64:
4934   case NEON::BI__builtin_neon_vceqzd_f64:
4935   case NEON::BI__builtin_neon_vceqzs_f32:
4936     Ops.push_back(EmitScalarExpr(E->getArg(0)));
4937     return EmitAArch64CompareBuiltinExpr(
4938         Ops[0], ConvertType(E->getCallReturnType(getContext())),
4939         ICmpInst::FCMP_OEQ, ICmpInst::ICMP_EQ, "vceqz");
4940   case NEON::BI__builtin_neon_vcgezd_s64:
4941   case NEON::BI__builtin_neon_vcgezd_f64:
4942   case NEON::BI__builtin_neon_vcgezs_f32:
4943     Ops.push_back(EmitScalarExpr(E->getArg(0)));
4944     return EmitAArch64CompareBuiltinExpr(
4945         Ops[0], ConvertType(E->getCallReturnType(getContext())),
4946         ICmpInst::FCMP_OGE, ICmpInst::ICMP_SGE, "vcgez");
4947   case NEON::BI__builtin_neon_vclezd_s64:
4948   case NEON::BI__builtin_neon_vclezd_f64:
4949   case NEON::BI__builtin_neon_vclezs_f32:
4950     Ops.push_back(EmitScalarExpr(E->getArg(0)));
4951     return EmitAArch64CompareBuiltinExpr(
4952         Ops[0], ConvertType(E->getCallReturnType(getContext())),
4953         ICmpInst::FCMP_OLE, ICmpInst::ICMP_SLE, "vclez");
4954   case NEON::BI__builtin_neon_vcgtzd_s64:
4955   case NEON::BI__builtin_neon_vcgtzd_f64:
4956   case NEON::BI__builtin_neon_vcgtzs_f32:
4957     Ops.push_back(EmitScalarExpr(E->getArg(0)));
4958     return EmitAArch64CompareBuiltinExpr(
4959         Ops[0], ConvertType(E->getCallReturnType(getContext())),
4960         ICmpInst::FCMP_OGT, ICmpInst::ICMP_SGT, "vcgtz");
4961   case NEON::BI__builtin_neon_vcltzd_s64:
4962   case NEON::BI__builtin_neon_vcltzd_f64:
4963   case NEON::BI__builtin_neon_vcltzs_f32:
4964     Ops.push_back(EmitScalarExpr(E->getArg(0)));
4965     return EmitAArch64CompareBuiltinExpr(
4966         Ops[0], ConvertType(E->getCallReturnType(getContext())),
4967         ICmpInst::FCMP_OLT, ICmpInst::ICMP_SLT, "vcltz");
4968 
4969   case NEON::BI__builtin_neon_vceqzd_u64: {
4970     Ops.push_back(EmitScalarExpr(E->getArg(0)));
4971     Ops[0] = Builder.CreateBitCast(Ops[0], Int64Ty);
4972     Ops[0] =
4973         Builder.CreateICmpEQ(Ops[0], llvm::Constant::getNullValue(Int64Ty));
4974     return Builder.CreateSExt(Ops[0], Int64Ty, "vceqzd");
4975   }
4976   case NEON::BI__builtin_neon_vceqd_f64:
4977   case NEON::BI__builtin_neon_vcled_f64:
4978   case NEON::BI__builtin_neon_vcltd_f64:
4979   case NEON::BI__builtin_neon_vcged_f64:
4980   case NEON::BI__builtin_neon_vcgtd_f64: {
4981     llvm::CmpInst::Predicate P;
4982     switch (BuiltinID) {
4983     default: llvm_unreachable("missing builtin ID in switch!");
4984     case NEON::BI__builtin_neon_vceqd_f64: P = llvm::FCmpInst::FCMP_OEQ; break;
4985     case NEON::BI__builtin_neon_vcled_f64: P = llvm::FCmpInst::FCMP_OLE; break;
4986     case NEON::BI__builtin_neon_vcltd_f64: P = llvm::FCmpInst::FCMP_OLT; break;
4987     case NEON::BI__builtin_neon_vcged_f64: P = llvm::FCmpInst::FCMP_OGE; break;
4988     case NEON::BI__builtin_neon_vcgtd_f64: P = llvm::FCmpInst::FCMP_OGT; break;
4989     }
4990     Ops.push_back(EmitScalarExpr(E->getArg(1)));
4991     Ops[0] = Builder.CreateBitCast(Ops[0], DoubleTy);
4992     Ops[1] = Builder.CreateBitCast(Ops[1], DoubleTy);
4993     Ops[0] = Builder.CreateFCmp(P, Ops[0], Ops[1]);
4994     return Builder.CreateSExt(Ops[0], Int64Ty, "vcmpd");
4995   }
4996   case NEON::BI__builtin_neon_vceqs_f32:
4997   case NEON::BI__builtin_neon_vcles_f32:
4998   case NEON::BI__builtin_neon_vclts_f32:
4999   case NEON::BI__builtin_neon_vcges_f32:
5000   case NEON::BI__builtin_neon_vcgts_f32: {
5001     llvm::CmpInst::Predicate P;
5002     switch (BuiltinID) {
5003     default: llvm_unreachable("missing builtin ID in switch!");
5004     case NEON::BI__builtin_neon_vceqs_f32: P = llvm::FCmpInst::FCMP_OEQ; break;
5005     case NEON::BI__builtin_neon_vcles_f32: P = llvm::FCmpInst::FCMP_OLE; break;
5006     case NEON::BI__builtin_neon_vclts_f32: P = llvm::FCmpInst::FCMP_OLT; break;
5007     case NEON::BI__builtin_neon_vcges_f32: P = llvm::FCmpInst::FCMP_OGE; break;
5008     case NEON::BI__builtin_neon_vcgts_f32: P = llvm::FCmpInst::FCMP_OGT; break;
5009     }
5010     Ops.push_back(EmitScalarExpr(E->getArg(1)));
5011     Ops[0] = Builder.CreateBitCast(Ops[0], FloatTy);
5012     Ops[1] = Builder.CreateBitCast(Ops[1], FloatTy);
5013     Ops[0] = Builder.CreateFCmp(P, Ops[0], Ops[1]);
5014     return Builder.CreateSExt(Ops[0], Int32Ty, "vcmpd");
5015   }
5016   case NEON::BI__builtin_neon_vceqd_s64:
5017   case NEON::BI__builtin_neon_vceqd_u64:
5018   case NEON::BI__builtin_neon_vcgtd_s64:
5019   case NEON::BI__builtin_neon_vcgtd_u64:
5020   case NEON::BI__builtin_neon_vcltd_s64:
5021   case NEON::BI__builtin_neon_vcltd_u64:
5022   case NEON::BI__builtin_neon_vcged_u64:
5023   case NEON::BI__builtin_neon_vcged_s64:
5024   case NEON::BI__builtin_neon_vcled_u64:
5025   case NEON::BI__builtin_neon_vcled_s64: {
5026     llvm::CmpInst::Predicate P;
5027     switch (BuiltinID) {
5028     default: llvm_unreachable("missing builtin ID in switch!");
5029     case NEON::BI__builtin_neon_vceqd_s64:
5030     case NEON::BI__builtin_neon_vceqd_u64:P = llvm::ICmpInst::ICMP_EQ;break;
5031     case NEON::BI__builtin_neon_vcgtd_s64:P = llvm::ICmpInst::ICMP_SGT;break;
5032     case NEON::BI__builtin_neon_vcgtd_u64:P = llvm::ICmpInst::ICMP_UGT;break;
5033     case NEON::BI__builtin_neon_vcltd_s64:P = llvm::ICmpInst::ICMP_SLT;break;
5034     case NEON::BI__builtin_neon_vcltd_u64:P = llvm::ICmpInst::ICMP_ULT;break;
5035     case NEON::BI__builtin_neon_vcged_u64:P = llvm::ICmpInst::ICMP_UGE;break;
5036     case NEON::BI__builtin_neon_vcged_s64:P = llvm::ICmpInst::ICMP_SGE;break;
5037     case NEON::BI__builtin_neon_vcled_u64:P = llvm::ICmpInst::ICMP_ULE;break;
5038     case NEON::BI__builtin_neon_vcled_s64:P = llvm::ICmpInst::ICMP_SLE;break;
5039     }
5040     Ops.push_back(EmitScalarExpr(E->getArg(1)));
5041     Ops[0] = Builder.CreateBitCast(Ops[0], Int64Ty);
5042     Ops[1] = Builder.CreateBitCast(Ops[1], Int64Ty);
5043     Ops[0] = Builder.CreateICmp(P, Ops[0], Ops[1]);
5044     return Builder.CreateSExt(Ops[0], Int64Ty, "vceqd");
5045   }
5046   case NEON::BI__builtin_neon_vtstd_s64:
5047   case NEON::BI__builtin_neon_vtstd_u64: {
5048     Ops.push_back(EmitScalarExpr(E->getArg(1)));
5049     Ops[0] = Builder.CreateBitCast(Ops[0], Int64Ty);
5050     Ops[1] = Builder.CreateBitCast(Ops[1], Int64Ty);
5051     Ops[0] = Builder.CreateAnd(Ops[0], Ops[1]);
5052     Ops[0] = Builder.CreateICmp(ICmpInst::ICMP_NE, Ops[0],
5053                                 llvm::Constant::getNullValue(Int64Ty));
5054     return Builder.CreateSExt(Ops[0], Int64Ty, "vtstd");
5055   }
5056   case NEON::BI__builtin_neon_vset_lane_i8:
5057   case NEON::BI__builtin_neon_vset_lane_i16:
5058   case NEON::BI__builtin_neon_vset_lane_i32:
5059   case NEON::BI__builtin_neon_vset_lane_i64:
5060   case NEON::BI__builtin_neon_vset_lane_f32:
5061   case NEON::BI__builtin_neon_vsetq_lane_i8:
5062   case NEON::BI__builtin_neon_vsetq_lane_i16:
5063   case NEON::BI__builtin_neon_vsetq_lane_i32:
5064   case NEON::BI__builtin_neon_vsetq_lane_i64:
5065   case NEON::BI__builtin_neon_vsetq_lane_f32:
5066     Ops.push_back(EmitScalarExpr(E->getArg(2)));
5067     return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vset_lane");
5068   case NEON::BI__builtin_neon_vset_lane_f64:
5069     // The vector type needs a cast for the v1f64 variant.
5070     Ops[1] = Builder.CreateBitCast(Ops[1],
5071                                    llvm::VectorType::get(DoubleTy, 1));
5072     Ops.push_back(EmitScalarExpr(E->getArg(2)));
5073     return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vset_lane");
5074   case NEON::BI__builtin_neon_vsetq_lane_f64:
5075     // The vector type needs a cast for the v2f64 variant.
5076     Ops[1] = Builder.CreateBitCast(Ops[1],
5077         llvm::VectorType::get(DoubleTy, 2));
5078     Ops.push_back(EmitScalarExpr(E->getArg(2)));
5079     return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vset_lane");
5080 
5081   case NEON::BI__builtin_neon_vget_lane_i8:
5082   case NEON::BI__builtin_neon_vdupb_lane_i8:
5083     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int8Ty, 8));
5084     return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),
5085                                         "vget_lane");
5086   case NEON::BI__builtin_neon_vgetq_lane_i8:
5087   case NEON::BI__builtin_neon_vdupb_laneq_i8:
5088     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int8Ty, 16));
5089     return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),
5090                                         "vgetq_lane");
5091   case NEON::BI__builtin_neon_vget_lane_i16:
5092   case NEON::BI__builtin_neon_vduph_lane_i16:
5093     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int16Ty, 4));
5094     return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),
5095                                         "vget_lane");
5096   case NEON::BI__builtin_neon_vgetq_lane_i16:
5097   case NEON::BI__builtin_neon_vduph_laneq_i16:
5098     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int16Ty, 8));
5099     return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),
5100                                         "vgetq_lane");
5101   case NEON::BI__builtin_neon_vget_lane_i32:
5102   case NEON::BI__builtin_neon_vdups_lane_i32:
5103     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int32Ty, 2));
5104     return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),
5105                                         "vget_lane");
5106   case NEON::BI__builtin_neon_vdups_lane_f32:
5107     Ops[0] = Builder.CreateBitCast(Ops[0],
5108         llvm::VectorType::get(FloatTy, 2));
5109     return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),
5110                                         "vdups_lane");
5111   case NEON::BI__builtin_neon_vgetq_lane_i32:
5112   case NEON::BI__builtin_neon_vdups_laneq_i32:
5113     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int32Ty, 4));
5114     return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),
5115                                         "vgetq_lane");
5116   case NEON::BI__builtin_neon_vget_lane_i64:
5117   case NEON::BI__builtin_neon_vdupd_lane_i64:
5118     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int64Ty, 1));
5119     return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),
5120                                         "vget_lane");
5121   case NEON::BI__builtin_neon_vdupd_lane_f64:
5122     Ops[0] = Builder.CreateBitCast(Ops[0],
5123         llvm::VectorType::get(DoubleTy, 1));
5124     return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),
5125                                         "vdupd_lane");
5126   case NEON::BI__builtin_neon_vgetq_lane_i64:
5127   case NEON::BI__builtin_neon_vdupd_laneq_i64:
5128     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int64Ty, 2));
5129     return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),
5130                                         "vgetq_lane");
5131   case NEON::BI__builtin_neon_vget_lane_f32:
5132     Ops[0] = Builder.CreateBitCast(Ops[0],
5133         llvm::VectorType::get(FloatTy, 2));
5134     return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),
5135                                         "vget_lane");
5136   case NEON::BI__builtin_neon_vget_lane_f64:
5137     Ops[0] = Builder.CreateBitCast(Ops[0],
5138         llvm::VectorType::get(DoubleTy, 1));
5139     return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),
5140                                         "vget_lane");
5141   case NEON::BI__builtin_neon_vgetq_lane_f32:
5142   case NEON::BI__builtin_neon_vdups_laneq_f32:
5143     Ops[0] = Builder.CreateBitCast(Ops[0],
5144         llvm::VectorType::get(FloatTy, 4));
5145     return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),
5146                                         "vgetq_lane");
5147   case NEON::BI__builtin_neon_vgetq_lane_f64:
5148   case NEON::BI__builtin_neon_vdupd_laneq_f64:
5149     Ops[0] = Builder.CreateBitCast(Ops[0],
5150         llvm::VectorType::get(DoubleTy, 2));
5151     return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),
5152                                         "vgetq_lane");
5153   case NEON::BI__builtin_neon_vaddd_s64:
5154   case NEON::BI__builtin_neon_vaddd_u64:
5155     return Builder.CreateAdd(Ops[0], EmitScalarExpr(E->getArg(1)), "vaddd");
5156   case NEON::BI__builtin_neon_vsubd_s64:
5157   case NEON::BI__builtin_neon_vsubd_u64:
5158     return Builder.CreateSub(Ops[0], EmitScalarExpr(E->getArg(1)), "vsubd");
5159   case NEON::BI__builtin_neon_vqdmlalh_s16:
5160   case NEON::BI__builtin_neon_vqdmlslh_s16: {
5161     SmallVector<Value *, 2> ProductOps;
5162     ProductOps.push_back(vectorWrapScalar16(Ops[1]));
5163     ProductOps.push_back(vectorWrapScalar16(EmitScalarExpr(E->getArg(2))));
5164     llvm::Type *VTy = llvm::VectorType::get(Int32Ty, 4);
5165     Ops[1] = EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_sqdmull, VTy),
5166                           ProductOps, "vqdmlXl");
5167     Constant *CI = ConstantInt::get(SizeTy, 0);
5168     Ops[1] = Builder.CreateExtractElement(Ops[1], CI, "lane0");
5169 
5170     unsigned AccumInt = BuiltinID == NEON::BI__builtin_neon_vqdmlalh_s16
5171                                         ? Intrinsic::aarch64_neon_sqadd
5172                                         : Intrinsic::aarch64_neon_sqsub;
5173     return EmitNeonCall(CGM.getIntrinsic(AccumInt, Int32Ty), Ops, "vqdmlXl");
5174   }
5175   case NEON::BI__builtin_neon_vqshlud_n_s64: {
5176     Ops.push_back(EmitScalarExpr(E->getArg(1)));
5177     Ops[1] = Builder.CreateZExt(Ops[1], Int64Ty);
5178     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_sqshlu, Int64Ty),
5179                         Ops, "vqshlu_n");
5180   }
5181   case NEON::BI__builtin_neon_vqshld_n_u64:
5182   case NEON::BI__builtin_neon_vqshld_n_s64: {
5183     unsigned Int = BuiltinID == NEON::BI__builtin_neon_vqshld_n_u64
5184                                    ? Intrinsic::aarch64_neon_uqshl
5185                                    : Intrinsic::aarch64_neon_sqshl;
5186     Ops.push_back(EmitScalarExpr(E->getArg(1)));
5187     Ops[1] = Builder.CreateZExt(Ops[1], Int64Ty);
5188     return EmitNeonCall(CGM.getIntrinsic(Int, Int64Ty), Ops, "vqshl_n");
5189   }
5190   case NEON::BI__builtin_neon_vrshrd_n_u64:
5191   case NEON::BI__builtin_neon_vrshrd_n_s64: {
5192     unsigned Int = BuiltinID == NEON::BI__builtin_neon_vrshrd_n_u64
5193                                    ? Intrinsic::aarch64_neon_urshl
5194                                    : Intrinsic::aarch64_neon_srshl;
5195     Ops.push_back(EmitScalarExpr(E->getArg(1)));
5196     int SV = cast<ConstantInt>(Ops[1])->getSExtValue();
5197     Ops[1] = ConstantInt::get(Int64Ty, -SV);
5198     return EmitNeonCall(CGM.getIntrinsic(Int, Int64Ty), Ops, "vrshr_n");
5199   }
5200   case NEON::BI__builtin_neon_vrsrad_n_u64:
5201   case NEON::BI__builtin_neon_vrsrad_n_s64: {
5202     unsigned Int = BuiltinID == NEON::BI__builtin_neon_vrsrad_n_u64
5203                                    ? Intrinsic::aarch64_neon_urshl
5204                                    : Intrinsic::aarch64_neon_srshl;
5205     Ops[1] = Builder.CreateBitCast(Ops[1], Int64Ty);
5206     Ops.push_back(Builder.CreateNeg(EmitScalarExpr(E->getArg(2))));
5207     Ops[1] = Builder.CreateCall(CGM.getIntrinsic(Int, Int64Ty),
5208                                 {Ops[1], Builder.CreateSExt(Ops[2], Int64Ty)});
5209     return Builder.CreateAdd(Ops[0], Builder.CreateBitCast(Ops[1], Int64Ty));
5210   }
5211   case NEON::BI__builtin_neon_vshld_n_s64:
5212   case NEON::BI__builtin_neon_vshld_n_u64: {
5213     llvm::ConstantInt *Amt = cast<ConstantInt>(EmitScalarExpr(E->getArg(1)));
5214     return Builder.CreateShl(
5215         Ops[0], ConstantInt::get(Int64Ty, Amt->getZExtValue()), "shld_n");
5216   }
5217   case NEON::BI__builtin_neon_vshrd_n_s64: {
5218     llvm::ConstantInt *Amt = cast<ConstantInt>(EmitScalarExpr(E->getArg(1)));
5219     return Builder.CreateAShr(
5220         Ops[0], ConstantInt::get(Int64Ty, std::min(static_cast<uint64_t>(63),
5221                                                    Amt->getZExtValue())),
5222         "shrd_n");
5223   }
5224   case NEON::BI__builtin_neon_vshrd_n_u64: {
5225     llvm::ConstantInt *Amt = cast<ConstantInt>(EmitScalarExpr(E->getArg(1)));
5226     uint64_t ShiftAmt = Amt->getZExtValue();
5227     // Right-shifting an unsigned value by its size yields 0.
5228     if (ShiftAmt == 64)
5229       return ConstantInt::get(Int64Ty, 0);
5230     return Builder.CreateLShr(Ops[0], ConstantInt::get(Int64Ty, ShiftAmt),
5231                               "shrd_n");
5232   }
5233   case NEON::BI__builtin_neon_vsrad_n_s64: {
5234     llvm::ConstantInt *Amt = cast<ConstantInt>(EmitScalarExpr(E->getArg(2)));
5235     Ops[1] = Builder.CreateAShr(
5236         Ops[1], ConstantInt::get(Int64Ty, std::min(static_cast<uint64_t>(63),
5237                                                    Amt->getZExtValue())),
5238         "shrd_n");
5239     return Builder.CreateAdd(Ops[0], Ops[1]);
5240   }
5241   case NEON::BI__builtin_neon_vsrad_n_u64: {
5242     llvm::ConstantInt *Amt = cast<ConstantInt>(EmitScalarExpr(E->getArg(2)));
5243     uint64_t ShiftAmt = Amt->getZExtValue();
5244     // Right-shifting an unsigned value by its size yields 0.
5245     // As Op + 0 = Op, return Ops[0] directly.
5246     if (ShiftAmt == 64)
5247       return Ops[0];
5248     Ops[1] = Builder.CreateLShr(Ops[1], ConstantInt::get(Int64Ty, ShiftAmt),
5249                                 "shrd_n");
5250     return Builder.CreateAdd(Ops[0], Ops[1]);
5251   }
5252   case NEON::BI__builtin_neon_vqdmlalh_lane_s16:
5253   case NEON::BI__builtin_neon_vqdmlalh_laneq_s16:
5254   case NEON::BI__builtin_neon_vqdmlslh_lane_s16:
5255   case NEON::BI__builtin_neon_vqdmlslh_laneq_s16: {
5256     Ops[2] = Builder.CreateExtractElement(Ops[2], EmitScalarExpr(E->getArg(3)),
5257                                           "lane");
5258     SmallVector<Value *, 2> ProductOps;
5259     ProductOps.push_back(vectorWrapScalar16(Ops[1]));
5260     ProductOps.push_back(vectorWrapScalar16(Ops[2]));
5261     llvm::Type *VTy = llvm::VectorType::get(Int32Ty, 4);
5262     Ops[1] = EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_sqdmull, VTy),
5263                           ProductOps, "vqdmlXl");
5264     Constant *CI = ConstantInt::get(SizeTy, 0);
5265     Ops[1] = Builder.CreateExtractElement(Ops[1], CI, "lane0");
5266     Ops.pop_back();
5267 
5268     unsigned AccInt = (BuiltinID == NEON::BI__builtin_neon_vqdmlalh_lane_s16 ||
5269                        BuiltinID == NEON::BI__builtin_neon_vqdmlalh_laneq_s16)
5270                           ? Intrinsic::aarch64_neon_sqadd
5271                           : Intrinsic::aarch64_neon_sqsub;
5272     return EmitNeonCall(CGM.getIntrinsic(AccInt, Int32Ty), Ops, "vqdmlXl");
5273   }
5274   case NEON::BI__builtin_neon_vqdmlals_s32:
5275   case NEON::BI__builtin_neon_vqdmlsls_s32: {
5276     SmallVector<Value *, 2> ProductOps;
5277     ProductOps.push_back(Ops[1]);
5278     ProductOps.push_back(EmitScalarExpr(E->getArg(2)));
5279     Ops[1] =
5280         EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_sqdmulls_scalar),
5281                      ProductOps, "vqdmlXl");
5282 
5283     unsigned AccumInt = BuiltinID == NEON::BI__builtin_neon_vqdmlals_s32
5284                                         ? Intrinsic::aarch64_neon_sqadd
5285                                         : Intrinsic::aarch64_neon_sqsub;
5286     return EmitNeonCall(CGM.getIntrinsic(AccumInt, Int64Ty), Ops, "vqdmlXl");
5287   }
5288   case NEON::BI__builtin_neon_vqdmlals_lane_s32:
5289   case NEON::BI__builtin_neon_vqdmlals_laneq_s32:
5290   case NEON::BI__builtin_neon_vqdmlsls_lane_s32:
5291   case NEON::BI__builtin_neon_vqdmlsls_laneq_s32: {
5292     Ops[2] = Builder.CreateExtractElement(Ops[2], EmitScalarExpr(E->getArg(3)),
5293                                           "lane");
5294     SmallVector<Value *, 2> ProductOps;
5295     ProductOps.push_back(Ops[1]);
5296     ProductOps.push_back(Ops[2]);
5297     Ops[1] =
5298         EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_sqdmulls_scalar),
5299                      ProductOps, "vqdmlXl");
5300     Ops.pop_back();
5301 
5302     unsigned AccInt = (BuiltinID == NEON::BI__builtin_neon_vqdmlals_lane_s32 ||
5303                        BuiltinID == NEON::BI__builtin_neon_vqdmlals_laneq_s32)
5304                           ? Intrinsic::aarch64_neon_sqadd
5305                           : Intrinsic::aarch64_neon_sqsub;
5306     return EmitNeonCall(CGM.getIntrinsic(AccInt, Int64Ty), Ops, "vqdmlXl");
5307   }
5308   }
5309 
5310   llvm::VectorType *VTy = GetNeonType(this, Type);
5311   llvm::Type *Ty = VTy;
5312   if (!Ty)
5313     return nullptr;
5314 
5315   // Not all intrinsics handled by the common case work for AArch64 yet, so only
5316   // defer to common code if it's been added to our special map.
5317   Builtin = findNeonIntrinsicInMap(AArch64SIMDIntrinsicMap, BuiltinID,
5318                                    AArch64SIMDIntrinsicsProvenSorted);
5319 
5320   if (Builtin)
5321     return EmitCommonNeonBuiltinExpr(
5322         Builtin->BuiltinID, Builtin->LLVMIntrinsic, Builtin->AltLLVMIntrinsic,
5323         Builtin->NameHint, Builtin->TypeModifier, E, Ops,
5324         /*never use addresses*/ Address::invalid(), Address::invalid());
5325 
5326   if (Value *V = EmitAArch64TblBuiltinExpr(*this, BuiltinID, E, Ops))
5327     return V;
5328 
5329   unsigned Int;
5330   switch (BuiltinID) {
5331   default: return nullptr;
5332   case NEON::BI__builtin_neon_vbsl_v:
5333   case NEON::BI__builtin_neon_vbslq_v: {
5334     llvm::Type *BitTy = llvm::VectorType::getInteger(VTy);
5335     Ops[0] = Builder.CreateBitCast(Ops[0], BitTy, "vbsl");
5336     Ops[1] = Builder.CreateBitCast(Ops[1], BitTy, "vbsl");
5337     Ops[2] = Builder.CreateBitCast(Ops[2], BitTy, "vbsl");
5338 
5339     Ops[1] = Builder.CreateAnd(Ops[0], Ops[1], "vbsl");
5340     Ops[2] = Builder.CreateAnd(Builder.CreateNot(Ops[0]), Ops[2], "vbsl");
5341     Ops[0] = Builder.CreateOr(Ops[1], Ops[2], "vbsl");
5342     return Builder.CreateBitCast(Ops[0], Ty);
5343   }
5344   case NEON::BI__builtin_neon_vfma_lane_v:
5345   case NEON::BI__builtin_neon_vfmaq_lane_v: { // Only used for FP types
5346     // The ARM builtins (and instructions) have the addend as the first
5347     // operand, but the 'fma' intrinsics have it last. Swap it around here.
5348     Value *Addend = Ops[0];
5349     Value *Multiplicand = Ops[1];
5350     Value *LaneSource = Ops[2];
5351     Ops[0] = Multiplicand;
5352     Ops[1] = LaneSource;
5353     Ops[2] = Addend;
5354 
5355     // Now adjust things to handle the lane access.
5356     llvm::Type *SourceTy = BuiltinID == NEON::BI__builtin_neon_vfmaq_lane_v ?
5357       llvm::VectorType::get(VTy->getElementType(), VTy->getNumElements() / 2) :
5358       VTy;
5359     llvm::Constant *cst = cast<Constant>(Ops[3]);
5360     Value *SV = llvm::ConstantVector::getSplat(VTy->getNumElements(), cst);
5361     Ops[1] = Builder.CreateBitCast(Ops[1], SourceTy);
5362     Ops[1] = Builder.CreateShuffleVector(Ops[1], Ops[1], SV, "lane");
5363 
5364     Ops.pop_back();
5365     Int = Intrinsic::fma;
5366     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "fmla");
5367   }
5368   case NEON::BI__builtin_neon_vfma_laneq_v: {
5369     llvm::VectorType *VTy = cast<llvm::VectorType>(Ty);
5370     // v1f64 fma should be mapped to Neon scalar f64 fma
5371     if (VTy && VTy->getElementType() == DoubleTy) {
5372       Ops[0] = Builder.CreateBitCast(Ops[0], DoubleTy);
5373       Ops[1] = Builder.CreateBitCast(Ops[1], DoubleTy);
5374       llvm::Type *VTy = GetNeonType(this,
5375         NeonTypeFlags(NeonTypeFlags::Float64, false, true));
5376       Ops[2] = Builder.CreateBitCast(Ops[2], VTy);
5377       Ops[2] = Builder.CreateExtractElement(Ops[2], Ops[3], "extract");
5378       Value *F = CGM.getIntrinsic(Intrinsic::fma, DoubleTy);
5379       Value *Result = Builder.CreateCall(F, {Ops[1], Ops[2], Ops[0]});
5380       return Builder.CreateBitCast(Result, Ty);
5381     }
5382     Value *F = CGM.getIntrinsic(Intrinsic::fma, Ty);
5383     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
5384     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
5385 
5386     llvm::Type *STy = llvm::VectorType::get(VTy->getElementType(),
5387                                             VTy->getNumElements() * 2);
5388     Ops[2] = Builder.CreateBitCast(Ops[2], STy);
5389     Value* SV = llvm::ConstantVector::getSplat(VTy->getNumElements(),
5390                                                cast<ConstantInt>(Ops[3]));
5391     Ops[2] = Builder.CreateShuffleVector(Ops[2], Ops[2], SV, "lane");
5392 
5393     return Builder.CreateCall(F, {Ops[2], Ops[1], Ops[0]});
5394   }
5395   case NEON::BI__builtin_neon_vfmaq_laneq_v: {
5396     Value *F = CGM.getIntrinsic(Intrinsic::fma, Ty);
5397     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
5398     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
5399 
5400     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
5401     Ops[2] = EmitNeonSplat(Ops[2], cast<ConstantInt>(Ops[3]));
5402     return Builder.CreateCall(F, {Ops[2], Ops[1], Ops[0]});
5403   }
5404   case NEON::BI__builtin_neon_vfmas_lane_f32:
5405   case NEON::BI__builtin_neon_vfmas_laneq_f32:
5406   case NEON::BI__builtin_neon_vfmad_lane_f64:
5407   case NEON::BI__builtin_neon_vfmad_laneq_f64: {
5408     Ops.push_back(EmitScalarExpr(E->getArg(3)));
5409     llvm::Type *Ty = ConvertType(E->getCallReturnType(getContext()));
5410     Value *F = CGM.getIntrinsic(Intrinsic::fma, Ty);
5411     Ops[2] = Builder.CreateExtractElement(Ops[2], Ops[3], "extract");
5412     return Builder.CreateCall(F, {Ops[1], Ops[2], Ops[0]});
5413   }
5414   case NEON::BI__builtin_neon_vmull_v:
5415     // FIXME: improve sharing scheme to cope with 3 alternative LLVM intrinsics.
5416     Int = usgn ? Intrinsic::aarch64_neon_umull : Intrinsic::aarch64_neon_smull;
5417     if (Type.isPoly()) Int = Intrinsic::aarch64_neon_pmull;
5418     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmull");
5419   case NEON::BI__builtin_neon_vmax_v:
5420   case NEON::BI__builtin_neon_vmaxq_v:
5421     // FIXME: improve sharing scheme to cope with 3 alternative LLVM intrinsics.
5422     Int = usgn ? Intrinsic::aarch64_neon_umax : Intrinsic::aarch64_neon_smax;
5423     if (Ty->isFPOrFPVectorTy()) Int = Intrinsic::aarch64_neon_fmax;
5424     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmax");
5425   case NEON::BI__builtin_neon_vmin_v:
5426   case NEON::BI__builtin_neon_vminq_v:
5427     // FIXME: improve sharing scheme to cope with 3 alternative LLVM intrinsics.
5428     Int = usgn ? Intrinsic::aarch64_neon_umin : Intrinsic::aarch64_neon_smin;
5429     if (Ty->isFPOrFPVectorTy()) Int = Intrinsic::aarch64_neon_fmin;
5430     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmin");
5431   case NEON::BI__builtin_neon_vabd_v:
5432   case NEON::BI__builtin_neon_vabdq_v:
5433     // FIXME: improve sharing scheme to cope with 3 alternative LLVM intrinsics.
5434     Int = usgn ? Intrinsic::aarch64_neon_uabd : Intrinsic::aarch64_neon_sabd;
5435     if (Ty->isFPOrFPVectorTy()) Int = Intrinsic::aarch64_neon_fabd;
5436     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vabd");
5437   case NEON::BI__builtin_neon_vpadal_v:
5438   case NEON::BI__builtin_neon_vpadalq_v: {
5439     unsigned ArgElts = VTy->getNumElements();
5440     llvm::IntegerType *EltTy = cast<IntegerType>(VTy->getElementType());
5441     unsigned BitWidth = EltTy->getBitWidth();
5442     llvm::Type *ArgTy = llvm::VectorType::get(
5443         llvm::IntegerType::get(getLLVMContext(), BitWidth/2), 2*ArgElts);
5444     llvm::Type* Tys[2] = { VTy, ArgTy };
5445     Int = usgn ? Intrinsic::aarch64_neon_uaddlp : Intrinsic::aarch64_neon_saddlp;
5446     SmallVector<llvm::Value*, 1> TmpOps;
5447     TmpOps.push_back(Ops[1]);
5448     Function *F = CGM.getIntrinsic(Int, Tys);
5449     llvm::Value *tmp = EmitNeonCall(F, TmpOps, "vpadal");
5450     llvm::Value *addend = Builder.CreateBitCast(Ops[0], tmp->getType());
5451     return Builder.CreateAdd(tmp, addend);
5452   }
5453   case NEON::BI__builtin_neon_vpmin_v:
5454   case NEON::BI__builtin_neon_vpminq_v:
5455     // FIXME: improve sharing scheme to cope with 3 alternative LLVM intrinsics.
5456     Int = usgn ? Intrinsic::aarch64_neon_uminp : Intrinsic::aarch64_neon_sminp;
5457     if (Ty->isFPOrFPVectorTy()) Int = Intrinsic::aarch64_neon_fminp;
5458     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpmin");
5459   case NEON::BI__builtin_neon_vpmax_v:
5460   case NEON::BI__builtin_neon_vpmaxq_v:
5461     // FIXME: improve sharing scheme to cope with 3 alternative LLVM intrinsics.
5462     Int = usgn ? Intrinsic::aarch64_neon_umaxp : Intrinsic::aarch64_neon_smaxp;
5463     if (Ty->isFPOrFPVectorTy()) Int = Intrinsic::aarch64_neon_fmaxp;
5464     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpmax");
5465   case NEON::BI__builtin_neon_vminnm_v:
5466   case NEON::BI__builtin_neon_vminnmq_v:
5467     Int = Intrinsic::aarch64_neon_fminnm;
5468     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vminnm");
5469   case NEON::BI__builtin_neon_vmaxnm_v:
5470   case NEON::BI__builtin_neon_vmaxnmq_v:
5471     Int = Intrinsic::aarch64_neon_fmaxnm;
5472     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmaxnm");
5473   case NEON::BI__builtin_neon_vrecpss_f32: {
5474     Ops.push_back(EmitScalarExpr(E->getArg(1)));
5475     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_frecps, FloatTy),
5476                         Ops, "vrecps");
5477   }
5478   case NEON::BI__builtin_neon_vrecpsd_f64: {
5479     Ops.push_back(EmitScalarExpr(E->getArg(1)));
5480     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_frecps, DoubleTy),
5481                         Ops, "vrecps");
5482   }
5483   case NEON::BI__builtin_neon_vqshrun_n_v:
5484     Int = Intrinsic::aarch64_neon_sqshrun;
5485     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshrun_n");
5486   case NEON::BI__builtin_neon_vqrshrun_n_v:
5487     Int = Intrinsic::aarch64_neon_sqrshrun;
5488     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqrshrun_n");
5489   case NEON::BI__builtin_neon_vqshrn_n_v:
5490     Int = usgn ? Intrinsic::aarch64_neon_uqshrn : Intrinsic::aarch64_neon_sqshrn;
5491     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshrn_n");
5492   case NEON::BI__builtin_neon_vrshrn_n_v:
5493     Int = Intrinsic::aarch64_neon_rshrn;
5494     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrshrn_n");
5495   case NEON::BI__builtin_neon_vqrshrn_n_v:
5496     Int = usgn ? Intrinsic::aarch64_neon_uqrshrn : Intrinsic::aarch64_neon_sqrshrn;
5497     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqrshrn_n");
5498   case NEON::BI__builtin_neon_vrnda_v:
5499   case NEON::BI__builtin_neon_vrndaq_v: {
5500     Int = Intrinsic::round;
5501     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrnda");
5502   }
5503   case NEON::BI__builtin_neon_vrndi_v:
5504   case NEON::BI__builtin_neon_vrndiq_v: {
5505     Int = Intrinsic::nearbyint;
5506     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrndi");
5507   }
5508   case NEON::BI__builtin_neon_vrndm_v:
5509   case NEON::BI__builtin_neon_vrndmq_v: {
5510     Int = Intrinsic::floor;
5511     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrndm");
5512   }
5513   case NEON::BI__builtin_neon_vrndn_v:
5514   case NEON::BI__builtin_neon_vrndnq_v: {
5515     Int = Intrinsic::aarch64_neon_frintn;
5516     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrndn");
5517   }
5518   case NEON::BI__builtin_neon_vrndp_v:
5519   case NEON::BI__builtin_neon_vrndpq_v: {
5520     Int = Intrinsic::ceil;
5521     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrndp");
5522   }
5523   case NEON::BI__builtin_neon_vrndx_v:
5524   case NEON::BI__builtin_neon_vrndxq_v: {
5525     Int = Intrinsic::rint;
5526     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrndx");
5527   }
5528   case NEON::BI__builtin_neon_vrnd_v:
5529   case NEON::BI__builtin_neon_vrndq_v: {
5530     Int = Intrinsic::trunc;
5531     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrndz");
5532   }
5533   case NEON::BI__builtin_neon_vceqz_v:
5534   case NEON::BI__builtin_neon_vceqzq_v:
5535     return EmitAArch64CompareBuiltinExpr(Ops[0], Ty, ICmpInst::FCMP_OEQ,
5536                                          ICmpInst::ICMP_EQ, "vceqz");
5537   case NEON::BI__builtin_neon_vcgez_v:
5538   case NEON::BI__builtin_neon_vcgezq_v:
5539     return EmitAArch64CompareBuiltinExpr(Ops[0], Ty, ICmpInst::FCMP_OGE,
5540                                          ICmpInst::ICMP_SGE, "vcgez");
5541   case NEON::BI__builtin_neon_vclez_v:
5542   case NEON::BI__builtin_neon_vclezq_v:
5543     return EmitAArch64CompareBuiltinExpr(Ops[0], Ty, ICmpInst::FCMP_OLE,
5544                                          ICmpInst::ICMP_SLE, "vclez");
5545   case NEON::BI__builtin_neon_vcgtz_v:
5546   case NEON::BI__builtin_neon_vcgtzq_v:
5547     return EmitAArch64CompareBuiltinExpr(Ops[0], Ty, ICmpInst::FCMP_OGT,
5548                                          ICmpInst::ICMP_SGT, "vcgtz");
5549   case NEON::BI__builtin_neon_vcltz_v:
5550   case NEON::BI__builtin_neon_vcltzq_v:
5551     return EmitAArch64CompareBuiltinExpr(Ops[0], Ty, ICmpInst::FCMP_OLT,
5552                                          ICmpInst::ICMP_SLT, "vcltz");
5553   case NEON::BI__builtin_neon_vcvt_f64_v:
5554   case NEON::BI__builtin_neon_vcvtq_f64_v:
5555     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
5556     Ty = GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float64, false, quad));
5557     return usgn ? Builder.CreateUIToFP(Ops[0], Ty, "vcvt")
5558                 : Builder.CreateSIToFP(Ops[0], Ty, "vcvt");
5559   case NEON::BI__builtin_neon_vcvt_f64_f32: {
5560     assert(Type.getEltType() == NeonTypeFlags::Float64 && quad &&
5561            "unexpected vcvt_f64_f32 builtin");
5562     NeonTypeFlags SrcFlag = NeonTypeFlags(NeonTypeFlags::Float32, false, false);
5563     Ops[0] = Builder.CreateBitCast(Ops[0], GetNeonType(this, SrcFlag));
5564 
5565     return Builder.CreateFPExt(Ops[0], Ty, "vcvt");
5566   }
5567   case NEON::BI__builtin_neon_vcvt_f32_f64: {
5568     assert(Type.getEltType() == NeonTypeFlags::Float32 &&
5569            "unexpected vcvt_f32_f64 builtin");
5570     NeonTypeFlags SrcFlag = NeonTypeFlags(NeonTypeFlags::Float64, false, true);
5571     Ops[0] = Builder.CreateBitCast(Ops[0], GetNeonType(this, SrcFlag));
5572 
5573     return Builder.CreateFPTrunc(Ops[0], Ty, "vcvt");
5574   }
5575   case NEON::BI__builtin_neon_vcvt_s32_v:
5576   case NEON::BI__builtin_neon_vcvt_u32_v:
5577   case NEON::BI__builtin_neon_vcvt_s64_v:
5578   case NEON::BI__builtin_neon_vcvt_u64_v:
5579   case NEON::BI__builtin_neon_vcvtq_s32_v:
5580   case NEON::BI__builtin_neon_vcvtq_u32_v:
5581   case NEON::BI__builtin_neon_vcvtq_s64_v:
5582   case NEON::BI__builtin_neon_vcvtq_u64_v: {
5583     Ops[0] = Builder.CreateBitCast(Ops[0], GetFloatNeonType(this, Type));
5584     if (usgn)
5585       return Builder.CreateFPToUI(Ops[0], Ty);
5586     return Builder.CreateFPToSI(Ops[0], Ty);
5587   }
5588   case NEON::BI__builtin_neon_vcvta_s32_v:
5589   case NEON::BI__builtin_neon_vcvtaq_s32_v:
5590   case NEON::BI__builtin_neon_vcvta_u32_v:
5591   case NEON::BI__builtin_neon_vcvtaq_u32_v:
5592   case NEON::BI__builtin_neon_vcvta_s64_v:
5593   case NEON::BI__builtin_neon_vcvtaq_s64_v:
5594   case NEON::BI__builtin_neon_vcvta_u64_v:
5595   case NEON::BI__builtin_neon_vcvtaq_u64_v: {
5596     Int = usgn ? Intrinsic::aarch64_neon_fcvtau : Intrinsic::aarch64_neon_fcvtas;
5597     llvm::Type *Tys[2] = { Ty, GetFloatNeonType(this, Type) };
5598     return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvta");
5599   }
5600   case NEON::BI__builtin_neon_vcvtm_s32_v:
5601   case NEON::BI__builtin_neon_vcvtmq_s32_v:
5602   case NEON::BI__builtin_neon_vcvtm_u32_v:
5603   case NEON::BI__builtin_neon_vcvtmq_u32_v:
5604   case NEON::BI__builtin_neon_vcvtm_s64_v:
5605   case NEON::BI__builtin_neon_vcvtmq_s64_v:
5606   case NEON::BI__builtin_neon_vcvtm_u64_v:
5607   case NEON::BI__builtin_neon_vcvtmq_u64_v: {
5608     Int = usgn ? Intrinsic::aarch64_neon_fcvtmu : Intrinsic::aarch64_neon_fcvtms;
5609     llvm::Type *Tys[2] = { Ty, GetFloatNeonType(this, Type) };
5610     return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvtm");
5611   }
5612   case NEON::BI__builtin_neon_vcvtn_s32_v:
5613   case NEON::BI__builtin_neon_vcvtnq_s32_v:
5614   case NEON::BI__builtin_neon_vcvtn_u32_v:
5615   case NEON::BI__builtin_neon_vcvtnq_u32_v:
5616   case NEON::BI__builtin_neon_vcvtn_s64_v:
5617   case NEON::BI__builtin_neon_vcvtnq_s64_v:
5618   case NEON::BI__builtin_neon_vcvtn_u64_v:
5619   case NEON::BI__builtin_neon_vcvtnq_u64_v: {
5620     Int = usgn ? Intrinsic::aarch64_neon_fcvtnu : Intrinsic::aarch64_neon_fcvtns;
5621     llvm::Type *Tys[2] = { Ty, GetFloatNeonType(this, Type) };
5622     return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvtn");
5623   }
5624   case NEON::BI__builtin_neon_vcvtp_s32_v:
5625   case NEON::BI__builtin_neon_vcvtpq_s32_v:
5626   case NEON::BI__builtin_neon_vcvtp_u32_v:
5627   case NEON::BI__builtin_neon_vcvtpq_u32_v:
5628   case NEON::BI__builtin_neon_vcvtp_s64_v:
5629   case NEON::BI__builtin_neon_vcvtpq_s64_v:
5630   case NEON::BI__builtin_neon_vcvtp_u64_v:
5631   case NEON::BI__builtin_neon_vcvtpq_u64_v: {
5632     Int = usgn ? Intrinsic::aarch64_neon_fcvtpu : Intrinsic::aarch64_neon_fcvtps;
5633     llvm::Type *Tys[2] = { Ty, GetFloatNeonType(this, Type) };
5634     return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvtp");
5635   }
5636   case NEON::BI__builtin_neon_vmulx_v:
5637   case NEON::BI__builtin_neon_vmulxq_v: {
5638     Int = Intrinsic::aarch64_neon_fmulx;
5639     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmulx");
5640   }
5641   case NEON::BI__builtin_neon_vmul_lane_v:
5642   case NEON::BI__builtin_neon_vmul_laneq_v: {
5643     // v1f64 vmul_lane should be mapped to Neon scalar mul lane
5644     bool Quad = false;
5645     if (BuiltinID == NEON::BI__builtin_neon_vmul_laneq_v)
5646       Quad = true;
5647     Ops[0] = Builder.CreateBitCast(Ops[0], DoubleTy);
5648     llvm::Type *VTy = GetNeonType(this,
5649       NeonTypeFlags(NeonTypeFlags::Float64, false, Quad));
5650     Ops[1] = Builder.CreateBitCast(Ops[1], VTy);
5651     Ops[1] = Builder.CreateExtractElement(Ops[1], Ops[2], "extract");
5652     Value *Result = Builder.CreateFMul(Ops[0], Ops[1]);
5653     return Builder.CreateBitCast(Result, Ty);
5654   }
5655   case NEON::BI__builtin_neon_vnegd_s64:
5656     return Builder.CreateNeg(EmitScalarExpr(E->getArg(0)), "vnegd");
5657   case NEON::BI__builtin_neon_vpmaxnm_v:
5658   case NEON::BI__builtin_neon_vpmaxnmq_v: {
5659     Int = Intrinsic::aarch64_neon_fmaxnmp;
5660     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpmaxnm");
5661   }
5662   case NEON::BI__builtin_neon_vpminnm_v:
5663   case NEON::BI__builtin_neon_vpminnmq_v: {
5664     Int = Intrinsic::aarch64_neon_fminnmp;
5665     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpminnm");
5666   }
5667   case NEON::BI__builtin_neon_vsqrt_v:
5668   case NEON::BI__builtin_neon_vsqrtq_v: {
5669     Int = Intrinsic::sqrt;
5670     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
5671     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vsqrt");
5672   }
5673   case NEON::BI__builtin_neon_vrbit_v:
5674   case NEON::BI__builtin_neon_vrbitq_v: {
5675     Int = Intrinsic::aarch64_neon_rbit;
5676     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrbit");
5677   }
5678   case NEON::BI__builtin_neon_vaddv_u8:
5679     // FIXME: These are handled by the AArch64 scalar code.
5680     usgn = true;
5681     // FALLTHROUGH
5682   case NEON::BI__builtin_neon_vaddv_s8: {
5683     Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv;
5684     Ty = Int32Ty;
5685     VTy = llvm::VectorType::get(Int8Ty, 8);
5686     llvm::Type *Tys[2] = { Ty, VTy };
5687     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5688     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv");
5689     return Builder.CreateTrunc(Ops[0], Int8Ty);
5690   }
5691   case NEON::BI__builtin_neon_vaddv_u16:
5692     usgn = true;
5693     // FALLTHROUGH
5694   case NEON::BI__builtin_neon_vaddv_s16: {
5695     Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv;
5696     Ty = Int32Ty;
5697     VTy = llvm::VectorType::get(Int16Ty, 4);
5698     llvm::Type *Tys[2] = { Ty, VTy };
5699     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5700     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv");
5701     return Builder.CreateTrunc(Ops[0], Int16Ty);
5702   }
5703   case NEON::BI__builtin_neon_vaddvq_u8:
5704     usgn = true;
5705     // FALLTHROUGH
5706   case NEON::BI__builtin_neon_vaddvq_s8: {
5707     Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv;
5708     Ty = Int32Ty;
5709     VTy = llvm::VectorType::get(Int8Ty, 16);
5710     llvm::Type *Tys[2] = { Ty, VTy };
5711     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5712     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv");
5713     return Builder.CreateTrunc(Ops[0], Int8Ty);
5714   }
5715   case NEON::BI__builtin_neon_vaddvq_u16:
5716     usgn = true;
5717     // FALLTHROUGH
5718   case NEON::BI__builtin_neon_vaddvq_s16: {
5719     Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv;
5720     Ty = Int32Ty;
5721     VTy = llvm::VectorType::get(Int16Ty, 8);
5722     llvm::Type *Tys[2] = { Ty, VTy };
5723     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5724     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv");
5725     return Builder.CreateTrunc(Ops[0], Int16Ty);
5726   }
5727   case NEON::BI__builtin_neon_vmaxv_u8: {
5728     Int = Intrinsic::aarch64_neon_umaxv;
5729     Ty = Int32Ty;
5730     VTy = llvm::VectorType::get(Int8Ty, 8);
5731     llvm::Type *Tys[2] = { Ty, VTy };
5732     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5733     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");
5734     return Builder.CreateTrunc(Ops[0], Int8Ty);
5735   }
5736   case NEON::BI__builtin_neon_vmaxv_u16: {
5737     Int = Intrinsic::aarch64_neon_umaxv;
5738     Ty = Int32Ty;
5739     VTy = llvm::VectorType::get(Int16Ty, 4);
5740     llvm::Type *Tys[2] = { Ty, VTy };
5741     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5742     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");
5743     return Builder.CreateTrunc(Ops[0], Int16Ty);
5744   }
5745   case NEON::BI__builtin_neon_vmaxvq_u8: {
5746     Int = Intrinsic::aarch64_neon_umaxv;
5747     Ty = Int32Ty;
5748     VTy = llvm::VectorType::get(Int8Ty, 16);
5749     llvm::Type *Tys[2] = { Ty, VTy };
5750     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5751     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");
5752     return Builder.CreateTrunc(Ops[0], Int8Ty);
5753   }
5754   case NEON::BI__builtin_neon_vmaxvq_u16: {
5755     Int = Intrinsic::aarch64_neon_umaxv;
5756     Ty = Int32Ty;
5757     VTy = llvm::VectorType::get(Int16Ty, 8);
5758     llvm::Type *Tys[2] = { Ty, VTy };
5759     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5760     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");
5761     return Builder.CreateTrunc(Ops[0], Int16Ty);
5762   }
5763   case NEON::BI__builtin_neon_vmaxv_s8: {
5764     Int = Intrinsic::aarch64_neon_smaxv;
5765     Ty = Int32Ty;
5766     VTy = llvm::VectorType::get(Int8Ty, 8);
5767     llvm::Type *Tys[2] = { Ty, VTy };
5768     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5769     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");
5770     return Builder.CreateTrunc(Ops[0], Int8Ty);
5771   }
5772   case NEON::BI__builtin_neon_vmaxv_s16: {
5773     Int = Intrinsic::aarch64_neon_smaxv;
5774     Ty = Int32Ty;
5775     VTy = llvm::VectorType::get(Int16Ty, 4);
5776     llvm::Type *Tys[2] = { Ty, VTy };
5777     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5778     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");
5779     return Builder.CreateTrunc(Ops[0], Int16Ty);
5780   }
5781   case NEON::BI__builtin_neon_vmaxvq_s8: {
5782     Int = Intrinsic::aarch64_neon_smaxv;
5783     Ty = Int32Ty;
5784     VTy = llvm::VectorType::get(Int8Ty, 16);
5785     llvm::Type *Tys[2] = { Ty, VTy };
5786     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5787     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");
5788     return Builder.CreateTrunc(Ops[0], Int8Ty);
5789   }
5790   case NEON::BI__builtin_neon_vmaxvq_s16: {
5791     Int = Intrinsic::aarch64_neon_smaxv;
5792     Ty = Int32Ty;
5793     VTy = llvm::VectorType::get(Int16Ty, 8);
5794     llvm::Type *Tys[2] = { Ty, VTy };
5795     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5796     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");
5797     return Builder.CreateTrunc(Ops[0], Int16Ty);
5798   }
5799   case NEON::BI__builtin_neon_vminv_u8: {
5800     Int = Intrinsic::aarch64_neon_uminv;
5801     Ty = Int32Ty;
5802     VTy = llvm::VectorType::get(Int8Ty, 8);
5803     llvm::Type *Tys[2] = { Ty, VTy };
5804     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5805     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");
5806     return Builder.CreateTrunc(Ops[0], Int8Ty);
5807   }
5808   case NEON::BI__builtin_neon_vminv_u16: {
5809     Int = Intrinsic::aarch64_neon_uminv;
5810     Ty = Int32Ty;
5811     VTy = llvm::VectorType::get(Int16Ty, 4);
5812     llvm::Type *Tys[2] = { Ty, VTy };
5813     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5814     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");
5815     return Builder.CreateTrunc(Ops[0], Int16Ty);
5816   }
5817   case NEON::BI__builtin_neon_vminvq_u8: {
5818     Int = Intrinsic::aarch64_neon_uminv;
5819     Ty = Int32Ty;
5820     VTy = llvm::VectorType::get(Int8Ty, 16);
5821     llvm::Type *Tys[2] = { Ty, VTy };
5822     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5823     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");
5824     return Builder.CreateTrunc(Ops[0], Int8Ty);
5825   }
5826   case NEON::BI__builtin_neon_vminvq_u16: {
5827     Int = Intrinsic::aarch64_neon_uminv;
5828     Ty = Int32Ty;
5829     VTy = llvm::VectorType::get(Int16Ty, 8);
5830     llvm::Type *Tys[2] = { Ty, VTy };
5831     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5832     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");
5833     return Builder.CreateTrunc(Ops[0], Int16Ty);
5834   }
5835   case NEON::BI__builtin_neon_vminv_s8: {
5836     Int = Intrinsic::aarch64_neon_sminv;
5837     Ty = Int32Ty;
5838     VTy = llvm::VectorType::get(Int8Ty, 8);
5839     llvm::Type *Tys[2] = { Ty, VTy };
5840     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5841     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");
5842     return Builder.CreateTrunc(Ops[0], Int8Ty);
5843   }
5844   case NEON::BI__builtin_neon_vminv_s16: {
5845     Int = Intrinsic::aarch64_neon_sminv;
5846     Ty = Int32Ty;
5847     VTy = llvm::VectorType::get(Int16Ty, 4);
5848     llvm::Type *Tys[2] = { Ty, VTy };
5849     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5850     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");
5851     return Builder.CreateTrunc(Ops[0], Int16Ty);
5852   }
5853   case NEON::BI__builtin_neon_vminvq_s8: {
5854     Int = Intrinsic::aarch64_neon_sminv;
5855     Ty = Int32Ty;
5856     VTy = llvm::VectorType::get(Int8Ty, 16);
5857     llvm::Type *Tys[2] = { Ty, VTy };
5858     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5859     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");
5860     return Builder.CreateTrunc(Ops[0], Int8Ty);
5861   }
5862   case NEON::BI__builtin_neon_vminvq_s16: {
5863     Int = Intrinsic::aarch64_neon_sminv;
5864     Ty = Int32Ty;
5865     VTy = llvm::VectorType::get(Int16Ty, 8);
5866     llvm::Type *Tys[2] = { Ty, VTy };
5867     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5868     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");
5869     return Builder.CreateTrunc(Ops[0], Int16Ty);
5870   }
5871   case NEON::BI__builtin_neon_vmul_n_f64: {
5872     Ops[0] = Builder.CreateBitCast(Ops[0], DoubleTy);
5873     Value *RHS = Builder.CreateBitCast(EmitScalarExpr(E->getArg(1)), DoubleTy);
5874     return Builder.CreateFMul(Ops[0], RHS);
5875   }
5876   case NEON::BI__builtin_neon_vaddlv_u8: {
5877     Int = Intrinsic::aarch64_neon_uaddlv;
5878     Ty = Int32Ty;
5879     VTy = llvm::VectorType::get(Int8Ty, 8);
5880     llvm::Type *Tys[2] = { Ty, VTy };
5881     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5882     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
5883     return Builder.CreateTrunc(Ops[0], Int16Ty);
5884   }
5885   case NEON::BI__builtin_neon_vaddlv_u16: {
5886     Int = Intrinsic::aarch64_neon_uaddlv;
5887     Ty = Int32Ty;
5888     VTy = llvm::VectorType::get(Int16Ty, 4);
5889     llvm::Type *Tys[2] = { Ty, VTy };
5890     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5891     return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
5892   }
5893   case NEON::BI__builtin_neon_vaddlvq_u8: {
5894     Int = Intrinsic::aarch64_neon_uaddlv;
5895     Ty = Int32Ty;
5896     VTy = llvm::VectorType::get(Int8Ty, 16);
5897     llvm::Type *Tys[2] = { Ty, VTy };
5898     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5899     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
5900     return Builder.CreateTrunc(Ops[0], Int16Ty);
5901   }
5902   case NEON::BI__builtin_neon_vaddlvq_u16: {
5903     Int = Intrinsic::aarch64_neon_uaddlv;
5904     Ty = Int32Ty;
5905     VTy = llvm::VectorType::get(Int16Ty, 8);
5906     llvm::Type *Tys[2] = { Ty, VTy };
5907     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5908     return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
5909   }
5910   case NEON::BI__builtin_neon_vaddlv_s8: {
5911     Int = Intrinsic::aarch64_neon_saddlv;
5912     Ty = Int32Ty;
5913     VTy = llvm::VectorType::get(Int8Ty, 8);
5914     llvm::Type *Tys[2] = { Ty, VTy };
5915     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5916     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
5917     return Builder.CreateTrunc(Ops[0], Int16Ty);
5918   }
5919   case NEON::BI__builtin_neon_vaddlv_s16: {
5920     Int = Intrinsic::aarch64_neon_saddlv;
5921     Ty = Int32Ty;
5922     VTy = llvm::VectorType::get(Int16Ty, 4);
5923     llvm::Type *Tys[2] = { Ty, VTy };
5924     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5925     return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
5926   }
5927   case NEON::BI__builtin_neon_vaddlvq_s8: {
5928     Int = Intrinsic::aarch64_neon_saddlv;
5929     Ty = Int32Ty;
5930     VTy = llvm::VectorType::get(Int8Ty, 16);
5931     llvm::Type *Tys[2] = { Ty, VTy };
5932     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5933     Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
5934     return Builder.CreateTrunc(Ops[0], Int16Ty);
5935   }
5936   case NEON::BI__builtin_neon_vaddlvq_s16: {
5937     Int = Intrinsic::aarch64_neon_saddlv;
5938     Ty = Int32Ty;
5939     VTy = llvm::VectorType::get(Int16Ty, 8);
5940     llvm::Type *Tys[2] = { Ty, VTy };
5941     Ops.push_back(EmitScalarExpr(E->getArg(0)));
5942     return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
5943   }
5944   case NEON::BI__builtin_neon_vsri_n_v:
5945   case NEON::BI__builtin_neon_vsriq_n_v: {
5946     Int = Intrinsic::aarch64_neon_vsri;
5947     llvm::Function *Intrin = CGM.getIntrinsic(Int, Ty);
5948     return EmitNeonCall(Intrin, Ops, "vsri_n");
5949   }
5950   case NEON::BI__builtin_neon_vsli_n_v:
5951   case NEON::BI__builtin_neon_vsliq_n_v: {
5952     Int = Intrinsic::aarch64_neon_vsli;
5953     llvm::Function *Intrin = CGM.getIntrinsic(Int, Ty);
5954     return EmitNeonCall(Intrin, Ops, "vsli_n");
5955   }
5956   case NEON::BI__builtin_neon_vsra_n_v:
5957   case NEON::BI__builtin_neon_vsraq_n_v:
5958     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
5959     Ops[1] = EmitNeonRShiftImm(Ops[1], Ops[2], Ty, usgn, "vsra_n");
5960     return Builder.CreateAdd(Ops[0], Ops[1]);
5961   case NEON::BI__builtin_neon_vrsra_n_v:
5962   case NEON::BI__builtin_neon_vrsraq_n_v: {
5963     Int = usgn ? Intrinsic::aarch64_neon_urshl : Intrinsic::aarch64_neon_srshl;
5964     SmallVector<llvm::Value*,2> TmpOps;
5965     TmpOps.push_back(Ops[1]);
5966     TmpOps.push_back(Ops[2]);
5967     Function* F = CGM.getIntrinsic(Int, Ty);
5968     llvm::Value *tmp = EmitNeonCall(F, TmpOps, "vrshr_n", 1, true);
5969     Ops[0] = Builder.CreateBitCast(Ops[0], VTy);
5970     return Builder.CreateAdd(Ops[0], tmp);
5971   }
5972     // FIXME: Sharing loads & stores with 32-bit is complicated by the absence
5973     // of an Align parameter here.
5974   case NEON::BI__builtin_neon_vld1_x2_v:
5975   case NEON::BI__builtin_neon_vld1q_x2_v:
5976   case NEON::BI__builtin_neon_vld1_x3_v:
5977   case NEON::BI__builtin_neon_vld1q_x3_v:
5978   case NEON::BI__builtin_neon_vld1_x4_v:
5979   case NEON::BI__builtin_neon_vld1q_x4_v: {
5980     llvm::Type *PTy = llvm::PointerType::getUnqual(VTy->getVectorElementType());
5981     Ops[1] = Builder.CreateBitCast(Ops[1], PTy);
5982     llvm::Type *Tys[2] = { VTy, PTy };
5983     unsigned Int;
5984     switch (BuiltinID) {
5985     case NEON::BI__builtin_neon_vld1_x2_v:
5986     case NEON::BI__builtin_neon_vld1q_x2_v:
5987       Int = Intrinsic::aarch64_neon_ld1x2;
5988       break;
5989     case NEON::BI__builtin_neon_vld1_x3_v:
5990     case NEON::BI__builtin_neon_vld1q_x3_v:
5991       Int = Intrinsic::aarch64_neon_ld1x3;
5992       break;
5993     case NEON::BI__builtin_neon_vld1_x4_v:
5994     case NEON::BI__builtin_neon_vld1q_x4_v:
5995       Int = Intrinsic::aarch64_neon_ld1x4;
5996       break;
5997     }
5998     Function *F = CGM.getIntrinsic(Int, Tys);
5999     Ops[1] = Builder.CreateCall(F, Ops[1], "vld1xN");
6000     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
6001     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
6002     return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]);
6003   }
6004   case NEON::BI__builtin_neon_vst1_x2_v:
6005   case NEON::BI__builtin_neon_vst1q_x2_v:
6006   case NEON::BI__builtin_neon_vst1_x3_v:
6007   case NEON::BI__builtin_neon_vst1q_x3_v:
6008   case NEON::BI__builtin_neon_vst1_x4_v:
6009   case NEON::BI__builtin_neon_vst1q_x4_v: {
6010     llvm::Type *PTy = llvm::PointerType::getUnqual(VTy->getVectorElementType());
6011     llvm::Type *Tys[2] = { VTy, PTy };
6012     unsigned Int;
6013     switch (BuiltinID) {
6014     case NEON::BI__builtin_neon_vst1_x2_v:
6015     case NEON::BI__builtin_neon_vst1q_x2_v:
6016       Int = Intrinsic::aarch64_neon_st1x2;
6017       break;
6018     case NEON::BI__builtin_neon_vst1_x3_v:
6019     case NEON::BI__builtin_neon_vst1q_x3_v:
6020       Int = Intrinsic::aarch64_neon_st1x3;
6021       break;
6022     case NEON::BI__builtin_neon_vst1_x4_v:
6023     case NEON::BI__builtin_neon_vst1q_x4_v:
6024       Int = Intrinsic::aarch64_neon_st1x4;
6025       break;
6026     }
6027     std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end());
6028     return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "");
6029   }
6030   case NEON::BI__builtin_neon_vld1_v:
6031   case NEON::BI__builtin_neon_vld1q_v:
6032     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(VTy));
6033     return Builder.CreateDefaultAlignedLoad(Ops[0]);
6034   case NEON::BI__builtin_neon_vst1_v:
6035   case NEON::BI__builtin_neon_vst1q_v:
6036     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(VTy));
6037     Ops[1] = Builder.CreateBitCast(Ops[1], VTy);
6038     return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]);
6039   case NEON::BI__builtin_neon_vld1_lane_v:
6040   case NEON::BI__builtin_neon_vld1q_lane_v:
6041     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
6042     Ty = llvm::PointerType::getUnqual(VTy->getElementType());
6043     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
6044     Ops[0] = Builder.CreateDefaultAlignedLoad(Ops[0]);
6045     return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vld1_lane");
6046   case NEON::BI__builtin_neon_vld1_dup_v:
6047   case NEON::BI__builtin_neon_vld1q_dup_v: {
6048     Value *V = UndefValue::get(Ty);
6049     Ty = llvm::PointerType::getUnqual(VTy->getElementType());
6050     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
6051     Ops[0] = Builder.CreateDefaultAlignedLoad(Ops[0]);
6052     llvm::Constant *CI = ConstantInt::get(Int32Ty, 0);
6053     Ops[0] = Builder.CreateInsertElement(V, Ops[0], CI);
6054     return EmitNeonSplat(Ops[0], CI);
6055   }
6056   case NEON::BI__builtin_neon_vst1_lane_v:
6057   case NEON::BI__builtin_neon_vst1q_lane_v:
6058     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
6059     Ops[1] = Builder.CreateExtractElement(Ops[1], Ops[2]);
6060     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
6061     return Builder.CreateDefaultAlignedStore(Ops[1],
6062                                              Builder.CreateBitCast(Ops[0], Ty));
6063   case NEON::BI__builtin_neon_vld2_v:
6064   case NEON::BI__builtin_neon_vld2q_v: {
6065     llvm::Type *PTy = llvm::PointerType::getUnqual(VTy);
6066     Ops[1] = Builder.CreateBitCast(Ops[1], PTy);
6067     llvm::Type *Tys[2] = { VTy, PTy };
6068     Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld2, Tys);
6069     Ops[1] = Builder.CreateCall(F, Ops[1], "vld2");
6070     Ops[0] = Builder.CreateBitCast(Ops[0],
6071                 llvm::PointerType::getUnqual(Ops[1]->getType()));
6072     return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]);
6073   }
6074   case NEON::BI__builtin_neon_vld3_v:
6075   case NEON::BI__builtin_neon_vld3q_v: {
6076     llvm::Type *PTy = llvm::PointerType::getUnqual(VTy);
6077     Ops[1] = Builder.CreateBitCast(Ops[1], PTy);
6078     llvm::Type *Tys[2] = { VTy, PTy };
6079     Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld3, Tys);
6080     Ops[1] = Builder.CreateCall(F, Ops[1], "vld3");
6081     Ops[0] = Builder.CreateBitCast(Ops[0],
6082                 llvm::PointerType::getUnqual(Ops[1]->getType()));
6083     return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]);
6084   }
6085   case NEON::BI__builtin_neon_vld4_v:
6086   case NEON::BI__builtin_neon_vld4q_v: {
6087     llvm::Type *PTy = llvm::PointerType::getUnqual(VTy);
6088     Ops[1] = Builder.CreateBitCast(Ops[1], PTy);
6089     llvm::Type *Tys[2] = { VTy, PTy };
6090     Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld4, Tys);
6091     Ops[1] = Builder.CreateCall(F, Ops[1], "vld4");
6092     Ops[0] = Builder.CreateBitCast(Ops[0],
6093                 llvm::PointerType::getUnqual(Ops[1]->getType()));
6094     return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]);
6095   }
6096   case NEON::BI__builtin_neon_vld2_dup_v:
6097   case NEON::BI__builtin_neon_vld2q_dup_v: {
6098     llvm::Type *PTy =
6099       llvm::PointerType::getUnqual(VTy->getElementType());
6100     Ops[1] = Builder.CreateBitCast(Ops[1], PTy);
6101     llvm::Type *Tys[2] = { VTy, PTy };
6102     Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld2r, Tys);
6103     Ops[1] = Builder.CreateCall(F, Ops[1], "vld2");
6104     Ops[0] = Builder.CreateBitCast(Ops[0],
6105                 llvm::PointerType::getUnqual(Ops[1]->getType()));
6106     return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]);
6107   }
6108   case NEON::BI__builtin_neon_vld3_dup_v:
6109   case NEON::BI__builtin_neon_vld3q_dup_v: {
6110     llvm::Type *PTy =
6111       llvm::PointerType::getUnqual(VTy->getElementType());
6112     Ops[1] = Builder.CreateBitCast(Ops[1], PTy);
6113     llvm::Type *Tys[2] = { VTy, PTy };
6114     Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld3r, Tys);
6115     Ops[1] = Builder.CreateCall(F, Ops[1], "vld3");
6116     Ops[0] = Builder.CreateBitCast(Ops[0],
6117                 llvm::PointerType::getUnqual(Ops[1]->getType()));
6118     return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]);
6119   }
6120   case NEON::BI__builtin_neon_vld4_dup_v:
6121   case NEON::BI__builtin_neon_vld4q_dup_v: {
6122     llvm::Type *PTy =
6123       llvm::PointerType::getUnqual(VTy->getElementType());
6124     Ops[1] = Builder.CreateBitCast(Ops[1], PTy);
6125     llvm::Type *Tys[2] = { VTy, PTy };
6126     Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld4r, Tys);
6127     Ops[1] = Builder.CreateCall(F, Ops[1], "vld4");
6128     Ops[0] = Builder.CreateBitCast(Ops[0],
6129                 llvm::PointerType::getUnqual(Ops[1]->getType()));
6130     return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]);
6131   }
6132   case NEON::BI__builtin_neon_vld2_lane_v:
6133   case NEON::BI__builtin_neon_vld2q_lane_v: {
6134     llvm::Type *Tys[2] = { VTy, Ops[1]->getType() };
6135     Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld2lane, Tys);
6136     Ops.push_back(Ops[1]);
6137     Ops.erase(Ops.begin()+1);
6138     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
6139     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
6140     Ops[3] = Builder.CreateZExt(Ops[3], Int64Ty);
6141     Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld2_lane");
6142     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
6143     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
6144     return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]);
6145   }
6146   case NEON::BI__builtin_neon_vld3_lane_v:
6147   case NEON::BI__builtin_neon_vld3q_lane_v: {
6148     llvm::Type *Tys[2] = { VTy, Ops[1]->getType() };
6149     Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld3lane, Tys);
6150     Ops.push_back(Ops[1]);
6151     Ops.erase(Ops.begin()+1);
6152     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
6153     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
6154     Ops[3] = Builder.CreateBitCast(Ops[3], Ty);
6155     Ops[4] = Builder.CreateZExt(Ops[4], Int64Ty);
6156     Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld3_lane");
6157     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
6158     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
6159     return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]);
6160   }
6161   case NEON::BI__builtin_neon_vld4_lane_v:
6162   case NEON::BI__builtin_neon_vld4q_lane_v: {
6163     llvm::Type *Tys[2] = { VTy, Ops[1]->getType() };
6164     Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_ld4lane, Tys);
6165     Ops.push_back(Ops[1]);
6166     Ops.erase(Ops.begin()+1);
6167     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
6168     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
6169     Ops[3] = Builder.CreateBitCast(Ops[3], Ty);
6170     Ops[4] = Builder.CreateBitCast(Ops[4], Ty);
6171     Ops[5] = Builder.CreateZExt(Ops[5], Int64Ty);
6172     Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld4_lane");
6173     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
6174     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
6175     return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]);
6176   }
6177   case NEON::BI__builtin_neon_vst2_v:
6178   case NEON::BI__builtin_neon_vst2q_v: {
6179     Ops.push_back(Ops[0]);
6180     Ops.erase(Ops.begin());
6181     llvm::Type *Tys[2] = { VTy, Ops[2]->getType() };
6182     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st2, Tys),
6183                         Ops, "");
6184   }
6185   case NEON::BI__builtin_neon_vst2_lane_v:
6186   case NEON::BI__builtin_neon_vst2q_lane_v: {
6187     Ops.push_back(Ops[0]);
6188     Ops.erase(Ops.begin());
6189     Ops[2] = Builder.CreateZExt(Ops[2], Int64Ty);
6190     llvm::Type *Tys[2] = { VTy, Ops[3]->getType() };
6191     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st2lane, Tys),
6192                         Ops, "");
6193   }
6194   case NEON::BI__builtin_neon_vst3_v:
6195   case NEON::BI__builtin_neon_vst3q_v: {
6196     Ops.push_back(Ops[0]);
6197     Ops.erase(Ops.begin());
6198     llvm::Type *Tys[2] = { VTy, Ops[3]->getType() };
6199     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st3, Tys),
6200                         Ops, "");
6201   }
6202   case NEON::BI__builtin_neon_vst3_lane_v:
6203   case NEON::BI__builtin_neon_vst3q_lane_v: {
6204     Ops.push_back(Ops[0]);
6205     Ops.erase(Ops.begin());
6206     Ops[3] = Builder.CreateZExt(Ops[3], Int64Ty);
6207     llvm::Type *Tys[2] = { VTy, Ops[4]->getType() };
6208     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st3lane, Tys),
6209                         Ops, "");
6210   }
6211   case NEON::BI__builtin_neon_vst4_v:
6212   case NEON::BI__builtin_neon_vst4q_v: {
6213     Ops.push_back(Ops[0]);
6214     Ops.erase(Ops.begin());
6215     llvm::Type *Tys[2] = { VTy, Ops[4]->getType() };
6216     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st4, Tys),
6217                         Ops, "");
6218   }
6219   case NEON::BI__builtin_neon_vst4_lane_v:
6220   case NEON::BI__builtin_neon_vst4q_lane_v: {
6221     Ops.push_back(Ops[0]);
6222     Ops.erase(Ops.begin());
6223     Ops[4] = Builder.CreateZExt(Ops[4], Int64Ty);
6224     llvm::Type *Tys[2] = { VTy, Ops[5]->getType() };
6225     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st4lane, Tys),
6226                         Ops, "");
6227   }
6228   case NEON::BI__builtin_neon_vtrn_v:
6229   case NEON::BI__builtin_neon_vtrnq_v: {
6230     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty));
6231     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
6232     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
6233     Value *SV = nullptr;
6234 
6235     for (unsigned vi = 0; vi != 2; ++vi) {
6236       SmallVector<uint32_t, 16> Indices;
6237       for (unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) {
6238         Indices.push_back(i+vi);
6239         Indices.push_back(i+e+vi);
6240       }
6241       Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi);
6242       SV = Builder.CreateShuffleVector(Ops[1], Ops[2], Indices, "vtrn");
6243       SV = Builder.CreateDefaultAlignedStore(SV, Addr);
6244     }
6245     return SV;
6246   }
6247   case NEON::BI__builtin_neon_vuzp_v:
6248   case NEON::BI__builtin_neon_vuzpq_v: {
6249     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty));
6250     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
6251     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
6252     Value *SV = nullptr;
6253 
6254     for (unsigned vi = 0; vi != 2; ++vi) {
6255       SmallVector<uint32_t, 16> Indices;
6256       for (unsigned i = 0, e = VTy->getNumElements(); i != e; ++i)
6257         Indices.push_back(2*i+vi);
6258 
6259       Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi);
6260       SV = Builder.CreateShuffleVector(Ops[1], Ops[2], Indices, "vuzp");
6261       SV = Builder.CreateDefaultAlignedStore(SV, Addr);
6262     }
6263     return SV;
6264   }
6265   case NEON::BI__builtin_neon_vzip_v:
6266   case NEON::BI__builtin_neon_vzipq_v: {
6267     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty));
6268     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
6269     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
6270     Value *SV = nullptr;
6271 
6272     for (unsigned vi = 0; vi != 2; ++vi) {
6273       SmallVector<uint32_t, 16> Indices;
6274       for (unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) {
6275         Indices.push_back((i + vi*e) >> 1);
6276         Indices.push_back(((i + vi*e) >> 1)+e);
6277       }
6278       Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ty, Ops[0], vi);
6279       SV = Builder.CreateShuffleVector(Ops[1], Ops[2], Indices, "vzip");
6280       SV = Builder.CreateDefaultAlignedStore(SV, Addr);
6281     }
6282     return SV;
6283   }
6284   case NEON::BI__builtin_neon_vqtbl1q_v: {
6285     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbl1, Ty),
6286                         Ops, "vtbl1");
6287   }
6288   case NEON::BI__builtin_neon_vqtbl2q_v: {
6289     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbl2, Ty),
6290                         Ops, "vtbl2");
6291   }
6292   case NEON::BI__builtin_neon_vqtbl3q_v: {
6293     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbl3, Ty),
6294                         Ops, "vtbl3");
6295   }
6296   case NEON::BI__builtin_neon_vqtbl4q_v: {
6297     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbl4, Ty),
6298                         Ops, "vtbl4");
6299   }
6300   case NEON::BI__builtin_neon_vqtbx1q_v: {
6301     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbx1, Ty),
6302                         Ops, "vtbx1");
6303   }
6304   case NEON::BI__builtin_neon_vqtbx2q_v: {
6305     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbx2, Ty),
6306                         Ops, "vtbx2");
6307   }
6308   case NEON::BI__builtin_neon_vqtbx3q_v: {
6309     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbx3, Ty),
6310                         Ops, "vtbx3");
6311   }
6312   case NEON::BI__builtin_neon_vqtbx4q_v: {
6313     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_tbx4, Ty),
6314                         Ops, "vtbx4");
6315   }
6316   case NEON::BI__builtin_neon_vsqadd_v:
6317   case NEON::BI__builtin_neon_vsqaddq_v: {
6318     Int = Intrinsic::aarch64_neon_usqadd;
6319     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vsqadd");
6320   }
6321   case NEON::BI__builtin_neon_vuqadd_v:
6322   case NEON::BI__builtin_neon_vuqaddq_v: {
6323     Int = Intrinsic::aarch64_neon_suqadd;
6324     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vuqadd");
6325   }
6326   }
6327 }
6328 
6329 llvm::Value *CodeGenFunction::
6330 BuildVector(ArrayRef<llvm::Value*> Ops) {
6331   assert((Ops.size() & (Ops.size() - 1)) == 0 &&
6332          "Not a power-of-two sized vector!");
6333   bool AllConstants = true;
6334   for (unsigned i = 0, e = Ops.size(); i != e && AllConstants; ++i)
6335     AllConstants &= isa<Constant>(Ops[i]);
6336 
6337   // If this is a constant vector, create a ConstantVector.
6338   if (AllConstants) {
6339     SmallVector<llvm::Constant*, 16> CstOps;
6340     for (unsigned i = 0, e = Ops.size(); i != e; ++i)
6341       CstOps.push_back(cast<Constant>(Ops[i]));
6342     return llvm::ConstantVector::get(CstOps);
6343   }
6344 
6345   // Otherwise, insertelement the values to build the vector.
6346   Value *Result =
6347     llvm::UndefValue::get(llvm::VectorType::get(Ops[0]->getType(), Ops.size()));
6348 
6349   for (unsigned i = 0, e = Ops.size(); i != e; ++i)
6350     Result = Builder.CreateInsertElement(Result, Ops[i], Builder.getInt32(i));
6351 
6352   return Result;
6353 }
6354 
6355 // Convert the mask from an integer type to a vector of i1.
6356 static Value *getMaskVecValue(CodeGenFunction &CGF, Value *Mask,
6357                               unsigned NumElts) {
6358 
6359   llvm::VectorType *MaskTy = llvm::VectorType::get(CGF.Builder.getInt1Ty(),
6360                          cast<IntegerType>(Mask->getType())->getBitWidth());
6361   Value *MaskVec = CGF.Builder.CreateBitCast(Mask, MaskTy);
6362 
6363   // If we have less than 8 elements, then the starting mask was an i8 and
6364   // we need to extract down to the right number of elements.
6365   if (NumElts < 8) {
6366     uint32_t Indices[4];
6367     for (unsigned i = 0; i != NumElts; ++i)
6368       Indices[i] = i;
6369     MaskVec = CGF.Builder.CreateShuffleVector(MaskVec, MaskVec,
6370                                              makeArrayRef(Indices, NumElts),
6371                                              "extract");
6372   }
6373   return MaskVec;
6374 }
6375 
6376 static Value *EmitX86MaskedStore(CodeGenFunction &CGF,
6377                                  SmallVectorImpl<Value *> &Ops,
6378                                  unsigned Align) {
6379   // Cast the pointer to right type.
6380   Ops[0] = CGF.Builder.CreateBitCast(Ops[0],
6381                                llvm::PointerType::getUnqual(Ops[1]->getType()));
6382 
6383   // If the mask is all ones just emit a regular store.
6384   if (const auto *C = dyn_cast<Constant>(Ops[2]))
6385     if (C->isAllOnesValue())
6386       return CGF.Builder.CreateAlignedStore(Ops[1], Ops[0], Align);
6387 
6388   Value *MaskVec = getMaskVecValue(CGF, Ops[2],
6389                                    Ops[1]->getType()->getVectorNumElements());
6390 
6391   return CGF.Builder.CreateMaskedStore(Ops[1], Ops[0], Align, MaskVec);
6392 }
6393 
6394 static Value *EmitX86MaskedLoad(CodeGenFunction &CGF,
6395                                 SmallVectorImpl<Value *> &Ops, unsigned Align) {
6396   // Cast the pointer to right type.
6397   Ops[0] = CGF.Builder.CreateBitCast(Ops[0],
6398                                llvm::PointerType::getUnqual(Ops[1]->getType()));
6399 
6400   // If the mask is all ones just emit a regular store.
6401   if (const auto *C = dyn_cast<Constant>(Ops[2]))
6402     if (C->isAllOnesValue())
6403       return CGF.Builder.CreateAlignedLoad(Ops[0], Align);
6404 
6405   Value *MaskVec = getMaskVecValue(CGF, Ops[2],
6406                                    Ops[1]->getType()->getVectorNumElements());
6407 
6408   return CGF.Builder.CreateMaskedLoad(Ops[0], Align, MaskVec, Ops[1]);
6409 }
6410 
6411 static Value *EmitX86Select(CodeGenFunction &CGF,
6412                             Value *Mask, Value *Op0, Value *Op1) {
6413 
6414   // If the mask is all ones just return first argument.
6415   if (const auto *C = dyn_cast<Constant>(Mask))
6416     if (C->isAllOnesValue())
6417       return Op0;
6418 
6419   Mask = getMaskVecValue(CGF, Mask, Op0->getType()->getVectorNumElements());
6420 
6421   return CGF.Builder.CreateSelect(Mask, Op0, Op1);
6422 }
6423 
6424 static Value *EmitX86MaskedCompare(CodeGenFunction &CGF, CmpInst::Predicate P,
6425                                    SmallVectorImpl<Value *> &Ops) {
6426   unsigned NumElts = Ops[0]->getType()->getVectorNumElements();
6427   Value *Cmp = CGF.Builder.CreateICmp(P, Ops[0], Ops[1]);
6428 
6429   const auto *C = dyn_cast<Constant>(Ops[2]);
6430   if (!C || !C->isAllOnesValue())
6431     Cmp = CGF.Builder.CreateAnd(Cmp, getMaskVecValue(CGF, Ops[2], NumElts));
6432 
6433   if (NumElts < 8) {
6434     uint32_t Indices[8];
6435     for (unsigned i = 0; i != NumElts; ++i)
6436       Indices[i] = i;
6437     for (unsigned i = NumElts; i != 8; ++i)
6438       Indices[i] = NumElts;
6439     Cmp = CGF.Builder.CreateShuffleVector(Cmp, UndefValue::get(Cmp->getType()),
6440                                           Indices);
6441   }
6442   return CGF.Builder.CreateBitCast(Cmp,
6443                                    IntegerType::get(CGF.getLLVMContext(),
6444                                                     std::max(NumElts, 8U)));
6445 }
6446 
6447 Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
6448                                            const CallExpr *E) {
6449   if (BuiltinID == X86::BI__builtin_ms_va_start ||
6450       BuiltinID == X86::BI__builtin_ms_va_end)
6451     return EmitVAStartEnd(EmitMSVAListRef(E->getArg(0)).getPointer(),
6452                           BuiltinID == X86::BI__builtin_ms_va_start);
6453   if (BuiltinID == X86::BI__builtin_ms_va_copy) {
6454     // Lower this manually. We can't reliably determine whether or not any
6455     // given va_copy() is for a Win64 va_list from the calling convention
6456     // alone, because it's legal to do this from a System V ABI function.
6457     // With opaque pointer types, we won't have enough information in LLVM
6458     // IR to determine this from the argument types, either. Best to do it
6459     // now, while we have enough information.
6460     Address DestAddr = EmitMSVAListRef(E->getArg(0));
6461     Address SrcAddr = EmitMSVAListRef(E->getArg(1));
6462 
6463     llvm::Type *BPP = Int8PtrPtrTy;
6464 
6465     DestAddr = Address(Builder.CreateBitCast(DestAddr.getPointer(), BPP, "cp"),
6466                        DestAddr.getAlignment());
6467     SrcAddr = Address(Builder.CreateBitCast(SrcAddr.getPointer(), BPP, "ap"),
6468                       SrcAddr.getAlignment());
6469 
6470     Value *ArgPtr = Builder.CreateLoad(SrcAddr, "ap.val");
6471     return Builder.CreateStore(ArgPtr, DestAddr);
6472   }
6473 
6474   SmallVector<Value*, 4> Ops;
6475 
6476   // Find out if any arguments are required to be integer constant expressions.
6477   unsigned ICEArguments = 0;
6478   ASTContext::GetBuiltinTypeError Error;
6479   getContext().GetBuiltinType(BuiltinID, Error, &ICEArguments);
6480   assert(Error == ASTContext::GE_None && "Should not codegen an error");
6481 
6482   for (unsigned i = 0, e = E->getNumArgs(); i != e; i++) {
6483     // If this is a normal argument, just emit it as a scalar.
6484     if ((ICEArguments & (1 << i)) == 0) {
6485       Ops.push_back(EmitScalarExpr(E->getArg(i)));
6486       continue;
6487     }
6488 
6489     // If this is required to be a constant, constant fold it so that we know
6490     // that the generated intrinsic gets a ConstantInt.
6491     llvm::APSInt Result;
6492     bool IsConst = E->getArg(i)->isIntegerConstantExpr(Result, getContext());
6493     assert(IsConst && "Constant arg isn't actually constant?"); (void)IsConst;
6494     Ops.push_back(llvm::ConstantInt::get(getLLVMContext(), Result));
6495   }
6496 
6497   // These exist so that the builtin that takes an immediate can be bounds
6498   // checked by clang to avoid passing bad immediates to the backend. Since
6499   // AVX has a larger immediate than SSE we would need separate builtins to
6500   // do the different bounds checking. Rather than create a clang specific
6501   // SSE only builtin, this implements eight separate builtins to match gcc
6502   // implementation.
6503   auto getCmpIntrinsicCall = [this, &Ops](Intrinsic::ID ID, unsigned Imm) {
6504     Ops.push_back(llvm::ConstantInt::get(Int8Ty, Imm));
6505     llvm::Function *F = CGM.getIntrinsic(ID);
6506     return Builder.CreateCall(F, Ops);
6507   };
6508 
6509   // For the vector forms of FP comparisons, translate the builtins directly to
6510   // IR.
6511   // TODO: The builtins could be removed if the SSE header files used vector
6512   // extension comparisons directly (vector ordered/unordered may need
6513   // additional support via __builtin_isnan()).
6514   llvm::VectorType *V2F64 =
6515       llvm::VectorType::get(llvm::Type::getDoubleTy(getLLVMContext()), 2);
6516   llvm::VectorType *V4F32 =
6517       llvm::VectorType::get(llvm::Type::getFloatTy(getLLVMContext()), 4);
6518 
6519   auto getVectorFCmpIR = [this, &Ops](CmpInst::Predicate Pred,
6520                                       llvm::VectorType *FPVecTy) {
6521     Value *Cmp = Builder.CreateFCmp(Pred, Ops[0], Ops[1]);
6522     llvm::VectorType *IntVecTy = llvm::VectorType::getInteger(FPVecTy);
6523     Value *Sext = Builder.CreateSExt(Cmp, IntVecTy);
6524     return Builder.CreateBitCast(Sext, FPVecTy);
6525   };
6526 
6527   switch (BuiltinID) {
6528   default: return nullptr;
6529   case X86::BI__builtin_cpu_supports: {
6530     const Expr *FeatureExpr = E->getArg(0)->IgnoreParenCasts();
6531     StringRef FeatureStr = cast<StringLiteral>(FeatureExpr)->getString();
6532 
6533     // TODO: When/if this becomes more than x86 specific then use a TargetInfo
6534     // based mapping.
6535     // Processor features and mapping to processor feature value.
6536     enum X86Features {
6537       CMOV = 0,
6538       MMX,
6539       POPCNT,
6540       SSE,
6541       SSE2,
6542       SSE3,
6543       SSSE3,
6544       SSE4_1,
6545       SSE4_2,
6546       AVX,
6547       AVX2,
6548       SSE4_A,
6549       FMA4,
6550       XOP,
6551       FMA,
6552       AVX512F,
6553       BMI,
6554       BMI2,
6555       AES,
6556       PCLMUL,
6557       AVX512VL,
6558       AVX512BW,
6559       AVX512DQ,
6560       AVX512CD,
6561       AVX512ER,
6562       AVX512PF,
6563       AVX512VBMI,
6564       AVX512IFMA,
6565       MAX
6566     };
6567 
6568     X86Features Feature = StringSwitch<X86Features>(FeatureStr)
6569                               .Case("cmov", X86Features::CMOV)
6570                               .Case("mmx", X86Features::MMX)
6571                               .Case("popcnt", X86Features::POPCNT)
6572                               .Case("sse", X86Features::SSE)
6573                               .Case("sse2", X86Features::SSE2)
6574                               .Case("sse3", X86Features::SSE3)
6575                               .Case("ssse3", X86Features::SSSE3)
6576                               .Case("sse4.1", X86Features::SSE4_1)
6577                               .Case("sse4.2", X86Features::SSE4_2)
6578                               .Case("avx", X86Features::AVX)
6579                               .Case("avx2", X86Features::AVX2)
6580                               .Case("sse4a", X86Features::SSE4_A)
6581                               .Case("fma4", X86Features::FMA4)
6582                               .Case("xop", X86Features::XOP)
6583                               .Case("fma", X86Features::FMA)
6584                               .Case("avx512f", X86Features::AVX512F)
6585                               .Case("bmi", X86Features::BMI)
6586                               .Case("bmi2", X86Features::BMI2)
6587                               .Case("aes", X86Features::AES)
6588                               .Case("pclmul", X86Features::PCLMUL)
6589                               .Case("avx512vl", X86Features::AVX512VL)
6590                               .Case("avx512bw", X86Features::AVX512BW)
6591                               .Case("avx512dq", X86Features::AVX512DQ)
6592                               .Case("avx512cd", X86Features::AVX512CD)
6593                               .Case("avx512er", X86Features::AVX512ER)
6594                               .Case("avx512pf", X86Features::AVX512PF)
6595                               .Case("avx512vbmi", X86Features::AVX512VBMI)
6596                               .Case("avx512ifma", X86Features::AVX512IFMA)
6597                               .Default(X86Features::MAX);
6598     assert(Feature != X86Features::MAX && "Invalid feature!");
6599 
6600     // Matching the struct layout from the compiler-rt/libgcc structure that is
6601     // filled in:
6602     // unsigned int __cpu_vendor;
6603     // unsigned int __cpu_type;
6604     // unsigned int __cpu_subtype;
6605     // unsigned int __cpu_features[1];
6606     llvm::Type *STy = llvm::StructType::get(
6607         Int32Ty, Int32Ty, Int32Ty, llvm::ArrayType::get(Int32Ty, 1), nullptr);
6608 
6609     // Grab the global __cpu_model.
6610     llvm::Constant *CpuModel = CGM.CreateRuntimeVariable(STy, "__cpu_model");
6611 
6612     // Grab the first (0th) element from the field __cpu_features off of the
6613     // global in the struct STy.
6614     Value *Idxs[] = {
6615       ConstantInt::get(Int32Ty, 0),
6616       ConstantInt::get(Int32Ty, 3),
6617       ConstantInt::get(Int32Ty, 0)
6618     };
6619     Value *CpuFeatures = Builder.CreateGEP(STy, CpuModel, Idxs);
6620     Value *Features = Builder.CreateAlignedLoad(CpuFeatures,
6621                                                 CharUnits::fromQuantity(4));
6622 
6623     // Check the value of the bit corresponding to the feature requested.
6624     Value *Bitset = Builder.CreateAnd(
6625         Features, llvm::ConstantInt::get(Int32Ty, 1ULL << Feature));
6626     return Builder.CreateICmpNE(Bitset, llvm::ConstantInt::get(Int32Ty, 0));
6627   }
6628   case X86::BI_mm_prefetch: {
6629     Value *Address = Ops[0];
6630     Value *RW = ConstantInt::get(Int32Ty, 0);
6631     Value *Locality = Ops[1];
6632     Value *Data = ConstantInt::get(Int32Ty, 1);
6633     Value *F = CGM.getIntrinsic(Intrinsic::prefetch);
6634     return Builder.CreateCall(F, {Address, RW, Locality, Data});
6635   }
6636   case X86::BI__builtin_ia32_undef128:
6637   case X86::BI__builtin_ia32_undef256:
6638   case X86::BI__builtin_ia32_undef512:
6639     return UndefValue::get(ConvertType(E->getType()));
6640   case X86::BI__builtin_ia32_vec_init_v8qi:
6641   case X86::BI__builtin_ia32_vec_init_v4hi:
6642   case X86::BI__builtin_ia32_vec_init_v2si:
6643     return Builder.CreateBitCast(BuildVector(Ops),
6644                                  llvm::Type::getX86_MMXTy(getLLVMContext()));
6645   case X86::BI__builtin_ia32_vec_ext_v2si:
6646     return Builder.CreateExtractElement(Ops[0],
6647                                   llvm::ConstantInt::get(Ops[1]->getType(), 0));
6648   case X86::BI__builtin_ia32_ldmxcsr: {
6649     Address Tmp = CreateMemTemp(E->getArg(0)->getType());
6650     Builder.CreateStore(Ops[0], Tmp);
6651     return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_ldmxcsr),
6652                           Builder.CreateBitCast(Tmp.getPointer(), Int8PtrTy));
6653   }
6654   case X86::BI__builtin_ia32_stmxcsr: {
6655     Address Tmp = CreateMemTemp(E->getType());
6656     Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_stmxcsr),
6657                        Builder.CreateBitCast(Tmp.getPointer(), Int8PtrTy));
6658     return Builder.CreateLoad(Tmp, "stmxcsr");
6659   }
6660   case X86::BI__builtin_ia32_xsave:
6661   case X86::BI__builtin_ia32_xsave64:
6662   case X86::BI__builtin_ia32_xrstor:
6663   case X86::BI__builtin_ia32_xrstor64:
6664   case X86::BI__builtin_ia32_xsaveopt:
6665   case X86::BI__builtin_ia32_xsaveopt64:
6666   case X86::BI__builtin_ia32_xrstors:
6667   case X86::BI__builtin_ia32_xrstors64:
6668   case X86::BI__builtin_ia32_xsavec:
6669   case X86::BI__builtin_ia32_xsavec64:
6670   case X86::BI__builtin_ia32_xsaves:
6671   case X86::BI__builtin_ia32_xsaves64: {
6672     Intrinsic::ID ID;
6673 #define INTRINSIC_X86_XSAVE_ID(NAME) \
6674     case X86::BI__builtin_ia32_##NAME: \
6675       ID = Intrinsic::x86_##NAME; \
6676       break
6677     switch (BuiltinID) {
6678     default: llvm_unreachable("Unsupported intrinsic!");
6679     INTRINSIC_X86_XSAVE_ID(xsave);
6680     INTRINSIC_X86_XSAVE_ID(xsave64);
6681     INTRINSIC_X86_XSAVE_ID(xrstor);
6682     INTRINSIC_X86_XSAVE_ID(xrstor64);
6683     INTRINSIC_X86_XSAVE_ID(xsaveopt);
6684     INTRINSIC_X86_XSAVE_ID(xsaveopt64);
6685     INTRINSIC_X86_XSAVE_ID(xrstors);
6686     INTRINSIC_X86_XSAVE_ID(xrstors64);
6687     INTRINSIC_X86_XSAVE_ID(xsavec);
6688     INTRINSIC_X86_XSAVE_ID(xsavec64);
6689     INTRINSIC_X86_XSAVE_ID(xsaves);
6690     INTRINSIC_X86_XSAVE_ID(xsaves64);
6691     }
6692 #undef INTRINSIC_X86_XSAVE_ID
6693     Value *Mhi = Builder.CreateTrunc(
6694       Builder.CreateLShr(Ops[1], ConstantInt::get(Int64Ty, 32)), Int32Ty);
6695     Value *Mlo = Builder.CreateTrunc(Ops[1], Int32Ty);
6696     Ops[1] = Mhi;
6697     Ops.push_back(Mlo);
6698     return Builder.CreateCall(CGM.getIntrinsic(ID), Ops);
6699   }
6700   case X86::BI__builtin_ia32_storedqudi128_mask:
6701   case X86::BI__builtin_ia32_storedqusi128_mask:
6702   case X86::BI__builtin_ia32_storedquhi128_mask:
6703   case X86::BI__builtin_ia32_storedquqi128_mask:
6704   case X86::BI__builtin_ia32_storeupd128_mask:
6705   case X86::BI__builtin_ia32_storeups128_mask:
6706   case X86::BI__builtin_ia32_storedqudi256_mask:
6707   case X86::BI__builtin_ia32_storedqusi256_mask:
6708   case X86::BI__builtin_ia32_storedquhi256_mask:
6709   case X86::BI__builtin_ia32_storedquqi256_mask:
6710   case X86::BI__builtin_ia32_storeupd256_mask:
6711   case X86::BI__builtin_ia32_storeups256_mask:
6712   case X86::BI__builtin_ia32_storedqudi512_mask:
6713   case X86::BI__builtin_ia32_storedqusi512_mask:
6714   case X86::BI__builtin_ia32_storedquhi512_mask:
6715   case X86::BI__builtin_ia32_storedquqi512_mask:
6716   case X86::BI__builtin_ia32_storeupd512_mask:
6717   case X86::BI__builtin_ia32_storeups512_mask:
6718     return EmitX86MaskedStore(*this, Ops, 1);
6719 
6720   case X86::BI__builtin_ia32_movdqa32store128_mask:
6721   case X86::BI__builtin_ia32_movdqa64store128_mask:
6722   case X86::BI__builtin_ia32_storeaps128_mask:
6723   case X86::BI__builtin_ia32_storeapd128_mask:
6724   case X86::BI__builtin_ia32_movdqa32store256_mask:
6725   case X86::BI__builtin_ia32_movdqa64store256_mask:
6726   case X86::BI__builtin_ia32_storeaps256_mask:
6727   case X86::BI__builtin_ia32_storeapd256_mask:
6728   case X86::BI__builtin_ia32_movdqa32store512_mask:
6729   case X86::BI__builtin_ia32_movdqa64store512_mask:
6730   case X86::BI__builtin_ia32_storeaps512_mask:
6731   case X86::BI__builtin_ia32_storeapd512_mask: {
6732     unsigned Align =
6733       getContext().getTypeAlignInChars(E->getArg(1)->getType()).getQuantity();
6734     return EmitX86MaskedStore(*this, Ops, Align);
6735   }
6736   case X86::BI__builtin_ia32_loadups128_mask:
6737   case X86::BI__builtin_ia32_loadups256_mask:
6738   case X86::BI__builtin_ia32_loadups512_mask:
6739   case X86::BI__builtin_ia32_loadupd128_mask:
6740   case X86::BI__builtin_ia32_loadupd256_mask:
6741   case X86::BI__builtin_ia32_loadupd512_mask:
6742   case X86::BI__builtin_ia32_loaddquqi128_mask:
6743   case X86::BI__builtin_ia32_loaddquqi256_mask:
6744   case X86::BI__builtin_ia32_loaddquqi512_mask:
6745   case X86::BI__builtin_ia32_loaddquhi128_mask:
6746   case X86::BI__builtin_ia32_loaddquhi256_mask:
6747   case X86::BI__builtin_ia32_loaddquhi512_mask:
6748   case X86::BI__builtin_ia32_loaddqusi128_mask:
6749   case X86::BI__builtin_ia32_loaddqusi256_mask:
6750   case X86::BI__builtin_ia32_loaddqusi512_mask:
6751   case X86::BI__builtin_ia32_loaddqudi128_mask:
6752   case X86::BI__builtin_ia32_loaddqudi256_mask:
6753   case X86::BI__builtin_ia32_loaddqudi512_mask:
6754     return EmitX86MaskedLoad(*this, Ops, 1);
6755 
6756   case X86::BI__builtin_ia32_loadaps128_mask:
6757   case X86::BI__builtin_ia32_loadaps256_mask:
6758   case X86::BI__builtin_ia32_loadaps512_mask:
6759   case X86::BI__builtin_ia32_loadapd128_mask:
6760   case X86::BI__builtin_ia32_loadapd256_mask:
6761   case X86::BI__builtin_ia32_loadapd512_mask:
6762   case X86::BI__builtin_ia32_movdqa32load128_mask:
6763   case X86::BI__builtin_ia32_movdqa32load256_mask:
6764   case X86::BI__builtin_ia32_movdqa32load512_mask:
6765   case X86::BI__builtin_ia32_movdqa64load128_mask:
6766   case X86::BI__builtin_ia32_movdqa64load256_mask:
6767   case X86::BI__builtin_ia32_movdqa64load512_mask: {
6768     unsigned Align =
6769       getContext().getTypeAlignInChars(E->getArg(1)->getType()).getQuantity();
6770     return EmitX86MaskedLoad(*this, Ops, Align);
6771   }
6772   case X86::BI__builtin_ia32_storehps:
6773   case X86::BI__builtin_ia32_storelps: {
6774     llvm::Type *PtrTy = llvm::PointerType::getUnqual(Int64Ty);
6775     llvm::Type *VecTy = llvm::VectorType::get(Int64Ty, 2);
6776 
6777     // cast val v2i64
6778     Ops[1] = Builder.CreateBitCast(Ops[1], VecTy, "cast");
6779 
6780     // extract (0, 1)
6781     unsigned Index = BuiltinID == X86::BI__builtin_ia32_storelps ? 0 : 1;
6782     llvm::Value *Idx = llvm::ConstantInt::get(SizeTy, Index);
6783     Ops[1] = Builder.CreateExtractElement(Ops[1], Idx, "extract");
6784 
6785     // cast pointer to i64 & store
6786     Ops[0] = Builder.CreateBitCast(Ops[0], PtrTy);
6787     return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]);
6788   }
6789   case X86::BI__builtin_ia32_palignr128:
6790   case X86::BI__builtin_ia32_palignr256:
6791   case X86::BI__builtin_ia32_palignr128_mask:
6792   case X86::BI__builtin_ia32_palignr256_mask:
6793   case X86::BI__builtin_ia32_palignr512_mask: {
6794     unsigned ShiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
6795 
6796     unsigned NumElts =
6797       cast<llvm::VectorType>(Ops[0]->getType())->getNumElements();
6798     assert(NumElts % 16 == 0);
6799 
6800     // If palignr is shifting the pair of vectors more than the size of two
6801     // lanes, emit zero.
6802     if (ShiftVal >= 32)
6803       return llvm::Constant::getNullValue(ConvertType(E->getType()));
6804 
6805     // If palignr is shifting the pair of input vectors more than one lane,
6806     // but less than two lanes, convert to shifting in zeroes.
6807     if (ShiftVal > 16) {
6808       ShiftVal -= 16;
6809       Ops[1] = Ops[0];
6810       Ops[0] = llvm::Constant::getNullValue(Ops[0]->getType());
6811     }
6812 
6813     uint32_t Indices[64];
6814     // 256-bit palignr operates on 128-bit lanes so we need to handle that
6815     for (unsigned l = 0; l != NumElts; l += 16) {
6816       for (unsigned i = 0; i != 16; ++i) {
6817         unsigned Idx = ShiftVal + i;
6818         if (Idx >= 16)
6819           Idx += NumElts - 16; // End of lane, switch operand.
6820         Indices[l + i] = Idx + l;
6821       }
6822     }
6823 
6824     Value *Align = Builder.CreateShuffleVector(Ops[1], Ops[0],
6825                                                makeArrayRef(Indices, NumElts),
6826                                                "palignr");
6827 
6828     // If this isn't a masked builtin, just return the align operation.
6829     if (Ops.size() == 3)
6830       return Align;
6831 
6832     return EmitX86Select(*this, Ops[4], Align, Ops[3]);
6833   }
6834 
6835   case X86::BI__builtin_ia32_movnti:
6836   case X86::BI__builtin_ia32_movnti64: {
6837     llvm::MDNode *Node = llvm::MDNode::get(
6838         getLLVMContext(), llvm::ConstantAsMetadata::get(Builder.getInt32(1)));
6839 
6840     // Convert the type of the pointer to a pointer to the stored type.
6841     Value *BC = Builder.CreateBitCast(Ops[0],
6842                                 llvm::PointerType::getUnqual(Ops[1]->getType()),
6843                                       "cast");
6844     StoreInst *SI = Builder.CreateDefaultAlignedStore(Ops[1], BC);
6845     SI->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node);
6846 
6847     // No alignment for scalar intrinsic store.
6848     SI->setAlignment(1);
6849     return SI;
6850   }
6851   case X86::BI__builtin_ia32_movntsd:
6852   case X86::BI__builtin_ia32_movntss: {
6853     llvm::MDNode *Node = llvm::MDNode::get(
6854         getLLVMContext(), llvm::ConstantAsMetadata::get(Builder.getInt32(1)));
6855 
6856     // Extract the 0'th element of the source vector.
6857     Value *Scl = Builder.CreateExtractElement(Ops[1], (uint64_t)0, "extract");
6858 
6859     // Convert the type of the pointer to a pointer to the stored type.
6860     Value *BC = Builder.CreateBitCast(Ops[0],
6861                                 llvm::PointerType::getUnqual(Scl->getType()),
6862                                       "cast");
6863 
6864     // Unaligned nontemporal store of the scalar value.
6865     StoreInst *SI = Builder.CreateDefaultAlignedStore(Scl, BC);
6866     SI->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node);
6867     SI->setAlignment(1);
6868     return SI;
6869   }
6870 
6871   case X86::BI__builtin_ia32_selectb_128:
6872   case X86::BI__builtin_ia32_selectb_256:
6873   case X86::BI__builtin_ia32_selectb_512:
6874   case X86::BI__builtin_ia32_selectw_128:
6875   case X86::BI__builtin_ia32_selectw_256:
6876   case X86::BI__builtin_ia32_selectw_512:
6877   case X86::BI__builtin_ia32_selectd_128:
6878   case X86::BI__builtin_ia32_selectd_256:
6879   case X86::BI__builtin_ia32_selectd_512:
6880   case X86::BI__builtin_ia32_selectq_128:
6881   case X86::BI__builtin_ia32_selectq_256:
6882   case X86::BI__builtin_ia32_selectq_512:
6883   case X86::BI__builtin_ia32_selectps_128:
6884   case X86::BI__builtin_ia32_selectps_256:
6885   case X86::BI__builtin_ia32_selectps_512:
6886   case X86::BI__builtin_ia32_selectpd_128:
6887   case X86::BI__builtin_ia32_selectpd_256:
6888   case X86::BI__builtin_ia32_selectpd_512:
6889     return EmitX86Select(*this, Ops[0], Ops[1], Ops[2]);
6890   case X86::BI__builtin_ia32_pcmpeqb128_mask:
6891   case X86::BI__builtin_ia32_pcmpeqb256_mask:
6892   case X86::BI__builtin_ia32_pcmpeqb512_mask:
6893   case X86::BI__builtin_ia32_pcmpeqw128_mask:
6894   case X86::BI__builtin_ia32_pcmpeqw256_mask:
6895   case X86::BI__builtin_ia32_pcmpeqw512_mask:
6896   case X86::BI__builtin_ia32_pcmpeqd128_mask:
6897   case X86::BI__builtin_ia32_pcmpeqd256_mask:
6898   case X86::BI__builtin_ia32_pcmpeqd512_mask:
6899   case X86::BI__builtin_ia32_pcmpeqq128_mask:
6900   case X86::BI__builtin_ia32_pcmpeqq256_mask:
6901   case X86::BI__builtin_ia32_pcmpeqq512_mask:
6902     return EmitX86MaskedCompare(*this, ICmpInst::ICMP_EQ, Ops);
6903   case X86::BI__builtin_ia32_pcmpgtb128_mask:
6904   case X86::BI__builtin_ia32_pcmpgtb256_mask:
6905   case X86::BI__builtin_ia32_pcmpgtb512_mask:
6906   case X86::BI__builtin_ia32_pcmpgtw128_mask:
6907   case X86::BI__builtin_ia32_pcmpgtw256_mask:
6908   case X86::BI__builtin_ia32_pcmpgtw512_mask:
6909   case X86::BI__builtin_ia32_pcmpgtd128_mask:
6910   case X86::BI__builtin_ia32_pcmpgtd256_mask:
6911   case X86::BI__builtin_ia32_pcmpgtd512_mask:
6912   case X86::BI__builtin_ia32_pcmpgtq128_mask:
6913   case X86::BI__builtin_ia32_pcmpgtq256_mask:
6914   case X86::BI__builtin_ia32_pcmpgtq512_mask:
6915     return EmitX86MaskedCompare(*this, ICmpInst::ICMP_SGT, Ops);
6916 
6917   // TODO: Handle 64/512-bit vector widths of min/max.
6918   case X86::BI__builtin_ia32_pmaxsb128:
6919   case X86::BI__builtin_ia32_pmaxsw128:
6920   case X86::BI__builtin_ia32_pmaxsd128:
6921   case X86::BI__builtin_ia32_pmaxsb256:
6922   case X86::BI__builtin_ia32_pmaxsw256:
6923   case X86::BI__builtin_ia32_pmaxsd256: {
6924     Value *Cmp = Builder.CreateICmp(ICmpInst::ICMP_SGT, Ops[0], Ops[1]);
6925     return Builder.CreateSelect(Cmp, Ops[0], Ops[1]);
6926   }
6927   case X86::BI__builtin_ia32_pmaxub128:
6928   case X86::BI__builtin_ia32_pmaxuw128:
6929   case X86::BI__builtin_ia32_pmaxud128:
6930   case X86::BI__builtin_ia32_pmaxub256:
6931   case X86::BI__builtin_ia32_pmaxuw256:
6932   case X86::BI__builtin_ia32_pmaxud256: {
6933     Value *Cmp = Builder.CreateICmp(ICmpInst::ICMP_UGT, Ops[0], Ops[1]);
6934     return Builder.CreateSelect(Cmp, Ops[0], Ops[1]);
6935   }
6936   case X86::BI__builtin_ia32_pminsb128:
6937   case X86::BI__builtin_ia32_pminsw128:
6938   case X86::BI__builtin_ia32_pminsd128:
6939   case X86::BI__builtin_ia32_pminsb256:
6940   case X86::BI__builtin_ia32_pminsw256:
6941   case X86::BI__builtin_ia32_pminsd256: {
6942     Value *Cmp = Builder.CreateICmp(ICmpInst::ICMP_SLT, Ops[0], Ops[1]);
6943     return Builder.CreateSelect(Cmp, Ops[0], Ops[1]);
6944   }
6945   case X86::BI__builtin_ia32_pminub128:
6946   case X86::BI__builtin_ia32_pminuw128:
6947   case X86::BI__builtin_ia32_pminud128:
6948   case X86::BI__builtin_ia32_pminub256:
6949   case X86::BI__builtin_ia32_pminuw256:
6950   case X86::BI__builtin_ia32_pminud256: {
6951     Value *Cmp = Builder.CreateICmp(ICmpInst::ICMP_ULT, Ops[0], Ops[1]);
6952     return Builder.CreateSelect(Cmp, Ops[0], Ops[1]);
6953   }
6954 
6955   // 3DNow!
6956   case X86::BI__builtin_ia32_pswapdsf:
6957   case X86::BI__builtin_ia32_pswapdsi: {
6958     llvm::Type *MMXTy = llvm::Type::getX86_MMXTy(getLLVMContext());
6959     Ops[0] = Builder.CreateBitCast(Ops[0], MMXTy, "cast");
6960     llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_3dnowa_pswapd);
6961     return Builder.CreateCall(F, Ops, "pswapd");
6962   }
6963   case X86::BI__builtin_ia32_rdrand16_step:
6964   case X86::BI__builtin_ia32_rdrand32_step:
6965   case X86::BI__builtin_ia32_rdrand64_step:
6966   case X86::BI__builtin_ia32_rdseed16_step:
6967   case X86::BI__builtin_ia32_rdseed32_step:
6968   case X86::BI__builtin_ia32_rdseed64_step: {
6969     Intrinsic::ID ID;
6970     switch (BuiltinID) {
6971     default: llvm_unreachable("Unsupported intrinsic!");
6972     case X86::BI__builtin_ia32_rdrand16_step:
6973       ID = Intrinsic::x86_rdrand_16;
6974       break;
6975     case X86::BI__builtin_ia32_rdrand32_step:
6976       ID = Intrinsic::x86_rdrand_32;
6977       break;
6978     case X86::BI__builtin_ia32_rdrand64_step:
6979       ID = Intrinsic::x86_rdrand_64;
6980       break;
6981     case X86::BI__builtin_ia32_rdseed16_step:
6982       ID = Intrinsic::x86_rdseed_16;
6983       break;
6984     case X86::BI__builtin_ia32_rdseed32_step:
6985       ID = Intrinsic::x86_rdseed_32;
6986       break;
6987     case X86::BI__builtin_ia32_rdseed64_step:
6988       ID = Intrinsic::x86_rdseed_64;
6989       break;
6990     }
6991 
6992     Value *Call = Builder.CreateCall(CGM.getIntrinsic(ID));
6993     Builder.CreateDefaultAlignedStore(Builder.CreateExtractValue(Call, 0),
6994                                       Ops[0]);
6995     return Builder.CreateExtractValue(Call, 1);
6996   }
6997 
6998   // SSE packed comparison intrinsics
6999   case X86::BI__builtin_ia32_cmpeqps:
7000     return getVectorFCmpIR(CmpInst::FCMP_OEQ, V4F32);
7001   case X86::BI__builtin_ia32_cmpltps:
7002     return getVectorFCmpIR(CmpInst::FCMP_OLT, V4F32);
7003   case X86::BI__builtin_ia32_cmpleps:
7004     return getVectorFCmpIR(CmpInst::FCMP_OLE, V4F32);
7005   case X86::BI__builtin_ia32_cmpunordps:
7006     return getVectorFCmpIR(CmpInst::FCMP_UNO, V4F32);
7007   case X86::BI__builtin_ia32_cmpneqps:
7008     return getVectorFCmpIR(CmpInst::FCMP_UNE, V4F32);
7009   case X86::BI__builtin_ia32_cmpnltps:
7010     return getVectorFCmpIR(CmpInst::FCMP_UGE, V4F32);
7011   case X86::BI__builtin_ia32_cmpnleps:
7012     return getVectorFCmpIR(CmpInst::FCMP_UGT, V4F32);
7013   case X86::BI__builtin_ia32_cmpordps:
7014     return getVectorFCmpIR(CmpInst::FCMP_ORD, V4F32);
7015   case X86::BI__builtin_ia32_cmpeqpd:
7016     return getVectorFCmpIR(CmpInst::FCMP_OEQ, V2F64);
7017   case X86::BI__builtin_ia32_cmpltpd:
7018     return getVectorFCmpIR(CmpInst::FCMP_OLT, V2F64);
7019   case X86::BI__builtin_ia32_cmplepd:
7020     return getVectorFCmpIR(CmpInst::FCMP_OLE, V2F64);
7021   case X86::BI__builtin_ia32_cmpunordpd:
7022     return getVectorFCmpIR(CmpInst::FCMP_UNO, V2F64);
7023   case X86::BI__builtin_ia32_cmpneqpd:
7024     return getVectorFCmpIR(CmpInst::FCMP_UNE, V2F64);
7025   case X86::BI__builtin_ia32_cmpnltpd:
7026     return getVectorFCmpIR(CmpInst::FCMP_UGE, V2F64);
7027   case X86::BI__builtin_ia32_cmpnlepd:
7028     return getVectorFCmpIR(CmpInst::FCMP_UGT, V2F64);
7029   case X86::BI__builtin_ia32_cmpordpd:
7030     return getVectorFCmpIR(CmpInst::FCMP_ORD, V2F64);
7031 
7032   // SSE scalar comparison intrinsics
7033   case X86::BI__builtin_ia32_cmpeqss:
7034     return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 0);
7035   case X86::BI__builtin_ia32_cmpltss:
7036     return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 1);
7037   case X86::BI__builtin_ia32_cmpless:
7038     return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 2);
7039   case X86::BI__builtin_ia32_cmpunordss:
7040     return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 3);
7041   case X86::BI__builtin_ia32_cmpneqss:
7042     return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 4);
7043   case X86::BI__builtin_ia32_cmpnltss:
7044     return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 5);
7045   case X86::BI__builtin_ia32_cmpnless:
7046     return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 6);
7047   case X86::BI__builtin_ia32_cmpordss:
7048     return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 7);
7049   case X86::BI__builtin_ia32_cmpeqsd:
7050     return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 0);
7051   case X86::BI__builtin_ia32_cmpltsd:
7052     return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 1);
7053   case X86::BI__builtin_ia32_cmplesd:
7054     return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 2);
7055   case X86::BI__builtin_ia32_cmpunordsd:
7056     return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 3);
7057   case X86::BI__builtin_ia32_cmpneqsd:
7058     return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 4);
7059   case X86::BI__builtin_ia32_cmpnltsd:
7060     return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 5);
7061   case X86::BI__builtin_ia32_cmpnlesd:
7062     return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 6);
7063   case X86::BI__builtin_ia32_cmpordsd:
7064     return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 7);
7065   }
7066 }
7067 
7068 
7069 Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
7070                                            const CallExpr *E) {
7071   SmallVector<Value*, 4> Ops;
7072 
7073   for (unsigned i = 0, e = E->getNumArgs(); i != e; i++)
7074     Ops.push_back(EmitScalarExpr(E->getArg(i)));
7075 
7076   Intrinsic::ID ID = Intrinsic::not_intrinsic;
7077 
7078   switch (BuiltinID) {
7079   default: return nullptr;
7080 
7081   // __builtin_ppc_get_timebase is GCC 4.8+'s PowerPC-specific name for what we
7082   // call __builtin_readcyclecounter.
7083   case PPC::BI__builtin_ppc_get_timebase:
7084     return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::readcyclecounter));
7085 
7086   // vec_ld, vec_lvsl, vec_lvsr
7087   case PPC::BI__builtin_altivec_lvx:
7088   case PPC::BI__builtin_altivec_lvxl:
7089   case PPC::BI__builtin_altivec_lvebx:
7090   case PPC::BI__builtin_altivec_lvehx:
7091   case PPC::BI__builtin_altivec_lvewx:
7092   case PPC::BI__builtin_altivec_lvsl:
7093   case PPC::BI__builtin_altivec_lvsr:
7094   case PPC::BI__builtin_vsx_lxvd2x:
7095   case PPC::BI__builtin_vsx_lxvw4x:
7096   {
7097     Ops[1] = Builder.CreateBitCast(Ops[1], Int8PtrTy);
7098 
7099     Ops[0] = Builder.CreateGEP(Ops[1], Ops[0]);
7100     Ops.pop_back();
7101 
7102     switch (BuiltinID) {
7103     default: llvm_unreachable("Unsupported ld/lvsl/lvsr intrinsic!");
7104     case PPC::BI__builtin_altivec_lvx:
7105       ID = Intrinsic::ppc_altivec_lvx;
7106       break;
7107     case PPC::BI__builtin_altivec_lvxl:
7108       ID = Intrinsic::ppc_altivec_lvxl;
7109       break;
7110     case PPC::BI__builtin_altivec_lvebx:
7111       ID = Intrinsic::ppc_altivec_lvebx;
7112       break;
7113     case PPC::BI__builtin_altivec_lvehx:
7114       ID = Intrinsic::ppc_altivec_lvehx;
7115       break;
7116     case PPC::BI__builtin_altivec_lvewx:
7117       ID = Intrinsic::ppc_altivec_lvewx;
7118       break;
7119     case PPC::BI__builtin_altivec_lvsl:
7120       ID = Intrinsic::ppc_altivec_lvsl;
7121       break;
7122     case PPC::BI__builtin_altivec_lvsr:
7123       ID = Intrinsic::ppc_altivec_lvsr;
7124       break;
7125     case PPC::BI__builtin_vsx_lxvd2x:
7126       ID = Intrinsic::ppc_vsx_lxvd2x;
7127       break;
7128     case PPC::BI__builtin_vsx_lxvw4x:
7129       ID = Intrinsic::ppc_vsx_lxvw4x;
7130       break;
7131     }
7132     llvm::Function *F = CGM.getIntrinsic(ID);
7133     return Builder.CreateCall(F, Ops, "");
7134   }
7135 
7136   // vec_st
7137   case PPC::BI__builtin_altivec_stvx:
7138   case PPC::BI__builtin_altivec_stvxl:
7139   case PPC::BI__builtin_altivec_stvebx:
7140   case PPC::BI__builtin_altivec_stvehx:
7141   case PPC::BI__builtin_altivec_stvewx:
7142   case PPC::BI__builtin_vsx_stxvd2x:
7143   case PPC::BI__builtin_vsx_stxvw4x:
7144   {
7145     Ops[2] = Builder.CreateBitCast(Ops[2], Int8PtrTy);
7146     Ops[1] = Builder.CreateGEP(Ops[2], Ops[1]);
7147     Ops.pop_back();
7148 
7149     switch (BuiltinID) {
7150     default: llvm_unreachable("Unsupported st intrinsic!");
7151     case PPC::BI__builtin_altivec_stvx:
7152       ID = Intrinsic::ppc_altivec_stvx;
7153       break;
7154     case PPC::BI__builtin_altivec_stvxl:
7155       ID = Intrinsic::ppc_altivec_stvxl;
7156       break;
7157     case PPC::BI__builtin_altivec_stvebx:
7158       ID = Intrinsic::ppc_altivec_stvebx;
7159       break;
7160     case PPC::BI__builtin_altivec_stvehx:
7161       ID = Intrinsic::ppc_altivec_stvehx;
7162       break;
7163     case PPC::BI__builtin_altivec_stvewx:
7164       ID = Intrinsic::ppc_altivec_stvewx;
7165       break;
7166     case PPC::BI__builtin_vsx_stxvd2x:
7167       ID = Intrinsic::ppc_vsx_stxvd2x;
7168       break;
7169     case PPC::BI__builtin_vsx_stxvw4x:
7170       ID = Intrinsic::ppc_vsx_stxvw4x;
7171       break;
7172     }
7173     llvm::Function *F = CGM.getIntrinsic(ID);
7174     return Builder.CreateCall(F, Ops, "");
7175   }
7176   // Square root
7177   case PPC::BI__builtin_vsx_xvsqrtsp:
7178   case PPC::BI__builtin_vsx_xvsqrtdp: {
7179     llvm::Type *ResultType = ConvertType(E->getType());
7180     Value *X = EmitScalarExpr(E->getArg(0));
7181     ID = Intrinsic::sqrt;
7182     llvm::Function *F = CGM.getIntrinsic(ID, ResultType);
7183     return Builder.CreateCall(F, X);
7184   }
7185   // Count leading zeros
7186   case PPC::BI__builtin_altivec_vclzb:
7187   case PPC::BI__builtin_altivec_vclzh:
7188   case PPC::BI__builtin_altivec_vclzw:
7189   case PPC::BI__builtin_altivec_vclzd: {
7190     llvm::Type *ResultType = ConvertType(E->getType());
7191     Value *X = EmitScalarExpr(E->getArg(0));
7192     Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false);
7193     Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ResultType);
7194     return Builder.CreateCall(F, {X, Undef});
7195   }
7196   // Copy sign
7197   case PPC::BI__builtin_vsx_xvcpsgnsp:
7198   case PPC::BI__builtin_vsx_xvcpsgndp: {
7199     llvm::Type *ResultType = ConvertType(E->getType());
7200     Value *X = EmitScalarExpr(E->getArg(0));
7201     Value *Y = EmitScalarExpr(E->getArg(1));
7202     ID = Intrinsic::copysign;
7203     llvm::Function *F = CGM.getIntrinsic(ID, ResultType);
7204     return Builder.CreateCall(F, {X, Y});
7205   }
7206   // Rounding/truncation
7207   case PPC::BI__builtin_vsx_xvrspip:
7208   case PPC::BI__builtin_vsx_xvrdpip:
7209   case PPC::BI__builtin_vsx_xvrdpim:
7210   case PPC::BI__builtin_vsx_xvrspim:
7211   case PPC::BI__builtin_vsx_xvrdpi:
7212   case PPC::BI__builtin_vsx_xvrspi:
7213   case PPC::BI__builtin_vsx_xvrdpic:
7214   case PPC::BI__builtin_vsx_xvrspic:
7215   case PPC::BI__builtin_vsx_xvrdpiz:
7216   case PPC::BI__builtin_vsx_xvrspiz: {
7217     llvm::Type *ResultType = ConvertType(E->getType());
7218     Value *X = EmitScalarExpr(E->getArg(0));
7219     if (BuiltinID == PPC::BI__builtin_vsx_xvrdpim ||
7220         BuiltinID == PPC::BI__builtin_vsx_xvrspim)
7221       ID = Intrinsic::floor;
7222     else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpi ||
7223              BuiltinID == PPC::BI__builtin_vsx_xvrspi)
7224       ID = Intrinsic::round;
7225     else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpic ||
7226              BuiltinID == PPC::BI__builtin_vsx_xvrspic)
7227       ID = Intrinsic::nearbyint;
7228     else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpip ||
7229              BuiltinID == PPC::BI__builtin_vsx_xvrspip)
7230       ID = Intrinsic::ceil;
7231     else if (BuiltinID == PPC::BI__builtin_vsx_xvrdpiz ||
7232              BuiltinID == PPC::BI__builtin_vsx_xvrspiz)
7233       ID = Intrinsic::trunc;
7234     llvm::Function *F = CGM.getIntrinsic(ID, ResultType);
7235     return Builder.CreateCall(F, X);
7236   }
7237 
7238   // Absolute value
7239   case PPC::BI__builtin_vsx_xvabsdp:
7240   case PPC::BI__builtin_vsx_xvabssp: {
7241     llvm::Type *ResultType = ConvertType(E->getType());
7242     Value *X = EmitScalarExpr(E->getArg(0));
7243     llvm::Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType);
7244     return Builder.CreateCall(F, X);
7245   }
7246 
7247   // FMA variations
7248   case PPC::BI__builtin_vsx_xvmaddadp:
7249   case PPC::BI__builtin_vsx_xvmaddasp:
7250   case PPC::BI__builtin_vsx_xvnmaddadp:
7251   case PPC::BI__builtin_vsx_xvnmaddasp:
7252   case PPC::BI__builtin_vsx_xvmsubadp:
7253   case PPC::BI__builtin_vsx_xvmsubasp:
7254   case PPC::BI__builtin_vsx_xvnmsubadp:
7255   case PPC::BI__builtin_vsx_xvnmsubasp: {
7256     llvm::Type *ResultType = ConvertType(E->getType());
7257     Value *X = EmitScalarExpr(E->getArg(0));
7258     Value *Y = EmitScalarExpr(E->getArg(1));
7259     Value *Z = EmitScalarExpr(E->getArg(2));
7260     Value *Zero = llvm::ConstantFP::getZeroValueForNegation(ResultType);
7261     llvm::Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
7262     switch (BuiltinID) {
7263       case PPC::BI__builtin_vsx_xvmaddadp:
7264       case PPC::BI__builtin_vsx_xvmaddasp:
7265         return Builder.CreateCall(F, {X, Y, Z});
7266       case PPC::BI__builtin_vsx_xvnmaddadp:
7267       case PPC::BI__builtin_vsx_xvnmaddasp:
7268         return Builder.CreateFSub(Zero,
7269                                   Builder.CreateCall(F, {X, Y, Z}), "sub");
7270       case PPC::BI__builtin_vsx_xvmsubadp:
7271       case PPC::BI__builtin_vsx_xvmsubasp:
7272         return Builder.CreateCall(F,
7273                                   {X, Y, Builder.CreateFSub(Zero, Z, "sub")});
7274       case PPC::BI__builtin_vsx_xvnmsubadp:
7275       case PPC::BI__builtin_vsx_xvnmsubasp:
7276         Value *FsubRes =
7277           Builder.CreateCall(F, {X, Y, Builder.CreateFSub(Zero, Z, "sub")});
7278         return Builder.CreateFSub(Zero, FsubRes, "sub");
7279     }
7280     llvm_unreachable("Unknown FMA operation");
7281     return nullptr; // Suppress no-return warning
7282   }
7283   }
7284 }
7285 
7286 Value *CodeGenFunction::EmitAMDGPUBuiltinExpr(unsigned BuiltinID,
7287                                               const CallExpr *E) {
7288   switch (BuiltinID) {
7289   case AMDGPU::BI__builtin_amdgcn_div_scale:
7290   case AMDGPU::BI__builtin_amdgcn_div_scalef: {
7291     // Translate from the intrinsics's struct return to the builtin's out
7292     // argument.
7293 
7294     Address FlagOutPtr = EmitPointerWithAlignment(E->getArg(3));
7295 
7296     llvm::Value *X = EmitScalarExpr(E->getArg(0));
7297     llvm::Value *Y = EmitScalarExpr(E->getArg(1));
7298     llvm::Value *Z = EmitScalarExpr(E->getArg(2));
7299 
7300     llvm::Value *Callee = CGM.getIntrinsic(Intrinsic::amdgcn_div_scale,
7301                                            X->getType());
7302 
7303     llvm::Value *Tmp = Builder.CreateCall(Callee, {X, Y, Z});
7304 
7305     llvm::Value *Result = Builder.CreateExtractValue(Tmp, 0);
7306     llvm::Value *Flag = Builder.CreateExtractValue(Tmp, 1);
7307 
7308     llvm::Type *RealFlagType
7309       = FlagOutPtr.getPointer()->getType()->getPointerElementType();
7310 
7311     llvm::Value *FlagExt = Builder.CreateZExt(Flag, RealFlagType);
7312     Builder.CreateStore(FlagExt, FlagOutPtr);
7313     return Result;
7314   }
7315   case AMDGPU::BI__builtin_amdgcn_div_fmas:
7316   case AMDGPU::BI__builtin_amdgcn_div_fmasf: {
7317     llvm::Value *Src0 = EmitScalarExpr(E->getArg(0));
7318     llvm::Value *Src1 = EmitScalarExpr(E->getArg(1));
7319     llvm::Value *Src2 = EmitScalarExpr(E->getArg(2));
7320     llvm::Value *Src3 = EmitScalarExpr(E->getArg(3));
7321 
7322     llvm::Value *F = CGM.getIntrinsic(Intrinsic::amdgcn_div_fmas,
7323                                       Src0->getType());
7324     llvm::Value *Src3ToBool = Builder.CreateIsNotNull(Src3);
7325     return Builder.CreateCall(F, {Src0, Src1, Src2, Src3ToBool});
7326   }
7327   case AMDGPU::BI__builtin_amdgcn_div_fixup:
7328   case AMDGPU::BI__builtin_amdgcn_div_fixupf:
7329     return emitTernaryFPBuiltin(*this, E, Intrinsic::amdgcn_div_fixup);
7330   case AMDGPU::BI__builtin_amdgcn_trig_preop:
7331   case AMDGPU::BI__builtin_amdgcn_trig_preopf:
7332     return emitFPIntBuiltin(*this, E, Intrinsic::amdgcn_trig_preop);
7333   case AMDGPU::BI__builtin_amdgcn_rcp:
7334   case AMDGPU::BI__builtin_amdgcn_rcpf:
7335     return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_rcp);
7336   case AMDGPU::BI__builtin_amdgcn_rsq:
7337   case AMDGPU::BI__builtin_amdgcn_rsqf:
7338     return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_rsq);
7339   case AMDGPU::BI__builtin_amdgcn_rsq_clamp:
7340   case AMDGPU::BI__builtin_amdgcn_rsq_clampf:
7341     return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_rsq_clamp);
7342   case AMDGPU::BI__builtin_amdgcn_sinf:
7343     return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_sin);
7344   case AMDGPU::BI__builtin_amdgcn_cosf:
7345     return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_cos);
7346   case AMDGPU::BI__builtin_amdgcn_log_clampf:
7347     return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_log_clamp);
7348   case AMDGPU::BI__builtin_amdgcn_ldexp:
7349   case AMDGPU::BI__builtin_amdgcn_ldexpf:
7350     return emitFPIntBuiltin(*this, E, Intrinsic::amdgcn_ldexp);
7351   case AMDGPU::BI__builtin_amdgcn_frexp_mant:
7352   case AMDGPU::BI__builtin_amdgcn_frexp_mantf: {
7353     return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_frexp_mant);
7354   }
7355   case AMDGPU::BI__builtin_amdgcn_frexp_exp:
7356   case AMDGPU::BI__builtin_amdgcn_frexp_expf: {
7357     return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_frexp_exp);
7358   }
7359   case AMDGPU::BI__builtin_amdgcn_fract:
7360   case AMDGPU::BI__builtin_amdgcn_fractf:
7361     return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_fract);
7362   case AMDGPU::BI__builtin_amdgcn_class:
7363   case AMDGPU::BI__builtin_amdgcn_classf:
7364     return emitFPIntBuiltin(*this, E, Intrinsic::amdgcn_class);
7365 
7366     // Legacy amdgpu prefix
7367   case AMDGPU::BI__builtin_amdgpu_rsq:
7368   case AMDGPU::BI__builtin_amdgpu_rsqf: {
7369     if (getTarget().getTriple().getArch() == Triple::amdgcn)
7370       return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_rsq);
7371     return emitUnaryBuiltin(*this, E, Intrinsic::r600_rsq);
7372   }
7373   case AMDGPU::BI__builtin_amdgpu_ldexp:
7374   case AMDGPU::BI__builtin_amdgpu_ldexpf: {
7375     if (getTarget().getTriple().getArch() == Triple::amdgcn)
7376       return emitFPIntBuiltin(*this, E, Intrinsic::amdgcn_ldexp);
7377     return emitFPIntBuiltin(*this, E, Intrinsic::AMDGPU_ldexp);
7378   }
7379   default:
7380     return nullptr;
7381   }
7382 }
7383 
7384 /// Handle a SystemZ function in which the final argument is a pointer
7385 /// to an int that receives the post-instruction CC value.  At the LLVM level
7386 /// this is represented as a function that returns a {result, cc} pair.
7387 static Value *EmitSystemZIntrinsicWithCC(CodeGenFunction &CGF,
7388                                          unsigned IntrinsicID,
7389                                          const CallExpr *E) {
7390   unsigned NumArgs = E->getNumArgs() - 1;
7391   SmallVector<Value *, 8> Args(NumArgs);
7392   for (unsigned I = 0; I < NumArgs; ++I)
7393     Args[I] = CGF.EmitScalarExpr(E->getArg(I));
7394   Address CCPtr = CGF.EmitPointerWithAlignment(E->getArg(NumArgs));
7395   Value *F = CGF.CGM.getIntrinsic(IntrinsicID);
7396   Value *Call = CGF.Builder.CreateCall(F, Args);
7397   Value *CC = CGF.Builder.CreateExtractValue(Call, 1);
7398   CGF.Builder.CreateStore(CC, CCPtr);
7399   return CGF.Builder.CreateExtractValue(Call, 0);
7400 }
7401 
7402 Value *CodeGenFunction::EmitSystemZBuiltinExpr(unsigned BuiltinID,
7403                                                const CallExpr *E) {
7404   switch (BuiltinID) {
7405   case SystemZ::BI__builtin_tbegin: {
7406     Value *TDB = EmitScalarExpr(E->getArg(0));
7407     Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff0c);
7408     Value *F = CGM.getIntrinsic(Intrinsic::s390_tbegin);
7409     return Builder.CreateCall(F, {TDB, Control});
7410   }
7411   case SystemZ::BI__builtin_tbegin_nofloat: {
7412     Value *TDB = EmitScalarExpr(E->getArg(0));
7413     Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff0c);
7414     Value *F = CGM.getIntrinsic(Intrinsic::s390_tbegin_nofloat);
7415     return Builder.CreateCall(F, {TDB, Control});
7416   }
7417   case SystemZ::BI__builtin_tbeginc: {
7418     Value *TDB = llvm::ConstantPointerNull::get(Int8PtrTy);
7419     Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff08);
7420     Value *F = CGM.getIntrinsic(Intrinsic::s390_tbeginc);
7421     return Builder.CreateCall(F, {TDB, Control});
7422   }
7423   case SystemZ::BI__builtin_tabort: {
7424     Value *Data = EmitScalarExpr(E->getArg(0));
7425     Value *F = CGM.getIntrinsic(Intrinsic::s390_tabort);
7426     return Builder.CreateCall(F, Builder.CreateSExt(Data, Int64Ty, "tabort"));
7427   }
7428   case SystemZ::BI__builtin_non_tx_store: {
7429     Value *Address = EmitScalarExpr(E->getArg(0));
7430     Value *Data = EmitScalarExpr(E->getArg(1));
7431     Value *F = CGM.getIntrinsic(Intrinsic::s390_ntstg);
7432     return Builder.CreateCall(F, {Data, Address});
7433   }
7434 
7435   // Vector builtins.  Note that most vector builtins are mapped automatically
7436   // to target-specific LLVM intrinsics.  The ones handled specially here can
7437   // be represented via standard LLVM IR, which is preferable to enable common
7438   // LLVM optimizations.
7439 
7440   case SystemZ::BI__builtin_s390_vpopctb:
7441   case SystemZ::BI__builtin_s390_vpopcth:
7442   case SystemZ::BI__builtin_s390_vpopctf:
7443   case SystemZ::BI__builtin_s390_vpopctg: {
7444     llvm::Type *ResultType = ConvertType(E->getType());
7445     Value *X = EmitScalarExpr(E->getArg(0));
7446     Function *F = CGM.getIntrinsic(Intrinsic::ctpop, ResultType);
7447     return Builder.CreateCall(F, X);
7448   }
7449 
7450   case SystemZ::BI__builtin_s390_vclzb:
7451   case SystemZ::BI__builtin_s390_vclzh:
7452   case SystemZ::BI__builtin_s390_vclzf:
7453   case SystemZ::BI__builtin_s390_vclzg: {
7454     llvm::Type *ResultType = ConvertType(E->getType());
7455     Value *X = EmitScalarExpr(E->getArg(0));
7456     Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false);
7457     Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ResultType);
7458     return Builder.CreateCall(F, {X, Undef});
7459   }
7460 
7461   case SystemZ::BI__builtin_s390_vctzb:
7462   case SystemZ::BI__builtin_s390_vctzh:
7463   case SystemZ::BI__builtin_s390_vctzf:
7464   case SystemZ::BI__builtin_s390_vctzg: {
7465     llvm::Type *ResultType = ConvertType(E->getType());
7466     Value *X = EmitScalarExpr(E->getArg(0));
7467     Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false);
7468     Function *F = CGM.getIntrinsic(Intrinsic::cttz, ResultType);
7469     return Builder.CreateCall(F, {X, Undef});
7470   }
7471 
7472   case SystemZ::BI__builtin_s390_vfsqdb: {
7473     llvm::Type *ResultType = ConvertType(E->getType());
7474     Value *X = EmitScalarExpr(E->getArg(0));
7475     Function *F = CGM.getIntrinsic(Intrinsic::sqrt, ResultType);
7476     return Builder.CreateCall(F, X);
7477   }
7478   case SystemZ::BI__builtin_s390_vfmadb: {
7479     llvm::Type *ResultType = ConvertType(E->getType());
7480     Value *X = EmitScalarExpr(E->getArg(0));
7481     Value *Y = EmitScalarExpr(E->getArg(1));
7482     Value *Z = EmitScalarExpr(E->getArg(2));
7483     Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
7484     return Builder.CreateCall(F, {X, Y, Z});
7485   }
7486   case SystemZ::BI__builtin_s390_vfmsdb: {
7487     llvm::Type *ResultType = ConvertType(E->getType());
7488     Value *X = EmitScalarExpr(E->getArg(0));
7489     Value *Y = EmitScalarExpr(E->getArg(1));
7490     Value *Z = EmitScalarExpr(E->getArg(2));
7491     Value *Zero = llvm::ConstantFP::getZeroValueForNegation(ResultType);
7492     Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
7493     return Builder.CreateCall(F, {X, Y, Builder.CreateFSub(Zero, Z, "sub")});
7494   }
7495   case SystemZ::BI__builtin_s390_vflpdb: {
7496     llvm::Type *ResultType = ConvertType(E->getType());
7497     Value *X = EmitScalarExpr(E->getArg(0));
7498     Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType);
7499     return Builder.CreateCall(F, X);
7500   }
7501   case SystemZ::BI__builtin_s390_vflndb: {
7502     llvm::Type *ResultType = ConvertType(E->getType());
7503     Value *X = EmitScalarExpr(E->getArg(0));
7504     Value *Zero = llvm::ConstantFP::getZeroValueForNegation(ResultType);
7505     Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType);
7506     return Builder.CreateFSub(Zero, Builder.CreateCall(F, X), "sub");
7507   }
7508   case SystemZ::BI__builtin_s390_vfidb: {
7509     llvm::Type *ResultType = ConvertType(E->getType());
7510     Value *X = EmitScalarExpr(E->getArg(0));
7511     // Constant-fold the M4 and M5 mask arguments.
7512     llvm::APSInt M4, M5;
7513     bool IsConstM4 = E->getArg(1)->isIntegerConstantExpr(M4, getContext());
7514     bool IsConstM5 = E->getArg(2)->isIntegerConstantExpr(M5, getContext());
7515     assert(IsConstM4 && IsConstM5 && "Constant arg isn't actually constant?");
7516     (void)IsConstM4; (void)IsConstM5;
7517     // Check whether this instance of vfidb can be represented via a LLVM
7518     // standard intrinsic.  We only support some combinations of M4 and M5.
7519     Intrinsic::ID ID = Intrinsic::not_intrinsic;
7520     switch (M4.getZExtValue()) {
7521     default: break;
7522     case 0:  // IEEE-inexact exception allowed
7523       switch (M5.getZExtValue()) {
7524       default: break;
7525       case 0: ID = Intrinsic::rint; break;
7526       }
7527       break;
7528     case 4:  // IEEE-inexact exception suppressed
7529       switch (M5.getZExtValue()) {
7530       default: break;
7531       case 0: ID = Intrinsic::nearbyint; break;
7532       case 1: ID = Intrinsic::round; break;
7533       case 5: ID = Intrinsic::trunc; break;
7534       case 6: ID = Intrinsic::ceil; break;
7535       case 7: ID = Intrinsic::floor; break;
7536       }
7537       break;
7538     }
7539     if (ID != Intrinsic::not_intrinsic) {
7540       Function *F = CGM.getIntrinsic(ID, ResultType);
7541       return Builder.CreateCall(F, X);
7542     }
7543     Function *F = CGM.getIntrinsic(Intrinsic::s390_vfidb);
7544     Value *M4Value = llvm::ConstantInt::get(getLLVMContext(), M4);
7545     Value *M5Value = llvm::ConstantInt::get(getLLVMContext(), M5);
7546     return Builder.CreateCall(F, {X, M4Value, M5Value});
7547   }
7548 
7549   // Vector intrisincs that output the post-instruction CC value.
7550 
7551 #define INTRINSIC_WITH_CC(NAME) \
7552     case SystemZ::BI__builtin_##NAME: \
7553       return EmitSystemZIntrinsicWithCC(*this, Intrinsic::NAME, E)
7554 
7555   INTRINSIC_WITH_CC(s390_vpkshs);
7556   INTRINSIC_WITH_CC(s390_vpksfs);
7557   INTRINSIC_WITH_CC(s390_vpksgs);
7558 
7559   INTRINSIC_WITH_CC(s390_vpklshs);
7560   INTRINSIC_WITH_CC(s390_vpklsfs);
7561   INTRINSIC_WITH_CC(s390_vpklsgs);
7562 
7563   INTRINSIC_WITH_CC(s390_vceqbs);
7564   INTRINSIC_WITH_CC(s390_vceqhs);
7565   INTRINSIC_WITH_CC(s390_vceqfs);
7566   INTRINSIC_WITH_CC(s390_vceqgs);
7567 
7568   INTRINSIC_WITH_CC(s390_vchbs);
7569   INTRINSIC_WITH_CC(s390_vchhs);
7570   INTRINSIC_WITH_CC(s390_vchfs);
7571   INTRINSIC_WITH_CC(s390_vchgs);
7572 
7573   INTRINSIC_WITH_CC(s390_vchlbs);
7574   INTRINSIC_WITH_CC(s390_vchlhs);
7575   INTRINSIC_WITH_CC(s390_vchlfs);
7576   INTRINSIC_WITH_CC(s390_vchlgs);
7577 
7578   INTRINSIC_WITH_CC(s390_vfaebs);
7579   INTRINSIC_WITH_CC(s390_vfaehs);
7580   INTRINSIC_WITH_CC(s390_vfaefs);
7581 
7582   INTRINSIC_WITH_CC(s390_vfaezbs);
7583   INTRINSIC_WITH_CC(s390_vfaezhs);
7584   INTRINSIC_WITH_CC(s390_vfaezfs);
7585 
7586   INTRINSIC_WITH_CC(s390_vfeebs);
7587   INTRINSIC_WITH_CC(s390_vfeehs);
7588   INTRINSIC_WITH_CC(s390_vfeefs);
7589 
7590   INTRINSIC_WITH_CC(s390_vfeezbs);
7591   INTRINSIC_WITH_CC(s390_vfeezhs);
7592   INTRINSIC_WITH_CC(s390_vfeezfs);
7593 
7594   INTRINSIC_WITH_CC(s390_vfenebs);
7595   INTRINSIC_WITH_CC(s390_vfenehs);
7596   INTRINSIC_WITH_CC(s390_vfenefs);
7597 
7598   INTRINSIC_WITH_CC(s390_vfenezbs);
7599   INTRINSIC_WITH_CC(s390_vfenezhs);
7600   INTRINSIC_WITH_CC(s390_vfenezfs);
7601 
7602   INTRINSIC_WITH_CC(s390_vistrbs);
7603   INTRINSIC_WITH_CC(s390_vistrhs);
7604   INTRINSIC_WITH_CC(s390_vistrfs);
7605 
7606   INTRINSIC_WITH_CC(s390_vstrcbs);
7607   INTRINSIC_WITH_CC(s390_vstrchs);
7608   INTRINSIC_WITH_CC(s390_vstrcfs);
7609 
7610   INTRINSIC_WITH_CC(s390_vstrczbs);
7611   INTRINSIC_WITH_CC(s390_vstrczhs);
7612   INTRINSIC_WITH_CC(s390_vstrczfs);
7613 
7614   INTRINSIC_WITH_CC(s390_vfcedbs);
7615   INTRINSIC_WITH_CC(s390_vfchdbs);
7616   INTRINSIC_WITH_CC(s390_vfchedbs);
7617 
7618   INTRINSIC_WITH_CC(s390_vftcidb);
7619 
7620 #undef INTRINSIC_WITH_CC
7621 
7622   default:
7623     return nullptr;
7624   }
7625 }
7626 
7627 Value *CodeGenFunction::EmitNVPTXBuiltinExpr(unsigned BuiltinID,
7628                                              const CallExpr *E) {
7629   auto MakeLdg = [&](unsigned IntrinsicID) {
7630     Value *Ptr = EmitScalarExpr(E->getArg(0));
7631     AlignmentSource AlignSource;
7632     clang::CharUnits Align =
7633         getNaturalPointeeTypeAlignment(E->getArg(0)->getType(), &AlignSource);
7634     return Builder.CreateCall(
7635         CGM.getIntrinsic(IntrinsicID, {Ptr->getType()->getPointerElementType(),
7636                                        Ptr->getType()}),
7637         {Ptr, ConstantInt::get(Builder.getInt32Ty(), Align.getQuantity())});
7638   };
7639 
7640   switch (BuiltinID) {
7641   case NVPTX::BI__nvvm_atom_add_gen_i:
7642   case NVPTX::BI__nvvm_atom_add_gen_l:
7643   case NVPTX::BI__nvvm_atom_add_gen_ll:
7644     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Add, E);
7645 
7646   case NVPTX::BI__nvvm_atom_sub_gen_i:
7647   case NVPTX::BI__nvvm_atom_sub_gen_l:
7648   case NVPTX::BI__nvvm_atom_sub_gen_ll:
7649     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Sub, E);
7650 
7651   case NVPTX::BI__nvvm_atom_and_gen_i:
7652   case NVPTX::BI__nvvm_atom_and_gen_l:
7653   case NVPTX::BI__nvvm_atom_and_gen_ll:
7654     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::And, E);
7655 
7656   case NVPTX::BI__nvvm_atom_or_gen_i:
7657   case NVPTX::BI__nvvm_atom_or_gen_l:
7658   case NVPTX::BI__nvvm_atom_or_gen_ll:
7659     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Or, E);
7660 
7661   case NVPTX::BI__nvvm_atom_xor_gen_i:
7662   case NVPTX::BI__nvvm_atom_xor_gen_l:
7663   case NVPTX::BI__nvvm_atom_xor_gen_ll:
7664     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Xor, E);
7665 
7666   case NVPTX::BI__nvvm_atom_xchg_gen_i:
7667   case NVPTX::BI__nvvm_atom_xchg_gen_l:
7668   case NVPTX::BI__nvvm_atom_xchg_gen_ll:
7669     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Xchg, E);
7670 
7671   case NVPTX::BI__nvvm_atom_max_gen_i:
7672   case NVPTX::BI__nvvm_atom_max_gen_l:
7673   case NVPTX::BI__nvvm_atom_max_gen_ll:
7674     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Max, E);
7675 
7676   case NVPTX::BI__nvvm_atom_max_gen_ui:
7677   case NVPTX::BI__nvvm_atom_max_gen_ul:
7678   case NVPTX::BI__nvvm_atom_max_gen_ull:
7679     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::UMax, E);
7680 
7681   case NVPTX::BI__nvvm_atom_min_gen_i:
7682   case NVPTX::BI__nvvm_atom_min_gen_l:
7683   case NVPTX::BI__nvvm_atom_min_gen_ll:
7684     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Min, E);
7685 
7686   case NVPTX::BI__nvvm_atom_min_gen_ui:
7687   case NVPTX::BI__nvvm_atom_min_gen_ul:
7688   case NVPTX::BI__nvvm_atom_min_gen_ull:
7689     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::UMin, E);
7690 
7691   case NVPTX::BI__nvvm_atom_cas_gen_i:
7692   case NVPTX::BI__nvvm_atom_cas_gen_l:
7693   case NVPTX::BI__nvvm_atom_cas_gen_ll:
7694     // __nvvm_atom_cas_gen_* should return the old value rather than the
7695     // success flag.
7696     return MakeAtomicCmpXchgValue(*this, E, /*ReturnBool=*/false);
7697 
7698   case NVPTX::BI__nvvm_atom_add_gen_f: {
7699     Value *Ptr = EmitScalarExpr(E->getArg(0));
7700     Value *Val = EmitScalarExpr(E->getArg(1));
7701     // atomicrmw only deals with integer arguments so we need to use
7702     // LLVM's nvvm_atomic_load_add_f32 intrinsic for that.
7703     Value *FnALAF32 =
7704         CGM.getIntrinsic(Intrinsic::nvvm_atomic_load_add_f32, Ptr->getType());
7705     return Builder.CreateCall(FnALAF32, {Ptr, Val});
7706   }
7707 
7708   case NVPTX::BI__nvvm_atom_inc_gen_ui: {
7709     Value *Ptr = EmitScalarExpr(E->getArg(0));
7710     Value *Val = EmitScalarExpr(E->getArg(1));
7711     Value *FnALI32 =
7712         CGM.getIntrinsic(Intrinsic::nvvm_atomic_load_inc_32, Ptr->getType());
7713     return Builder.CreateCall(FnALI32, {Ptr, Val});
7714   }
7715 
7716   case NVPTX::BI__nvvm_atom_dec_gen_ui: {
7717     Value *Ptr = EmitScalarExpr(E->getArg(0));
7718     Value *Val = EmitScalarExpr(E->getArg(1));
7719     Value *FnALD32 =
7720         CGM.getIntrinsic(Intrinsic::nvvm_atomic_load_dec_32, Ptr->getType());
7721     return Builder.CreateCall(FnALD32, {Ptr, Val});
7722   }
7723 
7724   case NVPTX::BI__nvvm_ldg_c:
7725   case NVPTX::BI__nvvm_ldg_c2:
7726   case NVPTX::BI__nvvm_ldg_c4:
7727   case NVPTX::BI__nvvm_ldg_s:
7728   case NVPTX::BI__nvvm_ldg_s2:
7729   case NVPTX::BI__nvvm_ldg_s4:
7730   case NVPTX::BI__nvvm_ldg_i:
7731   case NVPTX::BI__nvvm_ldg_i2:
7732   case NVPTX::BI__nvvm_ldg_i4:
7733   case NVPTX::BI__nvvm_ldg_l:
7734   case NVPTX::BI__nvvm_ldg_ll:
7735   case NVPTX::BI__nvvm_ldg_ll2:
7736   case NVPTX::BI__nvvm_ldg_uc:
7737   case NVPTX::BI__nvvm_ldg_uc2:
7738   case NVPTX::BI__nvvm_ldg_uc4:
7739   case NVPTX::BI__nvvm_ldg_us:
7740   case NVPTX::BI__nvvm_ldg_us2:
7741   case NVPTX::BI__nvvm_ldg_us4:
7742   case NVPTX::BI__nvvm_ldg_ui:
7743   case NVPTX::BI__nvvm_ldg_ui2:
7744   case NVPTX::BI__nvvm_ldg_ui4:
7745   case NVPTX::BI__nvvm_ldg_ul:
7746   case NVPTX::BI__nvvm_ldg_ull:
7747   case NVPTX::BI__nvvm_ldg_ull2:
7748     // PTX Interoperability section 2.2: "For a vector with an even number of
7749     // elements, its alignment is set to number of elements times the alignment
7750     // of its member: n*alignof(t)."
7751     return MakeLdg(Intrinsic::nvvm_ldg_global_i);
7752   case NVPTX::BI__nvvm_ldg_f:
7753   case NVPTX::BI__nvvm_ldg_f2:
7754   case NVPTX::BI__nvvm_ldg_f4:
7755   case NVPTX::BI__nvvm_ldg_d:
7756   case NVPTX::BI__nvvm_ldg_d2:
7757     return MakeLdg(Intrinsic::nvvm_ldg_global_f);
7758   default:
7759     return nullptr;
7760   }
7761 }
7762 
7763 Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID,
7764                                                    const CallExpr *E) {
7765   switch (BuiltinID) {
7766   case WebAssembly::BI__builtin_wasm_current_memory: {
7767     llvm::Type *ResultType = ConvertType(E->getType());
7768     Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_current_memory, ResultType);
7769     return Builder.CreateCall(Callee);
7770   }
7771   case WebAssembly::BI__builtin_wasm_grow_memory: {
7772     Value *X = EmitScalarExpr(E->getArg(0));
7773     Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_grow_memory, X->getType());
7774     return Builder.CreateCall(Callee, X);
7775   }
7776 
7777   default:
7778     return nullptr;
7779   }
7780 }
7781