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