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 "CGObjCRuntime.h"
16 #include "CodeGenModule.h"
17 #include "TargetInfo.h"
18 #include "clang/AST/ASTContext.h"
19 #include "clang/AST/Decl.h"
20 #include "clang/Basic/TargetBuiltins.h"
21 #include "clang/Basic/TargetInfo.h"
22 #include "llvm/IR/DataLayout.h"
23 #include "llvm/IR/Intrinsics.h"
24 
25 using namespace clang;
26 using namespace CodeGen;
27 using namespace llvm;
28 
29 /// getBuiltinLibFunction - Given a builtin id for a function like
30 /// "__builtin_fabsf", return a Function* for "fabsf".
31 llvm::Value *CodeGenModule::getBuiltinLibFunction(const FunctionDecl *FD,
32                                                   unsigned BuiltinID) {
33   assert(Context.BuiltinInfo.isLibFunction(BuiltinID));
34 
35   // Get the name, skip over the __builtin_ prefix (if necessary).
36   StringRef Name;
37   GlobalDecl D(FD);
38 
39   // If the builtin has been declared explicitly with an assembler label,
40   // use the mangled name. This differs from the plain label on platforms
41   // that prefix labels.
42   if (FD->hasAttr<AsmLabelAttr>())
43     Name = getMangledName(D);
44   else
45     Name = Context.BuiltinInfo.GetName(BuiltinID) + 10;
46 
47   llvm::FunctionType *Ty =
48     cast<llvm::FunctionType>(getTypes().ConvertType(FD->getType()));
49 
50   return GetOrCreateLLVMFunction(Name, Ty, D, /*ForVTable=*/false);
51 }
52 
53 /// Emit the conversions required to turn the given value into an
54 /// integer of the given size.
55 static Value *EmitToInt(CodeGenFunction &CGF, llvm::Value *V,
56                         QualType T, llvm::IntegerType *IntType) {
57   V = CGF.EmitToMemory(V, T);
58 
59   if (V->getType()->isPointerTy())
60     return CGF.Builder.CreatePtrToInt(V, IntType);
61 
62   assert(V->getType() == IntType);
63   return V;
64 }
65 
66 static Value *EmitFromInt(CodeGenFunction &CGF, llvm::Value *V,
67                           QualType T, llvm::Type *ResultType) {
68   V = CGF.EmitFromMemory(V, T);
69 
70   if (ResultType->isPointerTy())
71     return CGF.Builder.CreateIntToPtr(V, ResultType);
72 
73   assert(V->getType() == ResultType);
74   return V;
75 }
76 
77 /// Utility to insert an atomic instruction based on Instrinsic::ID
78 /// and the expression node.
79 static RValue EmitBinaryAtomic(CodeGenFunction &CGF,
80                                llvm::AtomicRMWInst::BinOp Kind,
81                                const CallExpr *E) {
82   QualType T = E->getType();
83   assert(E->getArg(0)->getType()->isPointerType());
84   assert(CGF.getContext().hasSameUnqualifiedType(T,
85                                   E->getArg(0)->getType()->getPointeeType()));
86   assert(CGF.getContext().hasSameUnqualifiedType(T, E->getArg(1)->getType()));
87 
88   llvm::Value *DestPtr = CGF.EmitScalarExpr(E->getArg(0));
89   unsigned AddrSpace = DestPtr->getType()->getPointerAddressSpace();
90 
91   llvm::IntegerType *IntType =
92     llvm::IntegerType::get(CGF.getLLVMContext(),
93                            CGF.getContext().getTypeSize(T));
94   llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
95 
96   llvm::Value *Args[2];
97   Args[0] = CGF.Builder.CreateBitCast(DestPtr, IntPtrType);
98   Args[1] = CGF.EmitScalarExpr(E->getArg(1));
99   llvm::Type *ValueType = Args[1]->getType();
100   Args[1] = EmitToInt(CGF, Args[1], T, IntType);
101 
102   llvm::Value *Result =
103       CGF.Builder.CreateAtomicRMW(Kind, Args[0], Args[1],
104                                   llvm::SequentiallyConsistent);
105   Result = EmitFromInt(CGF, Result, T, ValueType);
106   return RValue::get(Result);
107 }
108 
109 /// Utility to insert an atomic instruction based Instrinsic::ID and
110 /// the expression node, where the return value is the result of the
111 /// operation.
112 static RValue EmitBinaryAtomicPost(CodeGenFunction &CGF,
113                                    llvm::AtomicRMWInst::BinOp Kind,
114                                    const CallExpr *E,
115                                    Instruction::BinaryOps Op) {
116   QualType T = E->getType();
117   assert(E->getArg(0)->getType()->isPointerType());
118   assert(CGF.getContext().hasSameUnqualifiedType(T,
119                                   E->getArg(0)->getType()->getPointeeType()));
120   assert(CGF.getContext().hasSameUnqualifiedType(T, E->getArg(1)->getType()));
121 
122   llvm::Value *DestPtr = CGF.EmitScalarExpr(E->getArg(0));
123   unsigned AddrSpace = DestPtr->getType()->getPointerAddressSpace();
124 
125   llvm::IntegerType *IntType =
126     llvm::IntegerType::get(CGF.getLLVMContext(),
127                            CGF.getContext().getTypeSize(T));
128   llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
129 
130   llvm::Value *Args[2];
131   Args[1] = CGF.EmitScalarExpr(E->getArg(1));
132   llvm::Type *ValueType = Args[1]->getType();
133   Args[1] = EmitToInt(CGF, Args[1], T, IntType);
134   Args[0] = CGF.Builder.CreateBitCast(DestPtr, IntPtrType);
135 
136   llvm::Value *Result =
137       CGF.Builder.CreateAtomicRMW(Kind, Args[0], Args[1],
138                                   llvm::SequentiallyConsistent);
139   Result = CGF.Builder.CreateBinOp(Op, Result, Args[1]);
140   Result = EmitFromInt(CGF, Result, T, ValueType);
141   return RValue::get(Result);
142 }
143 
144 /// EmitFAbs - Emit a call to fabs/fabsf/fabsl, depending on the type of ValTy,
145 /// which must be a scalar floating point type.
146 static Value *EmitFAbs(CodeGenFunction &CGF, Value *V, QualType ValTy) {
147   const BuiltinType *ValTyP = ValTy->getAs<BuiltinType>();
148   assert(ValTyP && "isn't scalar fp type!");
149 
150   StringRef FnName;
151   switch (ValTyP->getKind()) {
152   default: llvm_unreachable("Isn't a scalar fp type!");
153   case BuiltinType::Float:      FnName = "fabsf"; break;
154   case BuiltinType::Double:     FnName = "fabs"; break;
155   case BuiltinType::LongDouble: FnName = "fabsl"; break;
156   }
157 
158   // The prototype is something that takes and returns whatever V's type is.
159   llvm::FunctionType *FT = llvm::FunctionType::get(V->getType(), V->getType(),
160                                                    false);
161   llvm::Value *Fn = CGF.CGM.CreateRuntimeFunction(FT, FnName);
162 
163   return CGF.Builder.CreateCall(Fn, V, "abs");
164 }
165 
166 static RValue emitLibraryCall(CodeGenFunction &CGF, const FunctionDecl *Fn,
167                               const CallExpr *E, llvm::Value *calleeValue) {
168   return CGF.EmitCall(E->getCallee()->getType(), calleeValue,
169                       ReturnValueSlot(), E->arg_begin(), E->arg_end(), Fn);
170 }
171 
172 RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
173                                         unsigned BuiltinID, const CallExpr *E) {
174   // See if we can constant fold this builtin.  If so, don't emit it at all.
175   Expr::EvalResult Result;
176   if (E->EvaluateAsRValue(Result, CGM.getContext()) &&
177       !Result.hasSideEffects()) {
178     if (Result.Val.isInt())
179       return RValue::get(llvm::ConstantInt::get(getLLVMContext(),
180                                                 Result.Val.getInt()));
181     if (Result.Val.isFloat())
182       return RValue::get(llvm::ConstantFP::get(getLLVMContext(),
183                                                Result.Val.getFloat()));
184   }
185 
186   switch (BuiltinID) {
187   default: break;  // Handle intrinsics and libm functions below.
188   case Builtin::BI__builtin___CFStringMakeConstantString:
189   case Builtin::BI__builtin___NSStringMakeConstantString:
190     return RValue::get(CGM.EmitConstantExpr(E, E->getType(), 0));
191   case Builtin::BI__builtin_stdarg_start:
192   case Builtin::BI__builtin_va_start:
193   case Builtin::BI__builtin_va_end: {
194     Value *ArgValue = EmitVAListRef(E->getArg(0));
195     llvm::Type *DestType = Int8PtrTy;
196     if (ArgValue->getType() != DestType)
197       ArgValue = Builder.CreateBitCast(ArgValue, DestType,
198                                        ArgValue->getName().data());
199 
200     Intrinsic::ID inst = (BuiltinID == Builtin::BI__builtin_va_end) ?
201       Intrinsic::vaend : Intrinsic::vastart;
202     return RValue::get(Builder.CreateCall(CGM.getIntrinsic(inst), ArgValue));
203   }
204   case Builtin::BI__builtin_va_copy: {
205     Value *DstPtr = EmitVAListRef(E->getArg(0));
206     Value *SrcPtr = EmitVAListRef(E->getArg(1));
207 
208     llvm::Type *Type = Int8PtrTy;
209 
210     DstPtr = Builder.CreateBitCast(DstPtr, Type);
211     SrcPtr = Builder.CreateBitCast(SrcPtr, Type);
212     return RValue::get(Builder.CreateCall2(CGM.getIntrinsic(Intrinsic::vacopy),
213                                            DstPtr, SrcPtr));
214   }
215   case Builtin::BI__builtin_abs:
216   case Builtin::BI__builtin_labs:
217   case Builtin::BI__builtin_llabs: {
218     Value *ArgValue = EmitScalarExpr(E->getArg(0));
219 
220     Value *NegOp = Builder.CreateNeg(ArgValue, "neg");
221     Value *CmpResult =
222     Builder.CreateICmpSGE(ArgValue,
223                           llvm::Constant::getNullValue(ArgValue->getType()),
224                                                             "abscond");
225     Value *Result =
226       Builder.CreateSelect(CmpResult, ArgValue, NegOp, "abs");
227 
228     return RValue::get(Result);
229   }
230 
231   case Builtin::BI__builtin_conj:
232   case Builtin::BI__builtin_conjf:
233   case Builtin::BI__builtin_conjl: {
234     ComplexPairTy ComplexVal = EmitComplexExpr(E->getArg(0));
235     Value *Real = ComplexVal.first;
236     Value *Imag = ComplexVal.second;
237     Value *Zero =
238       Imag->getType()->isFPOrFPVectorTy()
239         ? llvm::ConstantFP::getZeroValueForNegation(Imag->getType())
240         : llvm::Constant::getNullValue(Imag->getType());
241 
242     Imag = Builder.CreateFSub(Zero, Imag, "sub");
243     return RValue::getComplex(std::make_pair(Real, Imag));
244   }
245   case Builtin::BI__builtin_creal:
246   case Builtin::BI__builtin_crealf:
247   case Builtin::BI__builtin_creall:
248   case Builtin::BIcreal:
249   case Builtin::BIcrealf:
250   case Builtin::BIcreall: {
251     ComplexPairTy ComplexVal = EmitComplexExpr(E->getArg(0));
252     return RValue::get(ComplexVal.first);
253   }
254 
255   case Builtin::BI__builtin_cimag:
256   case Builtin::BI__builtin_cimagf:
257   case Builtin::BI__builtin_cimagl:
258   case Builtin::BIcimag:
259   case Builtin::BIcimagf:
260   case Builtin::BIcimagl: {
261     ComplexPairTy ComplexVal = EmitComplexExpr(E->getArg(0));
262     return RValue::get(ComplexVal.second);
263   }
264 
265   case Builtin::BI__builtin_ctzs:
266   case Builtin::BI__builtin_ctz:
267   case Builtin::BI__builtin_ctzl:
268   case Builtin::BI__builtin_ctzll: {
269     Value *ArgValue = EmitScalarExpr(E->getArg(0));
270 
271     llvm::Type *ArgType = ArgValue->getType();
272     Value *F = CGM.getIntrinsic(Intrinsic::cttz, ArgType);
273 
274     llvm::Type *ResultType = ConvertType(E->getType());
275     Value *ZeroUndef = Builder.getInt1(Target.isCLZForZeroUndef());
276     Value *Result = Builder.CreateCall2(F, ArgValue, ZeroUndef);
277     if (Result->getType() != ResultType)
278       Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true,
279                                      "cast");
280     return RValue::get(Result);
281   }
282   case Builtin::BI__builtin_clzs:
283   case Builtin::BI__builtin_clz:
284   case Builtin::BI__builtin_clzl:
285   case Builtin::BI__builtin_clzll: {
286     Value *ArgValue = EmitScalarExpr(E->getArg(0));
287 
288     llvm::Type *ArgType = ArgValue->getType();
289     Value *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType);
290 
291     llvm::Type *ResultType = ConvertType(E->getType());
292     Value *ZeroUndef = Builder.getInt1(Target.isCLZForZeroUndef());
293     Value *Result = Builder.CreateCall2(F, ArgValue, ZeroUndef);
294     if (Result->getType() != ResultType)
295       Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true,
296                                      "cast");
297     return RValue::get(Result);
298   }
299   case Builtin::BI__builtin_ffs:
300   case Builtin::BI__builtin_ffsl:
301   case Builtin::BI__builtin_ffsll: {
302     // ffs(x) -> x ? cttz(x) + 1 : 0
303     Value *ArgValue = EmitScalarExpr(E->getArg(0));
304 
305     llvm::Type *ArgType = ArgValue->getType();
306     Value *F = CGM.getIntrinsic(Intrinsic::cttz, ArgType);
307 
308     llvm::Type *ResultType = ConvertType(E->getType());
309     Value *Tmp = Builder.CreateAdd(Builder.CreateCall2(F, ArgValue,
310                                                        Builder.getTrue()),
311                                    llvm::ConstantInt::get(ArgType, 1));
312     Value *Zero = llvm::Constant::getNullValue(ArgType);
313     Value *IsZero = Builder.CreateICmpEQ(ArgValue, Zero, "iszero");
314     Value *Result = Builder.CreateSelect(IsZero, Zero, Tmp, "ffs");
315     if (Result->getType() != ResultType)
316       Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true,
317                                      "cast");
318     return RValue::get(Result);
319   }
320   case Builtin::BI__builtin_parity:
321   case Builtin::BI__builtin_parityl:
322   case Builtin::BI__builtin_parityll: {
323     // parity(x) -> ctpop(x) & 1
324     Value *ArgValue = EmitScalarExpr(E->getArg(0));
325 
326     llvm::Type *ArgType = ArgValue->getType();
327     Value *F = CGM.getIntrinsic(Intrinsic::ctpop, ArgType);
328 
329     llvm::Type *ResultType = ConvertType(E->getType());
330     Value *Tmp = Builder.CreateCall(F, ArgValue);
331     Value *Result = Builder.CreateAnd(Tmp, llvm::ConstantInt::get(ArgType, 1));
332     if (Result->getType() != ResultType)
333       Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true,
334                                      "cast");
335     return RValue::get(Result);
336   }
337   case Builtin::BI__builtin_popcount:
338   case Builtin::BI__builtin_popcountl:
339   case Builtin::BI__builtin_popcountll: {
340     Value *ArgValue = EmitScalarExpr(E->getArg(0));
341 
342     llvm::Type *ArgType = ArgValue->getType();
343     Value *F = CGM.getIntrinsic(Intrinsic::ctpop, ArgType);
344 
345     llvm::Type *ResultType = ConvertType(E->getType());
346     Value *Result = Builder.CreateCall(F, ArgValue);
347     if (Result->getType() != ResultType)
348       Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true,
349                                      "cast");
350     return RValue::get(Result);
351   }
352   case Builtin::BI__builtin_expect: {
353     Value *ArgValue = EmitScalarExpr(E->getArg(0));
354     llvm::Type *ArgType = ArgValue->getType();
355 
356     Value *FnExpect = CGM.getIntrinsic(Intrinsic::expect, ArgType);
357     Value *ExpectedValue = EmitScalarExpr(E->getArg(1));
358 
359     Value *Result = Builder.CreateCall2(FnExpect, ArgValue, ExpectedValue,
360                                         "expval");
361     return RValue::get(Result);
362   }
363   case Builtin::BI__builtin_bswap16:
364   case Builtin::BI__builtin_bswap32:
365   case Builtin::BI__builtin_bswap64: {
366     Value *ArgValue = EmitScalarExpr(E->getArg(0));
367     llvm::Type *ArgType = ArgValue->getType();
368     Value *F = CGM.getIntrinsic(Intrinsic::bswap, ArgType);
369     return RValue::get(Builder.CreateCall(F, ArgValue));
370   }
371   case Builtin::BI__builtin_object_size: {
372     // We rely on constant folding to deal with expressions with side effects.
373     assert(!E->getArg(0)->HasSideEffects(getContext()) &&
374            "should have been constant folded");
375 
376     // We pass this builtin onto the optimizer so that it can
377     // figure out the object size in more complex cases.
378     llvm::Type *ResType = ConvertType(E->getType());
379 
380     // LLVM only supports 0 and 2, make sure that we pass along that
381     // as a boolean.
382     Value *Ty = EmitScalarExpr(E->getArg(1));
383     ConstantInt *CI = dyn_cast<ConstantInt>(Ty);
384     assert(CI);
385     uint64_t val = CI->getZExtValue();
386     CI = ConstantInt::get(Builder.getInt1Ty(), (val & 0x2) >> 1);
387 
388     Value *F = CGM.getIntrinsic(Intrinsic::objectsize, ResType);
389     return RValue::get(Builder.CreateCall2(F, EmitScalarExpr(E->getArg(0)),CI));
390   }
391   case Builtin::BI__builtin_prefetch: {
392     Value *Locality, *RW, *Address = EmitScalarExpr(E->getArg(0));
393     // FIXME: Technically these constants should of type 'int', yes?
394     RW = (E->getNumArgs() > 1) ? EmitScalarExpr(E->getArg(1)) :
395       llvm::ConstantInt::get(Int32Ty, 0);
396     Locality = (E->getNumArgs() > 2) ? EmitScalarExpr(E->getArg(2)) :
397       llvm::ConstantInt::get(Int32Ty, 3);
398     Value *Data = llvm::ConstantInt::get(Int32Ty, 1);
399     Value *F = CGM.getIntrinsic(Intrinsic::prefetch);
400     return RValue::get(Builder.CreateCall4(F, Address, RW, Locality, Data));
401   }
402   case Builtin::BI__builtin_readcyclecounter: {
403     Value *F = CGM.getIntrinsic(Intrinsic::readcyclecounter);
404     return RValue::get(Builder.CreateCall(F));
405   }
406   case Builtin::BI__builtin_trap: {
407     Value *F = CGM.getIntrinsic(Intrinsic::trap);
408     return RValue::get(Builder.CreateCall(F));
409   }
410   case Builtin::BI__debugbreak: {
411     Value *F = CGM.getIntrinsic(Intrinsic::debugtrap);
412     return RValue::get(Builder.CreateCall(F));
413   }
414   case Builtin::BI__builtin_unreachable: {
415     if (getLangOpts().SanitizeUnreachable)
416       EmitCheck(Builder.getFalse(), "builtin_unreachable",
417                 EmitCheckSourceLocation(E->getExprLoc()),
418                 llvm::ArrayRef<llvm::Value *>(), CRK_Unrecoverable);
419     else
420       Builder.CreateUnreachable();
421 
422     // We do need to preserve an insertion point.
423     EmitBlock(createBasicBlock("unreachable.cont"));
424 
425     return RValue::get(0);
426   }
427 
428   case Builtin::BI__builtin_powi:
429   case Builtin::BI__builtin_powif:
430   case Builtin::BI__builtin_powil: {
431     Value *Base = EmitScalarExpr(E->getArg(0));
432     Value *Exponent = EmitScalarExpr(E->getArg(1));
433     llvm::Type *ArgType = Base->getType();
434     Value *F = CGM.getIntrinsic(Intrinsic::powi, ArgType);
435     return RValue::get(Builder.CreateCall2(F, Base, Exponent));
436   }
437 
438   case Builtin::BI__builtin_isgreater:
439   case Builtin::BI__builtin_isgreaterequal:
440   case Builtin::BI__builtin_isless:
441   case Builtin::BI__builtin_islessequal:
442   case Builtin::BI__builtin_islessgreater:
443   case Builtin::BI__builtin_isunordered: {
444     // Ordered comparisons: we know the arguments to these are matching scalar
445     // floating point values.
446     Value *LHS = EmitScalarExpr(E->getArg(0));
447     Value *RHS = EmitScalarExpr(E->getArg(1));
448 
449     switch (BuiltinID) {
450     default: llvm_unreachable("Unknown ordered comparison");
451     case Builtin::BI__builtin_isgreater:
452       LHS = Builder.CreateFCmpOGT(LHS, RHS, "cmp");
453       break;
454     case Builtin::BI__builtin_isgreaterequal:
455       LHS = Builder.CreateFCmpOGE(LHS, RHS, "cmp");
456       break;
457     case Builtin::BI__builtin_isless:
458       LHS = Builder.CreateFCmpOLT(LHS, RHS, "cmp");
459       break;
460     case Builtin::BI__builtin_islessequal:
461       LHS = Builder.CreateFCmpOLE(LHS, RHS, "cmp");
462       break;
463     case Builtin::BI__builtin_islessgreater:
464       LHS = Builder.CreateFCmpONE(LHS, RHS, "cmp");
465       break;
466     case Builtin::BI__builtin_isunordered:
467       LHS = Builder.CreateFCmpUNO(LHS, RHS, "cmp");
468       break;
469     }
470     // ZExt bool to int type.
471     return RValue::get(Builder.CreateZExt(LHS, ConvertType(E->getType())));
472   }
473   case Builtin::BI__builtin_isnan: {
474     Value *V = EmitScalarExpr(E->getArg(0));
475     V = Builder.CreateFCmpUNO(V, V, "cmp");
476     return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType())));
477   }
478 
479   case Builtin::BI__builtin_isinf: {
480     // isinf(x) --> fabs(x) == infinity
481     Value *V = EmitScalarExpr(E->getArg(0));
482     V = EmitFAbs(*this, V, E->getArg(0)->getType());
483 
484     V = Builder.CreateFCmpOEQ(V, ConstantFP::getInfinity(V->getType()),"isinf");
485     return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType())));
486   }
487 
488   // TODO: BI__builtin_isinf_sign
489   //   isinf_sign(x) -> isinf(x) ? (signbit(x) ? -1 : 1) : 0
490 
491   case Builtin::BI__builtin_isnormal: {
492     // isnormal(x) --> x == x && fabsf(x) < infinity && fabsf(x) >= float_min
493     Value *V = EmitScalarExpr(E->getArg(0));
494     Value *Eq = Builder.CreateFCmpOEQ(V, V, "iseq");
495 
496     Value *Abs = EmitFAbs(*this, V, E->getArg(0)->getType());
497     Value *IsLessThanInf =
498       Builder.CreateFCmpULT(Abs, ConstantFP::getInfinity(V->getType()),"isinf");
499     APFloat Smallest = APFloat::getSmallestNormalized(
500                    getContext().getFloatTypeSemantics(E->getArg(0)->getType()));
501     Value *IsNormal =
502       Builder.CreateFCmpUGE(Abs, ConstantFP::get(V->getContext(), Smallest),
503                             "isnormal");
504     V = Builder.CreateAnd(Eq, IsLessThanInf, "and");
505     V = Builder.CreateAnd(V, IsNormal, "and");
506     return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType())));
507   }
508 
509   case Builtin::BI__builtin_isfinite: {
510     // isfinite(x) --> x == x && fabs(x) != infinity;
511     Value *V = EmitScalarExpr(E->getArg(0));
512     Value *Eq = Builder.CreateFCmpOEQ(V, V, "iseq");
513 
514     Value *Abs = EmitFAbs(*this, V, E->getArg(0)->getType());
515     Value *IsNotInf =
516       Builder.CreateFCmpUNE(Abs, ConstantFP::getInfinity(V->getType()),"isinf");
517 
518     V = Builder.CreateAnd(Eq, IsNotInf, "and");
519     return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType())));
520   }
521 
522   case Builtin::BI__builtin_fpclassify: {
523     Value *V = EmitScalarExpr(E->getArg(5));
524     llvm::Type *Ty = ConvertType(E->getArg(5)->getType());
525 
526     // Create Result
527     BasicBlock *Begin = Builder.GetInsertBlock();
528     BasicBlock *End = createBasicBlock("fpclassify_end", this->CurFn);
529     Builder.SetInsertPoint(End);
530     PHINode *Result =
531       Builder.CreatePHI(ConvertType(E->getArg(0)->getType()), 4,
532                         "fpclassify_result");
533 
534     // if (V==0) return FP_ZERO
535     Builder.SetInsertPoint(Begin);
536     Value *IsZero = Builder.CreateFCmpOEQ(V, Constant::getNullValue(Ty),
537                                           "iszero");
538     Value *ZeroLiteral = EmitScalarExpr(E->getArg(4));
539     BasicBlock *NotZero = createBasicBlock("fpclassify_not_zero", this->CurFn);
540     Builder.CreateCondBr(IsZero, End, NotZero);
541     Result->addIncoming(ZeroLiteral, Begin);
542 
543     // if (V != V) return FP_NAN
544     Builder.SetInsertPoint(NotZero);
545     Value *IsNan = Builder.CreateFCmpUNO(V, V, "cmp");
546     Value *NanLiteral = EmitScalarExpr(E->getArg(0));
547     BasicBlock *NotNan = createBasicBlock("fpclassify_not_nan", this->CurFn);
548     Builder.CreateCondBr(IsNan, End, NotNan);
549     Result->addIncoming(NanLiteral, NotZero);
550 
551     // if (fabs(V) == infinity) return FP_INFINITY
552     Builder.SetInsertPoint(NotNan);
553     Value *VAbs = EmitFAbs(*this, V, E->getArg(5)->getType());
554     Value *IsInf =
555       Builder.CreateFCmpOEQ(VAbs, ConstantFP::getInfinity(V->getType()),
556                             "isinf");
557     Value *InfLiteral = EmitScalarExpr(E->getArg(1));
558     BasicBlock *NotInf = createBasicBlock("fpclassify_not_inf", this->CurFn);
559     Builder.CreateCondBr(IsInf, End, NotInf);
560     Result->addIncoming(InfLiteral, NotNan);
561 
562     // if (fabs(V) >= MIN_NORMAL) return FP_NORMAL else FP_SUBNORMAL
563     Builder.SetInsertPoint(NotInf);
564     APFloat Smallest = APFloat::getSmallestNormalized(
565         getContext().getFloatTypeSemantics(E->getArg(5)->getType()));
566     Value *IsNormal =
567       Builder.CreateFCmpUGE(VAbs, ConstantFP::get(V->getContext(), Smallest),
568                             "isnormal");
569     Value *NormalResult =
570       Builder.CreateSelect(IsNormal, EmitScalarExpr(E->getArg(2)),
571                            EmitScalarExpr(E->getArg(3)));
572     Builder.CreateBr(End);
573     Result->addIncoming(NormalResult, NotInf);
574 
575     // return Result
576     Builder.SetInsertPoint(End);
577     return RValue::get(Result);
578   }
579 
580   case Builtin::BIalloca:
581   case Builtin::BI__builtin_alloca: {
582     Value *Size = EmitScalarExpr(E->getArg(0));
583     return RValue::get(Builder.CreateAlloca(Builder.getInt8Ty(), Size));
584   }
585   case Builtin::BIbzero:
586   case Builtin::BI__builtin_bzero: {
587     std::pair<llvm::Value*, unsigned> Dest =
588         EmitPointerWithAlignment(E->getArg(0));
589     Value *SizeVal = EmitScalarExpr(E->getArg(1));
590     Builder.CreateMemSet(Dest.first, Builder.getInt8(0), SizeVal,
591                          Dest.second, false);
592     return RValue::get(Dest.first);
593   }
594   case Builtin::BImemcpy:
595   case Builtin::BI__builtin_memcpy: {
596     std::pair<llvm::Value*, unsigned> Dest =
597         EmitPointerWithAlignment(E->getArg(0));
598     std::pair<llvm::Value*, unsigned> Src =
599         EmitPointerWithAlignment(E->getArg(1));
600     Value *SizeVal = EmitScalarExpr(E->getArg(2));
601     unsigned Align = std::min(Dest.second, Src.second);
602     Builder.CreateMemCpy(Dest.first, Src.first, SizeVal, Align, false);
603     return RValue::get(Dest.first);
604   }
605 
606   case Builtin::BI__builtin___memcpy_chk: {
607     // fold __builtin_memcpy_chk(x, y, cst1, cst2) to memcpy iff cst1<=cst2.
608     llvm::APSInt Size, DstSize;
609     if (!E->getArg(2)->EvaluateAsInt(Size, CGM.getContext()) ||
610         !E->getArg(3)->EvaluateAsInt(DstSize, CGM.getContext()))
611       break;
612     if (Size.ugt(DstSize))
613       break;
614     std::pair<llvm::Value*, unsigned> Dest =
615         EmitPointerWithAlignment(E->getArg(0));
616     std::pair<llvm::Value*, unsigned> Src =
617         EmitPointerWithAlignment(E->getArg(1));
618     Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size);
619     unsigned Align = std::min(Dest.second, Src.second);
620     Builder.CreateMemCpy(Dest.first, Src.first, SizeVal, Align, false);
621     return RValue::get(Dest.first);
622   }
623 
624   case Builtin::BI__builtin_objc_memmove_collectable: {
625     Value *Address = EmitScalarExpr(E->getArg(0));
626     Value *SrcAddr = EmitScalarExpr(E->getArg(1));
627     Value *SizeVal = EmitScalarExpr(E->getArg(2));
628     CGM.getObjCRuntime().EmitGCMemmoveCollectable(*this,
629                                                   Address, SrcAddr, SizeVal);
630     return RValue::get(Address);
631   }
632 
633   case Builtin::BI__builtin___memmove_chk: {
634     // fold __builtin_memmove_chk(x, y, cst1, cst2) to memmove iff cst1<=cst2.
635     llvm::APSInt Size, DstSize;
636     if (!E->getArg(2)->EvaluateAsInt(Size, CGM.getContext()) ||
637         !E->getArg(3)->EvaluateAsInt(DstSize, CGM.getContext()))
638       break;
639     if (Size.ugt(DstSize))
640       break;
641     std::pair<llvm::Value*, unsigned> Dest =
642         EmitPointerWithAlignment(E->getArg(0));
643     std::pair<llvm::Value*, unsigned> Src =
644         EmitPointerWithAlignment(E->getArg(1));
645     Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size);
646     unsigned Align = std::min(Dest.second, Src.second);
647     Builder.CreateMemMove(Dest.first, Src.first, SizeVal, Align, false);
648     return RValue::get(Dest.first);
649   }
650 
651   case Builtin::BImemmove:
652   case Builtin::BI__builtin_memmove: {
653     std::pair<llvm::Value*, unsigned> Dest =
654         EmitPointerWithAlignment(E->getArg(0));
655     std::pair<llvm::Value*, unsigned> Src =
656         EmitPointerWithAlignment(E->getArg(1));
657     Value *SizeVal = EmitScalarExpr(E->getArg(2));
658     unsigned Align = std::min(Dest.second, Src.second);
659     Builder.CreateMemMove(Dest.first, Src.first, SizeVal, Align, false);
660     return RValue::get(Dest.first);
661   }
662   case Builtin::BImemset:
663   case Builtin::BI__builtin_memset: {
664     std::pair<llvm::Value*, unsigned> Dest =
665         EmitPointerWithAlignment(E->getArg(0));
666     Value *ByteVal = Builder.CreateTrunc(EmitScalarExpr(E->getArg(1)),
667                                          Builder.getInt8Ty());
668     Value *SizeVal = EmitScalarExpr(E->getArg(2));
669     Builder.CreateMemSet(Dest.first, ByteVal, SizeVal, Dest.second, false);
670     return RValue::get(Dest.first);
671   }
672   case Builtin::BI__builtin___memset_chk: {
673     // fold __builtin_memset_chk(x, y, cst1, cst2) to memset iff cst1<=cst2.
674     llvm::APSInt Size, DstSize;
675     if (!E->getArg(2)->EvaluateAsInt(Size, CGM.getContext()) ||
676         !E->getArg(3)->EvaluateAsInt(DstSize, CGM.getContext()))
677       break;
678     if (Size.ugt(DstSize))
679       break;
680     std::pair<llvm::Value*, unsigned> Dest =
681         EmitPointerWithAlignment(E->getArg(0));
682     Value *ByteVal = Builder.CreateTrunc(EmitScalarExpr(E->getArg(1)),
683                                          Builder.getInt8Ty());
684     Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size);
685     Builder.CreateMemSet(Dest.first, ByteVal, SizeVal, Dest.second, false);
686     return RValue::get(Dest.first);
687   }
688   case Builtin::BI__builtin_dwarf_cfa: {
689     // The offset in bytes from the first argument to the CFA.
690     //
691     // Why on earth is this in the frontend?  Is there any reason at
692     // all that the backend can't reasonably determine this while
693     // lowering llvm.eh.dwarf.cfa()?
694     //
695     // TODO: If there's a satisfactory reason, add a target hook for
696     // this instead of hard-coding 0, which is correct for most targets.
697     int32_t Offset = 0;
698 
699     Value *F = CGM.getIntrinsic(Intrinsic::eh_dwarf_cfa);
700     return RValue::get(Builder.CreateCall(F,
701                                       llvm::ConstantInt::get(Int32Ty, Offset)));
702   }
703   case Builtin::BI__builtin_return_address: {
704     Value *Depth = EmitScalarExpr(E->getArg(0));
705     Depth = Builder.CreateIntCast(Depth, Int32Ty, false);
706     Value *F = CGM.getIntrinsic(Intrinsic::returnaddress);
707     return RValue::get(Builder.CreateCall(F, Depth));
708   }
709   case Builtin::BI__builtin_frame_address: {
710     Value *Depth = EmitScalarExpr(E->getArg(0));
711     Depth = Builder.CreateIntCast(Depth, Int32Ty, false);
712     Value *F = CGM.getIntrinsic(Intrinsic::frameaddress);
713     return RValue::get(Builder.CreateCall(F, Depth));
714   }
715   case Builtin::BI__builtin_extract_return_addr: {
716     Value *Address = EmitScalarExpr(E->getArg(0));
717     Value *Result = getTargetHooks().decodeReturnAddress(*this, Address);
718     return RValue::get(Result);
719   }
720   case Builtin::BI__builtin_frob_return_addr: {
721     Value *Address = EmitScalarExpr(E->getArg(0));
722     Value *Result = getTargetHooks().encodeReturnAddress(*this, Address);
723     return RValue::get(Result);
724   }
725   case Builtin::BI__builtin_dwarf_sp_column: {
726     llvm::IntegerType *Ty
727       = cast<llvm::IntegerType>(ConvertType(E->getType()));
728     int Column = getTargetHooks().getDwarfEHStackPointer(CGM);
729     if (Column == -1) {
730       CGM.ErrorUnsupported(E, "__builtin_dwarf_sp_column");
731       return RValue::get(llvm::UndefValue::get(Ty));
732     }
733     return RValue::get(llvm::ConstantInt::get(Ty, Column, true));
734   }
735   case Builtin::BI__builtin_init_dwarf_reg_size_table: {
736     Value *Address = EmitScalarExpr(E->getArg(0));
737     if (getTargetHooks().initDwarfEHRegSizeTable(*this, Address))
738       CGM.ErrorUnsupported(E, "__builtin_init_dwarf_reg_size_table");
739     return RValue::get(llvm::UndefValue::get(ConvertType(E->getType())));
740   }
741   case Builtin::BI__builtin_eh_return: {
742     Value *Int = EmitScalarExpr(E->getArg(0));
743     Value *Ptr = EmitScalarExpr(E->getArg(1));
744 
745     llvm::IntegerType *IntTy = cast<llvm::IntegerType>(Int->getType());
746     assert((IntTy->getBitWidth() == 32 || IntTy->getBitWidth() == 64) &&
747            "LLVM's __builtin_eh_return only supports 32- and 64-bit variants");
748     Value *F = CGM.getIntrinsic(IntTy->getBitWidth() == 32
749                                   ? Intrinsic::eh_return_i32
750                                   : Intrinsic::eh_return_i64);
751     Builder.CreateCall2(F, Int, Ptr);
752     Builder.CreateUnreachable();
753 
754     // We do need to preserve an insertion point.
755     EmitBlock(createBasicBlock("builtin_eh_return.cont"));
756 
757     return RValue::get(0);
758   }
759   case Builtin::BI__builtin_unwind_init: {
760     Value *F = CGM.getIntrinsic(Intrinsic::eh_unwind_init);
761     return RValue::get(Builder.CreateCall(F));
762   }
763   case Builtin::BI__builtin_extend_pointer: {
764     // Extends a pointer to the size of an _Unwind_Word, which is
765     // uint64_t on all platforms.  Generally this gets poked into a
766     // register and eventually used as an address, so if the
767     // addressing registers are wider than pointers and the platform
768     // doesn't implicitly ignore high-order bits when doing
769     // addressing, we need to make sure we zext / sext based on
770     // the platform's expectations.
771     //
772     // See: http://gcc.gnu.org/ml/gcc-bugs/2002-02/msg00237.html
773 
774     // Cast the pointer to intptr_t.
775     Value *Ptr = EmitScalarExpr(E->getArg(0));
776     Value *Result = Builder.CreatePtrToInt(Ptr, IntPtrTy, "extend.cast");
777 
778     // If that's 64 bits, we're done.
779     if (IntPtrTy->getBitWidth() == 64)
780       return RValue::get(Result);
781 
782     // Otherwise, ask the codegen data what to do.
783     if (getTargetHooks().extendPointerWithSExt())
784       return RValue::get(Builder.CreateSExt(Result, Int64Ty, "extend.sext"));
785     else
786       return RValue::get(Builder.CreateZExt(Result, Int64Ty, "extend.zext"));
787   }
788   case Builtin::BI__builtin_setjmp: {
789     // Buffer is a void**.
790     Value *Buf = EmitScalarExpr(E->getArg(0));
791 
792     // Store the frame pointer to the setjmp buffer.
793     Value *FrameAddr =
794       Builder.CreateCall(CGM.getIntrinsic(Intrinsic::frameaddress),
795                          ConstantInt::get(Int32Ty, 0));
796     Builder.CreateStore(FrameAddr, Buf);
797 
798     // Store the stack pointer to the setjmp buffer.
799     Value *StackAddr =
800       Builder.CreateCall(CGM.getIntrinsic(Intrinsic::stacksave));
801     Value *StackSaveSlot =
802       Builder.CreateGEP(Buf, ConstantInt::get(Int32Ty, 2));
803     Builder.CreateStore(StackAddr, StackSaveSlot);
804 
805     // Call LLVM's EH setjmp, which is lightweight.
806     Value *F = CGM.getIntrinsic(Intrinsic::eh_sjlj_setjmp);
807     Buf = Builder.CreateBitCast(Buf, Int8PtrTy);
808     return RValue::get(Builder.CreateCall(F, Buf));
809   }
810   case Builtin::BI__builtin_longjmp: {
811     Value *Buf = EmitScalarExpr(E->getArg(0));
812     Buf = Builder.CreateBitCast(Buf, Int8PtrTy);
813 
814     // Call LLVM's EH longjmp, which is lightweight.
815     Builder.CreateCall(CGM.getIntrinsic(Intrinsic::eh_sjlj_longjmp), Buf);
816 
817     // longjmp doesn't return; mark this as unreachable.
818     Builder.CreateUnreachable();
819 
820     // We do need to preserve an insertion point.
821     EmitBlock(createBasicBlock("longjmp.cont"));
822 
823     return RValue::get(0);
824   }
825   case Builtin::BI__sync_fetch_and_add:
826   case Builtin::BI__sync_fetch_and_sub:
827   case Builtin::BI__sync_fetch_and_or:
828   case Builtin::BI__sync_fetch_and_and:
829   case Builtin::BI__sync_fetch_and_xor:
830   case Builtin::BI__sync_add_and_fetch:
831   case Builtin::BI__sync_sub_and_fetch:
832   case Builtin::BI__sync_and_and_fetch:
833   case Builtin::BI__sync_or_and_fetch:
834   case Builtin::BI__sync_xor_and_fetch:
835   case Builtin::BI__sync_val_compare_and_swap:
836   case Builtin::BI__sync_bool_compare_and_swap:
837   case Builtin::BI__sync_lock_test_and_set:
838   case Builtin::BI__sync_lock_release:
839   case Builtin::BI__sync_swap:
840     llvm_unreachable("Shouldn't make it through sema");
841   case Builtin::BI__sync_fetch_and_add_1:
842   case Builtin::BI__sync_fetch_and_add_2:
843   case Builtin::BI__sync_fetch_and_add_4:
844   case Builtin::BI__sync_fetch_and_add_8:
845   case Builtin::BI__sync_fetch_and_add_16:
846     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Add, E);
847   case Builtin::BI__sync_fetch_and_sub_1:
848   case Builtin::BI__sync_fetch_and_sub_2:
849   case Builtin::BI__sync_fetch_and_sub_4:
850   case Builtin::BI__sync_fetch_and_sub_8:
851   case Builtin::BI__sync_fetch_and_sub_16:
852     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Sub, E);
853   case Builtin::BI__sync_fetch_and_or_1:
854   case Builtin::BI__sync_fetch_and_or_2:
855   case Builtin::BI__sync_fetch_and_or_4:
856   case Builtin::BI__sync_fetch_and_or_8:
857   case Builtin::BI__sync_fetch_and_or_16:
858     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Or, E);
859   case Builtin::BI__sync_fetch_and_and_1:
860   case Builtin::BI__sync_fetch_and_and_2:
861   case Builtin::BI__sync_fetch_and_and_4:
862   case Builtin::BI__sync_fetch_and_and_8:
863   case Builtin::BI__sync_fetch_and_and_16:
864     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::And, E);
865   case Builtin::BI__sync_fetch_and_xor_1:
866   case Builtin::BI__sync_fetch_and_xor_2:
867   case Builtin::BI__sync_fetch_and_xor_4:
868   case Builtin::BI__sync_fetch_and_xor_8:
869   case Builtin::BI__sync_fetch_and_xor_16:
870     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Xor, E);
871 
872   // Clang extensions: not overloaded yet.
873   case Builtin::BI__sync_fetch_and_min:
874     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Min, E);
875   case Builtin::BI__sync_fetch_and_max:
876     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Max, E);
877   case Builtin::BI__sync_fetch_and_umin:
878     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::UMin, E);
879   case Builtin::BI__sync_fetch_and_umax:
880     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::UMax, E);
881 
882   case Builtin::BI__sync_add_and_fetch_1:
883   case Builtin::BI__sync_add_and_fetch_2:
884   case Builtin::BI__sync_add_and_fetch_4:
885   case Builtin::BI__sync_add_and_fetch_8:
886   case Builtin::BI__sync_add_and_fetch_16:
887     return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Add, E,
888                                 llvm::Instruction::Add);
889   case Builtin::BI__sync_sub_and_fetch_1:
890   case Builtin::BI__sync_sub_and_fetch_2:
891   case Builtin::BI__sync_sub_and_fetch_4:
892   case Builtin::BI__sync_sub_and_fetch_8:
893   case Builtin::BI__sync_sub_and_fetch_16:
894     return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Sub, E,
895                                 llvm::Instruction::Sub);
896   case Builtin::BI__sync_and_and_fetch_1:
897   case Builtin::BI__sync_and_and_fetch_2:
898   case Builtin::BI__sync_and_and_fetch_4:
899   case Builtin::BI__sync_and_and_fetch_8:
900   case Builtin::BI__sync_and_and_fetch_16:
901     return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::And, E,
902                                 llvm::Instruction::And);
903   case Builtin::BI__sync_or_and_fetch_1:
904   case Builtin::BI__sync_or_and_fetch_2:
905   case Builtin::BI__sync_or_and_fetch_4:
906   case Builtin::BI__sync_or_and_fetch_8:
907   case Builtin::BI__sync_or_and_fetch_16:
908     return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Or, E,
909                                 llvm::Instruction::Or);
910   case Builtin::BI__sync_xor_and_fetch_1:
911   case Builtin::BI__sync_xor_and_fetch_2:
912   case Builtin::BI__sync_xor_and_fetch_4:
913   case Builtin::BI__sync_xor_and_fetch_8:
914   case Builtin::BI__sync_xor_and_fetch_16:
915     return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Xor, E,
916                                 llvm::Instruction::Xor);
917 
918   case Builtin::BI__sync_val_compare_and_swap_1:
919   case Builtin::BI__sync_val_compare_and_swap_2:
920   case Builtin::BI__sync_val_compare_and_swap_4:
921   case Builtin::BI__sync_val_compare_and_swap_8:
922   case Builtin::BI__sync_val_compare_and_swap_16: {
923     QualType T = E->getType();
924     llvm::Value *DestPtr = EmitScalarExpr(E->getArg(0));
925     unsigned AddrSpace = DestPtr->getType()->getPointerAddressSpace();
926 
927     llvm::IntegerType *IntType =
928       llvm::IntegerType::get(getLLVMContext(),
929                              getContext().getTypeSize(T));
930     llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
931 
932     Value *Args[3];
933     Args[0] = Builder.CreateBitCast(DestPtr, IntPtrType);
934     Args[1] = EmitScalarExpr(E->getArg(1));
935     llvm::Type *ValueType = Args[1]->getType();
936     Args[1] = EmitToInt(*this, Args[1], T, IntType);
937     Args[2] = EmitToInt(*this, EmitScalarExpr(E->getArg(2)), T, IntType);
938 
939     Value *Result = Builder.CreateAtomicCmpXchg(Args[0], Args[1], Args[2],
940                                                 llvm::SequentiallyConsistent);
941     Result = EmitFromInt(*this, Result, T, ValueType);
942     return RValue::get(Result);
943   }
944 
945   case Builtin::BI__sync_bool_compare_and_swap_1:
946   case Builtin::BI__sync_bool_compare_and_swap_2:
947   case Builtin::BI__sync_bool_compare_and_swap_4:
948   case Builtin::BI__sync_bool_compare_and_swap_8:
949   case Builtin::BI__sync_bool_compare_and_swap_16: {
950     QualType T = E->getArg(1)->getType();
951     llvm::Value *DestPtr = EmitScalarExpr(E->getArg(0));
952     unsigned AddrSpace = DestPtr->getType()->getPointerAddressSpace();
953 
954     llvm::IntegerType *IntType =
955       llvm::IntegerType::get(getLLVMContext(),
956                              getContext().getTypeSize(T));
957     llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
958 
959     Value *Args[3];
960     Args[0] = Builder.CreateBitCast(DestPtr, IntPtrType);
961     Args[1] = EmitToInt(*this, EmitScalarExpr(E->getArg(1)), T, IntType);
962     Args[2] = EmitToInt(*this, EmitScalarExpr(E->getArg(2)), T, IntType);
963 
964     Value *OldVal = Args[1];
965     Value *PrevVal = Builder.CreateAtomicCmpXchg(Args[0], Args[1], Args[2],
966                                                  llvm::SequentiallyConsistent);
967     Value *Result = Builder.CreateICmpEQ(PrevVal, OldVal);
968     // zext bool to int.
969     Result = Builder.CreateZExt(Result, ConvertType(E->getType()));
970     return RValue::get(Result);
971   }
972 
973   case Builtin::BI__sync_swap_1:
974   case Builtin::BI__sync_swap_2:
975   case Builtin::BI__sync_swap_4:
976   case Builtin::BI__sync_swap_8:
977   case Builtin::BI__sync_swap_16:
978     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Xchg, E);
979 
980   case Builtin::BI__sync_lock_test_and_set_1:
981   case Builtin::BI__sync_lock_test_and_set_2:
982   case Builtin::BI__sync_lock_test_and_set_4:
983   case Builtin::BI__sync_lock_test_and_set_8:
984   case Builtin::BI__sync_lock_test_and_set_16:
985     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Xchg, E);
986 
987   case Builtin::BI__sync_lock_release_1:
988   case Builtin::BI__sync_lock_release_2:
989   case Builtin::BI__sync_lock_release_4:
990   case Builtin::BI__sync_lock_release_8:
991   case Builtin::BI__sync_lock_release_16: {
992     Value *Ptr = EmitScalarExpr(E->getArg(0));
993     QualType ElTy = E->getArg(0)->getType()->getPointeeType();
994     CharUnits StoreSize = getContext().getTypeSizeInChars(ElTy);
995     llvm::Type *ITy = llvm::IntegerType::get(getLLVMContext(),
996                                              StoreSize.getQuantity() * 8);
997     Ptr = Builder.CreateBitCast(Ptr, ITy->getPointerTo());
998     llvm::StoreInst *Store =
999       Builder.CreateStore(llvm::Constant::getNullValue(ITy), Ptr);
1000     Store->setAlignment(StoreSize.getQuantity());
1001     Store->setAtomic(llvm::Release);
1002     return RValue::get(0);
1003   }
1004 
1005   case Builtin::BI__sync_synchronize: {
1006     // We assume this is supposed to correspond to a C++0x-style
1007     // sequentially-consistent fence (i.e. this is only usable for
1008     // synchonization, not device I/O or anything like that). This intrinsic
1009     // is really badly designed in the sense that in theory, there isn't
1010     // any way to safely use it... but in practice, it mostly works
1011     // to use it with non-atomic loads and stores to get acquire/release
1012     // semantics.
1013     Builder.CreateFence(llvm::SequentiallyConsistent);
1014     return RValue::get(0);
1015   }
1016 
1017   case Builtin::BI__c11_atomic_is_lock_free:
1018   case Builtin::BI__atomic_is_lock_free: {
1019     // Call "bool __atomic_is_lock_free(size_t size, void *ptr)". For the
1020     // __c11 builtin, ptr is 0 (indicating a properly-aligned object), since
1021     // _Atomic(T) is always properly-aligned.
1022     const char *LibCallName = "__atomic_is_lock_free";
1023     CallArgList Args;
1024     Args.add(RValue::get(EmitScalarExpr(E->getArg(0))),
1025              getContext().getSizeType());
1026     if (BuiltinID == Builtin::BI__atomic_is_lock_free)
1027       Args.add(RValue::get(EmitScalarExpr(E->getArg(1))),
1028                getContext().VoidPtrTy);
1029     else
1030       Args.add(RValue::get(llvm::Constant::getNullValue(VoidPtrTy)),
1031                getContext().VoidPtrTy);
1032     const CGFunctionInfo &FuncInfo =
1033         CGM.getTypes().arrangeFreeFunctionCall(E->getType(), Args,
1034                                                FunctionType::ExtInfo(),
1035                                                RequiredArgs::All);
1036     llvm::FunctionType *FTy = CGM.getTypes().GetFunctionType(FuncInfo);
1037     llvm::Constant *Func = CGM.CreateRuntimeFunction(FTy, LibCallName);
1038     return EmitCall(FuncInfo, Func, ReturnValueSlot(), Args);
1039   }
1040 
1041   case Builtin::BI__atomic_test_and_set: {
1042     // Look at the argument type to determine whether this is a volatile
1043     // operation. The parameter type is always volatile.
1044     QualType PtrTy = E->getArg(0)->IgnoreImpCasts()->getType();
1045     bool Volatile =
1046         PtrTy->castAs<PointerType>()->getPointeeType().isVolatileQualified();
1047 
1048     Value *Ptr = EmitScalarExpr(E->getArg(0));
1049     unsigned AddrSpace = Ptr->getType()->getPointerAddressSpace();
1050     Ptr = Builder.CreateBitCast(Ptr, Int8Ty->getPointerTo(AddrSpace));
1051     Value *NewVal = Builder.getInt8(1);
1052     Value *Order = EmitScalarExpr(E->getArg(1));
1053     if (isa<llvm::ConstantInt>(Order)) {
1054       int ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
1055       AtomicRMWInst *Result = 0;
1056       switch (ord) {
1057       case 0:  // memory_order_relaxed
1058       default: // invalid order
1059         Result = Builder.CreateAtomicRMW(llvm::AtomicRMWInst::Xchg,
1060                                          Ptr, NewVal,
1061                                          llvm::Monotonic);
1062         break;
1063       case 1:  // memory_order_consume
1064       case 2:  // memory_order_acquire
1065         Result = Builder.CreateAtomicRMW(llvm::AtomicRMWInst::Xchg,
1066                                          Ptr, NewVal,
1067                                          llvm::Acquire);
1068         break;
1069       case 3:  // memory_order_release
1070         Result = Builder.CreateAtomicRMW(llvm::AtomicRMWInst::Xchg,
1071                                          Ptr, NewVal,
1072                                          llvm::Release);
1073         break;
1074       case 4:  // memory_order_acq_rel
1075         Result = Builder.CreateAtomicRMW(llvm::AtomicRMWInst::Xchg,
1076                                          Ptr, NewVal,
1077                                          llvm::AcquireRelease);
1078         break;
1079       case 5:  // memory_order_seq_cst
1080         Result = Builder.CreateAtomicRMW(llvm::AtomicRMWInst::Xchg,
1081                                          Ptr, NewVal,
1082                                          llvm::SequentiallyConsistent);
1083         break;
1084       }
1085       Result->setVolatile(Volatile);
1086       return RValue::get(Builder.CreateIsNotNull(Result, "tobool"));
1087     }
1088 
1089     llvm::BasicBlock *ContBB = createBasicBlock("atomic.continue", CurFn);
1090 
1091     llvm::BasicBlock *BBs[5] = {
1092       createBasicBlock("monotonic", CurFn),
1093       createBasicBlock("acquire", CurFn),
1094       createBasicBlock("release", CurFn),
1095       createBasicBlock("acqrel", CurFn),
1096       createBasicBlock("seqcst", CurFn)
1097     };
1098     llvm::AtomicOrdering Orders[5] = {
1099       llvm::Monotonic, llvm::Acquire, llvm::Release,
1100       llvm::AcquireRelease, llvm::SequentiallyConsistent
1101     };
1102 
1103     Order = Builder.CreateIntCast(Order, Builder.getInt32Ty(), false);
1104     llvm::SwitchInst *SI = Builder.CreateSwitch(Order, BBs[0]);
1105 
1106     Builder.SetInsertPoint(ContBB);
1107     PHINode *Result = Builder.CreatePHI(Int8Ty, 5, "was_set");
1108 
1109     for (unsigned i = 0; i < 5; ++i) {
1110       Builder.SetInsertPoint(BBs[i]);
1111       AtomicRMWInst *RMW = Builder.CreateAtomicRMW(llvm::AtomicRMWInst::Xchg,
1112                                                    Ptr, NewVal, Orders[i]);
1113       RMW->setVolatile(Volatile);
1114       Result->addIncoming(RMW, BBs[i]);
1115       Builder.CreateBr(ContBB);
1116     }
1117 
1118     SI->addCase(Builder.getInt32(0), BBs[0]);
1119     SI->addCase(Builder.getInt32(1), BBs[1]);
1120     SI->addCase(Builder.getInt32(2), BBs[1]);
1121     SI->addCase(Builder.getInt32(3), BBs[2]);
1122     SI->addCase(Builder.getInt32(4), BBs[3]);
1123     SI->addCase(Builder.getInt32(5), BBs[4]);
1124 
1125     Builder.SetInsertPoint(ContBB);
1126     return RValue::get(Builder.CreateIsNotNull(Result, "tobool"));
1127   }
1128 
1129   case Builtin::BI__atomic_clear: {
1130     QualType PtrTy = E->getArg(0)->IgnoreImpCasts()->getType();
1131     bool Volatile =
1132         PtrTy->castAs<PointerType>()->getPointeeType().isVolatileQualified();
1133 
1134     Value *Ptr = EmitScalarExpr(E->getArg(0));
1135     unsigned AddrSpace = Ptr->getType()->getPointerAddressSpace();
1136     Ptr = Builder.CreateBitCast(Ptr, Int8Ty->getPointerTo(AddrSpace));
1137     Value *NewVal = Builder.getInt8(0);
1138     Value *Order = EmitScalarExpr(E->getArg(1));
1139     if (isa<llvm::ConstantInt>(Order)) {
1140       int ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
1141       StoreInst *Store = Builder.CreateStore(NewVal, Ptr, Volatile);
1142       Store->setAlignment(1);
1143       switch (ord) {
1144       case 0:  // memory_order_relaxed
1145       default: // invalid order
1146         Store->setOrdering(llvm::Monotonic);
1147         break;
1148       case 3:  // memory_order_release
1149         Store->setOrdering(llvm::Release);
1150         break;
1151       case 5:  // memory_order_seq_cst
1152         Store->setOrdering(llvm::SequentiallyConsistent);
1153         break;
1154       }
1155       return RValue::get(0);
1156     }
1157 
1158     llvm::BasicBlock *ContBB = createBasicBlock("atomic.continue", CurFn);
1159 
1160     llvm::BasicBlock *BBs[3] = {
1161       createBasicBlock("monotonic", CurFn),
1162       createBasicBlock("release", CurFn),
1163       createBasicBlock("seqcst", CurFn)
1164     };
1165     llvm::AtomicOrdering Orders[3] = {
1166       llvm::Monotonic, llvm::Release, llvm::SequentiallyConsistent
1167     };
1168 
1169     Order = Builder.CreateIntCast(Order, Builder.getInt32Ty(), false);
1170     llvm::SwitchInst *SI = Builder.CreateSwitch(Order, BBs[0]);
1171 
1172     for (unsigned i = 0; i < 3; ++i) {
1173       Builder.SetInsertPoint(BBs[i]);
1174       StoreInst *Store = Builder.CreateStore(NewVal, Ptr, Volatile);
1175       Store->setAlignment(1);
1176       Store->setOrdering(Orders[i]);
1177       Builder.CreateBr(ContBB);
1178     }
1179 
1180     SI->addCase(Builder.getInt32(0), BBs[0]);
1181     SI->addCase(Builder.getInt32(3), BBs[1]);
1182     SI->addCase(Builder.getInt32(5), BBs[2]);
1183 
1184     Builder.SetInsertPoint(ContBB);
1185     return RValue::get(0);
1186   }
1187 
1188   case Builtin::BI__atomic_thread_fence:
1189   case Builtin::BI__atomic_signal_fence:
1190   case Builtin::BI__c11_atomic_thread_fence:
1191   case Builtin::BI__c11_atomic_signal_fence: {
1192     llvm::SynchronizationScope Scope;
1193     if (BuiltinID == Builtin::BI__atomic_signal_fence ||
1194         BuiltinID == Builtin::BI__c11_atomic_signal_fence)
1195       Scope = llvm::SingleThread;
1196     else
1197       Scope = llvm::CrossThread;
1198     Value *Order = EmitScalarExpr(E->getArg(0));
1199     if (isa<llvm::ConstantInt>(Order)) {
1200       int ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
1201       switch (ord) {
1202       case 0:  // memory_order_relaxed
1203       default: // invalid order
1204         break;
1205       case 1:  // memory_order_consume
1206       case 2:  // memory_order_acquire
1207         Builder.CreateFence(llvm::Acquire, Scope);
1208         break;
1209       case 3:  // memory_order_release
1210         Builder.CreateFence(llvm::Release, Scope);
1211         break;
1212       case 4:  // memory_order_acq_rel
1213         Builder.CreateFence(llvm::AcquireRelease, Scope);
1214         break;
1215       case 5:  // memory_order_seq_cst
1216         Builder.CreateFence(llvm::SequentiallyConsistent, Scope);
1217         break;
1218       }
1219       return RValue::get(0);
1220     }
1221 
1222     llvm::BasicBlock *AcquireBB, *ReleaseBB, *AcqRelBB, *SeqCstBB;
1223     AcquireBB = createBasicBlock("acquire", CurFn);
1224     ReleaseBB = createBasicBlock("release", CurFn);
1225     AcqRelBB = createBasicBlock("acqrel", CurFn);
1226     SeqCstBB = createBasicBlock("seqcst", CurFn);
1227     llvm::BasicBlock *ContBB = createBasicBlock("atomic.continue", CurFn);
1228 
1229     Order = Builder.CreateIntCast(Order, Builder.getInt32Ty(), false);
1230     llvm::SwitchInst *SI = Builder.CreateSwitch(Order, ContBB);
1231 
1232     Builder.SetInsertPoint(AcquireBB);
1233     Builder.CreateFence(llvm::Acquire, Scope);
1234     Builder.CreateBr(ContBB);
1235     SI->addCase(Builder.getInt32(1), AcquireBB);
1236     SI->addCase(Builder.getInt32(2), AcquireBB);
1237 
1238     Builder.SetInsertPoint(ReleaseBB);
1239     Builder.CreateFence(llvm::Release, Scope);
1240     Builder.CreateBr(ContBB);
1241     SI->addCase(Builder.getInt32(3), ReleaseBB);
1242 
1243     Builder.SetInsertPoint(AcqRelBB);
1244     Builder.CreateFence(llvm::AcquireRelease, Scope);
1245     Builder.CreateBr(ContBB);
1246     SI->addCase(Builder.getInt32(4), AcqRelBB);
1247 
1248     Builder.SetInsertPoint(SeqCstBB);
1249     Builder.CreateFence(llvm::SequentiallyConsistent, Scope);
1250     Builder.CreateBr(ContBB);
1251     SI->addCase(Builder.getInt32(5), SeqCstBB);
1252 
1253     Builder.SetInsertPoint(ContBB);
1254     return RValue::get(0);
1255   }
1256 
1257     // Library functions with special handling.
1258   case Builtin::BIsqrt:
1259   case Builtin::BIsqrtf:
1260   case Builtin::BIsqrtl: {
1261     // TODO: there is currently no set of optimizer flags
1262     // sufficient for us to rewrite sqrt to @llvm.sqrt.
1263     // -fmath-errno=0 is not good enough; we need finiteness.
1264     // We could probably precondition the call with an ult
1265     // against 0, but is that worth the complexity?
1266     break;
1267   }
1268 
1269   case Builtin::BIpow:
1270   case Builtin::BIpowf:
1271   case Builtin::BIpowl: {
1272     // Rewrite sqrt to intrinsic if allowed.
1273     if (!FD->hasAttr<ConstAttr>())
1274       break;
1275     Value *Base = EmitScalarExpr(E->getArg(0));
1276     Value *Exponent = EmitScalarExpr(E->getArg(1));
1277     llvm::Type *ArgType = Base->getType();
1278     Value *F = CGM.getIntrinsic(Intrinsic::pow, ArgType);
1279     return RValue::get(Builder.CreateCall2(F, Base, Exponent));
1280   }
1281 
1282   case Builtin::BIfma:
1283   case Builtin::BIfmaf:
1284   case Builtin::BIfmal:
1285   case Builtin::BI__builtin_fma:
1286   case Builtin::BI__builtin_fmaf:
1287   case Builtin::BI__builtin_fmal: {
1288     // Rewrite fma to intrinsic.
1289     Value *FirstArg = EmitScalarExpr(E->getArg(0));
1290     llvm::Type *ArgType = FirstArg->getType();
1291     Value *F = CGM.getIntrinsic(Intrinsic::fma, ArgType);
1292     return RValue::get(Builder.CreateCall3(F, FirstArg,
1293                                               EmitScalarExpr(E->getArg(1)),
1294                                               EmitScalarExpr(E->getArg(2))));
1295   }
1296 
1297   case Builtin::BI__builtin_signbit:
1298   case Builtin::BI__builtin_signbitf:
1299   case Builtin::BI__builtin_signbitl: {
1300     LLVMContext &C = CGM.getLLVMContext();
1301 
1302     Value *Arg = EmitScalarExpr(E->getArg(0));
1303     llvm::Type *ArgTy = Arg->getType();
1304     if (ArgTy->isPPC_FP128Ty())
1305       break; // FIXME: I'm not sure what the right implementation is here.
1306     int ArgWidth = ArgTy->getPrimitiveSizeInBits();
1307     llvm::Type *ArgIntTy = llvm::IntegerType::get(C, ArgWidth);
1308     Value *BCArg = Builder.CreateBitCast(Arg, ArgIntTy);
1309     Value *ZeroCmp = llvm::Constant::getNullValue(ArgIntTy);
1310     Value *Result = Builder.CreateICmpSLT(BCArg, ZeroCmp);
1311     return RValue::get(Builder.CreateZExt(Result, ConvertType(E->getType())));
1312   }
1313   case Builtin::BI__builtin_annotation: {
1314     llvm::Value *AnnVal = EmitScalarExpr(E->getArg(0));
1315     llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::annotation,
1316                                       AnnVal->getType());
1317 
1318     // Get the annotation string, go through casts. Sema requires this to be a
1319     // non-wide string literal, potentially casted, so the cast<> is safe.
1320     const Expr *AnnotationStrExpr = E->getArg(1)->IgnoreParenCasts();
1321     llvm::StringRef Str = cast<StringLiteral>(AnnotationStrExpr)->getString();
1322     return RValue::get(EmitAnnotationCall(F, AnnVal, Str, E->getExprLoc()));
1323   }
1324   case Builtin::BI__noop:
1325     return RValue::get(0);
1326   }
1327 
1328   // If this is an alias for a lib function (e.g. __builtin_sin), emit
1329   // the call using the normal call path, but using the unmangled
1330   // version of the function name.
1331   if (getContext().BuiltinInfo.isLibFunction(BuiltinID))
1332     return emitLibraryCall(*this, FD, E,
1333                            CGM.getBuiltinLibFunction(FD, BuiltinID));
1334 
1335   // If this is a predefined lib function (e.g. malloc), emit the call
1336   // using exactly the normal call path.
1337   if (getContext().BuiltinInfo.isPredefinedLibFunction(BuiltinID))
1338     return emitLibraryCall(*this, FD, E, EmitScalarExpr(E->getCallee()));
1339 
1340   // See if we have a target specific intrinsic.
1341   const char *Name = getContext().BuiltinInfo.GetName(BuiltinID);
1342   Intrinsic::ID IntrinsicID = Intrinsic::not_intrinsic;
1343   if (const char *Prefix =
1344       llvm::Triple::getArchTypePrefix(Target.getTriple().getArch()))
1345     IntrinsicID = Intrinsic::getIntrinsicForGCCBuiltin(Prefix, Name);
1346 
1347   if (IntrinsicID != Intrinsic::not_intrinsic) {
1348     SmallVector<Value*, 16> Args;
1349 
1350     // Find out if any arguments are required to be integer constant
1351     // expressions.
1352     unsigned ICEArguments = 0;
1353     ASTContext::GetBuiltinTypeError Error;
1354     getContext().GetBuiltinType(BuiltinID, Error, &ICEArguments);
1355     assert(Error == ASTContext::GE_None && "Should not codegen an error");
1356 
1357     Function *F = CGM.getIntrinsic(IntrinsicID);
1358     llvm::FunctionType *FTy = F->getFunctionType();
1359 
1360     for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) {
1361       Value *ArgValue;
1362       // If this is a normal argument, just emit it as a scalar.
1363       if ((ICEArguments & (1 << i)) == 0) {
1364         ArgValue = EmitScalarExpr(E->getArg(i));
1365       } else {
1366         // If this is required to be a constant, constant fold it so that we
1367         // know that the generated intrinsic gets a ConstantInt.
1368         llvm::APSInt Result;
1369         bool IsConst = E->getArg(i)->isIntegerConstantExpr(Result,getContext());
1370         assert(IsConst && "Constant arg isn't actually constant?");
1371         (void)IsConst;
1372         ArgValue = llvm::ConstantInt::get(getLLVMContext(), Result);
1373       }
1374 
1375       // If the intrinsic arg type is different from the builtin arg type
1376       // we need to do a bit cast.
1377       llvm::Type *PTy = FTy->getParamType(i);
1378       if (PTy != ArgValue->getType()) {
1379         assert(PTy->canLosslesslyBitCastTo(FTy->getParamType(i)) &&
1380                "Must be able to losslessly bit cast to param");
1381         ArgValue = Builder.CreateBitCast(ArgValue, PTy);
1382       }
1383 
1384       Args.push_back(ArgValue);
1385     }
1386 
1387     Value *V = Builder.CreateCall(F, Args);
1388     QualType BuiltinRetType = E->getType();
1389 
1390     llvm::Type *RetTy = VoidTy;
1391     if (!BuiltinRetType->isVoidType())
1392       RetTy = ConvertType(BuiltinRetType);
1393 
1394     if (RetTy != V->getType()) {
1395       assert(V->getType()->canLosslesslyBitCastTo(RetTy) &&
1396              "Must be able to losslessly bit cast result type");
1397       V = Builder.CreateBitCast(V, RetTy);
1398     }
1399 
1400     return RValue::get(V);
1401   }
1402 
1403   // See if we have a target specific builtin that needs to be lowered.
1404   if (Value *V = EmitTargetBuiltinExpr(BuiltinID, E))
1405     return RValue::get(V);
1406 
1407   ErrorUnsupported(E, "builtin function");
1408 
1409   // Unknown builtin, for now just dump it out and return undef.
1410   if (hasAggregateLLVMType(E->getType()))
1411     return RValue::getAggregate(CreateMemTemp(E->getType()));
1412   return RValue::get(llvm::UndefValue::get(ConvertType(E->getType())));
1413 }
1414 
1415 Value *CodeGenFunction::EmitTargetBuiltinExpr(unsigned BuiltinID,
1416                                               const CallExpr *E) {
1417   switch (Target.getTriple().getArch()) {
1418   case llvm::Triple::arm:
1419   case llvm::Triple::thumb:
1420     return EmitARMBuiltinExpr(BuiltinID, E);
1421   case llvm::Triple::x86:
1422   case llvm::Triple::x86_64:
1423     return EmitX86BuiltinExpr(BuiltinID, E);
1424   case llvm::Triple::ppc:
1425   case llvm::Triple::ppc64:
1426     return EmitPPCBuiltinExpr(BuiltinID, E);
1427   default:
1428     return 0;
1429   }
1430 }
1431 
1432 static llvm::VectorType *GetNeonType(CodeGenFunction *CGF,
1433                                      NeonTypeFlags TypeFlags) {
1434   int IsQuad = TypeFlags.isQuad();
1435   switch (TypeFlags.getEltType()) {
1436   case NeonTypeFlags::Int8:
1437   case NeonTypeFlags::Poly8:
1438     return llvm::VectorType::get(CGF->Int8Ty, 8 << IsQuad);
1439   case NeonTypeFlags::Int16:
1440   case NeonTypeFlags::Poly16:
1441   case NeonTypeFlags::Float16:
1442     return llvm::VectorType::get(CGF->Int16Ty, 4 << IsQuad);
1443   case NeonTypeFlags::Int32:
1444     return llvm::VectorType::get(CGF->Int32Ty, 2 << IsQuad);
1445   case NeonTypeFlags::Int64:
1446     return llvm::VectorType::get(CGF->Int64Ty, 1 << IsQuad);
1447   case NeonTypeFlags::Float32:
1448     return llvm::VectorType::get(CGF->FloatTy, 2 << IsQuad);
1449   }
1450   llvm_unreachable("Invalid NeonTypeFlags element type!");
1451 }
1452 
1453 Value *CodeGenFunction::EmitNeonSplat(Value *V, Constant *C) {
1454   unsigned nElts = cast<llvm::VectorType>(V->getType())->getNumElements();
1455   Value* SV = llvm::ConstantVector::getSplat(nElts, C);
1456   return Builder.CreateShuffleVector(V, V, SV, "lane");
1457 }
1458 
1459 Value *CodeGenFunction::EmitNeonCall(Function *F, SmallVectorImpl<Value*> &Ops,
1460                                      const char *name,
1461                                      unsigned shift, bool rightshift) {
1462   unsigned j = 0;
1463   for (Function::const_arg_iterator ai = F->arg_begin(), ae = F->arg_end();
1464        ai != ae; ++ai, ++j)
1465     if (shift > 0 && shift == j)
1466       Ops[j] = EmitNeonShiftVector(Ops[j], ai->getType(), rightshift);
1467     else
1468       Ops[j] = Builder.CreateBitCast(Ops[j], ai->getType(), name);
1469 
1470   return Builder.CreateCall(F, Ops, name);
1471 }
1472 
1473 Value *CodeGenFunction::EmitNeonShiftVector(Value *V, llvm::Type *Ty,
1474                                             bool neg) {
1475   int SV = cast<ConstantInt>(V)->getSExtValue();
1476 
1477   llvm::VectorType *VTy = cast<llvm::VectorType>(Ty);
1478   llvm::Constant *C = ConstantInt::get(VTy->getElementType(), neg ? -SV : SV);
1479   return llvm::ConstantVector::getSplat(VTy->getNumElements(), C);
1480 }
1481 
1482 /// GetPointeeAlignment - Given an expression with a pointer type, find the
1483 /// alignment of the type referenced by the pointer.  Skip over implicit
1484 /// casts.
1485 std::pair<llvm::Value*, unsigned>
1486 CodeGenFunction::EmitPointerWithAlignment(const Expr *Addr) {
1487   assert(Addr->getType()->isPointerType());
1488   Addr = Addr->IgnoreParens();
1489   if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Addr)) {
1490     if ((ICE->getCastKind() == CK_BitCast || ICE->getCastKind() == CK_NoOp) &&
1491         ICE->getSubExpr()->getType()->isPointerType()) {
1492       std::pair<llvm::Value*, unsigned> Ptr =
1493           EmitPointerWithAlignment(ICE->getSubExpr());
1494       Ptr.first = Builder.CreateBitCast(Ptr.first,
1495                                         ConvertType(Addr->getType()));
1496       return Ptr;
1497     } else if (ICE->getCastKind() == CK_ArrayToPointerDecay) {
1498       LValue LV = EmitLValue(ICE->getSubExpr());
1499       unsigned Align = LV.getAlignment().getQuantity();
1500       if (!Align) {
1501         // FIXME: Once LValues are fixed to always set alignment,
1502         // zap this code.
1503         QualType PtTy = ICE->getSubExpr()->getType();
1504         if (!PtTy->isIncompleteType())
1505           Align = getContext().getTypeAlignInChars(PtTy).getQuantity();
1506         else
1507           Align = 1;
1508       }
1509       return std::make_pair(LV.getAddress(), Align);
1510     }
1511   }
1512   if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(Addr)) {
1513     if (UO->getOpcode() == UO_AddrOf) {
1514       LValue LV = EmitLValue(UO->getSubExpr());
1515       unsigned Align = LV.getAlignment().getQuantity();
1516       if (!Align) {
1517         // FIXME: Once LValues are fixed to always set alignment,
1518         // zap this code.
1519         QualType PtTy = UO->getSubExpr()->getType();
1520         if (!PtTy->isIncompleteType())
1521           Align = getContext().getTypeAlignInChars(PtTy).getQuantity();
1522         else
1523           Align = 1;
1524       }
1525       return std::make_pair(LV.getAddress(), Align);
1526     }
1527   }
1528 
1529   unsigned Align = 1;
1530   QualType PtTy = Addr->getType()->getPointeeType();
1531   if (!PtTy->isIncompleteType())
1532     Align = getContext().getTypeAlignInChars(PtTy).getQuantity();
1533 
1534   return std::make_pair(EmitScalarExpr(Addr), Align);
1535 }
1536 
1537 Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
1538                                            const CallExpr *E) {
1539   if (BuiltinID == ARM::BI__clear_cache) {
1540     const FunctionDecl *FD = E->getDirectCallee();
1541     // Oddly people write this call without args on occasion and gcc accepts
1542     // it - it's also marked as varargs in the description file.
1543     SmallVector<Value*, 2> Ops;
1544     for (unsigned i = 0; i < E->getNumArgs(); i++)
1545       Ops.push_back(EmitScalarExpr(E->getArg(i)));
1546     llvm::Type *Ty = CGM.getTypes().ConvertType(FD->getType());
1547     llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty);
1548     StringRef Name = FD->getName();
1549     return Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, Name), Ops);
1550   }
1551 
1552   if (BuiltinID == ARM::BI__builtin_arm_ldrexd) {
1553     Function *F = CGM.getIntrinsic(Intrinsic::arm_ldrexd);
1554 
1555     Value *LdPtr = EmitScalarExpr(E->getArg(0));
1556     Value *Val = Builder.CreateCall(F, LdPtr, "ldrexd");
1557 
1558     Value *Val0 = Builder.CreateExtractValue(Val, 1);
1559     Value *Val1 = Builder.CreateExtractValue(Val, 0);
1560     Val0 = Builder.CreateZExt(Val0, Int64Ty);
1561     Val1 = Builder.CreateZExt(Val1, Int64Ty);
1562 
1563     Value *ShiftCst = llvm::ConstantInt::get(Int64Ty, 32);
1564     Val = Builder.CreateShl(Val0, ShiftCst, "shl", true /* nuw */);
1565     return Builder.CreateOr(Val, Val1);
1566   }
1567 
1568   if (BuiltinID == ARM::BI__builtin_arm_strexd) {
1569     Function *F = CGM.getIntrinsic(Intrinsic::arm_strexd);
1570     llvm::Type *STy = llvm::StructType::get(Int32Ty, Int32Ty, NULL);
1571 
1572     Value *One = llvm::ConstantInt::get(Int32Ty, 1);
1573     Value *Tmp = Builder.CreateAlloca(Int64Ty, One);
1574     Value *Val = EmitScalarExpr(E->getArg(0));
1575     Builder.CreateStore(Val, Tmp);
1576 
1577     Value *LdPtr = Builder.CreateBitCast(Tmp,llvm::PointerType::getUnqual(STy));
1578     Val = Builder.CreateLoad(LdPtr);
1579 
1580     Value *Arg0 = Builder.CreateExtractValue(Val, 0);
1581     Value *Arg1 = Builder.CreateExtractValue(Val, 1);
1582     Value *StPtr = EmitScalarExpr(E->getArg(1));
1583     return Builder.CreateCall3(F, Arg0, Arg1, StPtr, "strexd");
1584   }
1585 
1586   SmallVector<Value*, 4> Ops;
1587   llvm::Value *Align = 0;
1588   for (unsigned i = 0, e = E->getNumArgs() - 1; i != e; i++) {
1589     if (i == 0) {
1590       switch (BuiltinID) {
1591       case ARM::BI__builtin_neon_vld1_v:
1592       case ARM::BI__builtin_neon_vld1q_v:
1593       case ARM::BI__builtin_neon_vld1q_lane_v:
1594       case ARM::BI__builtin_neon_vld1_lane_v:
1595       case ARM::BI__builtin_neon_vld1_dup_v:
1596       case ARM::BI__builtin_neon_vld1q_dup_v:
1597       case ARM::BI__builtin_neon_vst1_v:
1598       case ARM::BI__builtin_neon_vst1q_v:
1599       case ARM::BI__builtin_neon_vst1q_lane_v:
1600       case ARM::BI__builtin_neon_vst1_lane_v:
1601       case ARM::BI__builtin_neon_vst2_v:
1602       case ARM::BI__builtin_neon_vst2q_v:
1603       case ARM::BI__builtin_neon_vst2_lane_v:
1604       case ARM::BI__builtin_neon_vst2q_lane_v:
1605       case ARM::BI__builtin_neon_vst3_v:
1606       case ARM::BI__builtin_neon_vst3q_v:
1607       case ARM::BI__builtin_neon_vst3_lane_v:
1608       case ARM::BI__builtin_neon_vst3q_lane_v:
1609       case ARM::BI__builtin_neon_vst4_v:
1610       case ARM::BI__builtin_neon_vst4q_v:
1611       case ARM::BI__builtin_neon_vst4_lane_v:
1612       case ARM::BI__builtin_neon_vst4q_lane_v:
1613         // Get the alignment for the argument in addition to the value;
1614         // we'll use it later.
1615         std::pair<llvm::Value*, unsigned> Src =
1616             EmitPointerWithAlignment(E->getArg(0));
1617         Ops.push_back(Src.first);
1618         Align = Builder.getInt32(Src.second);
1619         continue;
1620       }
1621     }
1622     if (i == 1) {
1623       switch (BuiltinID) {
1624       case ARM::BI__builtin_neon_vld2_v:
1625       case ARM::BI__builtin_neon_vld2q_v:
1626       case ARM::BI__builtin_neon_vld3_v:
1627       case ARM::BI__builtin_neon_vld3q_v:
1628       case ARM::BI__builtin_neon_vld4_v:
1629       case ARM::BI__builtin_neon_vld4q_v:
1630       case ARM::BI__builtin_neon_vld2_lane_v:
1631       case ARM::BI__builtin_neon_vld2q_lane_v:
1632       case ARM::BI__builtin_neon_vld3_lane_v:
1633       case ARM::BI__builtin_neon_vld3q_lane_v:
1634       case ARM::BI__builtin_neon_vld4_lane_v:
1635       case ARM::BI__builtin_neon_vld4q_lane_v:
1636       case ARM::BI__builtin_neon_vld2_dup_v:
1637       case ARM::BI__builtin_neon_vld3_dup_v:
1638       case ARM::BI__builtin_neon_vld4_dup_v:
1639         // Get the alignment for the argument in addition to the value;
1640         // we'll use it later.
1641         std::pair<llvm::Value*, unsigned> Src =
1642             EmitPointerWithAlignment(E->getArg(1));
1643         Ops.push_back(Src.first);
1644         Align = Builder.getInt32(Src.second);
1645         continue;
1646       }
1647     }
1648     Ops.push_back(EmitScalarExpr(E->getArg(i)));
1649   }
1650 
1651   // vget_lane and vset_lane are not overloaded and do not have an extra
1652   // argument that specifies the vector type.
1653   switch (BuiltinID) {
1654   default: break;
1655   case ARM::BI__builtin_neon_vget_lane_i8:
1656   case ARM::BI__builtin_neon_vget_lane_i16:
1657   case ARM::BI__builtin_neon_vget_lane_i32:
1658   case ARM::BI__builtin_neon_vget_lane_i64:
1659   case ARM::BI__builtin_neon_vget_lane_f32:
1660   case ARM::BI__builtin_neon_vgetq_lane_i8:
1661   case ARM::BI__builtin_neon_vgetq_lane_i16:
1662   case ARM::BI__builtin_neon_vgetq_lane_i32:
1663   case ARM::BI__builtin_neon_vgetq_lane_i64:
1664   case ARM::BI__builtin_neon_vgetq_lane_f32:
1665     return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),
1666                                         "vget_lane");
1667   case ARM::BI__builtin_neon_vset_lane_i8:
1668   case ARM::BI__builtin_neon_vset_lane_i16:
1669   case ARM::BI__builtin_neon_vset_lane_i32:
1670   case ARM::BI__builtin_neon_vset_lane_i64:
1671   case ARM::BI__builtin_neon_vset_lane_f32:
1672   case ARM::BI__builtin_neon_vsetq_lane_i8:
1673   case ARM::BI__builtin_neon_vsetq_lane_i16:
1674   case ARM::BI__builtin_neon_vsetq_lane_i32:
1675   case ARM::BI__builtin_neon_vsetq_lane_i64:
1676   case ARM::BI__builtin_neon_vsetq_lane_f32:
1677     Ops.push_back(EmitScalarExpr(E->getArg(2)));
1678     return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vset_lane");
1679   }
1680 
1681   // Get the last argument, which specifies the vector type.
1682   llvm::APSInt Result;
1683   const Expr *Arg = E->getArg(E->getNumArgs()-1);
1684   if (!Arg->isIntegerConstantExpr(Result, getContext()))
1685     return 0;
1686 
1687   if (BuiltinID == ARM::BI__builtin_arm_vcvtr_f ||
1688       BuiltinID == ARM::BI__builtin_arm_vcvtr_d) {
1689     // Determine the overloaded type of this builtin.
1690     llvm::Type *Ty;
1691     if (BuiltinID == ARM::BI__builtin_arm_vcvtr_f)
1692       Ty = FloatTy;
1693     else
1694       Ty = DoubleTy;
1695 
1696     // Determine whether this is an unsigned conversion or not.
1697     bool usgn = Result.getZExtValue() == 1;
1698     unsigned Int = usgn ? Intrinsic::arm_vcvtru : Intrinsic::arm_vcvtr;
1699 
1700     // Call the appropriate intrinsic.
1701     Function *F = CGM.getIntrinsic(Int, Ty);
1702     return Builder.CreateCall(F, Ops, "vcvtr");
1703   }
1704 
1705   // Determine the type of this overloaded NEON intrinsic.
1706   NeonTypeFlags Type(Result.getZExtValue());
1707   bool usgn = Type.isUnsigned();
1708   bool quad = Type.isQuad();
1709   bool rightShift = false;
1710 
1711   llvm::VectorType *VTy = GetNeonType(this, Type);
1712   llvm::Type *Ty = VTy;
1713   if (!Ty)
1714     return 0;
1715 
1716   unsigned Int;
1717   switch (BuiltinID) {
1718   default: return 0;
1719   case ARM::BI__builtin_neon_vbsl_v:
1720   case ARM::BI__builtin_neon_vbslq_v:
1721     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vbsl, Ty),
1722                         Ops, "vbsl");
1723   case ARM::BI__builtin_neon_vabd_v:
1724   case ARM::BI__builtin_neon_vabdq_v:
1725     Int = usgn ? Intrinsic::arm_neon_vabdu : Intrinsic::arm_neon_vabds;
1726     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vabd");
1727   case ARM::BI__builtin_neon_vabs_v:
1728   case ARM::BI__builtin_neon_vabsq_v:
1729     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vabs, Ty),
1730                         Ops, "vabs");
1731   case ARM::BI__builtin_neon_vaddhn_v:
1732     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vaddhn, Ty),
1733                         Ops, "vaddhn");
1734   case ARM::BI__builtin_neon_vcale_v:
1735     std::swap(Ops[0], Ops[1]);
1736   case ARM::BI__builtin_neon_vcage_v: {
1737     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vacged);
1738     return EmitNeonCall(F, Ops, "vcage");
1739   }
1740   case ARM::BI__builtin_neon_vcaleq_v:
1741     std::swap(Ops[0], Ops[1]);
1742   case ARM::BI__builtin_neon_vcageq_v: {
1743     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vacgeq);
1744     return EmitNeonCall(F, Ops, "vcage");
1745   }
1746   case ARM::BI__builtin_neon_vcalt_v:
1747     std::swap(Ops[0], Ops[1]);
1748   case ARM::BI__builtin_neon_vcagt_v: {
1749     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vacgtd);
1750     return EmitNeonCall(F, Ops, "vcagt");
1751   }
1752   case ARM::BI__builtin_neon_vcaltq_v:
1753     std::swap(Ops[0], Ops[1]);
1754   case ARM::BI__builtin_neon_vcagtq_v: {
1755     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vacgtq);
1756     return EmitNeonCall(F, Ops, "vcagt");
1757   }
1758   case ARM::BI__builtin_neon_vcls_v:
1759   case ARM::BI__builtin_neon_vclsq_v: {
1760     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vcls, Ty);
1761     return EmitNeonCall(F, Ops, "vcls");
1762   }
1763   case ARM::BI__builtin_neon_vclz_v:
1764   case ARM::BI__builtin_neon_vclzq_v: {
1765     // Generate target-independent intrinsic; also need to add second argument
1766     // for whether or not clz of zero is undefined; on ARM it isn't.
1767     Function *F = CGM.getIntrinsic(Intrinsic::ctlz, Ty);
1768     Ops.push_back(Builder.getInt1(Target.isCLZForZeroUndef()));
1769     return EmitNeonCall(F, Ops, "vclz");
1770   }
1771   case ARM::BI__builtin_neon_vcnt_v:
1772   case ARM::BI__builtin_neon_vcntq_v: {
1773     // generate target-independent intrinsic
1774     Function *F = CGM.getIntrinsic(Intrinsic::ctpop, Ty);
1775     return EmitNeonCall(F, Ops, "vctpop");
1776   }
1777   case ARM::BI__builtin_neon_vcvt_f16_v: {
1778     assert(Type.getEltType() == NeonTypeFlags::Float16 && !quad &&
1779            "unexpected vcvt_f16_v builtin");
1780     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vcvtfp2hf);
1781     return EmitNeonCall(F, Ops, "vcvt");
1782   }
1783   case ARM::BI__builtin_neon_vcvt_f32_f16: {
1784     assert(Type.getEltType() == NeonTypeFlags::Float16 && !quad &&
1785            "unexpected vcvt_f32_f16 builtin");
1786     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vcvthf2fp);
1787     return EmitNeonCall(F, Ops, "vcvt");
1788   }
1789   case ARM::BI__builtin_neon_vcvt_f32_v:
1790   case ARM::BI__builtin_neon_vcvtq_f32_v:
1791     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1792     Ty = GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float32, false, quad));
1793     return usgn ? Builder.CreateUIToFP(Ops[0], Ty, "vcvt")
1794                 : Builder.CreateSIToFP(Ops[0], Ty, "vcvt");
1795   case ARM::BI__builtin_neon_vcvt_s32_v:
1796   case ARM::BI__builtin_neon_vcvt_u32_v:
1797   case ARM::BI__builtin_neon_vcvtq_s32_v:
1798   case ARM::BI__builtin_neon_vcvtq_u32_v: {
1799     llvm::Type *FloatTy =
1800       GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float32, false, quad));
1801     Ops[0] = Builder.CreateBitCast(Ops[0], FloatTy);
1802     return usgn ? Builder.CreateFPToUI(Ops[0], Ty, "vcvt")
1803                 : Builder.CreateFPToSI(Ops[0], Ty, "vcvt");
1804   }
1805   case ARM::BI__builtin_neon_vcvt_n_f32_v:
1806   case ARM::BI__builtin_neon_vcvtq_n_f32_v: {
1807     llvm::Type *FloatTy =
1808       GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float32, false, quad));
1809     llvm::Type *Tys[2] = { FloatTy, Ty };
1810     Int = usgn ? Intrinsic::arm_neon_vcvtfxu2fp
1811                : Intrinsic::arm_neon_vcvtfxs2fp;
1812     Function *F = CGM.getIntrinsic(Int, Tys);
1813     return EmitNeonCall(F, Ops, "vcvt_n");
1814   }
1815   case ARM::BI__builtin_neon_vcvt_n_s32_v:
1816   case ARM::BI__builtin_neon_vcvt_n_u32_v:
1817   case ARM::BI__builtin_neon_vcvtq_n_s32_v:
1818   case ARM::BI__builtin_neon_vcvtq_n_u32_v: {
1819     llvm::Type *FloatTy =
1820       GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float32, false, quad));
1821     llvm::Type *Tys[2] = { Ty, FloatTy };
1822     Int = usgn ? Intrinsic::arm_neon_vcvtfp2fxu
1823                : Intrinsic::arm_neon_vcvtfp2fxs;
1824     Function *F = CGM.getIntrinsic(Int, Tys);
1825     return EmitNeonCall(F, Ops, "vcvt_n");
1826   }
1827   case ARM::BI__builtin_neon_vext_v:
1828   case ARM::BI__builtin_neon_vextq_v: {
1829     int CV = cast<ConstantInt>(Ops[2])->getSExtValue();
1830     SmallVector<Constant*, 16> Indices;
1831     for (unsigned i = 0, e = VTy->getNumElements(); i != e; ++i)
1832       Indices.push_back(ConstantInt::get(Int32Ty, i+CV));
1833 
1834     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1835     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
1836     Value *SV = llvm::ConstantVector::get(Indices);
1837     return Builder.CreateShuffleVector(Ops[0], Ops[1], SV, "vext");
1838   }
1839   case ARM::BI__builtin_neon_vhadd_v:
1840   case ARM::BI__builtin_neon_vhaddq_v:
1841     Int = usgn ? Intrinsic::arm_neon_vhaddu : Intrinsic::arm_neon_vhadds;
1842     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vhadd");
1843   case ARM::BI__builtin_neon_vhsub_v:
1844   case ARM::BI__builtin_neon_vhsubq_v:
1845     Int = usgn ? Intrinsic::arm_neon_vhsubu : Intrinsic::arm_neon_vhsubs;
1846     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vhsub");
1847   case ARM::BI__builtin_neon_vld1_v:
1848   case ARM::BI__builtin_neon_vld1q_v:
1849     Ops.push_back(Align);
1850     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vld1, Ty),
1851                         Ops, "vld1");
1852   case ARM::BI__builtin_neon_vld1q_lane_v:
1853     // Handle 64-bit integer elements as a special case.  Use shuffles of
1854     // one-element vectors to avoid poor code for i64 in the backend.
1855     if (VTy->getElementType()->isIntegerTy(64)) {
1856       // Extract the other lane.
1857       Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
1858       int Lane = cast<ConstantInt>(Ops[2])->getZExtValue();
1859       Value *SV = llvm::ConstantVector::get(ConstantInt::get(Int32Ty, 1-Lane));
1860       Ops[1] = Builder.CreateShuffleVector(Ops[1], Ops[1], SV);
1861       // Load the value as a one-element vector.
1862       Ty = llvm::VectorType::get(VTy->getElementType(), 1);
1863       Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld1, Ty);
1864       Value *Ld = Builder.CreateCall2(F, Ops[0], Align);
1865       // Combine them.
1866       SmallVector<Constant*, 2> Indices;
1867       Indices.push_back(ConstantInt::get(Int32Ty, 1-Lane));
1868       Indices.push_back(ConstantInt::get(Int32Ty, Lane));
1869       SV = llvm::ConstantVector::get(Indices);
1870       return Builder.CreateShuffleVector(Ops[1], Ld, SV, "vld1q_lane");
1871     }
1872     // fall through
1873   case ARM::BI__builtin_neon_vld1_lane_v: {
1874     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
1875     Ty = llvm::PointerType::getUnqual(VTy->getElementType());
1876     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1877     LoadInst *Ld = Builder.CreateLoad(Ops[0]);
1878     Ld->setAlignment(cast<ConstantInt>(Align)->getZExtValue());
1879     return Builder.CreateInsertElement(Ops[1], Ld, Ops[2], "vld1_lane");
1880   }
1881   case ARM::BI__builtin_neon_vld1_dup_v:
1882   case ARM::BI__builtin_neon_vld1q_dup_v: {
1883     Value *V = UndefValue::get(Ty);
1884     Ty = llvm::PointerType::getUnqual(VTy->getElementType());
1885     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1886     LoadInst *Ld = Builder.CreateLoad(Ops[0]);
1887     Ld->setAlignment(cast<ConstantInt>(Align)->getZExtValue());
1888     llvm::Constant *CI = ConstantInt::get(Int32Ty, 0);
1889     Ops[0] = Builder.CreateInsertElement(V, Ld, CI);
1890     return EmitNeonSplat(Ops[0], CI);
1891   }
1892   case ARM::BI__builtin_neon_vld2_v:
1893   case ARM::BI__builtin_neon_vld2q_v: {
1894     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld2, Ty);
1895     Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld2");
1896     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
1897     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1898     return Builder.CreateStore(Ops[1], Ops[0]);
1899   }
1900   case ARM::BI__builtin_neon_vld3_v:
1901   case ARM::BI__builtin_neon_vld3q_v: {
1902     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld3, Ty);
1903     Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld3");
1904     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
1905     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1906     return Builder.CreateStore(Ops[1], Ops[0]);
1907   }
1908   case ARM::BI__builtin_neon_vld4_v:
1909   case ARM::BI__builtin_neon_vld4q_v: {
1910     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld4, Ty);
1911     Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld4");
1912     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
1913     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1914     return Builder.CreateStore(Ops[1], Ops[0]);
1915   }
1916   case ARM::BI__builtin_neon_vld2_lane_v:
1917   case ARM::BI__builtin_neon_vld2q_lane_v: {
1918     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld2lane, Ty);
1919     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
1920     Ops[3] = Builder.CreateBitCast(Ops[3], Ty);
1921     Ops.push_back(Align);
1922     Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld2_lane");
1923     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
1924     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1925     return Builder.CreateStore(Ops[1], Ops[0]);
1926   }
1927   case ARM::BI__builtin_neon_vld3_lane_v:
1928   case ARM::BI__builtin_neon_vld3q_lane_v: {
1929     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld3lane, Ty);
1930     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
1931     Ops[3] = Builder.CreateBitCast(Ops[3], Ty);
1932     Ops[4] = Builder.CreateBitCast(Ops[4], Ty);
1933     Ops.push_back(Align);
1934     Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld3_lane");
1935     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
1936     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1937     return Builder.CreateStore(Ops[1], Ops[0]);
1938   }
1939   case ARM::BI__builtin_neon_vld4_lane_v:
1940   case ARM::BI__builtin_neon_vld4q_lane_v: {
1941     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld4lane, Ty);
1942     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
1943     Ops[3] = Builder.CreateBitCast(Ops[3], Ty);
1944     Ops[4] = Builder.CreateBitCast(Ops[4], Ty);
1945     Ops[5] = Builder.CreateBitCast(Ops[5], Ty);
1946     Ops.push_back(Align);
1947     Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld3_lane");
1948     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
1949     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1950     return Builder.CreateStore(Ops[1], Ops[0]);
1951   }
1952   case ARM::BI__builtin_neon_vld2_dup_v:
1953   case ARM::BI__builtin_neon_vld3_dup_v:
1954   case ARM::BI__builtin_neon_vld4_dup_v: {
1955     // Handle 64-bit elements as a special-case.  There is no "dup" needed.
1956     if (VTy->getElementType()->getPrimitiveSizeInBits() == 64) {
1957       switch (BuiltinID) {
1958       case ARM::BI__builtin_neon_vld2_dup_v:
1959         Int = Intrinsic::arm_neon_vld2;
1960         break;
1961       case ARM::BI__builtin_neon_vld3_dup_v:
1962         Int = Intrinsic::arm_neon_vld3;
1963         break;
1964       case ARM::BI__builtin_neon_vld4_dup_v:
1965         Int = Intrinsic::arm_neon_vld4;
1966         break;
1967       default: llvm_unreachable("unknown vld_dup intrinsic?");
1968       }
1969       Function *F = CGM.getIntrinsic(Int, Ty);
1970       Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld_dup");
1971       Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
1972       Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1973       return Builder.CreateStore(Ops[1], Ops[0]);
1974     }
1975     switch (BuiltinID) {
1976     case ARM::BI__builtin_neon_vld2_dup_v:
1977       Int = Intrinsic::arm_neon_vld2lane;
1978       break;
1979     case ARM::BI__builtin_neon_vld3_dup_v:
1980       Int = Intrinsic::arm_neon_vld3lane;
1981       break;
1982     case ARM::BI__builtin_neon_vld4_dup_v:
1983       Int = Intrinsic::arm_neon_vld4lane;
1984       break;
1985     default: llvm_unreachable("unknown vld_dup intrinsic?");
1986     }
1987     Function *F = CGM.getIntrinsic(Int, Ty);
1988     llvm::StructType *STy = cast<llvm::StructType>(F->getReturnType());
1989 
1990     SmallVector<Value*, 6> Args;
1991     Args.push_back(Ops[1]);
1992     Args.append(STy->getNumElements(), UndefValue::get(Ty));
1993 
1994     llvm::Constant *CI = ConstantInt::get(Int32Ty, 0);
1995     Args.push_back(CI);
1996     Args.push_back(Align);
1997 
1998     Ops[1] = Builder.CreateCall(F, Args, "vld_dup");
1999     // splat lane 0 to all elts in each vector of the result.
2000     for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
2001       Value *Val = Builder.CreateExtractValue(Ops[1], i);
2002       Value *Elt = Builder.CreateBitCast(Val, Ty);
2003       Elt = EmitNeonSplat(Elt, CI);
2004       Elt = Builder.CreateBitCast(Elt, Val->getType());
2005       Ops[1] = Builder.CreateInsertValue(Ops[1], Elt, i);
2006     }
2007     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
2008     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
2009     return Builder.CreateStore(Ops[1], Ops[0]);
2010   }
2011   case ARM::BI__builtin_neon_vmax_v:
2012   case ARM::BI__builtin_neon_vmaxq_v:
2013     Int = usgn ? Intrinsic::arm_neon_vmaxu : Intrinsic::arm_neon_vmaxs;
2014     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmax");
2015   case ARM::BI__builtin_neon_vmin_v:
2016   case ARM::BI__builtin_neon_vminq_v:
2017     Int = usgn ? Intrinsic::arm_neon_vminu : Intrinsic::arm_neon_vmins;
2018     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmin");
2019   case ARM::BI__builtin_neon_vmovl_v: {
2020     llvm::Type *DTy =llvm::VectorType::getTruncatedElementVectorType(VTy);
2021     Ops[0] = Builder.CreateBitCast(Ops[0], DTy);
2022     if (usgn)
2023       return Builder.CreateZExt(Ops[0], Ty, "vmovl");
2024     return Builder.CreateSExt(Ops[0], Ty, "vmovl");
2025   }
2026   case ARM::BI__builtin_neon_vmovn_v: {
2027     llvm::Type *QTy = llvm::VectorType::getExtendedElementVectorType(VTy);
2028     Ops[0] = Builder.CreateBitCast(Ops[0], QTy);
2029     return Builder.CreateTrunc(Ops[0], Ty, "vmovn");
2030   }
2031   case ARM::BI__builtin_neon_vmul_v:
2032   case ARM::BI__builtin_neon_vmulq_v:
2033     assert(Type.isPoly() && "vmul builtin only supported for polynomial types");
2034     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vmulp, Ty),
2035                         Ops, "vmul");
2036   case ARM::BI__builtin_neon_vmull_v:
2037     Int = usgn ? Intrinsic::arm_neon_vmullu : Intrinsic::arm_neon_vmulls;
2038     Int = Type.isPoly() ? (unsigned)Intrinsic::arm_neon_vmullp : Int;
2039     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmull");
2040   case ARM::BI__builtin_neon_vfma_v:
2041   case ARM::BI__builtin_neon_vfmaq_v: {
2042     Value *F = CGM.getIntrinsic(Intrinsic::fma, Ty);
2043     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
2044     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
2045     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
2046     return Builder.CreateCall3(F, Ops[0], Ops[1], Ops[2]);
2047   }
2048   case ARM::BI__builtin_neon_vpadal_v:
2049   case ARM::BI__builtin_neon_vpadalq_v: {
2050     Int = usgn ? Intrinsic::arm_neon_vpadalu : Intrinsic::arm_neon_vpadals;
2051     // The source operand type has twice as many elements of half the size.
2052     unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits();
2053     llvm::Type *EltTy =
2054       llvm::IntegerType::get(getLLVMContext(), EltBits / 2);
2055     llvm::Type *NarrowTy =
2056       llvm::VectorType::get(EltTy, VTy->getNumElements() * 2);
2057     llvm::Type *Tys[2] = { Ty, NarrowTy };
2058     return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vpadal");
2059   }
2060   case ARM::BI__builtin_neon_vpadd_v:
2061     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vpadd, Ty),
2062                         Ops, "vpadd");
2063   case ARM::BI__builtin_neon_vpaddl_v:
2064   case ARM::BI__builtin_neon_vpaddlq_v: {
2065     Int = usgn ? Intrinsic::arm_neon_vpaddlu : Intrinsic::arm_neon_vpaddls;
2066     // The source operand type has twice as many elements of half the size.
2067     unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits();
2068     llvm::Type *EltTy = llvm::IntegerType::get(getLLVMContext(), EltBits / 2);
2069     llvm::Type *NarrowTy =
2070       llvm::VectorType::get(EltTy, VTy->getNumElements() * 2);
2071     llvm::Type *Tys[2] = { Ty, NarrowTy };
2072     return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vpaddl");
2073   }
2074   case ARM::BI__builtin_neon_vpmax_v:
2075     Int = usgn ? Intrinsic::arm_neon_vpmaxu : Intrinsic::arm_neon_vpmaxs;
2076     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpmax");
2077   case ARM::BI__builtin_neon_vpmin_v:
2078     Int = usgn ? Intrinsic::arm_neon_vpminu : Intrinsic::arm_neon_vpmins;
2079     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpmin");
2080   case ARM::BI__builtin_neon_vqabs_v:
2081   case ARM::BI__builtin_neon_vqabsq_v:
2082     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqabs, Ty),
2083                         Ops, "vqabs");
2084   case ARM::BI__builtin_neon_vqadd_v:
2085   case ARM::BI__builtin_neon_vqaddq_v:
2086     Int = usgn ? Intrinsic::arm_neon_vqaddu : Intrinsic::arm_neon_vqadds;
2087     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqadd");
2088   case ARM::BI__builtin_neon_vqdmlal_v:
2089     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmlal, Ty),
2090                         Ops, "vqdmlal");
2091   case ARM::BI__builtin_neon_vqdmlsl_v:
2092     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmlsl, Ty),
2093                         Ops, "vqdmlsl");
2094   case ARM::BI__builtin_neon_vqdmulh_v:
2095   case ARM::BI__builtin_neon_vqdmulhq_v:
2096     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmulh, Ty),
2097                         Ops, "vqdmulh");
2098   case ARM::BI__builtin_neon_vqdmull_v:
2099     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmull, Ty),
2100                         Ops, "vqdmull");
2101   case ARM::BI__builtin_neon_vqmovn_v:
2102     Int = usgn ? Intrinsic::arm_neon_vqmovnu : Intrinsic::arm_neon_vqmovns;
2103     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqmovn");
2104   case ARM::BI__builtin_neon_vqmovun_v:
2105     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqmovnsu, Ty),
2106                         Ops, "vqdmull");
2107   case ARM::BI__builtin_neon_vqneg_v:
2108   case ARM::BI__builtin_neon_vqnegq_v:
2109     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqneg, Ty),
2110                         Ops, "vqneg");
2111   case ARM::BI__builtin_neon_vqrdmulh_v:
2112   case ARM::BI__builtin_neon_vqrdmulhq_v:
2113     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqrdmulh, Ty),
2114                         Ops, "vqrdmulh");
2115   case ARM::BI__builtin_neon_vqrshl_v:
2116   case ARM::BI__builtin_neon_vqrshlq_v:
2117     Int = usgn ? Intrinsic::arm_neon_vqrshiftu : Intrinsic::arm_neon_vqrshifts;
2118     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqrshl");
2119   case ARM::BI__builtin_neon_vqrshrn_n_v:
2120     Int =
2121       usgn ? Intrinsic::arm_neon_vqrshiftnu : Intrinsic::arm_neon_vqrshiftns;
2122     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqrshrn_n",
2123                         1, true);
2124   case ARM::BI__builtin_neon_vqrshrun_n_v:
2125     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqrshiftnsu, Ty),
2126                         Ops, "vqrshrun_n", 1, true);
2127   case ARM::BI__builtin_neon_vqshl_v:
2128   case ARM::BI__builtin_neon_vqshlq_v:
2129     Int = usgn ? Intrinsic::arm_neon_vqshiftu : Intrinsic::arm_neon_vqshifts;
2130     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshl");
2131   case ARM::BI__builtin_neon_vqshl_n_v:
2132   case ARM::BI__builtin_neon_vqshlq_n_v:
2133     Int = usgn ? Intrinsic::arm_neon_vqshiftu : Intrinsic::arm_neon_vqshifts;
2134     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshl_n",
2135                         1, false);
2136   case ARM::BI__builtin_neon_vqshlu_n_v:
2137   case ARM::BI__builtin_neon_vqshluq_n_v:
2138     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqshiftsu, Ty),
2139                         Ops, "vqshlu", 1, false);
2140   case ARM::BI__builtin_neon_vqshrn_n_v:
2141     Int = usgn ? Intrinsic::arm_neon_vqshiftnu : Intrinsic::arm_neon_vqshiftns;
2142     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshrn_n",
2143                         1, true);
2144   case ARM::BI__builtin_neon_vqshrun_n_v:
2145     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqshiftnsu, Ty),
2146                         Ops, "vqshrun_n", 1, true);
2147   case ARM::BI__builtin_neon_vqsub_v:
2148   case ARM::BI__builtin_neon_vqsubq_v:
2149     Int = usgn ? Intrinsic::arm_neon_vqsubu : Intrinsic::arm_neon_vqsubs;
2150     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqsub");
2151   case ARM::BI__builtin_neon_vraddhn_v:
2152     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vraddhn, Ty),
2153                         Ops, "vraddhn");
2154   case ARM::BI__builtin_neon_vrecpe_v:
2155   case ARM::BI__builtin_neon_vrecpeq_v:
2156     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrecpe, Ty),
2157                         Ops, "vrecpe");
2158   case ARM::BI__builtin_neon_vrecps_v:
2159   case ARM::BI__builtin_neon_vrecpsq_v:
2160     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrecps, Ty),
2161                         Ops, "vrecps");
2162   case ARM::BI__builtin_neon_vrhadd_v:
2163   case ARM::BI__builtin_neon_vrhaddq_v:
2164     Int = usgn ? Intrinsic::arm_neon_vrhaddu : Intrinsic::arm_neon_vrhadds;
2165     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrhadd");
2166   case ARM::BI__builtin_neon_vrshl_v:
2167   case ARM::BI__builtin_neon_vrshlq_v:
2168     Int = usgn ? Intrinsic::arm_neon_vrshiftu : Intrinsic::arm_neon_vrshifts;
2169     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrshl");
2170   case ARM::BI__builtin_neon_vrshrn_n_v:
2171     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrshiftn, Ty),
2172                         Ops, "vrshrn_n", 1, true);
2173   case ARM::BI__builtin_neon_vrshr_n_v:
2174   case ARM::BI__builtin_neon_vrshrq_n_v:
2175     Int = usgn ? Intrinsic::arm_neon_vrshiftu : Intrinsic::arm_neon_vrshifts;
2176     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrshr_n", 1, true);
2177   case ARM::BI__builtin_neon_vrsqrte_v:
2178   case ARM::BI__builtin_neon_vrsqrteq_v:
2179     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrsqrte, Ty),
2180                         Ops, "vrsqrte");
2181   case ARM::BI__builtin_neon_vrsqrts_v:
2182   case ARM::BI__builtin_neon_vrsqrtsq_v:
2183     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrsqrts, Ty),
2184                         Ops, "vrsqrts");
2185   case ARM::BI__builtin_neon_vrsra_n_v:
2186   case ARM::BI__builtin_neon_vrsraq_n_v:
2187     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
2188     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
2189     Ops[2] = EmitNeonShiftVector(Ops[2], Ty, true);
2190     Int = usgn ? Intrinsic::arm_neon_vrshiftu : Intrinsic::arm_neon_vrshifts;
2191     Ops[1] = Builder.CreateCall2(CGM.getIntrinsic(Int, Ty), Ops[1], Ops[2]);
2192     return Builder.CreateAdd(Ops[0], Ops[1], "vrsra_n");
2193   case ARM::BI__builtin_neon_vrsubhn_v:
2194     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrsubhn, Ty),
2195                         Ops, "vrsubhn");
2196   case ARM::BI__builtin_neon_vshl_v:
2197   case ARM::BI__builtin_neon_vshlq_v:
2198     Int = usgn ? Intrinsic::arm_neon_vshiftu : Intrinsic::arm_neon_vshifts;
2199     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vshl");
2200   case ARM::BI__builtin_neon_vshll_n_v:
2201     Int = usgn ? Intrinsic::arm_neon_vshiftlu : Intrinsic::arm_neon_vshiftls;
2202     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vshll", 1);
2203   case ARM::BI__builtin_neon_vshl_n_v:
2204   case ARM::BI__builtin_neon_vshlq_n_v:
2205     Ops[1] = EmitNeonShiftVector(Ops[1], Ty, false);
2206     return Builder.CreateShl(Builder.CreateBitCast(Ops[0],Ty), Ops[1],
2207                              "vshl_n");
2208   case ARM::BI__builtin_neon_vshrn_n_v:
2209     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vshiftn, Ty),
2210                         Ops, "vshrn_n", 1, true);
2211   case ARM::BI__builtin_neon_vshr_n_v:
2212   case ARM::BI__builtin_neon_vshrq_n_v:
2213     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
2214     Ops[1] = EmitNeonShiftVector(Ops[1], Ty, false);
2215     if (usgn)
2216       return Builder.CreateLShr(Ops[0], Ops[1], "vshr_n");
2217     else
2218       return Builder.CreateAShr(Ops[0], Ops[1], "vshr_n");
2219   case ARM::BI__builtin_neon_vsri_n_v:
2220   case ARM::BI__builtin_neon_vsriq_n_v:
2221     rightShift = true;
2222   case ARM::BI__builtin_neon_vsli_n_v:
2223   case ARM::BI__builtin_neon_vsliq_n_v:
2224     Ops[2] = EmitNeonShiftVector(Ops[2], Ty, rightShift);
2225     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vshiftins, Ty),
2226                         Ops, "vsli_n");
2227   case ARM::BI__builtin_neon_vsra_n_v:
2228   case ARM::BI__builtin_neon_vsraq_n_v:
2229     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
2230     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
2231     Ops[2] = EmitNeonShiftVector(Ops[2], Ty, false);
2232     if (usgn)
2233       Ops[1] = Builder.CreateLShr(Ops[1], Ops[2], "vsra_n");
2234     else
2235       Ops[1] = Builder.CreateAShr(Ops[1], Ops[2], "vsra_n");
2236     return Builder.CreateAdd(Ops[0], Ops[1]);
2237   case ARM::BI__builtin_neon_vst1_v:
2238   case ARM::BI__builtin_neon_vst1q_v:
2239     Ops.push_back(Align);
2240     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst1, Ty),
2241                         Ops, "");
2242   case ARM::BI__builtin_neon_vst1q_lane_v:
2243     // Handle 64-bit integer elements as a special case.  Use a shuffle to get
2244     // a one-element vector and avoid poor code for i64 in the backend.
2245     if (VTy->getElementType()->isIntegerTy(64)) {
2246       Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
2247       Value *SV = llvm::ConstantVector::get(cast<llvm::Constant>(Ops[2]));
2248       Ops[1] = Builder.CreateShuffleVector(Ops[1], Ops[1], SV);
2249       Ops[2] = Align;
2250       return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst1,
2251                                                  Ops[1]->getType()), Ops);
2252     }
2253     // fall through
2254   case ARM::BI__builtin_neon_vst1_lane_v: {
2255     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
2256     Ops[1] = Builder.CreateExtractElement(Ops[1], Ops[2]);
2257     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
2258     StoreInst *St = Builder.CreateStore(Ops[1],
2259                                         Builder.CreateBitCast(Ops[0], Ty));
2260     St->setAlignment(cast<ConstantInt>(Align)->getZExtValue());
2261     return St;
2262   }
2263   case ARM::BI__builtin_neon_vst2_v:
2264   case ARM::BI__builtin_neon_vst2q_v:
2265     Ops.push_back(Align);
2266     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst2, Ty),
2267                         Ops, "");
2268   case ARM::BI__builtin_neon_vst2_lane_v:
2269   case ARM::BI__builtin_neon_vst2q_lane_v:
2270     Ops.push_back(Align);
2271     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst2lane, Ty),
2272                         Ops, "");
2273   case ARM::BI__builtin_neon_vst3_v:
2274   case ARM::BI__builtin_neon_vst3q_v:
2275     Ops.push_back(Align);
2276     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst3, Ty),
2277                         Ops, "");
2278   case ARM::BI__builtin_neon_vst3_lane_v:
2279   case ARM::BI__builtin_neon_vst3q_lane_v:
2280     Ops.push_back(Align);
2281     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst3lane, Ty),
2282                         Ops, "");
2283   case ARM::BI__builtin_neon_vst4_v:
2284   case ARM::BI__builtin_neon_vst4q_v:
2285     Ops.push_back(Align);
2286     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst4, Ty),
2287                         Ops, "");
2288   case ARM::BI__builtin_neon_vst4_lane_v:
2289   case ARM::BI__builtin_neon_vst4q_lane_v:
2290     Ops.push_back(Align);
2291     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst4lane, Ty),
2292                         Ops, "");
2293   case ARM::BI__builtin_neon_vsubhn_v:
2294     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vsubhn, Ty),
2295                         Ops, "vsubhn");
2296   case ARM::BI__builtin_neon_vtbl1_v:
2297     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl1),
2298                         Ops, "vtbl1");
2299   case ARM::BI__builtin_neon_vtbl2_v:
2300     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl2),
2301                         Ops, "vtbl2");
2302   case ARM::BI__builtin_neon_vtbl3_v:
2303     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl3),
2304                         Ops, "vtbl3");
2305   case ARM::BI__builtin_neon_vtbl4_v:
2306     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl4),
2307                         Ops, "vtbl4");
2308   case ARM::BI__builtin_neon_vtbx1_v:
2309     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx1),
2310                         Ops, "vtbx1");
2311   case ARM::BI__builtin_neon_vtbx2_v:
2312     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx2),
2313                         Ops, "vtbx2");
2314   case ARM::BI__builtin_neon_vtbx3_v:
2315     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx3),
2316                         Ops, "vtbx3");
2317   case ARM::BI__builtin_neon_vtbx4_v:
2318     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx4),
2319                         Ops, "vtbx4");
2320   case ARM::BI__builtin_neon_vtst_v:
2321   case ARM::BI__builtin_neon_vtstq_v: {
2322     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
2323     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
2324     Ops[0] = Builder.CreateAnd(Ops[0], Ops[1]);
2325     Ops[0] = Builder.CreateICmp(ICmpInst::ICMP_NE, Ops[0],
2326                                 ConstantAggregateZero::get(Ty));
2327     return Builder.CreateSExt(Ops[0], Ty, "vtst");
2328   }
2329   case ARM::BI__builtin_neon_vtrn_v:
2330   case ARM::BI__builtin_neon_vtrnq_v: {
2331     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty));
2332     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
2333     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
2334     Value *SV = 0;
2335 
2336     for (unsigned vi = 0; vi != 2; ++vi) {
2337       SmallVector<Constant*, 16> Indices;
2338       for (unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) {
2339         Indices.push_back(Builder.getInt32(i+vi));
2340         Indices.push_back(Builder.getInt32(i+e+vi));
2341       }
2342       Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ops[0], vi);
2343       SV = llvm::ConstantVector::get(Indices);
2344       SV = Builder.CreateShuffleVector(Ops[1], Ops[2], SV, "vtrn");
2345       SV = Builder.CreateStore(SV, Addr);
2346     }
2347     return SV;
2348   }
2349   case ARM::BI__builtin_neon_vuzp_v:
2350   case ARM::BI__builtin_neon_vuzpq_v: {
2351     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty));
2352     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
2353     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
2354     Value *SV = 0;
2355 
2356     for (unsigned vi = 0; vi != 2; ++vi) {
2357       SmallVector<Constant*, 16> Indices;
2358       for (unsigned i = 0, e = VTy->getNumElements(); i != e; ++i)
2359         Indices.push_back(ConstantInt::get(Int32Ty, 2*i+vi));
2360 
2361       Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ops[0], vi);
2362       SV = llvm::ConstantVector::get(Indices);
2363       SV = Builder.CreateShuffleVector(Ops[1], Ops[2], SV, "vuzp");
2364       SV = Builder.CreateStore(SV, Addr);
2365     }
2366     return SV;
2367   }
2368   case ARM::BI__builtin_neon_vzip_v:
2369   case ARM::BI__builtin_neon_vzipq_v: {
2370     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty));
2371     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
2372     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
2373     Value *SV = 0;
2374 
2375     for (unsigned vi = 0; vi != 2; ++vi) {
2376       SmallVector<Constant*, 16> Indices;
2377       for (unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) {
2378         Indices.push_back(ConstantInt::get(Int32Ty, (i + vi*e) >> 1));
2379         Indices.push_back(ConstantInt::get(Int32Ty, ((i + vi*e) >> 1)+e));
2380       }
2381       Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ops[0], vi);
2382       SV = llvm::ConstantVector::get(Indices);
2383       SV = Builder.CreateShuffleVector(Ops[1], Ops[2], SV, "vzip");
2384       SV = Builder.CreateStore(SV, Addr);
2385     }
2386     return SV;
2387   }
2388   }
2389 }
2390 
2391 llvm::Value *CodeGenFunction::
2392 BuildVector(ArrayRef<llvm::Value*> Ops) {
2393   assert((Ops.size() & (Ops.size() - 1)) == 0 &&
2394          "Not a power-of-two sized vector!");
2395   bool AllConstants = true;
2396   for (unsigned i = 0, e = Ops.size(); i != e && AllConstants; ++i)
2397     AllConstants &= isa<Constant>(Ops[i]);
2398 
2399   // If this is a constant vector, create a ConstantVector.
2400   if (AllConstants) {
2401     SmallVector<llvm::Constant*, 16> CstOps;
2402     for (unsigned i = 0, e = Ops.size(); i != e; ++i)
2403       CstOps.push_back(cast<Constant>(Ops[i]));
2404     return llvm::ConstantVector::get(CstOps);
2405   }
2406 
2407   // Otherwise, insertelement the values to build the vector.
2408   Value *Result =
2409     llvm::UndefValue::get(llvm::VectorType::get(Ops[0]->getType(), Ops.size()));
2410 
2411   for (unsigned i = 0, e = Ops.size(); i != e; ++i)
2412     Result = Builder.CreateInsertElement(Result, Ops[i], Builder.getInt32(i));
2413 
2414   return Result;
2415 }
2416 
2417 Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
2418                                            const CallExpr *E) {
2419   SmallVector<Value*, 4> Ops;
2420 
2421   // Find out if any arguments are required to be integer constant expressions.
2422   unsigned ICEArguments = 0;
2423   ASTContext::GetBuiltinTypeError Error;
2424   getContext().GetBuiltinType(BuiltinID, Error, &ICEArguments);
2425   assert(Error == ASTContext::GE_None && "Should not codegen an error");
2426 
2427   for (unsigned i = 0, e = E->getNumArgs(); i != e; i++) {
2428     // If this is a normal argument, just emit it as a scalar.
2429     if ((ICEArguments & (1 << i)) == 0) {
2430       Ops.push_back(EmitScalarExpr(E->getArg(i)));
2431       continue;
2432     }
2433 
2434     // If this is required to be a constant, constant fold it so that we know
2435     // that the generated intrinsic gets a ConstantInt.
2436     llvm::APSInt Result;
2437     bool IsConst = E->getArg(i)->isIntegerConstantExpr(Result, getContext());
2438     assert(IsConst && "Constant arg isn't actually constant?"); (void)IsConst;
2439     Ops.push_back(llvm::ConstantInt::get(getLLVMContext(), Result));
2440   }
2441 
2442   switch (BuiltinID) {
2443   default: return 0;
2444   case X86::BI__builtin_ia32_vec_init_v8qi:
2445   case X86::BI__builtin_ia32_vec_init_v4hi:
2446   case X86::BI__builtin_ia32_vec_init_v2si:
2447     return Builder.CreateBitCast(BuildVector(Ops),
2448                                  llvm::Type::getX86_MMXTy(getLLVMContext()));
2449   case X86::BI__builtin_ia32_vec_ext_v2si:
2450     return Builder.CreateExtractElement(Ops[0],
2451                                   llvm::ConstantInt::get(Ops[1]->getType(), 0));
2452   case X86::BI__builtin_ia32_ldmxcsr: {
2453     llvm::Type *PtrTy = Int8PtrTy;
2454     Value *One = llvm::ConstantInt::get(Int32Ty, 1);
2455     Value *Tmp = Builder.CreateAlloca(Int32Ty, One);
2456     Builder.CreateStore(Ops[0], Tmp);
2457     return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_ldmxcsr),
2458                               Builder.CreateBitCast(Tmp, PtrTy));
2459   }
2460   case X86::BI__builtin_ia32_stmxcsr: {
2461     llvm::Type *PtrTy = Int8PtrTy;
2462     Value *One = llvm::ConstantInt::get(Int32Ty, 1);
2463     Value *Tmp = Builder.CreateAlloca(Int32Ty, One);
2464     Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_stmxcsr),
2465                        Builder.CreateBitCast(Tmp, PtrTy));
2466     return Builder.CreateLoad(Tmp, "stmxcsr");
2467   }
2468   case X86::BI__builtin_ia32_storehps:
2469   case X86::BI__builtin_ia32_storelps: {
2470     llvm::Type *PtrTy = llvm::PointerType::getUnqual(Int64Ty);
2471     llvm::Type *VecTy = llvm::VectorType::get(Int64Ty, 2);
2472 
2473     // cast val v2i64
2474     Ops[1] = Builder.CreateBitCast(Ops[1], VecTy, "cast");
2475 
2476     // extract (0, 1)
2477     unsigned Index = BuiltinID == X86::BI__builtin_ia32_storelps ? 0 : 1;
2478     llvm::Value *Idx = llvm::ConstantInt::get(Int32Ty, Index);
2479     Ops[1] = Builder.CreateExtractElement(Ops[1], Idx, "extract");
2480 
2481     // cast pointer to i64 & store
2482     Ops[0] = Builder.CreateBitCast(Ops[0], PtrTy);
2483     return Builder.CreateStore(Ops[1], Ops[0]);
2484   }
2485   case X86::BI__builtin_ia32_palignr: {
2486     unsigned shiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
2487 
2488     // If palignr is shifting the pair of input vectors less than 9 bytes,
2489     // emit a shuffle instruction.
2490     if (shiftVal <= 8) {
2491       SmallVector<llvm::Constant*, 8> Indices;
2492       for (unsigned i = 0; i != 8; ++i)
2493         Indices.push_back(llvm::ConstantInt::get(Int32Ty, shiftVal + i));
2494 
2495       Value* SV = llvm::ConstantVector::get(Indices);
2496       return Builder.CreateShuffleVector(Ops[1], Ops[0], SV, "palignr");
2497     }
2498 
2499     // If palignr is shifting the pair of input vectors more than 8 but less
2500     // than 16 bytes, emit a logical right shift of the destination.
2501     if (shiftVal < 16) {
2502       // MMX has these as 1 x i64 vectors for some odd optimization reasons.
2503       llvm::Type *VecTy = llvm::VectorType::get(Int64Ty, 1);
2504 
2505       Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast");
2506       Ops[1] = llvm::ConstantInt::get(VecTy, (shiftVal-8) * 8);
2507 
2508       // create i32 constant
2509       llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_mmx_psrl_q);
2510       return Builder.CreateCall(F, makeArrayRef(&Ops[0], 2), "palignr");
2511     }
2512 
2513     // If palignr is shifting the pair of vectors more than 16 bytes, emit zero.
2514     return llvm::Constant::getNullValue(ConvertType(E->getType()));
2515   }
2516   case X86::BI__builtin_ia32_palignr128: {
2517     unsigned shiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
2518 
2519     // If palignr is shifting the pair of input vectors less than 17 bytes,
2520     // emit a shuffle instruction.
2521     if (shiftVal <= 16) {
2522       SmallVector<llvm::Constant*, 16> Indices;
2523       for (unsigned i = 0; i != 16; ++i)
2524         Indices.push_back(llvm::ConstantInt::get(Int32Ty, shiftVal + i));
2525 
2526       Value* SV = llvm::ConstantVector::get(Indices);
2527       return Builder.CreateShuffleVector(Ops[1], Ops[0], SV, "palignr");
2528     }
2529 
2530     // If palignr is shifting the pair of input vectors more than 16 but less
2531     // than 32 bytes, emit a logical right shift of the destination.
2532     if (shiftVal < 32) {
2533       llvm::Type *VecTy = llvm::VectorType::get(Int64Ty, 2);
2534 
2535       Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast");
2536       Ops[1] = llvm::ConstantInt::get(Int32Ty, (shiftVal-16) * 8);
2537 
2538       // create i32 constant
2539       llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse2_psrl_dq);
2540       return Builder.CreateCall(F, makeArrayRef(&Ops[0], 2), "palignr");
2541     }
2542 
2543     // If palignr is shifting the pair of vectors more than 32 bytes, emit zero.
2544     return llvm::Constant::getNullValue(ConvertType(E->getType()));
2545   }
2546   case X86::BI__builtin_ia32_palignr256: {
2547     unsigned shiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
2548 
2549     // If palignr is shifting the pair of input vectors less than 17 bytes,
2550     // emit a shuffle instruction.
2551     if (shiftVal <= 16) {
2552       SmallVector<llvm::Constant*, 32> Indices;
2553       // 256-bit palignr operates on 128-bit lanes so we need to handle that
2554       for (unsigned l = 0; l != 2; ++l) {
2555         unsigned LaneStart = l * 16;
2556         unsigned LaneEnd = (l+1) * 16;
2557         for (unsigned i = 0; i != 16; ++i) {
2558           unsigned Idx = shiftVal + i + LaneStart;
2559           if (Idx >= LaneEnd) Idx += 16; // end of lane, switch operand
2560           Indices.push_back(llvm::ConstantInt::get(Int32Ty, Idx));
2561         }
2562       }
2563 
2564       Value* SV = llvm::ConstantVector::get(Indices);
2565       return Builder.CreateShuffleVector(Ops[1], Ops[0], SV, "palignr");
2566     }
2567 
2568     // If palignr is shifting the pair of input vectors more than 16 but less
2569     // than 32 bytes, emit a logical right shift of the destination.
2570     if (shiftVal < 32) {
2571       llvm::Type *VecTy = llvm::VectorType::get(Int64Ty, 4);
2572 
2573       Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast");
2574       Ops[1] = llvm::ConstantInt::get(Int32Ty, (shiftVal-16) * 8);
2575 
2576       // create i32 constant
2577       llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_avx2_psrl_dq);
2578       return Builder.CreateCall(F, makeArrayRef(&Ops[0], 2), "palignr");
2579     }
2580 
2581     // If palignr is shifting the pair of vectors more than 32 bytes, emit zero.
2582     return llvm::Constant::getNullValue(ConvertType(E->getType()));
2583   }
2584   case X86::BI__builtin_ia32_movntps:
2585   case X86::BI__builtin_ia32_movntps256:
2586   case X86::BI__builtin_ia32_movntpd:
2587   case X86::BI__builtin_ia32_movntpd256:
2588   case X86::BI__builtin_ia32_movntdq:
2589   case X86::BI__builtin_ia32_movntdq256:
2590   case X86::BI__builtin_ia32_movnti: {
2591     llvm::MDNode *Node = llvm::MDNode::get(getLLVMContext(),
2592                                            Builder.getInt32(1));
2593 
2594     // Convert the type of the pointer to a pointer to the stored type.
2595     Value *BC = Builder.CreateBitCast(Ops[0],
2596                                 llvm::PointerType::getUnqual(Ops[1]->getType()),
2597                                       "cast");
2598     StoreInst *SI = Builder.CreateStore(Ops[1], BC);
2599     SI->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node);
2600     SI->setAlignment(16);
2601     return SI;
2602   }
2603   // 3DNow!
2604   case X86::BI__builtin_ia32_pswapdsf:
2605   case X86::BI__builtin_ia32_pswapdsi: {
2606     const char *name = 0;
2607     Intrinsic::ID ID = Intrinsic::not_intrinsic;
2608     switch(BuiltinID) {
2609     default: llvm_unreachable("Unsupported intrinsic!");
2610     case X86::BI__builtin_ia32_pswapdsf:
2611     case X86::BI__builtin_ia32_pswapdsi:
2612       name = "pswapd";
2613       ID = Intrinsic::x86_3dnowa_pswapd;
2614       break;
2615     }
2616     llvm::Type *MMXTy = llvm::Type::getX86_MMXTy(getLLVMContext());
2617     Ops[0] = Builder.CreateBitCast(Ops[0], MMXTy, "cast");
2618     llvm::Function *F = CGM.getIntrinsic(ID);
2619     return Builder.CreateCall(F, Ops, name);
2620   }
2621   case X86::BI__builtin_ia32_rdrand16_step:
2622   case X86::BI__builtin_ia32_rdrand32_step:
2623   case X86::BI__builtin_ia32_rdrand64_step: {
2624     Intrinsic::ID ID;
2625     switch (BuiltinID) {
2626     default: llvm_unreachable("Unsupported intrinsic!");
2627     case X86::BI__builtin_ia32_rdrand16_step:
2628       ID = Intrinsic::x86_rdrand_16;
2629       break;
2630     case X86::BI__builtin_ia32_rdrand32_step:
2631       ID = Intrinsic::x86_rdrand_32;
2632       break;
2633     case X86::BI__builtin_ia32_rdrand64_step:
2634       ID = Intrinsic::x86_rdrand_64;
2635       break;
2636     }
2637 
2638     Value *Call = Builder.CreateCall(CGM.getIntrinsic(ID));
2639     Builder.CreateStore(Builder.CreateExtractValue(Call, 0), Ops[0]);
2640     return Builder.CreateExtractValue(Call, 1);
2641   }
2642   }
2643 }
2644 
2645 
2646 Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
2647                                            const CallExpr *E) {
2648   SmallVector<Value*, 4> Ops;
2649 
2650   for (unsigned i = 0, e = E->getNumArgs(); i != e; i++)
2651     Ops.push_back(EmitScalarExpr(E->getArg(i)));
2652 
2653   Intrinsic::ID ID = Intrinsic::not_intrinsic;
2654 
2655   switch (BuiltinID) {
2656   default: return 0;
2657 
2658   // vec_ld, vec_lvsl, vec_lvsr
2659   case PPC::BI__builtin_altivec_lvx:
2660   case PPC::BI__builtin_altivec_lvxl:
2661   case PPC::BI__builtin_altivec_lvebx:
2662   case PPC::BI__builtin_altivec_lvehx:
2663   case PPC::BI__builtin_altivec_lvewx:
2664   case PPC::BI__builtin_altivec_lvsl:
2665   case PPC::BI__builtin_altivec_lvsr:
2666   {
2667     Ops[1] = Builder.CreateBitCast(Ops[1], Int8PtrTy);
2668 
2669     Ops[0] = Builder.CreateGEP(Ops[1], Ops[0]);
2670     Ops.pop_back();
2671 
2672     switch (BuiltinID) {
2673     default: llvm_unreachable("Unsupported ld/lvsl/lvsr intrinsic!");
2674     case PPC::BI__builtin_altivec_lvx:
2675       ID = Intrinsic::ppc_altivec_lvx;
2676       break;
2677     case PPC::BI__builtin_altivec_lvxl:
2678       ID = Intrinsic::ppc_altivec_lvxl;
2679       break;
2680     case PPC::BI__builtin_altivec_lvebx:
2681       ID = Intrinsic::ppc_altivec_lvebx;
2682       break;
2683     case PPC::BI__builtin_altivec_lvehx:
2684       ID = Intrinsic::ppc_altivec_lvehx;
2685       break;
2686     case PPC::BI__builtin_altivec_lvewx:
2687       ID = Intrinsic::ppc_altivec_lvewx;
2688       break;
2689     case PPC::BI__builtin_altivec_lvsl:
2690       ID = Intrinsic::ppc_altivec_lvsl;
2691       break;
2692     case PPC::BI__builtin_altivec_lvsr:
2693       ID = Intrinsic::ppc_altivec_lvsr;
2694       break;
2695     }
2696     llvm::Function *F = CGM.getIntrinsic(ID);
2697     return Builder.CreateCall(F, Ops, "");
2698   }
2699 
2700   // vec_st
2701   case PPC::BI__builtin_altivec_stvx:
2702   case PPC::BI__builtin_altivec_stvxl:
2703   case PPC::BI__builtin_altivec_stvebx:
2704   case PPC::BI__builtin_altivec_stvehx:
2705   case PPC::BI__builtin_altivec_stvewx:
2706   {
2707     Ops[2] = Builder.CreateBitCast(Ops[2], Int8PtrTy);
2708     Ops[1] = Builder.CreateGEP(Ops[2], Ops[1]);
2709     Ops.pop_back();
2710 
2711     switch (BuiltinID) {
2712     default: llvm_unreachable("Unsupported st intrinsic!");
2713     case PPC::BI__builtin_altivec_stvx:
2714       ID = Intrinsic::ppc_altivec_stvx;
2715       break;
2716     case PPC::BI__builtin_altivec_stvxl:
2717       ID = Intrinsic::ppc_altivec_stvxl;
2718       break;
2719     case PPC::BI__builtin_altivec_stvebx:
2720       ID = Intrinsic::ppc_altivec_stvebx;
2721       break;
2722     case PPC::BI__builtin_altivec_stvehx:
2723       ID = Intrinsic::ppc_altivec_stvehx;
2724       break;
2725     case PPC::BI__builtin_altivec_stvewx:
2726       ID = Intrinsic::ppc_altivec_stvewx;
2727       break;
2728     }
2729     llvm::Function *F = CGM.getIntrinsic(ID);
2730     return Builder.CreateCall(F, Ops, "");
2731   }
2732   }
2733 }
2734