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 "TargetInfo.h"
15 #include "CodeGenFunction.h"
16 #include "CodeGenModule.h"
17 #include "CGObjCRuntime.h"
18 #include "clang/Basic/TargetInfo.h"
19 #include "clang/AST/ASTContext.h"
20 #include "clang/AST/Decl.h"
21 #include "clang/Basic/TargetBuiltins.h"
22 #include "llvm/Intrinsics.h"
23 #include "llvm/Target/TargetData.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 =
90     cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
91 
92   llvm::IntegerType *IntType =
93     llvm::IntegerType::get(CGF.getLLVMContext(),
94                            CGF.getContext().getTypeSize(T));
95   llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
96 
97   llvm::Value *Args[2];
98   Args[0] = CGF.Builder.CreateBitCast(DestPtr, IntPtrType);
99   Args[1] = CGF.EmitScalarExpr(E->getArg(1));
100   llvm::Type *ValueType = Args[1]->getType();
101   Args[1] = EmitToInt(CGF, Args[1], T, IntType);
102 
103   llvm::Value *Result =
104       CGF.Builder.CreateAtomicRMW(Kind, Args[0], Args[1],
105                                   llvm::SequentiallyConsistent);
106   Result = EmitFromInt(CGF, Result, T, ValueType);
107   return RValue::get(Result);
108 }
109 
110 /// Utility to insert an atomic instruction based Instrinsic::ID and
111 /// the expression node, where the return value is the result of the
112 /// operation.
113 static RValue EmitBinaryAtomicPost(CodeGenFunction &CGF,
114                                    llvm::AtomicRMWInst::BinOp Kind,
115                                    const CallExpr *E,
116                                    Instruction::BinaryOps Op) {
117   QualType T = E->getType();
118   assert(E->getArg(0)->getType()->isPointerType());
119   assert(CGF.getContext().hasSameUnqualifiedType(T,
120                                   E->getArg(0)->getType()->getPointeeType()));
121   assert(CGF.getContext().hasSameUnqualifiedType(T, E->getArg(1)->getType()));
122 
123   llvm::Value *DestPtr = CGF.EmitScalarExpr(E->getArg(0));
124   unsigned AddrSpace =
125     cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
126 
127   llvm::IntegerType *IntType =
128     llvm::IntegerType::get(CGF.getLLVMContext(),
129                            CGF.getContext().getTypeSize(T));
130   llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
131 
132   llvm::Value *Args[2];
133   Args[1] = CGF.EmitScalarExpr(E->getArg(1));
134   llvm::Type *ValueType = Args[1]->getType();
135   Args[1] = EmitToInt(CGF, Args[1], T, IntType);
136   Args[0] = CGF.Builder.CreateBitCast(DestPtr, IntPtrType);
137 
138   llvm::Value *Result =
139       CGF.Builder.CreateAtomicRMW(Kind, Args[0], Args[1],
140                                   llvm::SequentiallyConsistent);
141   Result = CGF.Builder.CreateBinOp(Op, Result, Args[1]);
142   Result = EmitFromInt(CGF, Result, T, ValueType);
143   return RValue::get(Result);
144 }
145 
146 /// EmitFAbs - Emit a call to fabs/fabsf/fabsl, depending on the type of ValTy,
147 /// which must be a scalar floating point type.
148 static Value *EmitFAbs(CodeGenFunction &CGF, Value *V, QualType ValTy) {
149   const BuiltinType *ValTyP = ValTy->getAs<BuiltinType>();
150   assert(ValTyP && "isn't scalar fp type!");
151 
152   StringRef FnName;
153   switch (ValTyP->getKind()) {
154   default: llvm_unreachable("Isn't a scalar fp type!");
155   case BuiltinType::Float:      FnName = "fabsf"; break;
156   case BuiltinType::Double:     FnName = "fabs"; break;
157   case BuiltinType::LongDouble: FnName = "fabsl"; break;
158   }
159 
160   // The prototype is something that takes and returns whatever V's type is.
161   llvm::FunctionType *FT = llvm::FunctionType::get(V->getType(), V->getType(),
162                                                    false);
163   llvm::Value *Fn = CGF.CGM.CreateRuntimeFunction(FT, FnName);
164 
165   return CGF.Builder.CreateCall(Fn, V, "abs");
166 }
167 
168 static RValue emitLibraryCall(CodeGenFunction &CGF, const FunctionDecl *Fn,
169                               const CallExpr *E, llvm::Value *calleeValue) {
170   return CGF.EmitCall(E->getCallee()->getType(), calleeValue,
171                       ReturnValueSlot(), E->arg_begin(), E->arg_end(), Fn);
172 }
173 
174 RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
175                                         unsigned BuiltinID, const CallExpr *E) {
176   // See if we can constant fold this builtin.  If so, don't emit it at all.
177   Expr::EvalResult Result;
178   if (E->EvaluateAsRValue(Result, CGM.getContext()) &&
179       !Result.hasSideEffects()) {
180     if (Result.Val.isInt())
181       return RValue::get(llvm::ConstantInt::get(getLLVMContext(),
182                                                 Result.Val.getInt()));
183     if (Result.Val.isFloat())
184       return RValue::get(llvm::ConstantFP::get(getLLVMContext(),
185                                                Result.Val.getFloat()));
186   }
187 
188   switch (BuiltinID) {
189   default: break;  // Handle intrinsics and libm functions below.
190   case Builtin::BI__builtin___CFStringMakeConstantString:
191   case Builtin::BI__builtin___NSStringMakeConstantString:
192     return RValue::get(CGM.EmitConstantExpr(E, E->getType(), 0));
193   case Builtin::BI__builtin_stdarg_start:
194   case Builtin::BI__builtin_va_start:
195   case Builtin::BI__builtin_va_end: {
196     Value *ArgValue = EmitVAListRef(E->getArg(0));
197     llvm::Type *DestType = Int8PtrTy;
198     if (ArgValue->getType() != DestType)
199       ArgValue = Builder.CreateBitCast(ArgValue, DestType,
200                                        ArgValue->getName().data());
201 
202     Intrinsic::ID inst = (BuiltinID == Builtin::BI__builtin_va_end) ?
203       Intrinsic::vaend : Intrinsic::vastart;
204     return RValue::get(Builder.CreateCall(CGM.getIntrinsic(inst), ArgValue));
205   }
206   case Builtin::BI__builtin_va_copy: {
207     Value *DstPtr = EmitVAListRef(E->getArg(0));
208     Value *SrcPtr = EmitVAListRef(E->getArg(1));
209 
210     llvm::Type *Type = Int8PtrTy;
211 
212     DstPtr = Builder.CreateBitCast(DstPtr, Type);
213     SrcPtr = Builder.CreateBitCast(SrcPtr, Type);
214     return RValue::get(Builder.CreateCall2(CGM.getIntrinsic(Intrinsic::vacopy),
215                                            DstPtr, SrcPtr));
216   }
217   case Builtin::BI__builtin_abs:
218   case Builtin::BI__builtin_labs:
219   case Builtin::BI__builtin_llabs: {
220     Value *ArgValue = EmitScalarExpr(E->getArg(0));
221 
222     Value *NegOp = Builder.CreateNeg(ArgValue, "neg");
223     Value *CmpResult =
224     Builder.CreateICmpSGE(ArgValue,
225                           llvm::Constant::getNullValue(ArgValue->getType()),
226                                                             "abscond");
227     Value *Result =
228       Builder.CreateSelect(CmpResult, ArgValue, NegOp, "abs");
229 
230     return RValue::get(Result);
231   }
232   case Builtin::BI__builtin_ctz:
233   case Builtin::BI__builtin_ctzl:
234   case Builtin::BI__builtin_ctzll: {
235     Value *ArgValue = EmitScalarExpr(E->getArg(0));
236 
237     llvm::Type *ArgType = ArgValue->getType();
238     Value *F = CGM.getIntrinsic(Intrinsic::cttz, ArgType);
239 
240     llvm::Type *ResultType = ConvertType(E->getType());
241     Value *Result = Builder.CreateCall2(F, ArgValue, Builder.getTrue());
242     if (Result->getType() != ResultType)
243       Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true,
244                                      "cast");
245     return RValue::get(Result);
246   }
247   case Builtin::BI__builtin_clz:
248   case Builtin::BI__builtin_clzl:
249   case Builtin::BI__builtin_clzll: {
250     Value *ArgValue = EmitScalarExpr(E->getArg(0));
251 
252     llvm::Type *ArgType = ArgValue->getType();
253     Value *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType);
254 
255     llvm::Type *ResultType = ConvertType(E->getType());
256     Value *Result = Builder.CreateCall2(F, ArgValue, Builder.getTrue());
257     if (Result->getType() != ResultType)
258       Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true,
259                                      "cast");
260     return RValue::get(Result);
261   }
262   case Builtin::BI__builtin_ffs:
263   case Builtin::BI__builtin_ffsl:
264   case Builtin::BI__builtin_ffsll: {
265     // ffs(x) -> x ? cttz(x) + 1 : 0
266     Value *ArgValue = EmitScalarExpr(E->getArg(0));
267 
268     llvm::Type *ArgType = ArgValue->getType();
269     Value *F = CGM.getIntrinsic(Intrinsic::cttz, ArgType);
270 
271     llvm::Type *ResultType = ConvertType(E->getType());
272     Value *Tmp = Builder.CreateAdd(Builder.CreateCall2(F, ArgValue,
273                                                        Builder.getTrue()),
274                                    llvm::ConstantInt::get(ArgType, 1));
275     Value *Zero = llvm::Constant::getNullValue(ArgType);
276     Value *IsZero = Builder.CreateICmpEQ(ArgValue, Zero, "iszero");
277     Value *Result = Builder.CreateSelect(IsZero, Zero, Tmp, "ffs");
278     if (Result->getType() != ResultType)
279       Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true,
280                                      "cast");
281     return RValue::get(Result);
282   }
283   case Builtin::BI__builtin_parity:
284   case Builtin::BI__builtin_parityl:
285   case Builtin::BI__builtin_parityll: {
286     // parity(x) -> ctpop(x) & 1
287     Value *ArgValue = EmitScalarExpr(E->getArg(0));
288 
289     llvm::Type *ArgType = ArgValue->getType();
290     Value *F = CGM.getIntrinsic(Intrinsic::ctpop, ArgType);
291 
292     llvm::Type *ResultType = ConvertType(E->getType());
293     Value *Tmp = Builder.CreateCall(F, ArgValue);
294     Value *Result = Builder.CreateAnd(Tmp, llvm::ConstantInt::get(ArgType, 1));
295     if (Result->getType() != ResultType)
296       Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true,
297                                      "cast");
298     return RValue::get(Result);
299   }
300   case Builtin::BI__builtin_popcount:
301   case Builtin::BI__builtin_popcountl:
302   case Builtin::BI__builtin_popcountll: {
303     Value *ArgValue = EmitScalarExpr(E->getArg(0));
304 
305     llvm::Type *ArgType = ArgValue->getType();
306     Value *F = CGM.getIntrinsic(Intrinsic::ctpop, ArgType);
307 
308     llvm::Type *ResultType = ConvertType(E->getType());
309     Value *Result = Builder.CreateCall(F, ArgValue);
310     if (Result->getType() != ResultType)
311       Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true,
312                                      "cast");
313     return RValue::get(Result);
314   }
315   case Builtin::BI__builtin_expect: {
316     Value *ArgValue = EmitScalarExpr(E->getArg(0));
317     llvm::Type *ArgType = ArgValue->getType();
318 
319     Value *FnExpect = CGM.getIntrinsic(Intrinsic::expect, ArgType);
320     Value *ExpectedValue = EmitScalarExpr(E->getArg(1));
321 
322     Value *Result = Builder.CreateCall2(FnExpect, ArgValue, ExpectedValue,
323                                         "expval");
324     return RValue::get(Result);
325   }
326   case Builtin::BI__builtin_bswap32:
327   case Builtin::BI__builtin_bswap64: {
328     Value *ArgValue = EmitScalarExpr(E->getArg(0));
329     llvm::Type *ArgType = ArgValue->getType();
330     Value *F = CGM.getIntrinsic(Intrinsic::bswap, ArgType);
331     return RValue::get(Builder.CreateCall(F, ArgValue));
332   }
333   case Builtin::BI__builtin_object_size: {
334     // We pass this builtin onto the optimizer so that it can
335     // figure out the object size in more complex cases.
336     llvm::Type *ResType = ConvertType(E->getType());
337 
338     // LLVM only supports 0 and 2, make sure that we pass along that
339     // as a boolean.
340     Value *Ty = EmitScalarExpr(E->getArg(1));
341     ConstantInt *CI = dyn_cast<ConstantInt>(Ty);
342     assert(CI);
343     uint64_t val = CI->getZExtValue();
344     CI = ConstantInt::get(Builder.getInt1Ty(), (val & 0x2) >> 1);
345 
346     Value *F = CGM.getIntrinsic(Intrinsic::objectsize, ResType);
347     return RValue::get(Builder.CreateCall2(F,
348                                            EmitScalarExpr(E->getArg(0)),
349                                            CI));
350   }
351   case Builtin::BI__builtin_prefetch: {
352     Value *Locality, *RW, *Address = EmitScalarExpr(E->getArg(0));
353     // FIXME: Technically these constants should of type 'int', yes?
354     RW = (E->getNumArgs() > 1) ? EmitScalarExpr(E->getArg(1)) :
355       llvm::ConstantInt::get(Int32Ty, 0);
356     Locality = (E->getNumArgs() > 2) ? EmitScalarExpr(E->getArg(2)) :
357       llvm::ConstantInt::get(Int32Ty, 3);
358     Value *Data = llvm::ConstantInt::get(Int32Ty, 1);
359     Value *F = CGM.getIntrinsic(Intrinsic::prefetch);
360     return RValue::get(Builder.CreateCall4(F, Address, RW, Locality, Data));
361   }
362   case Builtin::BI__builtin_trap: {
363     Value *F = CGM.getIntrinsic(Intrinsic::trap);
364     return RValue::get(Builder.CreateCall(F));
365   }
366   case Builtin::BI__builtin_unreachable: {
367     if (CatchUndefined)
368       EmitBranch(getTrapBB());
369     else
370       Builder.CreateUnreachable();
371 
372     // We do need to preserve an insertion point.
373     EmitBlock(createBasicBlock("unreachable.cont"));
374 
375     return RValue::get(0);
376   }
377 
378   case Builtin::BI__builtin_powi:
379   case Builtin::BI__builtin_powif:
380   case Builtin::BI__builtin_powil: {
381     Value *Base = EmitScalarExpr(E->getArg(0));
382     Value *Exponent = EmitScalarExpr(E->getArg(1));
383     llvm::Type *ArgType = Base->getType();
384     Value *F = CGM.getIntrinsic(Intrinsic::powi, ArgType);
385     return RValue::get(Builder.CreateCall2(F, Base, Exponent));
386   }
387 
388   case Builtin::BI__builtin_isgreater:
389   case Builtin::BI__builtin_isgreaterequal:
390   case Builtin::BI__builtin_isless:
391   case Builtin::BI__builtin_islessequal:
392   case Builtin::BI__builtin_islessgreater:
393   case Builtin::BI__builtin_isunordered: {
394     // Ordered comparisons: we know the arguments to these are matching scalar
395     // floating point values.
396     Value *LHS = EmitScalarExpr(E->getArg(0));
397     Value *RHS = EmitScalarExpr(E->getArg(1));
398 
399     switch (BuiltinID) {
400     default: llvm_unreachable("Unknown ordered comparison");
401     case Builtin::BI__builtin_isgreater:
402       LHS = Builder.CreateFCmpOGT(LHS, RHS, "cmp");
403       break;
404     case Builtin::BI__builtin_isgreaterequal:
405       LHS = Builder.CreateFCmpOGE(LHS, RHS, "cmp");
406       break;
407     case Builtin::BI__builtin_isless:
408       LHS = Builder.CreateFCmpOLT(LHS, RHS, "cmp");
409       break;
410     case Builtin::BI__builtin_islessequal:
411       LHS = Builder.CreateFCmpOLE(LHS, RHS, "cmp");
412       break;
413     case Builtin::BI__builtin_islessgreater:
414       LHS = Builder.CreateFCmpONE(LHS, RHS, "cmp");
415       break;
416     case Builtin::BI__builtin_isunordered:
417       LHS = Builder.CreateFCmpUNO(LHS, RHS, "cmp");
418       break;
419     }
420     // ZExt bool to int type.
421     return RValue::get(Builder.CreateZExt(LHS, ConvertType(E->getType())));
422   }
423   case Builtin::BI__builtin_isnan: {
424     Value *V = EmitScalarExpr(E->getArg(0));
425     V = Builder.CreateFCmpUNO(V, V, "cmp");
426     return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType())));
427   }
428 
429   case Builtin::BI__builtin_isinf: {
430     // isinf(x) --> fabs(x) == infinity
431     Value *V = EmitScalarExpr(E->getArg(0));
432     V = EmitFAbs(*this, V, E->getArg(0)->getType());
433 
434     V = Builder.CreateFCmpOEQ(V, ConstantFP::getInfinity(V->getType()),"isinf");
435     return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType())));
436   }
437 
438   // TODO: BI__builtin_isinf_sign
439   //   isinf_sign(x) -> isinf(x) ? (signbit(x) ? -1 : 1) : 0
440 
441   case Builtin::BI__builtin_isnormal: {
442     // isnormal(x) --> x == x && fabsf(x) < infinity && fabsf(x) >= float_min
443     Value *V = EmitScalarExpr(E->getArg(0));
444     Value *Eq = Builder.CreateFCmpOEQ(V, V, "iseq");
445 
446     Value *Abs = EmitFAbs(*this, V, E->getArg(0)->getType());
447     Value *IsLessThanInf =
448       Builder.CreateFCmpULT(Abs, ConstantFP::getInfinity(V->getType()),"isinf");
449     APFloat Smallest = APFloat::getSmallestNormalized(
450                    getContext().getFloatTypeSemantics(E->getArg(0)->getType()));
451     Value *IsNormal =
452       Builder.CreateFCmpUGE(Abs, ConstantFP::get(V->getContext(), Smallest),
453                             "isnormal");
454     V = Builder.CreateAnd(Eq, IsLessThanInf, "and");
455     V = Builder.CreateAnd(V, IsNormal, "and");
456     return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType())));
457   }
458 
459   case Builtin::BI__builtin_isfinite: {
460     // isfinite(x) --> x == x && fabs(x) != infinity;
461     Value *V = EmitScalarExpr(E->getArg(0));
462     Value *Eq = Builder.CreateFCmpOEQ(V, V, "iseq");
463 
464     Value *Abs = EmitFAbs(*this, V, E->getArg(0)->getType());
465     Value *IsNotInf =
466       Builder.CreateFCmpUNE(Abs, ConstantFP::getInfinity(V->getType()),"isinf");
467 
468     V = Builder.CreateAnd(Eq, IsNotInf, "and");
469     return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType())));
470   }
471 
472   case Builtin::BI__builtin_fpclassify: {
473     Value *V = EmitScalarExpr(E->getArg(5));
474     llvm::Type *Ty = ConvertType(E->getArg(5)->getType());
475 
476     // Create Result
477     BasicBlock *Begin = Builder.GetInsertBlock();
478     BasicBlock *End = createBasicBlock("fpclassify_end", this->CurFn);
479     Builder.SetInsertPoint(End);
480     PHINode *Result =
481       Builder.CreatePHI(ConvertType(E->getArg(0)->getType()), 4,
482                         "fpclassify_result");
483 
484     // if (V==0) return FP_ZERO
485     Builder.SetInsertPoint(Begin);
486     Value *IsZero = Builder.CreateFCmpOEQ(V, Constant::getNullValue(Ty),
487                                           "iszero");
488     Value *ZeroLiteral = EmitScalarExpr(E->getArg(4));
489     BasicBlock *NotZero = createBasicBlock("fpclassify_not_zero", this->CurFn);
490     Builder.CreateCondBr(IsZero, End, NotZero);
491     Result->addIncoming(ZeroLiteral, Begin);
492 
493     // if (V != V) return FP_NAN
494     Builder.SetInsertPoint(NotZero);
495     Value *IsNan = Builder.CreateFCmpUNO(V, V, "cmp");
496     Value *NanLiteral = EmitScalarExpr(E->getArg(0));
497     BasicBlock *NotNan = createBasicBlock("fpclassify_not_nan", this->CurFn);
498     Builder.CreateCondBr(IsNan, End, NotNan);
499     Result->addIncoming(NanLiteral, NotZero);
500 
501     // if (fabs(V) == infinity) return FP_INFINITY
502     Builder.SetInsertPoint(NotNan);
503     Value *VAbs = EmitFAbs(*this, V, E->getArg(5)->getType());
504     Value *IsInf =
505       Builder.CreateFCmpOEQ(VAbs, ConstantFP::getInfinity(V->getType()),
506                             "isinf");
507     Value *InfLiteral = EmitScalarExpr(E->getArg(1));
508     BasicBlock *NotInf = createBasicBlock("fpclassify_not_inf", this->CurFn);
509     Builder.CreateCondBr(IsInf, End, NotInf);
510     Result->addIncoming(InfLiteral, NotNan);
511 
512     // if (fabs(V) >= MIN_NORMAL) return FP_NORMAL else FP_SUBNORMAL
513     Builder.SetInsertPoint(NotInf);
514     APFloat Smallest = APFloat::getSmallestNormalized(
515         getContext().getFloatTypeSemantics(E->getArg(5)->getType()));
516     Value *IsNormal =
517       Builder.CreateFCmpUGE(VAbs, ConstantFP::get(V->getContext(), Smallest),
518                             "isnormal");
519     Value *NormalResult =
520       Builder.CreateSelect(IsNormal, EmitScalarExpr(E->getArg(2)),
521                            EmitScalarExpr(E->getArg(3)));
522     Builder.CreateBr(End);
523     Result->addIncoming(NormalResult, NotInf);
524 
525     // return Result
526     Builder.SetInsertPoint(End);
527     return RValue::get(Result);
528   }
529 
530   case Builtin::BIalloca:
531   case Builtin::BI__builtin_alloca: {
532     Value *Size = EmitScalarExpr(E->getArg(0));
533     return RValue::get(Builder.CreateAlloca(Builder.getInt8Ty(), Size));
534   }
535   case Builtin::BIbzero:
536   case Builtin::BI__builtin_bzero: {
537     Value *Address = EmitScalarExpr(E->getArg(0));
538     Value *SizeVal = EmitScalarExpr(E->getArg(1));
539     Builder.CreateMemSet(Address, Builder.getInt8(0), SizeVal, 1, false);
540     return RValue::get(Address);
541   }
542   case Builtin::BImemcpy:
543   case Builtin::BI__builtin_memcpy: {
544     Value *Address = EmitScalarExpr(E->getArg(0));
545     Value *SrcAddr = EmitScalarExpr(E->getArg(1));
546     Value *SizeVal = EmitScalarExpr(E->getArg(2));
547     Builder.CreateMemCpy(Address, SrcAddr, SizeVal, 1, false);
548     return RValue::get(Address);
549   }
550 
551   case Builtin::BI__builtin___memcpy_chk: {
552     // fold __builtin_memcpy_chk(x, y, cst1, cst2) to memset iff cst1<=cst2.
553     llvm::APSInt Size, DstSize;
554     if (!E->getArg(2)->EvaluateAsInt(Size, CGM.getContext()) ||
555         !E->getArg(3)->EvaluateAsInt(DstSize, CGM.getContext()))
556       break;
557     if (Size.ugt(DstSize))
558       break;
559     Value *Dest = EmitScalarExpr(E->getArg(0));
560     Value *Src = EmitScalarExpr(E->getArg(1));
561     Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size);
562     Builder.CreateMemCpy(Dest, Src, SizeVal, 1, false);
563     return RValue::get(Dest);
564   }
565 
566   case Builtin::BI__builtin_objc_memmove_collectable: {
567     Value *Address = EmitScalarExpr(E->getArg(0));
568     Value *SrcAddr = EmitScalarExpr(E->getArg(1));
569     Value *SizeVal = EmitScalarExpr(E->getArg(2));
570     CGM.getObjCRuntime().EmitGCMemmoveCollectable(*this,
571                                                   Address, SrcAddr, SizeVal);
572     return RValue::get(Address);
573   }
574 
575   case Builtin::BI__builtin___memmove_chk: {
576     // fold __builtin_memmove_chk(x, y, cst1, cst2) to memset iff cst1<=cst2.
577     llvm::APSInt Size, DstSize;
578     if (!E->getArg(2)->EvaluateAsInt(Size, CGM.getContext()) ||
579         !E->getArg(3)->EvaluateAsInt(DstSize, CGM.getContext()))
580       break;
581     if (Size.ugt(DstSize))
582       break;
583     Value *Dest = EmitScalarExpr(E->getArg(0));
584     Value *Src = EmitScalarExpr(E->getArg(1));
585     Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size);
586     Builder.CreateMemMove(Dest, Src, SizeVal, 1, false);
587     return RValue::get(Dest);
588   }
589 
590   case Builtin::BImemmove:
591   case Builtin::BI__builtin_memmove: {
592     Value *Address = EmitScalarExpr(E->getArg(0));
593     Value *SrcAddr = EmitScalarExpr(E->getArg(1));
594     Value *SizeVal = EmitScalarExpr(E->getArg(2));
595     Builder.CreateMemMove(Address, SrcAddr, SizeVal, 1, false);
596     return RValue::get(Address);
597   }
598   case Builtin::BImemset:
599   case Builtin::BI__builtin_memset: {
600     Value *Address = EmitScalarExpr(E->getArg(0));
601     Value *ByteVal = Builder.CreateTrunc(EmitScalarExpr(E->getArg(1)),
602                                          Builder.getInt8Ty());
603     Value *SizeVal = EmitScalarExpr(E->getArg(2));
604     Builder.CreateMemSet(Address, ByteVal, SizeVal, 1, false);
605     return RValue::get(Address);
606   }
607   case Builtin::BI__builtin___memset_chk: {
608     // fold __builtin_memset_chk(x, y, cst1, cst2) to memset iff cst1<=cst2.
609     llvm::APSInt Size, DstSize;
610     if (!E->getArg(2)->EvaluateAsInt(Size, CGM.getContext()) ||
611         !E->getArg(3)->EvaluateAsInt(DstSize, CGM.getContext()))
612       break;
613     if (Size.ugt(DstSize))
614       break;
615     Value *Address = EmitScalarExpr(E->getArg(0));
616     Value *ByteVal = Builder.CreateTrunc(EmitScalarExpr(E->getArg(1)),
617                                          Builder.getInt8Ty());
618     Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size);
619     Builder.CreateMemSet(Address, ByteVal, SizeVal, 1, false);
620 
621     return RValue::get(Address);
622   }
623   case Builtin::BI__builtin_dwarf_cfa: {
624     // The offset in bytes from the first argument to the CFA.
625     //
626     // Why on earth is this in the frontend?  Is there any reason at
627     // all that the backend can't reasonably determine this while
628     // lowering llvm.eh.dwarf.cfa()?
629     //
630     // TODO: If there's a satisfactory reason, add a target hook for
631     // this instead of hard-coding 0, which is correct for most targets.
632     int32_t Offset = 0;
633 
634     Value *F = CGM.getIntrinsic(Intrinsic::eh_dwarf_cfa);
635     return RValue::get(Builder.CreateCall(F,
636                                       llvm::ConstantInt::get(Int32Ty, Offset)));
637   }
638   case Builtin::BI__builtin_return_address: {
639     Value *Depth = EmitScalarExpr(E->getArg(0));
640     Depth = Builder.CreateIntCast(Depth, Int32Ty, false);
641     Value *F = CGM.getIntrinsic(Intrinsic::returnaddress);
642     return RValue::get(Builder.CreateCall(F, Depth));
643   }
644   case Builtin::BI__builtin_frame_address: {
645     Value *Depth = EmitScalarExpr(E->getArg(0));
646     Depth = Builder.CreateIntCast(Depth, Int32Ty, false);
647     Value *F = CGM.getIntrinsic(Intrinsic::frameaddress);
648     return RValue::get(Builder.CreateCall(F, Depth));
649   }
650   case Builtin::BI__builtin_extract_return_addr: {
651     Value *Address = EmitScalarExpr(E->getArg(0));
652     Value *Result = getTargetHooks().decodeReturnAddress(*this, Address);
653     return RValue::get(Result);
654   }
655   case Builtin::BI__builtin_frob_return_addr: {
656     Value *Address = EmitScalarExpr(E->getArg(0));
657     Value *Result = getTargetHooks().encodeReturnAddress(*this, Address);
658     return RValue::get(Result);
659   }
660   case Builtin::BI__builtin_dwarf_sp_column: {
661     llvm::IntegerType *Ty
662       = cast<llvm::IntegerType>(ConvertType(E->getType()));
663     int Column = getTargetHooks().getDwarfEHStackPointer(CGM);
664     if (Column == -1) {
665       CGM.ErrorUnsupported(E, "__builtin_dwarf_sp_column");
666       return RValue::get(llvm::UndefValue::get(Ty));
667     }
668     return RValue::get(llvm::ConstantInt::get(Ty, Column, true));
669   }
670   case Builtin::BI__builtin_init_dwarf_reg_size_table: {
671     Value *Address = EmitScalarExpr(E->getArg(0));
672     if (getTargetHooks().initDwarfEHRegSizeTable(*this, Address))
673       CGM.ErrorUnsupported(E, "__builtin_init_dwarf_reg_size_table");
674     return RValue::get(llvm::UndefValue::get(ConvertType(E->getType())));
675   }
676   case Builtin::BI__builtin_eh_return: {
677     Value *Int = EmitScalarExpr(E->getArg(0));
678     Value *Ptr = EmitScalarExpr(E->getArg(1));
679 
680     llvm::IntegerType *IntTy = cast<llvm::IntegerType>(Int->getType());
681     assert((IntTy->getBitWidth() == 32 || IntTy->getBitWidth() == 64) &&
682            "LLVM's __builtin_eh_return only supports 32- and 64-bit variants");
683     Value *F = CGM.getIntrinsic(IntTy->getBitWidth() == 32
684                                   ? Intrinsic::eh_return_i32
685                                   : Intrinsic::eh_return_i64);
686     Builder.CreateCall2(F, Int, Ptr);
687     Builder.CreateUnreachable();
688 
689     // We do need to preserve an insertion point.
690     EmitBlock(createBasicBlock("builtin_eh_return.cont"));
691 
692     return RValue::get(0);
693   }
694   case Builtin::BI__builtin_unwind_init: {
695     Value *F = CGM.getIntrinsic(Intrinsic::eh_unwind_init);
696     return RValue::get(Builder.CreateCall(F));
697   }
698   case Builtin::BI__builtin_extend_pointer: {
699     // Extends a pointer to the size of an _Unwind_Word, which is
700     // uint64_t on all platforms.  Generally this gets poked into a
701     // register and eventually used as an address, so if the
702     // addressing registers are wider than pointers and the platform
703     // doesn't implicitly ignore high-order bits when doing
704     // addressing, we need to make sure we zext / sext based on
705     // the platform's expectations.
706     //
707     // See: http://gcc.gnu.org/ml/gcc-bugs/2002-02/msg00237.html
708 
709     // Cast the pointer to intptr_t.
710     Value *Ptr = EmitScalarExpr(E->getArg(0));
711     Value *Result = Builder.CreatePtrToInt(Ptr, IntPtrTy, "extend.cast");
712 
713     // If that's 64 bits, we're done.
714     if (IntPtrTy->getBitWidth() == 64)
715       return RValue::get(Result);
716 
717     // Otherwise, ask the codegen data what to do.
718     if (getTargetHooks().extendPointerWithSExt())
719       return RValue::get(Builder.CreateSExt(Result, Int64Ty, "extend.sext"));
720     else
721       return RValue::get(Builder.CreateZExt(Result, Int64Ty, "extend.zext"));
722   }
723   case Builtin::BI__builtin_setjmp: {
724     // Buffer is a void**.
725     Value *Buf = EmitScalarExpr(E->getArg(0));
726 
727     // Store the frame pointer to the setjmp buffer.
728     Value *FrameAddr =
729       Builder.CreateCall(CGM.getIntrinsic(Intrinsic::frameaddress),
730                          ConstantInt::get(Int32Ty, 0));
731     Builder.CreateStore(FrameAddr, Buf);
732 
733     // Store the stack pointer to the setjmp buffer.
734     Value *StackAddr =
735       Builder.CreateCall(CGM.getIntrinsic(Intrinsic::stacksave));
736     Value *StackSaveSlot =
737       Builder.CreateGEP(Buf, ConstantInt::get(Int32Ty, 2));
738     Builder.CreateStore(StackAddr, StackSaveSlot);
739 
740     // Call LLVM's EH setjmp, which is lightweight.
741     Value *F = CGM.getIntrinsic(Intrinsic::eh_sjlj_setjmp);
742     Buf = Builder.CreateBitCast(Buf, Int8PtrTy);
743     return RValue::get(Builder.CreateCall(F, Buf));
744   }
745   case Builtin::BI__builtin_longjmp: {
746     Value *Buf = EmitScalarExpr(E->getArg(0));
747     Buf = Builder.CreateBitCast(Buf, Int8PtrTy);
748 
749     // Call LLVM's EH longjmp, which is lightweight.
750     Builder.CreateCall(CGM.getIntrinsic(Intrinsic::eh_sjlj_longjmp), Buf);
751 
752     // longjmp doesn't return; mark this as unreachable.
753     Builder.CreateUnreachable();
754 
755     // We do need to preserve an insertion point.
756     EmitBlock(createBasicBlock("longjmp.cont"));
757 
758     return RValue::get(0);
759   }
760   case Builtin::BI__sync_fetch_and_add:
761   case Builtin::BI__sync_fetch_and_sub:
762   case Builtin::BI__sync_fetch_and_or:
763   case Builtin::BI__sync_fetch_and_and:
764   case Builtin::BI__sync_fetch_and_xor:
765   case Builtin::BI__sync_add_and_fetch:
766   case Builtin::BI__sync_sub_and_fetch:
767   case Builtin::BI__sync_and_and_fetch:
768   case Builtin::BI__sync_or_and_fetch:
769   case Builtin::BI__sync_xor_and_fetch:
770   case Builtin::BI__sync_val_compare_and_swap:
771   case Builtin::BI__sync_bool_compare_and_swap:
772   case Builtin::BI__sync_lock_test_and_set:
773   case Builtin::BI__sync_lock_release:
774   case Builtin::BI__sync_swap:
775     llvm_unreachable("Shouldn't make it through sema");
776   case Builtin::BI__sync_fetch_and_add_1:
777   case Builtin::BI__sync_fetch_and_add_2:
778   case Builtin::BI__sync_fetch_and_add_4:
779   case Builtin::BI__sync_fetch_and_add_8:
780   case Builtin::BI__sync_fetch_and_add_16:
781     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Add, E);
782   case Builtin::BI__sync_fetch_and_sub_1:
783   case Builtin::BI__sync_fetch_and_sub_2:
784   case Builtin::BI__sync_fetch_and_sub_4:
785   case Builtin::BI__sync_fetch_and_sub_8:
786   case Builtin::BI__sync_fetch_and_sub_16:
787     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Sub, E);
788   case Builtin::BI__sync_fetch_and_or_1:
789   case Builtin::BI__sync_fetch_and_or_2:
790   case Builtin::BI__sync_fetch_and_or_4:
791   case Builtin::BI__sync_fetch_and_or_8:
792   case Builtin::BI__sync_fetch_and_or_16:
793     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Or, E);
794   case Builtin::BI__sync_fetch_and_and_1:
795   case Builtin::BI__sync_fetch_and_and_2:
796   case Builtin::BI__sync_fetch_and_and_4:
797   case Builtin::BI__sync_fetch_and_and_8:
798   case Builtin::BI__sync_fetch_and_and_16:
799     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::And, E);
800   case Builtin::BI__sync_fetch_and_xor_1:
801   case Builtin::BI__sync_fetch_and_xor_2:
802   case Builtin::BI__sync_fetch_and_xor_4:
803   case Builtin::BI__sync_fetch_and_xor_8:
804   case Builtin::BI__sync_fetch_and_xor_16:
805     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Xor, E);
806 
807   // Clang extensions: not overloaded yet.
808   case Builtin::BI__sync_fetch_and_min:
809     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Min, E);
810   case Builtin::BI__sync_fetch_and_max:
811     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Max, E);
812   case Builtin::BI__sync_fetch_and_umin:
813     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::UMin, E);
814   case Builtin::BI__sync_fetch_and_umax:
815     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::UMax, E);
816 
817   case Builtin::BI__sync_add_and_fetch_1:
818   case Builtin::BI__sync_add_and_fetch_2:
819   case Builtin::BI__sync_add_and_fetch_4:
820   case Builtin::BI__sync_add_and_fetch_8:
821   case Builtin::BI__sync_add_and_fetch_16:
822     return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Add, E,
823                                 llvm::Instruction::Add);
824   case Builtin::BI__sync_sub_and_fetch_1:
825   case Builtin::BI__sync_sub_and_fetch_2:
826   case Builtin::BI__sync_sub_and_fetch_4:
827   case Builtin::BI__sync_sub_and_fetch_8:
828   case Builtin::BI__sync_sub_and_fetch_16:
829     return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Sub, E,
830                                 llvm::Instruction::Sub);
831   case Builtin::BI__sync_and_and_fetch_1:
832   case Builtin::BI__sync_and_and_fetch_2:
833   case Builtin::BI__sync_and_and_fetch_4:
834   case Builtin::BI__sync_and_and_fetch_8:
835   case Builtin::BI__sync_and_and_fetch_16:
836     return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::And, E,
837                                 llvm::Instruction::And);
838   case Builtin::BI__sync_or_and_fetch_1:
839   case Builtin::BI__sync_or_and_fetch_2:
840   case Builtin::BI__sync_or_and_fetch_4:
841   case Builtin::BI__sync_or_and_fetch_8:
842   case Builtin::BI__sync_or_and_fetch_16:
843     return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Or, E,
844                                 llvm::Instruction::Or);
845   case Builtin::BI__sync_xor_and_fetch_1:
846   case Builtin::BI__sync_xor_and_fetch_2:
847   case Builtin::BI__sync_xor_and_fetch_4:
848   case Builtin::BI__sync_xor_and_fetch_8:
849   case Builtin::BI__sync_xor_and_fetch_16:
850     return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Xor, E,
851                                 llvm::Instruction::Xor);
852 
853   case Builtin::BI__sync_val_compare_and_swap_1:
854   case Builtin::BI__sync_val_compare_and_swap_2:
855   case Builtin::BI__sync_val_compare_and_swap_4:
856   case Builtin::BI__sync_val_compare_and_swap_8:
857   case Builtin::BI__sync_val_compare_and_swap_16: {
858     QualType T = E->getType();
859     llvm::Value *DestPtr = EmitScalarExpr(E->getArg(0));
860     unsigned AddrSpace =
861       cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
862 
863     llvm::IntegerType *IntType =
864       llvm::IntegerType::get(getLLVMContext(),
865                              getContext().getTypeSize(T));
866     llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
867 
868     Value *Args[3];
869     Args[0] = Builder.CreateBitCast(DestPtr, IntPtrType);
870     Args[1] = EmitScalarExpr(E->getArg(1));
871     llvm::Type *ValueType = Args[1]->getType();
872     Args[1] = EmitToInt(*this, Args[1], T, IntType);
873     Args[2] = EmitToInt(*this, EmitScalarExpr(E->getArg(2)), T, IntType);
874 
875     Value *Result = Builder.CreateAtomicCmpXchg(Args[0], Args[1], Args[2],
876                                                 llvm::SequentiallyConsistent);
877     Result = EmitFromInt(*this, Result, T, ValueType);
878     return RValue::get(Result);
879   }
880 
881   case Builtin::BI__sync_bool_compare_and_swap_1:
882   case Builtin::BI__sync_bool_compare_and_swap_2:
883   case Builtin::BI__sync_bool_compare_and_swap_4:
884   case Builtin::BI__sync_bool_compare_and_swap_8:
885   case Builtin::BI__sync_bool_compare_and_swap_16: {
886     QualType T = E->getArg(1)->getType();
887     llvm::Value *DestPtr = EmitScalarExpr(E->getArg(0));
888     unsigned AddrSpace =
889       cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
890 
891     llvm::IntegerType *IntType =
892       llvm::IntegerType::get(getLLVMContext(),
893                              getContext().getTypeSize(T));
894     llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
895 
896     Value *Args[3];
897     Args[0] = Builder.CreateBitCast(DestPtr, IntPtrType);
898     Args[1] = EmitToInt(*this, EmitScalarExpr(E->getArg(1)), T, IntType);
899     Args[2] = EmitToInt(*this, EmitScalarExpr(E->getArg(2)), T, IntType);
900 
901     Value *OldVal = Args[1];
902     Value *PrevVal = Builder.CreateAtomicCmpXchg(Args[0], Args[1], Args[2],
903                                                  llvm::SequentiallyConsistent);
904     Value *Result = Builder.CreateICmpEQ(PrevVal, OldVal);
905     // zext bool to int.
906     Result = Builder.CreateZExt(Result, ConvertType(E->getType()));
907     return RValue::get(Result);
908   }
909 
910   case Builtin::BI__sync_swap_1:
911   case Builtin::BI__sync_swap_2:
912   case Builtin::BI__sync_swap_4:
913   case Builtin::BI__sync_swap_8:
914   case Builtin::BI__sync_swap_16:
915     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Xchg, E);
916 
917   case Builtin::BI__sync_lock_test_and_set_1:
918   case Builtin::BI__sync_lock_test_and_set_2:
919   case Builtin::BI__sync_lock_test_and_set_4:
920   case Builtin::BI__sync_lock_test_and_set_8:
921   case Builtin::BI__sync_lock_test_and_set_16:
922     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Xchg, E);
923 
924   case Builtin::BI__sync_lock_release_1:
925   case Builtin::BI__sync_lock_release_2:
926   case Builtin::BI__sync_lock_release_4:
927   case Builtin::BI__sync_lock_release_8:
928   case Builtin::BI__sync_lock_release_16: {
929     Value *Ptr = EmitScalarExpr(E->getArg(0));
930     llvm::Type *ElLLVMTy =
931       cast<llvm::PointerType>(Ptr->getType())->getElementType();
932     llvm::StoreInst *Store =
933       Builder.CreateStore(llvm::Constant::getNullValue(ElLLVMTy), Ptr);
934     QualType ElTy = E->getArg(0)->getType()->getPointeeType();
935     CharUnits StoreSize = getContext().getTypeSizeInChars(ElTy);
936     Store->setAlignment(StoreSize.getQuantity());
937     Store->setAtomic(llvm::Release);
938     return RValue::get(0);
939   }
940 
941   case Builtin::BI__sync_synchronize: {
942     // We assume this is supposed to correspond to a C++0x-style
943     // sequentially-consistent fence (i.e. this is only usable for
944     // synchonization, not device I/O or anything like that). This intrinsic
945     // is really badly designed in the sense that in theory, there isn't
946     // any way to safely use it... but in practice, it mostly works
947     // to use it with non-atomic loads and stores to get acquire/release
948     // semantics.
949     Builder.CreateFence(llvm::SequentiallyConsistent);
950     return RValue::get(0);
951   }
952 
953   case Builtin::BI__atomic_thread_fence:
954   case Builtin::BI__atomic_signal_fence: {
955     llvm::SynchronizationScope Scope;
956     if (BuiltinID == Builtin::BI__atomic_signal_fence)
957       Scope = llvm::SingleThread;
958     else
959       Scope = llvm::CrossThread;
960     Value *Order = EmitScalarExpr(E->getArg(0));
961     if (isa<llvm::ConstantInt>(Order)) {
962       int ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
963       switch (ord) {
964       case 0:  // memory_order_relaxed
965       default: // invalid order
966         break;
967       case 1:  // memory_order_consume
968       case 2:  // memory_order_acquire
969         Builder.CreateFence(llvm::Acquire, Scope);
970         break;
971       case 3:  // memory_order_release
972         Builder.CreateFence(llvm::Release, Scope);
973         break;
974       case 4:  // memory_order_acq_rel
975         Builder.CreateFence(llvm::AcquireRelease, Scope);
976         break;
977       case 5:  // memory_order_seq_cst
978         Builder.CreateFence(llvm::SequentiallyConsistent, Scope);
979         break;
980       }
981       return RValue::get(0);
982     }
983 
984     llvm::BasicBlock *AcquireBB, *ReleaseBB, *AcqRelBB, *SeqCstBB;
985     AcquireBB = createBasicBlock("acquire", CurFn);
986     ReleaseBB = createBasicBlock("release", CurFn);
987     AcqRelBB = createBasicBlock("acqrel", CurFn);
988     SeqCstBB = createBasicBlock("seqcst", CurFn);
989     llvm::BasicBlock *ContBB = createBasicBlock("atomic.continue", CurFn);
990 
991     Order = Builder.CreateIntCast(Order, Builder.getInt32Ty(), false);
992     llvm::SwitchInst *SI = Builder.CreateSwitch(Order, ContBB);
993 
994     Builder.SetInsertPoint(AcquireBB);
995     Builder.CreateFence(llvm::Acquire, Scope);
996     Builder.CreateBr(ContBB);
997     SI->addCase(Builder.getInt32(1), AcquireBB);
998     SI->addCase(Builder.getInt32(2), AcquireBB);
999 
1000     Builder.SetInsertPoint(ReleaseBB);
1001     Builder.CreateFence(llvm::Release, Scope);
1002     Builder.CreateBr(ContBB);
1003     SI->addCase(Builder.getInt32(3), ReleaseBB);
1004 
1005     Builder.SetInsertPoint(AcqRelBB);
1006     Builder.CreateFence(llvm::AcquireRelease, Scope);
1007     Builder.CreateBr(ContBB);
1008     SI->addCase(Builder.getInt32(4), AcqRelBB);
1009 
1010     Builder.SetInsertPoint(SeqCstBB);
1011     Builder.CreateFence(llvm::SequentiallyConsistent, Scope);
1012     Builder.CreateBr(ContBB);
1013     SI->addCase(Builder.getInt32(5), SeqCstBB);
1014 
1015     Builder.SetInsertPoint(ContBB);
1016     return RValue::get(0);
1017   }
1018 
1019     // Library functions with special handling.
1020   case Builtin::BIsqrt:
1021   case Builtin::BIsqrtf:
1022   case Builtin::BIsqrtl: {
1023     // TODO: there is currently no set of optimizer flags
1024     // sufficient for us to rewrite sqrt to @llvm.sqrt.
1025     // -fmath-errno=0 is not good enough; we need finiteness.
1026     // We could probably precondition the call with an ult
1027     // against 0, but is that worth the complexity?
1028     break;
1029   }
1030 
1031   case Builtin::BIpow:
1032   case Builtin::BIpowf:
1033   case Builtin::BIpowl: {
1034     // Rewrite sqrt to intrinsic if allowed.
1035     if (!FD->hasAttr<ConstAttr>())
1036       break;
1037     Value *Base = EmitScalarExpr(E->getArg(0));
1038     Value *Exponent = EmitScalarExpr(E->getArg(1));
1039     llvm::Type *ArgType = Base->getType();
1040     Value *F = CGM.getIntrinsic(Intrinsic::pow, ArgType);
1041     return RValue::get(Builder.CreateCall2(F, Base, Exponent));
1042   }
1043 
1044   case Builtin::BIfma:
1045   case Builtin::BIfmaf:
1046   case Builtin::BIfmal:
1047   case Builtin::BI__builtin_fma:
1048   case Builtin::BI__builtin_fmaf:
1049   case Builtin::BI__builtin_fmal: {
1050     // Rewrite fma to intrinsic.
1051     Value *FirstArg = EmitScalarExpr(E->getArg(0));
1052     llvm::Type *ArgType = FirstArg->getType();
1053     Value *F = CGM.getIntrinsic(Intrinsic::fma, ArgType);
1054     return RValue::get(Builder.CreateCall3(F, FirstArg,
1055                                               EmitScalarExpr(E->getArg(1)),
1056                                               EmitScalarExpr(E->getArg(2))));
1057   }
1058 
1059   case Builtin::BI__builtin_signbit:
1060   case Builtin::BI__builtin_signbitf:
1061   case Builtin::BI__builtin_signbitl: {
1062     LLVMContext &C = CGM.getLLVMContext();
1063 
1064     Value *Arg = EmitScalarExpr(E->getArg(0));
1065     llvm::Type *ArgTy = Arg->getType();
1066     if (ArgTy->isPPC_FP128Ty())
1067       break; // FIXME: I'm not sure what the right implementation is here.
1068     int ArgWidth = ArgTy->getPrimitiveSizeInBits();
1069     llvm::Type *ArgIntTy = llvm::IntegerType::get(C, ArgWidth);
1070     Value *BCArg = Builder.CreateBitCast(Arg, ArgIntTy);
1071     Value *ZeroCmp = llvm::Constant::getNullValue(ArgIntTy);
1072     Value *Result = Builder.CreateICmpSLT(BCArg, ZeroCmp);
1073     return RValue::get(Builder.CreateZExt(Result, ConvertType(E->getType())));
1074   }
1075   case Builtin::BI__builtin_annotation: {
1076     llvm::Value *AnnVal = EmitScalarExpr(E->getArg(0));
1077     llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::annotation,
1078                                       AnnVal->getType());
1079 
1080     // Get the annotation string, go through casts. Sema requires this to be a
1081     // non-wide string literal, potentially casted, so the cast<> is safe.
1082     const Expr *AnnotationStrExpr = E->getArg(1)->IgnoreParenCasts();
1083     llvm::StringRef Str = cast<StringLiteral>(AnnotationStrExpr)->getString();
1084     return RValue::get(EmitAnnotationCall(F, AnnVal, Str, E->getExprLoc()));
1085   }
1086   }
1087 
1088   // If this is an alias for a lib function (e.g. __builtin_sin), emit
1089   // the call using the normal call path, but using the unmangled
1090   // version of the function name.
1091   if (getContext().BuiltinInfo.isLibFunction(BuiltinID))
1092     return emitLibraryCall(*this, FD, E,
1093                            CGM.getBuiltinLibFunction(FD, BuiltinID));
1094 
1095   // If this is a predefined lib function (e.g. malloc), emit the call
1096   // using exactly the normal call path.
1097   if (getContext().BuiltinInfo.isPredefinedLibFunction(BuiltinID))
1098     return emitLibraryCall(*this, FD, E, EmitScalarExpr(E->getCallee()));
1099 
1100   // See if we have a target specific intrinsic.
1101   const char *Name = getContext().BuiltinInfo.GetName(BuiltinID);
1102   Intrinsic::ID IntrinsicID = Intrinsic::not_intrinsic;
1103   if (const char *Prefix =
1104       llvm::Triple::getArchTypePrefix(Target.getTriple().getArch()))
1105     IntrinsicID = Intrinsic::getIntrinsicForGCCBuiltin(Prefix, Name);
1106 
1107   if (IntrinsicID != Intrinsic::not_intrinsic) {
1108     SmallVector<Value*, 16> Args;
1109 
1110     // Find out if any arguments are required to be integer constant
1111     // expressions.
1112     unsigned ICEArguments = 0;
1113     ASTContext::GetBuiltinTypeError Error;
1114     getContext().GetBuiltinType(BuiltinID, Error, &ICEArguments);
1115     assert(Error == ASTContext::GE_None && "Should not codegen an error");
1116 
1117     Function *F = CGM.getIntrinsic(IntrinsicID);
1118     llvm::FunctionType *FTy = F->getFunctionType();
1119 
1120     for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) {
1121       Value *ArgValue;
1122       // If this is a normal argument, just emit it as a scalar.
1123       if ((ICEArguments & (1 << i)) == 0) {
1124         ArgValue = EmitScalarExpr(E->getArg(i));
1125       } else {
1126         // If this is required to be a constant, constant fold it so that we
1127         // know that the generated intrinsic gets a ConstantInt.
1128         llvm::APSInt Result;
1129         bool IsConst = E->getArg(i)->isIntegerConstantExpr(Result,getContext());
1130         assert(IsConst && "Constant arg isn't actually constant?");
1131         (void)IsConst;
1132         ArgValue = llvm::ConstantInt::get(getLLVMContext(), Result);
1133       }
1134 
1135       // If the intrinsic arg type is different from the builtin arg type
1136       // we need to do a bit cast.
1137       llvm::Type *PTy = FTy->getParamType(i);
1138       if (PTy != ArgValue->getType()) {
1139         assert(PTy->canLosslesslyBitCastTo(FTy->getParamType(i)) &&
1140                "Must be able to losslessly bit cast to param");
1141         ArgValue = Builder.CreateBitCast(ArgValue, PTy);
1142       }
1143 
1144       Args.push_back(ArgValue);
1145     }
1146 
1147     Value *V = Builder.CreateCall(F, Args);
1148     QualType BuiltinRetType = E->getType();
1149 
1150     llvm::Type *RetTy = llvm::Type::getVoidTy(getLLVMContext());
1151     if (!BuiltinRetType->isVoidType()) RetTy = ConvertType(BuiltinRetType);
1152 
1153     if (RetTy != V->getType()) {
1154       assert(V->getType()->canLosslesslyBitCastTo(RetTy) &&
1155              "Must be able to losslessly bit cast result type");
1156       V = Builder.CreateBitCast(V, RetTy);
1157     }
1158 
1159     return RValue::get(V);
1160   }
1161 
1162   // See if we have a target specific builtin that needs to be lowered.
1163   if (Value *V = EmitTargetBuiltinExpr(BuiltinID, E))
1164     return RValue::get(V);
1165 
1166   ErrorUnsupported(E, "builtin function");
1167 
1168   // Unknown builtin, for now just dump it out and return undef.
1169   if (hasAggregateLLVMType(E->getType()))
1170     return RValue::getAggregate(CreateMemTemp(E->getType()));
1171   return RValue::get(llvm::UndefValue::get(ConvertType(E->getType())));
1172 }
1173 
1174 Value *CodeGenFunction::EmitTargetBuiltinExpr(unsigned BuiltinID,
1175                                               const CallExpr *E) {
1176   switch (Target.getTriple().getArch()) {
1177   case llvm::Triple::arm:
1178   case llvm::Triple::thumb:
1179     return EmitARMBuiltinExpr(BuiltinID, E);
1180   case llvm::Triple::x86:
1181   case llvm::Triple::x86_64:
1182     return EmitX86BuiltinExpr(BuiltinID, E);
1183   case llvm::Triple::ppc:
1184   case llvm::Triple::ppc64:
1185     return EmitPPCBuiltinExpr(BuiltinID, E);
1186   case llvm::Triple::hexagon:
1187     return EmitHexagonBuiltinExpr(BuiltinID, E);
1188   default:
1189     return 0;
1190   }
1191 }
1192 
1193 static llvm::VectorType *GetNeonType(LLVMContext &C, NeonTypeFlags TypeFlags) {
1194   int IsQuad = TypeFlags.isQuad();
1195   switch (TypeFlags.getEltType()) {
1196   case NeonTypeFlags::Int8:
1197   case NeonTypeFlags::Poly8:
1198     return llvm::VectorType::get(llvm::Type::getInt8Ty(C), 8 << IsQuad);
1199   case NeonTypeFlags::Int16:
1200   case NeonTypeFlags::Poly16:
1201   case NeonTypeFlags::Float16:
1202     return llvm::VectorType::get(llvm::Type::getInt16Ty(C), 4 << IsQuad);
1203   case NeonTypeFlags::Int32:
1204     return llvm::VectorType::get(llvm::Type::getInt32Ty(C), 2 << IsQuad);
1205   case NeonTypeFlags::Int64:
1206     return llvm::VectorType::get(llvm::Type::getInt64Ty(C), 1 << IsQuad);
1207   case NeonTypeFlags::Float32:
1208     return llvm::VectorType::get(llvm::Type::getFloatTy(C), 2 << IsQuad);
1209   }
1210   llvm_unreachable("Invalid NeonTypeFlags element type!");
1211 }
1212 
1213 Value *CodeGenFunction::EmitNeonSplat(Value *V, Constant *C) {
1214   unsigned nElts = cast<llvm::VectorType>(V->getType())->getNumElements();
1215   Value* SV = llvm::ConstantVector::getSplat(nElts, C);
1216   return Builder.CreateShuffleVector(V, V, SV, "lane");
1217 }
1218 
1219 Value *CodeGenFunction::EmitNeonCall(Function *F, SmallVectorImpl<Value*> &Ops,
1220                                      const char *name,
1221                                      unsigned shift, bool rightshift) {
1222   unsigned j = 0;
1223   for (Function::const_arg_iterator ai = F->arg_begin(), ae = F->arg_end();
1224        ai != ae; ++ai, ++j)
1225     if (shift > 0 && shift == j)
1226       Ops[j] = EmitNeonShiftVector(Ops[j], ai->getType(), rightshift);
1227     else
1228       Ops[j] = Builder.CreateBitCast(Ops[j], ai->getType(), name);
1229 
1230   return Builder.CreateCall(F, Ops, name);
1231 }
1232 
1233 Value *CodeGenFunction::EmitNeonShiftVector(Value *V, llvm::Type *Ty,
1234                                             bool neg) {
1235   int SV = cast<ConstantInt>(V)->getSExtValue();
1236 
1237   llvm::VectorType *VTy = cast<llvm::VectorType>(Ty);
1238   llvm::Constant *C = ConstantInt::get(VTy->getElementType(), neg ? -SV : SV);
1239   return llvm::ConstantVector::getSplat(VTy->getNumElements(), C);
1240 }
1241 
1242 /// GetPointeeAlignment - Given an expression with a pointer type, find the
1243 /// alignment of the type referenced by the pointer.  Skip over implicit
1244 /// casts.
1245 static Value *GetPointeeAlignment(CodeGenFunction &CGF, const Expr *Addr) {
1246   unsigned Align = 1;
1247   // Check if the type is a pointer.  The implicit cast operand might not be.
1248   while (Addr->getType()->isPointerType()) {
1249     QualType PtTy = Addr->getType()->getPointeeType();
1250     unsigned NewA = CGF.getContext().getTypeAlignInChars(PtTy).getQuantity();
1251     if (NewA > Align)
1252       Align = NewA;
1253 
1254     // If the address is an implicit cast, repeat with the cast operand.
1255     if (const ImplicitCastExpr *CastAddr = dyn_cast<ImplicitCastExpr>(Addr)) {
1256       Addr = CastAddr->getSubExpr();
1257       continue;
1258     }
1259     break;
1260   }
1261   return llvm::ConstantInt::get(CGF.Int32Ty, Align);
1262 }
1263 
1264 Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
1265                                            const CallExpr *E) {
1266   if (BuiltinID == ARM::BI__clear_cache) {
1267     const FunctionDecl *FD = E->getDirectCallee();
1268     // Oddly people write this call without args on occasion and gcc accepts
1269     // it - it's also marked as varargs in the description file.
1270     SmallVector<Value*, 2> Ops;
1271     for (unsigned i = 0; i < E->getNumArgs(); i++)
1272       Ops.push_back(EmitScalarExpr(E->getArg(i)));
1273     llvm::Type *Ty = CGM.getTypes().ConvertType(FD->getType());
1274     llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty);
1275     StringRef Name = FD->getName();
1276     return Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, Name), Ops);
1277   }
1278 
1279   if (BuiltinID == ARM::BI__builtin_arm_ldrexd) {
1280     Function *F = CGM.getIntrinsic(Intrinsic::arm_ldrexd);
1281 
1282     Value *LdPtr = EmitScalarExpr(E->getArg(0));
1283     Value *Val = Builder.CreateCall(F, LdPtr, "ldrexd");
1284 
1285     Value *Val0 = Builder.CreateExtractValue(Val, 1);
1286     Value *Val1 = Builder.CreateExtractValue(Val, 0);
1287     Val0 = Builder.CreateZExt(Val0, Int64Ty);
1288     Val1 = Builder.CreateZExt(Val1, Int64Ty);
1289 
1290     Value *ShiftCst = llvm::ConstantInt::get(Int64Ty, 32);
1291     Val = Builder.CreateShl(Val0, ShiftCst, "shl", true /* nuw */);
1292     return Builder.CreateOr(Val, Val1);
1293   }
1294 
1295   if (BuiltinID == ARM::BI__builtin_arm_strexd) {
1296     Function *F = CGM.getIntrinsic(Intrinsic::arm_strexd);
1297     llvm::Type *STy = llvm::StructType::get(Int32Ty, Int32Ty, NULL);
1298 
1299     Value *One = llvm::ConstantInt::get(Int32Ty, 1);
1300     Value *Tmp = Builder.CreateAlloca(Int64Ty, One);
1301     Value *Val = EmitScalarExpr(E->getArg(0));
1302     Builder.CreateStore(Val, Tmp);
1303 
1304     Value *LdPtr = Builder.CreateBitCast(Tmp,llvm::PointerType::getUnqual(STy));
1305     Val = Builder.CreateLoad(LdPtr);
1306 
1307     Value *Arg0 = Builder.CreateExtractValue(Val, 0);
1308     Value *Arg1 = Builder.CreateExtractValue(Val, 1);
1309     Value *StPtr = EmitScalarExpr(E->getArg(1));
1310     return Builder.CreateCall3(F, Arg0, Arg1, StPtr, "strexd");
1311   }
1312 
1313   SmallVector<Value*, 4> Ops;
1314   for (unsigned i = 0, e = E->getNumArgs() - 1; i != e; i++)
1315     Ops.push_back(EmitScalarExpr(E->getArg(i)));
1316 
1317   // vget_lane and vset_lane are not overloaded and do not have an extra
1318   // argument that specifies the vector type.
1319   switch (BuiltinID) {
1320   default: break;
1321   case ARM::BI__builtin_neon_vget_lane_i8:
1322   case ARM::BI__builtin_neon_vget_lane_i16:
1323   case ARM::BI__builtin_neon_vget_lane_i32:
1324   case ARM::BI__builtin_neon_vget_lane_i64:
1325   case ARM::BI__builtin_neon_vget_lane_f32:
1326   case ARM::BI__builtin_neon_vgetq_lane_i8:
1327   case ARM::BI__builtin_neon_vgetq_lane_i16:
1328   case ARM::BI__builtin_neon_vgetq_lane_i32:
1329   case ARM::BI__builtin_neon_vgetq_lane_i64:
1330   case ARM::BI__builtin_neon_vgetq_lane_f32:
1331     return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),
1332                                         "vget_lane");
1333   case ARM::BI__builtin_neon_vset_lane_i8:
1334   case ARM::BI__builtin_neon_vset_lane_i16:
1335   case ARM::BI__builtin_neon_vset_lane_i32:
1336   case ARM::BI__builtin_neon_vset_lane_i64:
1337   case ARM::BI__builtin_neon_vset_lane_f32:
1338   case ARM::BI__builtin_neon_vsetq_lane_i8:
1339   case ARM::BI__builtin_neon_vsetq_lane_i16:
1340   case ARM::BI__builtin_neon_vsetq_lane_i32:
1341   case ARM::BI__builtin_neon_vsetq_lane_i64:
1342   case ARM::BI__builtin_neon_vsetq_lane_f32:
1343     Ops.push_back(EmitScalarExpr(E->getArg(2)));
1344     return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vset_lane");
1345   }
1346 
1347   // Get the last argument, which specifies the vector type.
1348   llvm::APSInt Result;
1349   const Expr *Arg = E->getArg(E->getNumArgs()-1);
1350   if (!Arg->isIntegerConstantExpr(Result, getContext()))
1351     return 0;
1352 
1353   if (BuiltinID == ARM::BI__builtin_arm_vcvtr_f ||
1354       BuiltinID == ARM::BI__builtin_arm_vcvtr_d) {
1355     // Determine the overloaded type of this builtin.
1356     llvm::Type *Ty;
1357     if (BuiltinID == ARM::BI__builtin_arm_vcvtr_f)
1358       Ty = llvm::Type::getFloatTy(getLLVMContext());
1359     else
1360       Ty = llvm::Type::getDoubleTy(getLLVMContext());
1361 
1362     // Determine whether this is an unsigned conversion or not.
1363     bool usgn = Result.getZExtValue() == 1;
1364     unsigned Int = usgn ? Intrinsic::arm_vcvtru : Intrinsic::arm_vcvtr;
1365 
1366     // Call the appropriate intrinsic.
1367     Function *F = CGM.getIntrinsic(Int, Ty);
1368     return Builder.CreateCall(F, Ops, "vcvtr");
1369   }
1370 
1371   // Determine the type of this overloaded NEON intrinsic.
1372   NeonTypeFlags Type(Result.getZExtValue());
1373   bool usgn = Type.isUnsigned();
1374   bool quad = Type.isQuad();
1375   bool rightShift = false;
1376 
1377   llvm::VectorType *VTy = GetNeonType(getLLVMContext(), Type);
1378   llvm::Type *Ty = VTy;
1379   if (!Ty)
1380     return 0;
1381 
1382   unsigned Int;
1383   switch (BuiltinID) {
1384   default: return 0;
1385   case ARM::BI__builtin_neon_vabd_v:
1386   case ARM::BI__builtin_neon_vabdq_v:
1387     Int = usgn ? Intrinsic::arm_neon_vabdu : Intrinsic::arm_neon_vabds;
1388     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vabd");
1389   case ARM::BI__builtin_neon_vabs_v:
1390   case ARM::BI__builtin_neon_vabsq_v:
1391     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vabs, Ty),
1392                         Ops, "vabs");
1393   case ARM::BI__builtin_neon_vaddhn_v:
1394     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vaddhn, Ty),
1395                         Ops, "vaddhn");
1396   case ARM::BI__builtin_neon_vcale_v:
1397     std::swap(Ops[0], Ops[1]);
1398   case ARM::BI__builtin_neon_vcage_v: {
1399     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vacged);
1400     return EmitNeonCall(F, Ops, "vcage");
1401   }
1402   case ARM::BI__builtin_neon_vcaleq_v:
1403     std::swap(Ops[0], Ops[1]);
1404   case ARM::BI__builtin_neon_vcageq_v: {
1405     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vacgeq);
1406     return EmitNeonCall(F, Ops, "vcage");
1407   }
1408   case ARM::BI__builtin_neon_vcalt_v:
1409     std::swap(Ops[0], Ops[1]);
1410   case ARM::BI__builtin_neon_vcagt_v: {
1411     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vacgtd);
1412     return EmitNeonCall(F, Ops, "vcagt");
1413   }
1414   case ARM::BI__builtin_neon_vcaltq_v:
1415     std::swap(Ops[0], Ops[1]);
1416   case ARM::BI__builtin_neon_vcagtq_v: {
1417     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vacgtq);
1418     return EmitNeonCall(F, Ops, "vcagt");
1419   }
1420   case ARM::BI__builtin_neon_vcls_v:
1421   case ARM::BI__builtin_neon_vclsq_v: {
1422     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vcls, Ty);
1423     return EmitNeonCall(F, Ops, "vcls");
1424   }
1425   case ARM::BI__builtin_neon_vclz_v:
1426   case ARM::BI__builtin_neon_vclzq_v: {
1427     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vclz, Ty);
1428     return EmitNeonCall(F, Ops, "vclz");
1429   }
1430   case ARM::BI__builtin_neon_vcnt_v:
1431   case ARM::BI__builtin_neon_vcntq_v: {
1432     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vcnt, Ty);
1433     return EmitNeonCall(F, Ops, "vcnt");
1434   }
1435   case ARM::BI__builtin_neon_vcvt_f16_v: {
1436     assert(Type.getEltType() == NeonTypeFlags::Float16 && !quad &&
1437            "unexpected vcvt_f16_v builtin");
1438     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vcvtfp2hf);
1439     return EmitNeonCall(F, Ops, "vcvt");
1440   }
1441   case ARM::BI__builtin_neon_vcvt_f32_f16: {
1442     assert(Type.getEltType() == NeonTypeFlags::Float16 && !quad &&
1443            "unexpected vcvt_f32_f16 builtin");
1444     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vcvthf2fp);
1445     return EmitNeonCall(F, Ops, "vcvt");
1446   }
1447   case ARM::BI__builtin_neon_vcvt_f32_v:
1448   case ARM::BI__builtin_neon_vcvtq_f32_v:
1449     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1450     Ty = GetNeonType(getLLVMContext(),
1451                      NeonTypeFlags(NeonTypeFlags::Float32, false, quad));
1452     return usgn ? Builder.CreateUIToFP(Ops[0], Ty, "vcvt")
1453                 : Builder.CreateSIToFP(Ops[0], Ty, "vcvt");
1454   case ARM::BI__builtin_neon_vcvt_s32_v:
1455   case ARM::BI__builtin_neon_vcvt_u32_v:
1456   case ARM::BI__builtin_neon_vcvtq_s32_v:
1457   case ARM::BI__builtin_neon_vcvtq_u32_v: {
1458     llvm::Type *FloatTy =
1459       GetNeonType(getLLVMContext(),
1460                   NeonTypeFlags(NeonTypeFlags::Float32, false, quad));
1461     Ops[0] = Builder.CreateBitCast(Ops[0], FloatTy);
1462     return usgn ? Builder.CreateFPToUI(Ops[0], Ty, "vcvt")
1463                 : Builder.CreateFPToSI(Ops[0], Ty, "vcvt");
1464   }
1465   case ARM::BI__builtin_neon_vcvt_n_f32_v:
1466   case ARM::BI__builtin_neon_vcvtq_n_f32_v: {
1467     llvm::Type *FloatTy =
1468       GetNeonType(getLLVMContext(),
1469                   NeonTypeFlags(NeonTypeFlags::Float32, false, quad));
1470     llvm::Type *Tys[2] = { FloatTy, Ty };
1471     Int = usgn ? Intrinsic::arm_neon_vcvtfxu2fp
1472                : Intrinsic::arm_neon_vcvtfxs2fp;
1473     Function *F = CGM.getIntrinsic(Int, Tys);
1474     return EmitNeonCall(F, Ops, "vcvt_n");
1475   }
1476   case ARM::BI__builtin_neon_vcvt_n_s32_v:
1477   case ARM::BI__builtin_neon_vcvt_n_u32_v:
1478   case ARM::BI__builtin_neon_vcvtq_n_s32_v:
1479   case ARM::BI__builtin_neon_vcvtq_n_u32_v: {
1480     llvm::Type *FloatTy =
1481       GetNeonType(getLLVMContext(),
1482                   NeonTypeFlags(NeonTypeFlags::Float32, false, quad));
1483     llvm::Type *Tys[2] = { Ty, FloatTy };
1484     Int = usgn ? Intrinsic::arm_neon_vcvtfp2fxu
1485                : Intrinsic::arm_neon_vcvtfp2fxs;
1486     Function *F = CGM.getIntrinsic(Int, Tys);
1487     return EmitNeonCall(F, Ops, "vcvt_n");
1488   }
1489   case ARM::BI__builtin_neon_vext_v:
1490   case ARM::BI__builtin_neon_vextq_v: {
1491     int CV = cast<ConstantInt>(Ops[2])->getSExtValue();
1492     SmallVector<Constant*, 16> Indices;
1493     for (unsigned i = 0, e = VTy->getNumElements(); i != e; ++i)
1494       Indices.push_back(ConstantInt::get(Int32Ty, i+CV));
1495 
1496     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1497     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
1498     Value *SV = llvm::ConstantVector::get(Indices);
1499     return Builder.CreateShuffleVector(Ops[0], Ops[1], SV, "vext");
1500   }
1501   case ARM::BI__builtin_neon_vhadd_v:
1502   case ARM::BI__builtin_neon_vhaddq_v:
1503     Int = usgn ? Intrinsic::arm_neon_vhaddu : Intrinsic::arm_neon_vhadds;
1504     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vhadd");
1505   case ARM::BI__builtin_neon_vhsub_v:
1506   case ARM::BI__builtin_neon_vhsubq_v:
1507     Int = usgn ? Intrinsic::arm_neon_vhsubu : Intrinsic::arm_neon_vhsubs;
1508     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vhsub");
1509   case ARM::BI__builtin_neon_vld1_v:
1510   case ARM::BI__builtin_neon_vld1q_v:
1511     Ops.push_back(GetPointeeAlignment(*this, E->getArg(0)));
1512     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vld1, Ty),
1513                         Ops, "vld1");
1514   case ARM::BI__builtin_neon_vld1_lane_v:
1515   case ARM::BI__builtin_neon_vld1q_lane_v:
1516     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
1517     Ty = llvm::PointerType::getUnqual(VTy->getElementType());
1518     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1519     Ops[0] = Builder.CreateLoad(Ops[0]);
1520     return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vld1_lane");
1521   case ARM::BI__builtin_neon_vld1_dup_v:
1522   case ARM::BI__builtin_neon_vld1q_dup_v: {
1523     Value *V = UndefValue::get(Ty);
1524     Ty = llvm::PointerType::getUnqual(VTy->getElementType());
1525     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1526     Ops[0] = Builder.CreateLoad(Ops[0]);
1527     llvm::Constant *CI = ConstantInt::get(Int32Ty, 0);
1528     Ops[0] = Builder.CreateInsertElement(V, Ops[0], CI);
1529     return EmitNeonSplat(Ops[0], CI);
1530   }
1531   case ARM::BI__builtin_neon_vld2_v:
1532   case ARM::BI__builtin_neon_vld2q_v: {
1533     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld2, Ty);
1534     Value *Align = GetPointeeAlignment(*this, E->getArg(1));
1535     Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld2");
1536     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
1537     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1538     return Builder.CreateStore(Ops[1], Ops[0]);
1539   }
1540   case ARM::BI__builtin_neon_vld3_v:
1541   case ARM::BI__builtin_neon_vld3q_v: {
1542     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld3, Ty);
1543     Value *Align = GetPointeeAlignment(*this, E->getArg(1));
1544     Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld3");
1545     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
1546     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1547     return Builder.CreateStore(Ops[1], Ops[0]);
1548   }
1549   case ARM::BI__builtin_neon_vld4_v:
1550   case ARM::BI__builtin_neon_vld4q_v: {
1551     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld4, Ty);
1552     Value *Align = GetPointeeAlignment(*this, E->getArg(1));
1553     Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld4");
1554     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
1555     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1556     return Builder.CreateStore(Ops[1], Ops[0]);
1557   }
1558   case ARM::BI__builtin_neon_vld2_lane_v:
1559   case ARM::BI__builtin_neon_vld2q_lane_v: {
1560     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld2lane, Ty);
1561     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
1562     Ops[3] = Builder.CreateBitCast(Ops[3], Ty);
1563     Ops.push_back(GetPointeeAlignment(*this, E->getArg(1)));
1564     Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld2_lane");
1565     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
1566     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1567     return Builder.CreateStore(Ops[1], Ops[0]);
1568   }
1569   case ARM::BI__builtin_neon_vld3_lane_v:
1570   case ARM::BI__builtin_neon_vld3q_lane_v: {
1571     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld3lane, Ty);
1572     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
1573     Ops[3] = Builder.CreateBitCast(Ops[3], Ty);
1574     Ops[4] = Builder.CreateBitCast(Ops[4], Ty);
1575     Ops.push_back(GetPointeeAlignment(*this, E->getArg(1)));
1576     Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld3_lane");
1577     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
1578     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1579     return Builder.CreateStore(Ops[1], Ops[0]);
1580   }
1581   case ARM::BI__builtin_neon_vld4_lane_v:
1582   case ARM::BI__builtin_neon_vld4q_lane_v: {
1583     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld4lane, Ty);
1584     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
1585     Ops[3] = Builder.CreateBitCast(Ops[3], Ty);
1586     Ops[4] = Builder.CreateBitCast(Ops[4], Ty);
1587     Ops[5] = Builder.CreateBitCast(Ops[5], Ty);
1588     Ops.push_back(GetPointeeAlignment(*this, E->getArg(1)));
1589     Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld3_lane");
1590     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
1591     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1592     return Builder.CreateStore(Ops[1], Ops[0]);
1593   }
1594   case ARM::BI__builtin_neon_vld2_dup_v:
1595   case ARM::BI__builtin_neon_vld3_dup_v:
1596   case ARM::BI__builtin_neon_vld4_dup_v: {
1597     // Handle 64-bit elements as a special-case.  There is no "dup" needed.
1598     if (VTy->getElementType()->getPrimitiveSizeInBits() == 64) {
1599       switch (BuiltinID) {
1600       case ARM::BI__builtin_neon_vld2_dup_v:
1601         Int = Intrinsic::arm_neon_vld2;
1602         break;
1603       case ARM::BI__builtin_neon_vld3_dup_v:
1604         Int = Intrinsic::arm_neon_vld2;
1605         break;
1606       case ARM::BI__builtin_neon_vld4_dup_v:
1607         Int = Intrinsic::arm_neon_vld2;
1608         break;
1609       default: llvm_unreachable("unknown vld_dup intrinsic?");
1610       }
1611       Function *F = CGM.getIntrinsic(Int, Ty);
1612       Value *Align = GetPointeeAlignment(*this, E->getArg(1));
1613       Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld_dup");
1614       Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
1615       Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1616       return Builder.CreateStore(Ops[1], Ops[0]);
1617     }
1618     switch (BuiltinID) {
1619     case ARM::BI__builtin_neon_vld2_dup_v:
1620       Int = Intrinsic::arm_neon_vld2lane;
1621       break;
1622     case ARM::BI__builtin_neon_vld3_dup_v:
1623       Int = Intrinsic::arm_neon_vld2lane;
1624       break;
1625     case ARM::BI__builtin_neon_vld4_dup_v:
1626       Int = Intrinsic::arm_neon_vld2lane;
1627       break;
1628     default: llvm_unreachable("unknown vld_dup intrinsic?");
1629     }
1630     Function *F = CGM.getIntrinsic(Int, Ty);
1631     llvm::StructType *STy = cast<llvm::StructType>(F->getReturnType());
1632 
1633     SmallVector<Value*, 6> Args;
1634     Args.push_back(Ops[1]);
1635     Args.append(STy->getNumElements(), UndefValue::get(Ty));
1636 
1637     llvm::Constant *CI = ConstantInt::get(Int32Ty, 0);
1638     Args.push_back(CI);
1639     Args.push_back(GetPointeeAlignment(*this, E->getArg(1)));
1640 
1641     Ops[1] = Builder.CreateCall(F, Args, "vld_dup");
1642     // splat lane 0 to all elts in each vector of the result.
1643     for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
1644       Value *Val = Builder.CreateExtractValue(Ops[1], i);
1645       Value *Elt = Builder.CreateBitCast(Val, Ty);
1646       Elt = EmitNeonSplat(Elt, CI);
1647       Elt = Builder.CreateBitCast(Elt, Val->getType());
1648       Ops[1] = Builder.CreateInsertValue(Ops[1], Elt, i);
1649     }
1650     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
1651     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1652     return Builder.CreateStore(Ops[1], Ops[0]);
1653   }
1654   case ARM::BI__builtin_neon_vmax_v:
1655   case ARM::BI__builtin_neon_vmaxq_v:
1656     Int = usgn ? Intrinsic::arm_neon_vmaxu : Intrinsic::arm_neon_vmaxs;
1657     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmax");
1658   case ARM::BI__builtin_neon_vmin_v:
1659   case ARM::BI__builtin_neon_vminq_v:
1660     Int = usgn ? Intrinsic::arm_neon_vminu : Intrinsic::arm_neon_vmins;
1661     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmin");
1662   case ARM::BI__builtin_neon_vmovl_v: {
1663     llvm::Type *DTy =llvm::VectorType::getTruncatedElementVectorType(VTy);
1664     Ops[0] = Builder.CreateBitCast(Ops[0], DTy);
1665     if (usgn)
1666       return Builder.CreateZExt(Ops[0], Ty, "vmovl");
1667     return Builder.CreateSExt(Ops[0], Ty, "vmovl");
1668   }
1669   case ARM::BI__builtin_neon_vmovn_v: {
1670     llvm::Type *QTy = llvm::VectorType::getExtendedElementVectorType(VTy);
1671     Ops[0] = Builder.CreateBitCast(Ops[0], QTy);
1672     return Builder.CreateTrunc(Ops[0], Ty, "vmovn");
1673   }
1674   case ARM::BI__builtin_neon_vmul_v:
1675   case ARM::BI__builtin_neon_vmulq_v:
1676     assert(Type.isPoly() && "vmul builtin only supported for polynomial types");
1677     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vmulp, Ty),
1678                         Ops, "vmul");
1679   case ARM::BI__builtin_neon_vmull_v:
1680     Int = usgn ? Intrinsic::arm_neon_vmullu : Intrinsic::arm_neon_vmulls;
1681     Int = Type.isPoly() ? (unsigned)Intrinsic::arm_neon_vmullp : Int;
1682     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmull");
1683   case ARM::BI__builtin_neon_vpadal_v:
1684   case ARM::BI__builtin_neon_vpadalq_v: {
1685     Int = usgn ? Intrinsic::arm_neon_vpadalu : Intrinsic::arm_neon_vpadals;
1686     // The source operand type has twice as many elements of half the size.
1687     unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits();
1688     llvm::Type *EltTy =
1689       llvm::IntegerType::get(getLLVMContext(), EltBits / 2);
1690     llvm::Type *NarrowTy =
1691       llvm::VectorType::get(EltTy, VTy->getNumElements() * 2);
1692     llvm::Type *Tys[2] = { Ty, NarrowTy };
1693     return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vpadal");
1694   }
1695   case ARM::BI__builtin_neon_vpadd_v:
1696     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vpadd, Ty),
1697                         Ops, "vpadd");
1698   case ARM::BI__builtin_neon_vpaddl_v:
1699   case ARM::BI__builtin_neon_vpaddlq_v: {
1700     Int = usgn ? Intrinsic::arm_neon_vpaddlu : Intrinsic::arm_neon_vpaddls;
1701     // The source operand type has twice as many elements of half the size.
1702     unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits();
1703     llvm::Type *EltTy = llvm::IntegerType::get(getLLVMContext(), EltBits / 2);
1704     llvm::Type *NarrowTy =
1705       llvm::VectorType::get(EltTy, VTy->getNumElements() * 2);
1706     llvm::Type *Tys[2] = { Ty, NarrowTy };
1707     return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vpaddl");
1708   }
1709   case ARM::BI__builtin_neon_vpmax_v:
1710     Int = usgn ? Intrinsic::arm_neon_vpmaxu : Intrinsic::arm_neon_vpmaxs;
1711     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpmax");
1712   case ARM::BI__builtin_neon_vpmin_v:
1713     Int = usgn ? Intrinsic::arm_neon_vpminu : Intrinsic::arm_neon_vpmins;
1714     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpmin");
1715   case ARM::BI__builtin_neon_vqabs_v:
1716   case ARM::BI__builtin_neon_vqabsq_v:
1717     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqabs, Ty),
1718                         Ops, "vqabs");
1719   case ARM::BI__builtin_neon_vqadd_v:
1720   case ARM::BI__builtin_neon_vqaddq_v:
1721     Int = usgn ? Intrinsic::arm_neon_vqaddu : Intrinsic::arm_neon_vqadds;
1722     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqadd");
1723   case ARM::BI__builtin_neon_vqdmlal_v:
1724     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmlal, Ty),
1725                         Ops, "vqdmlal");
1726   case ARM::BI__builtin_neon_vqdmlsl_v:
1727     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmlsl, Ty),
1728                         Ops, "vqdmlsl");
1729   case ARM::BI__builtin_neon_vqdmulh_v:
1730   case ARM::BI__builtin_neon_vqdmulhq_v:
1731     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmulh, Ty),
1732                         Ops, "vqdmulh");
1733   case ARM::BI__builtin_neon_vqdmull_v:
1734     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmull, Ty),
1735                         Ops, "vqdmull");
1736   case ARM::BI__builtin_neon_vqmovn_v:
1737     Int = usgn ? Intrinsic::arm_neon_vqmovnu : Intrinsic::arm_neon_vqmovns;
1738     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqmovn");
1739   case ARM::BI__builtin_neon_vqmovun_v:
1740     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqmovnsu, Ty),
1741                         Ops, "vqdmull");
1742   case ARM::BI__builtin_neon_vqneg_v:
1743   case ARM::BI__builtin_neon_vqnegq_v:
1744     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqneg, Ty),
1745                         Ops, "vqneg");
1746   case ARM::BI__builtin_neon_vqrdmulh_v:
1747   case ARM::BI__builtin_neon_vqrdmulhq_v:
1748     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqrdmulh, Ty),
1749                         Ops, "vqrdmulh");
1750   case ARM::BI__builtin_neon_vqrshl_v:
1751   case ARM::BI__builtin_neon_vqrshlq_v:
1752     Int = usgn ? Intrinsic::arm_neon_vqrshiftu : Intrinsic::arm_neon_vqrshifts;
1753     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqrshl");
1754   case ARM::BI__builtin_neon_vqrshrn_n_v:
1755     Int = usgn ? Intrinsic::arm_neon_vqrshiftnu : Intrinsic::arm_neon_vqrshiftns;
1756     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqrshrn_n",
1757                         1, true);
1758   case ARM::BI__builtin_neon_vqrshrun_n_v:
1759     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqrshiftnsu, Ty),
1760                         Ops, "vqrshrun_n", 1, true);
1761   case ARM::BI__builtin_neon_vqshl_v:
1762   case ARM::BI__builtin_neon_vqshlq_v:
1763     Int = usgn ? Intrinsic::arm_neon_vqshiftu : Intrinsic::arm_neon_vqshifts;
1764     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshl");
1765   case ARM::BI__builtin_neon_vqshl_n_v:
1766   case ARM::BI__builtin_neon_vqshlq_n_v:
1767     Int = usgn ? Intrinsic::arm_neon_vqshiftu : Intrinsic::arm_neon_vqshifts;
1768     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshl_n",
1769                         1, false);
1770   case ARM::BI__builtin_neon_vqshlu_n_v:
1771   case ARM::BI__builtin_neon_vqshluq_n_v:
1772     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqshiftsu, Ty),
1773                         Ops, "vqshlu", 1, false);
1774   case ARM::BI__builtin_neon_vqshrn_n_v:
1775     Int = usgn ? Intrinsic::arm_neon_vqshiftnu : Intrinsic::arm_neon_vqshiftns;
1776     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshrn_n",
1777                         1, true);
1778   case ARM::BI__builtin_neon_vqshrun_n_v:
1779     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqshiftnsu, Ty),
1780                         Ops, "vqshrun_n", 1, true);
1781   case ARM::BI__builtin_neon_vqsub_v:
1782   case ARM::BI__builtin_neon_vqsubq_v:
1783     Int = usgn ? Intrinsic::arm_neon_vqsubu : Intrinsic::arm_neon_vqsubs;
1784     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqsub");
1785   case ARM::BI__builtin_neon_vraddhn_v:
1786     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vraddhn, Ty),
1787                         Ops, "vraddhn");
1788   case ARM::BI__builtin_neon_vrecpe_v:
1789   case ARM::BI__builtin_neon_vrecpeq_v:
1790     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrecpe, Ty),
1791                         Ops, "vrecpe");
1792   case ARM::BI__builtin_neon_vrecps_v:
1793   case ARM::BI__builtin_neon_vrecpsq_v:
1794     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrecps, Ty),
1795                         Ops, "vrecps");
1796   case ARM::BI__builtin_neon_vrhadd_v:
1797   case ARM::BI__builtin_neon_vrhaddq_v:
1798     Int = usgn ? Intrinsic::arm_neon_vrhaddu : Intrinsic::arm_neon_vrhadds;
1799     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrhadd");
1800   case ARM::BI__builtin_neon_vrshl_v:
1801   case ARM::BI__builtin_neon_vrshlq_v:
1802     Int = usgn ? Intrinsic::arm_neon_vrshiftu : Intrinsic::arm_neon_vrshifts;
1803     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrshl");
1804   case ARM::BI__builtin_neon_vrshrn_n_v:
1805     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrshiftn, Ty),
1806                         Ops, "vrshrn_n", 1, true);
1807   case ARM::BI__builtin_neon_vrshr_n_v:
1808   case ARM::BI__builtin_neon_vrshrq_n_v:
1809     Int = usgn ? Intrinsic::arm_neon_vrshiftu : Intrinsic::arm_neon_vrshifts;
1810     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrshr_n", 1, true);
1811   case ARM::BI__builtin_neon_vrsqrte_v:
1812   case ARM::BI__builtin_neon_vrsqrteq_v:
1813     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrsqrte, Ty),
1814                         Ops, "vrsqrte");
1815   case ARM::BI__builtin_neon_vrsqrts_v:
1816   case ARM::BI__builtin_neon_vrsqrtsq_v:
1817     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrsqrts, Ty),
1818                         Ops, "vrsqrts");
1819   case ARM::BI__builtin_neon_vrsra_n_v:
1820   case ARM::BI__builtin_neon_vrsraq_n_v:
1821     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1822     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
1823     Ops[2] = EmitNeonShiftVector(Ops[2], Ty, true);
1824     Int = usgn ? Intrinsic::arm_neon_vrshiftu : Intrinsic::arm_neon_vrshifts;
1825     Ops[1] = Builder.CreateCall2(CGM.getIntrinsic(Int, Ty), Ops[1], Ops[2]);
1826     return Builder.CreateAdd(Ops[0], Ops[1], "vrsra_n");
1827   case ARM::BI__builtin_neon_vrsubhn_v:
1828     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrsubhn, Ty),
1829                         Ops, "vrsubhn");
1830   case ARM::BI__builtin_neon_vshl_v:
1831   case ARM::BI__builtin_neon_vshlq_v:
1832     Int = usgn ? Intrinsic::arm_neon_vshiftu : Intrinsic::arm_neon_vshifts;
1833     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vshl");
1834   case ARM::BI__builtin_neon_vshll_n_v:
1835     Int = usgn ? Intrinsic::arm_neon_vshiftlu : Intrinsic::arm_neon_vshiftls;
1836     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vshll", 1);
1837   case ARM::BI__builtin_neon_vshl_n_v:
1838   case ARM::BI__builtin_neon_vshlq_n_v:
1839     Ops[1] = EmitNeonShiftVector(Ops[1], Ty, false);
1840     return Builder.CreateShl(Builder.CreateBitCast(Ops[0],Ty), Ops[1], "vshl_n");
1841   case ARM::BI__builtin_neon_vshrn_n_v:
1842     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vshiftn, Ty),
1843                         Ops, "vshrn_n", 1, true);
1844   case ARM::BI__builtin_neon_vshr_n_v:
1845   case ARM::BI__builtin_neon_vshrq_n_v:
1846     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1847     Ops[1] = EmitNeonShiftVector(Ops[1], Ty, false);
1848     if (usgn)
1849       return Builder.CreateLShr(Ops[0], Ops[1], "vshr_n");
1850     else
1851       return Builder.CreateAShr(Ops[0], Ops[1], "vshr_n");
1852   case ARM::BI__builtin_neon_vsri_n_v:
1853   case ARM::BI__builtin_neon_vsriq_n_v:
1854     rightShift = true;
1855   case ARM::BI__builtin_neon_vsli_n_v:
1856   case ARM::BI__builtin_neon_vsliq_n_v:
1857     Ops[2] = EmitNeonShiftVector(Ops[2], Ty, rightShift);
1858     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vshiftins, Ty),
1859                         Ops, "vsli_n");
1860   case ARM::BI__builtin_neon_vsra_n_v:
1861   case ARM::BI__builtin_neon_vsraq_n_v:
1862     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1863     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
1864     Ops[2] = EmitNeonShiftVector(Ops[2], Ty, false);
1865     if (usgn)
1866       Ops[1] = Builder.CreateLShr(Ops[1], Ops[2], "vsra_n");
1867     else
1868       Ops[1] = Builder.CreateAShr(Ops[1], Ops[2], "vsra_n");
1869     return Builder.CreateAdd(Ops[0], Ops[1]);
1870   case ARM::BI__builtin_neon_vst1_v:
1871   case ARM::BI__builtin_neon_vst1q_v:
1872     Ops.push_back(GetPointeeAlignment(*this, E->getArg(0)));
1873     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst1, Ty),
1874                         Ops, "");
1875   case ARM::BI__builtin_neon_vst1_lane_v:
1876   case ARM::BI__builtin_neon_vst1q_lane_v:
1877     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
1878     Ops[1] = Builder.CreateExtractElement(Ops[1], Ops[2]);
1879     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
1880     return Builder.CreateStore(Ops[1], Builder.CreateBitCast(Ops[0], Ty));
1881   case ARM::BI__builtin_neon_vst2_v:
1882   case ARM::BI__builtin_neon_vst2q_v:
1883     Ops.push_back(GetPointeeAlignment(*this, E->getArg(0)));
1884     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst2, Ty),
1885                         Ops, "");
1886   case ARM::BI__builtin_neon_vst2_lane_v:
1887   case ARM::BI__builtin_neon_vst2q_lane_v:
1888     Ops.push_back(GetPointeeAlignment(*this, E->getArg(0)));
1889     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst2lane, Ty),
1890                         Ops, "");
1891   case ARM::BI__builtin_neon_vst3_v:
1892   case ARM::BI__builtin_neon_vst3q_v:
1893     Ops.push_back(GetPointeeAlignment(*this, E->getArg(0)));
1894     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst3, Ty),
1895                         Ops, "");
1896   case ARM::BI__builtin_neon_vst3_lane_v:
1897   case ARM::BI__builtin_neon_vst3q_lane_v:
1898     Ops.push_back(GetPointeeAlignment(*this, E->getArg(0)));
1899     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst3lane, Ty),
1900                         Ops, "");
1901   case ARM::BI__builtin_neon_vst4_v:
1902   case ARM::BI__builtin_neon_vst4q_v:
1903     Ops.push_back(GetPointeeAlignment(*this, E->getArg(0)));
1904     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst4, Ty),
1905                         Ops, "");
1906   case ARM::BI__builtin_neon_vst4_lane_v:
1907   case ARM::BI__builtin_neon_vst4q_lane_v:
1908     Ops.push_back(GetPointeeAlignment(*this, E->getArg(0)));
1909     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst4lane, Ty),
1910                         Ops, "");
1911   case ARM::BI__builtin_neon_vsubhn_v:
1912     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vsubhn, Ty),
1913                         Ops, "vsubhn");
1914   case ARM::BI__builtin_neon_vtbl1_v:
1915     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl1),
1916                         Ops, "vtbl1");
1917   case ARM::BI__builtin_neon_vtbl2_v:
1918     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl2),
1919                         Ops, "vtbl2");
1920   case ARM::BI__builtin_neon_vtbl3_v:
1921     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl3),
1922                         Ops, "vtbl3");
1923   case ARM::BI__builtin_neon_vtbl4_v:
1924     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl4),
1925                         Ops, "vtbl4");
1926   case ARM::BI__builtin_neon_vtbx1_v:
1927     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx1),
1928                         Ops, "vtbx1");
1929   case ARM::BI__builtin_neon_vtbx2_v:
1930     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx2),
1931                         Ops, "vtbx2");
1932   case ARM::BI__builtin_neon_vtbx3_v:
1933     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx3),
1934                         Ops, "vtbx3");
1935   case ARM::BI__builtin_neon_vtbx4_v:
1936     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx4),
1937                         Ops, "vtbx4");
1938   case ARM::BI__builtin_neon_vtst_v:
1939   case ARM::BI__builtin_neon_vtstq_v: {
1940     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
1941     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
1942     Ops[0] = Builder.CreateAnd(Ops[0], Ops[1]);
1943     Ops[0] = Builder.CreateICmp(ICmpInst::ICMP_NE, Ops[0],
1944                                 ConstantAggregateZero::get(Ty));
1945     return Builder.CreateSExt(Ops[0], Ty, "vtst");
1946   }
1947   case ARM::BI__builtin_neon_vtrn_v:
1948   case ARM::BI__builtin_neon_vtrnq_v: {
1949     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty));
1950     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
1951     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
1952     Value *SV = 0;
1953 
1954     for (unsigned vi = 0; vi != 2; ++vi) {
1955       SmallVector<Constant*, 16> Indices;
1956       for (unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) {
1957         Indices.push_back(Builder.getInt32(i+vi));
1958         Indices.push_back(Builder.getInt32(i+e+vi));
1959       }
1960       Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ops[0], vi);
1961       SV = llvm::ConstantVector::get(Indices);
1962       SV = Builder.CreateShuffleVector(Ops[1], Ops[2], SV, "vtrn");
1963       SV = Builder.CreateStore(SV, Addr);
1964     }
1965     return SV;
1966   }
1967   case ARM::BI__builtin_neon_vuzp_v:
1968   case ARM::BI__builtin_neon_vuzpq_v: {
1969     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty));
1970     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
1971     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
1972     Value *SV = 0;
1973 
1974     for (unsigned vi = 0; vi != 2; ++vi) {
1975       SmallVector<Constant*, 16> Indices;
1976       for (unsigned i = 0, e = VTy->getNumElements(); i != e; ++i)
1977         Indices.push_back(ConstantInt::get(Int32Ty, 2*i+vi));
1978 
1979       Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ops[0], vi);
1980       SV = llvm::ConstantVector::get(Indices);
1981       SV = Builder.CreateShuffleVector(Ops[1], Ops[2], SV, "vuzp");
1982       SV = Builder.CreateStore(SV, Addr);
1983     }
1984     return SV;
1985   }
1986   case ARM::BI__builtin_neon_vzip_v:
1987   case ARM::BI__builtin_neon_vzipq_v: {
1988     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty));
1989     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
1990     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
1991     Value *SV = 0;
1992 
1993     for (unsigned vi = 0; vi != 2; ++vi) {
1994       SmallVector<Constant*, 16> Indices;
1995       for (unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) {
1996         Indices.push_back(ConstantInt::get(Int32Ty, (i + vi*e) >> 1));
1997         Indices.push_back(ConstantInt::get(Int32Ty, ((i + vi*e) >> 1)+e));
1998       }
1999       Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ops[0], vi);
2000       SV = llvm::ConstantVector::get(Indices);
2001       SV = Builder.CreateShuffleVector(Ops[1], Ops[2], SV, "vzip");
2002       SV = Builder.CreateStore(SV, Addr);
2003     }
2004     return SV;
2005   }
2006   }
2007 }
2008 
2009 llvm::Value *CodeGenFunction::
2010 BuildVector(const SmallVectorImpl<llvm::Value*> &Ops) {
2011   assert((Ops.size() & (Ops.size() - 1)) == 0 &&
2012          "Not a power-of-two sized vector!");
2013   bool AllConstants = true;
2014   for (unsigned i = 0, e = Ops.size(); i != e && AllConstants; ++i)
2015     AllConstants &= isa<Constant>(Ops[i]);
2016 
2017   // If this is a constant vector, create a ConstantVector.
2018   if (AllConstants) {
2019     SmallVector<llvm::Constant*, 16> CstOps;
2020     for (unsigned i = 0, e = Ops.size(); i != e; ++i)
2021       CstOps.push_back(cast<Constant>(Ops[i]));
2022     return llvm::ConstantVector::get(CstOps);
2023   }
2024 
2025   // Otherwise, insertelement the values to build the vector.
2026   Value *Result =
2027     llvm::UndefValue::get(llvm::VectorType::get(Ops[0]->getType(), Ops.size()));
2028 
2029   for (unsigned i = 0, e = Ops.size(); i != e; ++i)
2030     Result = Builder.CreateInsertElement(Result, Ops[i], Builder.getInt32(i));
2031 
2032   return Result;
2033 }
2034 
2035 Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
2036                                            const CallExpr *E) {
2037   SmallVector<Value*, 4> Ops;
2038 
2039   // Find out if any arguments are required to be integer constant expressions.
2040   unsigned ICEArguments = 0;
2041   ASTContext::GetBuiltinTypeError Error;
2042   getContext().GetBuiltinType(BuiltinID, Error, &ICEArguments);
2043   assert(Error == ASTContext::GE_None && "Should not codegen an error");
2044 
2045   for (unsigned i = 0, e = E->getNumArgs(); i != e; i++) {
2046     // If this is a normal argument, just emit it as a scalar.
2047     if ((ICEArguments & (1 << i)) == 0) {
2048       Ops.push_back(EmitScalarExpr(E->getArg(i)));
2049       continue;
2050     }
2051 
2052     // If this is required to be a constant, constant fold it so that we know
2053     // that the generated intrinsic gets a ConstantInt.
2054     llvm::APSInt Result;
2055     bool IsConst = E->getArg(i)->isIntegerConstantExpr(Result, getContext());
2056     assert(IsConst && "Constant arg isn't actually constant?"); (void)IsConst;
2057     Ops.push_back(llvm::ConstantInt::get(getLLVMContext(), Result));
2058   }
2059 
2060   switch (BuiltinID) {
2061   default: return 0;
2062   case X86::BI__builtin_clzs: {
2063     Value *ArgValue = EmitScalarExpr(E->getArg(0));
2064 
2065     llvm::Type *ArgType = ArgValue->getType();
2066     Value *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType);
2067 
2068     llvm::Type *ResultType = ConvertType(E->getType());
2069     Value *Result = Builder.CreateCall2(F, ArgValue, Builder.getTrue());
2070     if (Result->getType() != ResultType)
2071       Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true,
2072                                      "cast");
2073     return Result;
2074   }
2075   case X86::BI__builtin_ctzs: {
2076     Value *ArgValue = EmitScalarExpr(E->getArg(0));
2077 
2078     llvm::Type *ArgType = ArgValue->getType();
2079     Value *F = CGM.getIntrinsic(Intrinsic::cttz, ArgType);
2080 
2081     llvm::Type *ResultType = ConvertType(E->getType());
2082     Value *Result = Builder.CreateCall2(F, ArgValue, Builder.getTrue());
2083     if (Result->getType() != ResultType)
2084       Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true,
2085                                      "cast");
2086     return Result;
2087   }
2088   case X86::BI__builtin_ia32_pslldi128:
2089   case X86::BI__builtin_ia32_psllqi128:
2090   case X86::BI__builtin_ia32_psllwi128:
2091   case X86::BI__builtin_ia32_psradi128:
2092   case X86::BI__builtin_ia32_psrawi128:
2093   case X86::BI__builtin_ia32_psrldi128:
2094   case X86::BI__builtin_ia32_psrlqi128:
2095   case X86::BI__builtin_ia32_psrlwi128: {
2096     Ops[1] = Builder.CreateZExt(Ops[1], Int64Ty, "zext");
2097     llvm::Type *Ty = llvm::VectorType::get(Int64Ty, 2);
2098     llvm::Value *Zero = llvm::ConstantInt::get(Int32Ty, 0);
2099     Ops[1] = Builder.CreateInsertElement(llvm::UndefValue::get(Ty),
2100                                          Ops[1], Zero, "insert");
2101     Ops[1] = Builder.CreateBitCast(Ops[1], Ops[0]->getType(), "bitcast");
2102     const char *name = 0;
2103     Intrinsic::ID ID = Intrinsic::not_intrinsic;
2104 
2105     switch (BuiltinID) {
2106     default: llvm_unreachable("Unsupported shift intrinsic!");
2107     case X86::BI__builtin_ia32_pslldi128:
2108       name = "pslldi";
2109       ID = Intrinsic::x86_sse2_psll_d;
2110       break;
2111     case X86::BI__builtin_ia32_psllqi128:
2112       name = "psllqi";
2113       ID = Intrinsic::x86_sse2_psll_q;
2114       break;
2115     case X86::BI__builtin_ia32_psllwi128:
2116       name = "psllwi";
2117       ID = Intrinsic::x86_sse2_psll_w;
2118       break;
2119     case X86::BI__builtin_ia32_psradi128:
2120       name = "psradi";
2121       ID = Intrinsic::x86_sse2_psra_d;
2122       break;
2123     case X86::BI__builtin_ia32_psrawi128:
2124       name = "psrawi";
2125       ID = Intrinsic::x86_sse2_psra_w;
2126       break;
2127     case X86::BI__builtin_ia32_psrldi128:
2128       name = "psrldi";
2129       ID = Intrinsic::x86_sse2_psrl_d;
2130       break;
2131     case X86::BI__builtin_ia32_psrlqi128:
2132       name = "psrlqi";
2133       ID = Intrinsic::x86_sse2_psrl_q;
2134       break;
2135     case X86::BI__builtin_ia32_psrlwi128:
2136       name = "psrlwi";
2137       ID = Intrinsic::x86_sse2_psrl_w;
2138       break;
2139     }
2140     llvm::Function *F = CGM.getIntrinsic(ID);
2141     return Builder.CreateCall(F, Ops, name);
2142   }
2143   case X86::BI__builtin_ia32_vec_init_v8qi:
2144   case X86::BI__builtin_ia32_vec_init_v4hi:
2145   case X86::BI__builtin_ia32_vec_init_v2si:
2146     return Builder.CreateBitCast(BuildVector(Ops),
2147                                  llvm::Type::getX86_MMXTy(getLLVMContext()));
2148   case X86::BI__builtin_ia32_vec_ext_v2si:
2149     return Builder.CreateExtractElement(Ops[0],
2150                                   llvm::ConstantInt::get(Ops[1]->getType(), 0));
2151   case X86::BI__builtin_ia32_pslldi:
2152   case X86::BI__builtin_ia32_psllqi:
2153   case X86::BI__builtin_ia32_psllwi:
2154   case X86::BI__builtin_ia32_psradi:
2155   case X86::BI__builtin_ia32_psrawi:
2156   case X86::BI__builtin_ia32_psrldi:
2157   case X86::BI__builtin_ia32_psrlqi:
2158   case X86::BI__builtin_ia32_psrlwi: {
2159     Ops[1] = Builder.CreateZExt(Ops[1], Int64Ty, "zext");
2160     llvm::Type *Ty = llvm::VectorType::get(Int64Ty, 1);
2161     Ops[1] = Builder.CreateBitCast(Ops[1], Ty, "bitcast");
2162     const char *name = 0;
2163     Intrinsic::ID ID = Intrinsic::not_intrinsic;
2164 
2165     switch (BuiltinID) {
2166     default: llvm_unreachable("Unsupported shift intrinsic!");
2167     case X86::BI__builtin_ia32_pslldi:
2168       name = "pslldi";
2169       ID = Intrinsic::x86_mmx_psll_d;
2170       break;
2171     case X86::BI__builtin_ia32_psllqi:
2172       name = "psllqi";
2173       ID = Intrinsic::x86_mmx_psll_q;
2174       break;
2175     case X86::BI__builtin_ia32_psllwi:
2176       name = "psllwi";
2177       ID = Intrinsic::x86_mmx_psll_w;
2178       break;
2179     case X86::BI__builtin_ia32_psradi:
2180       name = "psradi";
2181       ID = Intrinsic::x86_mmx_psra_d;
2182       break;
2183     case X86::BI__builtin_ia32_psrawi:
2184       name = "psrawi";
2185       ID = Intrinsic::x86_mmx_psra_w;
2186       break;
2187     case X86::BI__builtin_ia32_psrldi:
2188       name = "psrldi";
2189       ID = Intrinsic::x86_mmx_psrl_d;
2190       break;
2191     case X86::BI__builtin_ia32_psrlqi:
2192       name = "psrlqi";
2193       ID = Intrinsic::x86_mmx_psrl_q;
2194       break;
2195     case X86::BI__builtin_ia32_psrlwi:
2196       name = "psrlwi";
2197       ID = Intrinsic::x86_mmx_psrl_w;
2198       break;
2199     }
2200     llvm::Function *F = CGM.getIntrinsic(ID);
2201     return Builder.CreateCall(F, Ops, name);
2202   }
2203   case X86::BI__builtin_ia32_cmpps: {
2204     llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse_cmp_ps);
2205     return Builder.CreateCall(F, Ops, "cmpps");
2206   }
2207   case X86::BI__builtin_ia32_cmpss: {
2208     llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse_cmp_ss);
2209     return Builder.CreateCall(F, Ops, "cmpss");
2210   }
2211   case X86::BI__builtin_ia32_ldmxcsr: {
2212     llvm::Type *PtrTy = Int8PtrTy;
2213     Value *One = llvm::ConstantInt::get(Int32Ty, 1);
2214     Value *Tmp = Builder.CreateAlloca(Int32Ty, One);
2215     Builder.CreateStore(Ops[0], Tmp);
2216     return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_ldmxcsr),
2217                               Builder.CreateBitCast(Tmp, PtrTy));
2218   }
2219   case X86::BI__builtin_ia32_stmxcsr: {
2220     llvm::Type *PtrTy = Int8PtrTy;
2221     Value *One = llvm::ConstantInt::get(Int32Ty, 1);
2222     Value *Tmp = Builder.CreateAlloca(Int32Ty, One);
2223     Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_stmxcsr),
2224                        Builder.CreateBitCast(Tmp, PtrTy));
2225     return Builder.CreateLoad(Tmp, "stmxcsr");
2226   }
2227   case X86::BI__builtin_ia32_cmppd: {
2228     llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse2_cmp_pd);
2229     return Builder.CreateCall(F, Ops, "cmppd");
2230   }
2231   case X86::BI__builtin_ia32_cmpsd: {
2232     llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse2_cmp_sd);
2233     return Builder.CreateCall(F, Ops, "cmpsd");
2234   }
2235   case X86::BI__builtin_ia32_storehps:
2236   case X86::BI__builtin_ia32_storelps: {
2237     llvm::Type *PtrTy = llvm::PointerType::getUnqual(Int64Ty);
2238     llvm::Type *VecTy = llvm::VectorType::get(Int64Ty, 2);
2239 
2240     // cast val v2i64
2241     Ops[1] = Builder.CreateBitCast(Ops[1], VecTy, "cast");
2242 
2243     // extract (0, 1)
2244     unsigned Index = BuiltinID == X86::BI__builtin_ia32_storelps ? 0 : 1;
2245     llvm::Value *Idx = llvm::ConstantInt::get(Int32Ty, Index);
2246     Ops[1] = Builder.CreateExtractElement(Ops[1], Idx, "extract");
2247 
2248     // cast pointer to i64 & store
2249     Ops[0] = Builder.CreateBitCast(Ops[0], PtrTy);
2250     return Builder.CreateStore(Ops[1], Ops[0]);
2251   }
2252   case X86::BI__builtin_ia32_palignr: {
2253     unsigned shiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
2254 
2255     // If palignr is shifting the pair of input vectors less than 9 bytes,
2256     // emit a shuffle instruction.
2257     if (shiftVal <= 8) {
2258       SmallVector<llvm::Constant*, 8> Indices;
2259       for (unsigned i = 0; i != 8; ++i)
2260         Indices.push_back(llvm::ConstantInt::get(Int32Ty, shiftVal + i));
2261 
2262       Value* SV = llvm::ConstantVector::get(Indices);
2263       return Builder.CreateShuffleVector(Ops[1], Ops[0], SV, "palignr");
2264     }
2265 
2266     // If palignr is shifting the pair of input vectors more than 8 but less
2267     // than 16 bytes, emit a logical right shift of the destination.
2268     if (shiftVal < 16) {
2269       // MMX has these as 1 x i64 vectors for some odd optimization reasons.
2270       llvm::Type *VecTy = llvm::VectorType::get(Int64Ty, 1);
2271 
2272       Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast");
2273       Ops[1] = llvm::ConstantInt::get(VecTy, (shiftVal-8) * 8);
2274 
2275       // create i32 constant
2276       llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_mmx_psrl_q);
2277       return Builder.CreateCall(F, makeArrayRef(&Ops[0], 2), "palignr");
2278     }
2279 
2280     // If palignr is shifting the pair of vectors more than 16 bytes, emit zero.
2281     return llvm::Constant::getNullValue(ConvertType(E->getType()));
2282   }
2283   case X86::BI__builtin_ia32_palignr128: {
2284     unsigned shiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
2285 
2286     // If palignr is shifting the pair of input vectors less than 17 bytes,
2287     // emit a shuffle instruction.
2288     if (shiftVal <= 16) {
2289       SmallVector<llvm::Constant*, 16> Indices;
2290       for (unsigned i = 0; i != 16; ++i)
2291         Indices.push_back(llvm::ConstantInt::get(Int32Ty, shiftVal + i));
2292 
2293       Value* SV = llvm::ConstantVector::get(Indices);
2294       return Builder.CreateShuffleVector(Ops[1], Ops[0], SV, "palignr");
2295     }
2296 
2297     // If palignr is shifting the pair of input vectors more than 16 but less
2298     // than 32 bytes, emit a logical right shift of the destination.
2299     if (shiftVal < 32) {
2300       llvm::Type *VecTy = llvm::VectorType::get(Int64Ty, 2);
2301 
2302       Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast");
2303       Ops[1] = llvm::ConstantInt::get(Int32Ty, (shiftVal-16) * 8);
2304 
2305       // create i32 constant
2306       llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse2_psrl_dq);
2307       return Builder.CreateCall(F, makeArrayRef(&Ops[0], 2), "palignr");
2308     }
2309 
2310     // If palignr is shifting the pair of vectors more than 32 bytes, emit zero.
2311     return llvm::Constant::getNullValue(ConvertType(E->getType()));
2312   }
2313   case X86::BI__builtin_ia32_palignr256: {
2314     unsigned shiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
2315 
2316     // If palignr is shifting the pair of input vectors less than 17 bytes,
2317     // emit a shuffle instruction.
2318     if (shiftVal <= 16) {
2319       SmallVector<llvm::Constant*, 32> Indices;
2320       // 256-bit palignr operates on 128-bit lanes so we need to handle that
2321       for (unsigned l = 0; l != 2; ++l) {
2322         unsigned LaneStart = l * 16;
2323         unsigned LaneEnd = (l+1) * 16;
2324         for (unsigned i = 0; i != 16; ++i) {
2325           unsigned Idx = shiftVal + i + LaneStart;
2326           if (Idx >= LaneEnd) Idx += 16; // end of lane, switch operand
2327           Indices.push_back(llvm::ConstantInt::get(Int32Ty, Idx));
2328         }
2329       }
2330 
2331       Value* SV = llvm::ConstantVector::get(Indices);
2332       return Builder.CreateShuffleVector(Ops[1], Ops[0], SV, "palignr");
2333     }
2334 
2335     // If palignr is shifting the pair of input vectors more than 16 but less
2336     // than 32 bytes, emit a logical right shift of the destination.
2337     if (shiftVal < 32) {
2338       llvm::Type *VecTy = llvm::VectorType::get(Int64Ty, 4);
2339 
2340       Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast");
2341       Ops[1] = llvm::ConstantInt::get(Int32Ty, (shiftVal-16) * 8);
2342 
2343       // create i32 constant
2344       llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_avx2_psrl_dq);
2345       return Builder.CreateCall(F, makeArrayRef(&Ops[0], 2), "palignr");
2346     }
2347 
2348     // If palignr is shifting the pair of vectors more than 32 bytes, emit zero.
2349     return llvm::Constant::getNullValue(ConvertType(E->getType()));
2350   }
2351   case X86::BI__builtin_ia32_movntps:
2352   case X86::BI__builtin_ia32_movntpd:
2353   case X86::BI__builtin_ia32_movntdq:
2354   case X86::BI__builtin_ia32_movnti: {
2355     llvm::MDNode *Node = llvm::MDNode::get(getLLVMContext(),
2356                                            Builder.getInt32(1));
2357 
2358     // Convert the type of the pointer to a pointer to the stored type.
2359     Value *BC = Builder.CreateBitCast(Ops[0],
2360                                 llvm::PointerType::getUnqual(Ops[1]->getType()),
2361                                       "cast");
2362     StoreInst *SI = Builder.CreateStore(Ops[1], BC);
2363     SI->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node);
2364     SI->setAlignment(16);
2365     return SI;
2366   }
2367   // 3DNow!
2368   case X86::BI__builtin_ia32_pavgusb:
2369   case X86::BI__builtin_ia32_pf2id:
2370   case X86::BI__builtin_ia32_pfacc:
2371   case X86::BI__builtin_ia32_pfadd:
2372   case X86::BI__builtin_ia32_pfcmpeq:
2373   case X86::BI__builtin_ia32_pfcmpge:
2374   case X86::BI__builtin_ia32_pfcmpgt:
2375   case X86::BI__builtin_ia32_pfmax:
2376   case X86::BI__builtin_ia32_pfmin:
2377   case X86::BI__builtin_ia32_pfmul:
2378   case X86::BI__builtin_ia32_pfrcp:
2379   case X86::BI__builtin_ia32_pfrcpit1:
2380   case X86::BI__builtin_ia32_pfrcpit2:
2381   case X86::BI__builtin_ia32_pfrsqrt:
2382   case X86::BI__builtin_ia32_pfrsqit1:
2383   case X86::BI__builtin_ia32_pfrsqrtit1:
2384   case X86::BI__builtin_ia32_pfsub:
2385   case X86::BI__builtin_ia32_pfsubr:
2386   case X86::BI__builtin_ia32_pi2fd:
2387   case X86::BI__builtin_ia32_pmulhrw:
2388   case X86::BI__builtin_ia32_pf2iw:
2389   case X86::BI__builtin_ia32_pfnacc:
2390   case X86::BI__builtin_ia32_pfpnacc:
2391   case X86::BI__builtin_ia32_pi2fw:
2392   case X86::BI__builtin_ia32_pswapdsf:
2393   case X86::BI__builtin_ia32_pswapdsi: {
2394     const char *name = 0;
2395     Intrinsic::ID ID = Intrinsic::not_intrinsic;
2396     switch(BuiltinID) {
2397     case X86::BI__builtin_ia32_pavgusb:
2398       name = "pavgusb";
2399       ID = Intrinsic::x86_3dnow_pavgusb;
2400       break;
2401     case X86::BI__builtin_ia32_pf2id:
2402       name = "pf2id";
2403       ID = Intrinsic::x86_3dnow_pf2id;
2404       break;
2405     case X86::BI__builtin_ia32_pfacc:
2406       name = "pfacc";
2407       ID = Intrinsic::x86_3dnow_pfacc;
2408       break;
2409     case X86::BI__builtin_ia32_pfadd:
2410       name = "pfadd";
2411       ID = Intrinsic::x86_3dnow_pfadd;
2412       break;
2413     case X86::BI__builtin_ia32_pfcmpeq:
2414       name = "pfcmpeq";
2415       ID = Intrinsic::x86_3dnow_pfcmpeq;
2416       break;
2417     case X86::BI__builtin_ia32_pfcmpge:
2418       name = "pfcmpge";
2419       ID = Intrinsic::x86_3dnow_pfcmpge;
2420       break;
2421     case X86::BI__builtin_ia32_pfcmpgt:
2422       name = "pfcmpgt";
2423       ID = Intrinsic::x86_3dnow_pfcmpgt;
2424       break;
2425     case X86::BI__builtin_ia32_pfmax:
2426       name = "pfmax";
2427       ID = Intrinsic::x86_3dnow_pfmax;
2428       break;
2429     case X86::BI__builtin_ia32_pfmin:
2430       name = "pfmin";
2431       ID = Intrinsic::x86_3dnow_pfmin;
2432       break;
2433     case X86::BI__builtin_ia32_pfmul:
2434       name = "pfmul";
2435       ID = Intrinsic::x86_3dnow_pfmul;
2436       break;
2437     case X86::BI__builtin_ia32_pfrcp:
2438       name = "pfrcp";
2439       ID = Intrinsic::x86_3dnow_pfrcp;
2440       break;
2441     case X86::BI__builtin_ia32_pfrcpit1:
2442       name = "pfrcpit1";
2443       ID = Intrinsic::x86_3dnow_pfrcpit1;
2444       break;
2445     case X86::BI__builtin_ia32_pfrcpit2:
2446       name = "pfrcpit2";
2447       ID = Intrinsic::x86_3dnow_pfrcpit2;
2448       break;
2449     case X86::BI__builtin_ia32_pfrsqrt:
2450       name = "pfrsqrt";
2451       ID = Intrinsic::x86_3dnow_pfrsqrt;
2452       break;
2453     case X86::BI__builtin_ia32_pfrsqit1:
2454     case X86::BI__builtin_ia32_pfrsqrtit1:
2455       name = "pfrsqit1";
2456       ID = Intrinsic::x86_3dnow_pfrsqit1;
2457       break;
2458     case X86::BI__builtin_ia32_pfsub:
2459       name = "pfsub";
2460       ID = Intrinsic::x86_3dnow_pfsub;
2461       break;
2462     case X86::BI__builtin_ia32_pfsubr:
2463       name = "pfsubr";
2464       ID = Intrinsic::x86_3dnow_pfsubr;
2465       break;
2466     case X86::BI__builtin_ia32_pi2fd:
2467       name = "pi2fd";
2468       ID = Intrinsic::x86_3dnow_pi2fd;
2469       break;
2470     case X86::BI__builtin_ia32_pmulhrw:
2471       name = "pmulhrw";
2472       ID = Intrinsic::x86_3dnow_pmulhrw;
2473       break;
2474     case X86::BI__builtin_ia32_pf2iw:
2475       name = "pf2iw";
2476       ID = Intrinsic::x86_3dnowa_pf2iw;
2477       break;
2478     case X86::BI__builtin_ia32_pfnacc:
2479       name = "pfnacc";
2480       ID = Intrinsic::x86_3dnowa_pfnacc;
2481       break;
2482     case X86::BI__builtin_ia32_pfpnacc:
2483       name = "pfpnacc";
2484       ID = Intrinsic::x86_3dnowa_pfpnacc;
2485       break;
2486     case X86::BI__builtin_ia32_pi2fw:
2487       name = "pi2fw";
2488       ID = Intrinsic::x86_3dnowa_pi2fw;
2489       break;
2490     case X86::BI__builtin_ia32_pswapdsf:
2491     case X86::BI__builtin_ia32_pswapdsi:
2492       name = "pswapd";
2493       ID = Intrinsic::x86_3dnowa_pswapd;
2494       break;
2495     }
2496     llvm::Function *F = CGM.getIntrinsic(ID);
2497     return Builder.CreateCall(F, Ops, name);
2498   }
2499   }
2500 }
2501 
2502 
2503 Value *CodeGenFunction::EmitHexagonBuiltinExpr(unsigned BuiltinID,
2504                                              const CallExpr *E) {
2505   llvm::SmallVector<Value*, 4> Ops;
2506 
2507   for (unsigned i = 0, e = E->getNumArgs(); i != e; i++)
2508     Ops.push_back(EmitScalarExpr(E->getArg(i)));
2509 
2510   Intrinsic::ID ID = Intrinsic::not_intrinsic;
2511 
2512   switch (BuiltinID) {
2513   default: return 0;
2514 
2515   case Hexagon::BI__builtin_HEXAGON_C2_cmpeq:
2516     ID = Intrinsic::hexagon_C2_cmpeq; break;
2517 
2518   case Hexagon::BI__builtin_HEXAGON_C2_cmpgt:
2519     ID = Intrinsic::hexagon_C2_cmpgt; break;
2520 
2521   case Hexagon::BI__builtin_HEXAGON_C2_cmpgtu:
2522     ID = Intrinsic::hexagon_C2_cmpgtu; break;
2523 
2524   case Hexagon::BI__builtin_HEXAGON_C2_cmpeqp:
2525     ID = Intrinsic::hexagon_C2_cmpeqp; break;
2526 
2527   case Hexagon::BI__builtin_HEXAGON_C2_cmpgtp:
2528     ID = Intrinsic::hexagon_C2_cmpgtp; break;
2529 
2530   case Hexagon::BI__builtin_HEXAGON_C2_cmpgtup:
2531     ID = Intrinsic::hexagon_C2_cmpgtup; break;
2532 
2533   case Hexagon::BI__builtin_HEXAGON_C2_bitsset:
2534     ID = Intrinsic::hexagon_C2_bitsset; break;
2535 
2536   case Hexagon::BI__builtin_HEXAGON_C2_bitsclr:
2537     ID = Intrinsic::hexagon_C2_bitsclr; break;
2538 
2539   case Hexagon::BI__builtin_HEXAGON_C2_cmpeqi:
2540     ID = Intrinsic::hexagon_C2_cmpeqi; break;
2541 
2542   case Hexagon::BI__builtin_HEXAGON_C2_cmpgti:
2543     ID = Intrinsic::hexagon_C2_cmpgti; break;
2544 
2545   case Hexagon::BI__builtin_HEXAGON_C2_cmpgtui:
2546     ID = Intrinsic::hexagon_C2_cmpgtui; break;
2547 
2548   case Hexagon::BI__builtin_HEXAGON_C2_cmpgei:
2549     ID = Intrinsic::hexagon_C2_cmpgei; break;
2550 
2551   case Hexagon::BI__builtin_HEXAGON_C2_cmpgeui:
2552     ID = Intrinsic::hexagon_C2_cmpgeui; break;
2553 
2554   case Hexagon::BI__builtin_HEXAGON_C2_cmplt:
2555     ID = Intrinsic::hexagon_C2_cmplt; break;
2556 
2557   case Hexagon::BI__builtin_HEXAGON_C2_cmpltu:
2558     ID = Intrinsic::hexagon_C2_cmpltu; break;
2559 
2560   case Hexagon::BI__builtin_HEXAGON_C2_bitsclri:
2561     ID = Intrinsic::hexagon_C2_bitsclri; break;
2562 
2563   case Hexagon::BI__builtin_HEXAGON_C2_and:
2564     ID = Intrinsic::hexagon_C2_and; break;
2565 
2566   case Hexagon::BI__builtin_HEXAGON_C2_or:
2567     ID = Intrinsic::hexagon_C2_or; break;
2568 
2569   case Hexagon::BI__builtin_HEXAGON_C2_xor:
2570     ID = Intrinsic::hexagon_C2_xor; break;
2571 
2572   case Hexagon::BI__builtin_HEXAGON_C2_andn:
2573     ID = Intrinsic::hexagon_C2_andn; break;
2574 
2575   case Hexagon::BI__builtin_HEXAGON_C2_not:
2576     ID = Intrinsic::hexagon_C2_not; break;
2577 
2578   case Hexagon::BI__builtin_HEXAGON_C2_orn:
2579     ID = Intrinsic::hexagon_C2_orn; break;
2580 
2581   case Hexagon::BI__builtin_HEXAGON_C2_pxfer_map:
2582     ID = Intrinsic::hexagon_C2_pxfer_map; break;
2583 
2584   case Hexagon::BI__builtin_HEXAGON_C2_any8:
2585     ID = Intrinsic::hexagon_C2_any8; break;
2586 
2587   case Hexagon::BI__builtin_HEXAGON_C2_all8:
2588     ID = Intrinsic::hexagon_C2_all8; break;
2589 
2590   case Hexagon::BI__builtin_HEXAGON_C2_vitpack:
2591     ID = Intrinsic::hexagon_C2_vitpack; break;
2592 
2593   case Hexagon::BI__builtin_HEXAGON_C2_mux:
2594     ID = Intrinsic::hexagon_C2_mux; break;
2595 
2596   case Hexagon::BI__builtin_HEXAGON_C2_muxii:
2597     ID = Intrinsic::hexagon_C2_muxii; break;
2598 
2599   case Hexagon::BI__builtin_HEXAGON_C2_muxir:
2600     ID = Intrinsic::hexagon_C2_muxir; break;
2601 
2602   case Hexagon::BI__builtin_HEXAGON_C2_muxri:
2603     ID = Intrinsic::hexagon_C2_muxri; break;
2604 
2605   case Hexagon::BI__builtin_HEXAGON_C2_vmux:
2606     ID = Intrinsic::hexagon_C2_vmux; break;
2607 
2608   case Hexagon::BI__builtin_HEXAGON_C2_mask:
2609     ID = Intrinsic::hexagon_C2_mask; break;
2610 
2611   case Hexagon::BI__builtin_HEXAGON_A2_vcmpbeq:
2612     ID = Intrinsic::hexagon_A2_vcmpbeq; break;
2613 
2614   case Hexagon::BI__builtin_HEXAGON_A2_vcmpbgtu:
2615     ID = Intrinsic::hexagon_A2_vcmpbgtu; break;
2616 
2617   case Hexagon::BI__builtin_HEXAGON_A2_vcmpheq:
2618     ID = Intrinsic::hexagon_A2_vcmpheq; break;
2619 
2620   case Hexagon::BI__builtin_HEXAGON_A2_vcmphgt:
2621     ID = Intrinsic::hexagon_A2_vcmphgt; break;
2622 
2623   case Hexagon::BI__builtin_HEXAGON_A2_vcmphgtu:
2624     ID = Intrinsic::hexagon_A2_vcmphgtu; break;
2625 
2626   case Hexagon::BI__builtin_HEXAGON_A2_vcmpweq:
2627     ID = Intrinsic::hexagon_A2_vcmpweq; break;
2628 
2629   case Hexagon::BI__builtin_HEXAGON_A2_vcmpwgt:
2630     ID = Intrinsic::hexagon_A2_vcmpwgt; break;
2631 
2632   case Hexagon::BI__builtin_HEXAGON_A2_vcmpwgtu:
2633     ID = Intrinsic::hexagon_A2_vcmpwgtu; break;
2634 
2635   case Hexagon::BI__builtin_HEXAGON_C2_tfrpr:
2636     ID = Intrinsic::hexagon_C2_tfrpr; break;
2637 
2638   case Hexagon::BI__builtin_HEXAGON_C2_tfrrp:
2639     ID = Intrinsic::hexagon_C2_tfrrp; break;
2640 
2641   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_hh_s0:
2642     ID = Intrinsic::hexagon_M2_mpy_acc_hh_s0; break;
2643 
2644   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_hh_s1:
2645     ID = Intrinsic::hexagon_M2_mpy_acc_hh_s1; break;
2646 
2647   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_hl_s0:
2648     ID = Intrinsic::hexagon_M2_mpy_acc_hl_s0; break;
2649 
2650   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_hl_s1:
2651     ID = Intrinsic::hexagon_M2_mpy_acc_hl_s1; break;
2652 
2653   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_lh_s0:
2654     ID = Intrinsic::hexagon_M2_mpy_acc_lh_s0; break;
2655 
2656   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_lh_s1:
2657     ID = Intrinsic::hexagon_M2_mpy_acc_lh_s1; break;
2658 
2659   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_ll_s0:
2660     ID = Intrinsic::hexagon_M2_mpy_acc_ll_s0; break;
2661 
2662   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_ll_s1:
2663     ID = Intrinsic::hexagon_M2_mpy_acc_ll_s1; break;
2664 
2665   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_hh_s0:
2666     ID = Intrinsic::hexagon_M2_mpy_nac_hh_s0; break;
2667 
2668   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_hh_s1:
2669     ID = Intrinsic::hexagon_M2_mpy_nac_hh_s1; break;
2670 
2671   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_hl_s0:
2672     ID = Intrinsic::hexagon_M2_mpy_nac_hl_s0; break;
2673 
2674   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_hl_s1:
2675     ID = Intrinsic::hexagon_M2_mpy_nac_hl_s1; break;
2676 
2677   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_lh_s0:
2678     ID = Intrinsic::hexagon_M2_mpy_nac_lh_s0; break;
2679 
2680   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_lh_s1:
2681     ID = Intrinsic::hexagon_M2_mpy_nac_lh_s1; break;
2682 
2683   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_ll_s0:
2684     ID = Intrinsic::hexagon_M2_mpy_nac_ll_s0; break;
2685 
2686   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_ll_s1:
2687     ID = Intrinsic::hexagon_M2_mpy_nac_ll_s1; break;
2688 
2689   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_sat_hh_s0:
2690     ID = Intrinsic::hexagon_M2_mpy_acc_sat_hh_s0; break;
2691 
2692   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_sat_hh_s1:
2693     ID = Intrinsic::hexagon_M2_mpy_acc_sat_hh_s1; break;
2694 
2695   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_sat_hl_s0:
2696     ID = Intrinsic::hexagon_M2_mpy_acc_sat_hl_s0; break;
2697 
2698   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_sat_hl_s1:
2699     ID = Intrinsic::hexagon_M2_mpy_acc_sat_hl_s1; break;
2700 
2701   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_sat_lh_s0:
2702     ID = Intrinsic::hexagon_M2_mpy_acc_sat_lh_s0; break;
2703 
2704   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_sat_lh_s1:
2705     ID = Intrinsic::hexagon_M2_mpy_acc_sat_lh_s1; break;
2706 
2707   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_sat_ll_s0:
2708     ID = Intrinsic::hexagon_M2_mpy_acc_sat_ll_s0; break;
2709 
2710   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_sat_ll_s1:
2711     ID = Intrinsic::hexagon_M2_mpy_acc_sat_ll_s1; break;
2712 
2713   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_sat_hh_s0:
2714     ID = Intrinsic::hexagon_M2_mpy_nac_sat_hh_s0; break;
2715 
2716   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_sat_hh_s1:
2717     ID = Intrinsic::hexagon_M2_mpy_nac_sat_hh_s1; break;
2718 
2719   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_sat_hl_s0:
2720     ID = Intrinsic::hexagon_M2_mpy_nac_sat_hl_s0; break;
2721 
2722   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_sat_hl_s1:
2723     ID = Intrinsic::hexagon_M2_mpy_nac_sat_hl_s1; break;
2724 
2725   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_sat_lh_s0:
2726     ID = Intrinsic::hexagon_M2_mpy_nac_sat_lh_s0; break;
2727 
2728   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_sat_lh_s1:
2729     ID = Intrinsic::hexagon_M2_mpy_nac_sat_lh_s1; break;
2730 
2731   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_sat_ll_s0:
2732     ID = Intrinsic::hexagon_M2_mpy_nac_sat_ll_s0; break;
2733 
2734   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_sat_ll_s1:
2735     ID = Intrinsic::hexagon_M2_mpy_nac_sat_ll_s1; break;
2736 
2737   case Hexagon::BI__builtin_HEXAGON_M2_mpy_hh_s0:
2738     ID = Intrinsic::hexagon_M2_mpy_hh_s0; break;
2739 
2740   case Hexagon::BI__builtin_HEXAGON_M2_mpy_hh_s1:
2741     ID = Intrinsic::hexagon_M2_mpy_hh_s1; break;
2742 
2743   case Hexagon::BI__builtin_HEXAGON_M2_mpy_hl_s0:
2744     ID = Intrinsic::hexagon_M2_mpy_hl_s0; break;
2745 
2746   case Hexagon::BI__builtin_HEXAGON_M2_mpy_hl_s1:
2747     ID = Intrinsic::hexagon_M2_mpy_hl_s1; break;
2748 
2749   case Hexagon::BI__builtin_HEXAGON_M2_mpy_lh_s0:
2750     ID = Intrinsic::hexagon_M2_mpy_lh_s0; break;
2751 
2752   case Hexagon::BI__builtin_HEXAGON_M2_mpy_lh_s1:
2753     ID = Intrinsic::hexagon_M2_mpy_lh_s1; break;
2754 
2755   case Hexagon::BI__builtin_HEXAGON_M2_mpy_ll_s0:
2756     ID = Intrinsic::hexagon_M2_mpy_ll_s0; break;
2757 
2758   case Hexagon::BI__builtin_HEXAGON_M2_mpy_ll_s1:
2759     ID = Intrinsic::hexagon_M2_mpy_ll_s1; break;
2760 
2761   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_hh_s0:
2762     ID = Intrinsic::hexagon_M2_mpy_sat_hh_s0; break;
2763 
2764   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_hh_s1:
2765     ID = Intrinsic::hexagon_M2_mpy_sat_hh_s1; break;
2766 
2767   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_hl_s0:
2768     ID = Intrinsic::hexagon_M2_mpy_sat_hl_s0; break;
2769 
2770   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_hl_s1:
2771     ID = Intrinsic::hexagon_M2_mpy_sat_hl_s1; break;
2772 
2773   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_lh_s0:
2774     ID = Intrinsic::hexagon_M2_mpy_sat_lh_s0; break;
2775 
2776   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_lh_s1:
2777     ID = Intrinsic::hexagon_M2_mpy_sat_lh_s1; break;
2778 
2779   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_ll_s0:
2780     ID = Intrinsic::hexagon_M2_mpy_sat_ll_s0; break;
2781 
2782   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_ll_s1:
2783     ID = Intrinsic::hexagon_M2_mpy_sat_ll_s1; break;
2784 
2785   case Hexagon::BI__builtin_HEXAGON_M2_mpy_rnd_hh_s0:
2786     ID = Intrinsic::hexagon_M2_mpy_rnd_hh_s0; break;
2787 
2788   case Hexagon::BI__builtin_HEXAGON_M2_mpy_rnd_hh_s1:
2789     ID = Intrinsic::hexagon_M2_mpy_rnd_hh_s1; break;
2790 
2791   case Hexagon::BI__builtin_HEXAGON_M2_mpy_rnd_hl_s0:
2792     ID = Intrinsic::hexagon_M2_mpy_rnd_hl_s0; break;
2793 
2794   case Hexagon::BI__builtin_HEXAGON_M2_mpy_rnd_hl_s1:
2795     ID = Intrinsic::hexagon_M2_mpy_rnd_hl_s1; break;
2796 
2797   case Hexagon::BI__builtin_HEXAGON_M2_mpy_rnd_lh_s0:
2798     ID = Intrinsic::hexagon_M2_mpy_rnd_lh_s0; break;
2799 
2800   case Hexagon::BI__builtin_HEXAGON_M2_mpy_rnd_lh_s1:
2801     ID = Intrinsic::hexagon_M2_mpy_rnd_lh_s1; break;
2802 
2803   case Hexagon::BI__builtin_HEXAGON_M2_mpy_rnd_ll_s0:
2804     ID = Intrinsic::hexagon_M2_mpy_rnd_ll_s0; break;
2805 
2806   case Hexagon::BI__builtin_HEXAGON_M2_mpy_rnd_ll_s1:
2807     ID = Intrinsic::hexagon_M2_mpy_rnd_ll_s1; break;
2808 
2809   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_rnd_hh_s0:
2810     ID = Intrinsic::hexagon_M2_mpy_sat_rnd_hh_s0; break;
2811 
2812   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_rnd_hh_s1:
2813     ID = Intrinsic::hexagon_M2_mpy_sat_rnd_hh_s1; break;
2814 
2815   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_rnd_hl_s0:
2816     ID = Intrinsic::hexagon_M2_mpy_sat_rnd_hl_s0; break;
2817 
2818   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_rnd_hl_s1:
2819     ID = Intrinsic::hexagon_M2_mpy_sat_rnd_hl_s1; break;
2820 
2821   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_rnd_lh_s0:
2822     ID = Intrinsic::hexagon_M2_mpy_sat_rnd_lh_s0; break;
2823 
2824   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_rnd_lh_s1:
2825     ID = Intrinsic::hexagon_M2_mpy_sat_rnd_lh_s1; break;
2826 
2827   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_rnd_ll_s0:
2828     ID = Intrinsic::hexagon_M2_mpy_sat_rnd_ll_s0; break;
2829 
2830   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_rnd_ll_s1:
2831     ID = Intrinsic::hexagon_M2_mpy_sat_rnd_ll_s1; break;
2832 
2833   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_acc_hh_s0:
2834     ID = Intrinsic::hexagon_M2_mpyd_acc_hh_s0; break;
2835 
2836   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_acc_hh_s1:
2837     ID = Intrinsic::hexagon_M2_mpyd_acc_hh_s1; break;
2838 
2839   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_acc_hl_s0:
2840     ID = Intrinsic::hexagon_M2_mpyd_acc_hl_s0; break;
2841 
2842   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_acc_hl_s1:
2843     ID = Intrinsic::hexagon_M2_mpyd_acc_hl_s1; break;
2844 
2845   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_acc_lh_s0:
2846     ID = Intrinsic::hexagon_M2_mpyd_acc_lh_s0; break;
2847 
2848   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_acc_lh_s1:
2849     ID = Intrinsic::hexagon_M2_mpyd_acc_lh_s1; break;
2850 
2851   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_acc_ll_s0:
2852     ID = Intrinsic::hexagon_M2_mpyd_acc_ll_s0; break;
2853 
2854   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_acc_ll_s1:
2855     ID = Intrinsic::hexagon_M2_mpyd_acc_ll_s1; break;
2856 
2857   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_nac_hh_s0:
2858     ID = Intrinsic::hexagon_M2_mpyd_nac_hh_s0; break;
2859 
2860   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_nac_hh_s1:
2861     ID = Intrinsic::hexagon_M2_mpyd_nac_hh_s1; break;
2862 
2863   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_nac_hl_s0:
2864     ID = Intrinsic::hexagon_M2_mpyd_nac_hl_s0; break;
2865 
2866   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_nac_hl_s1:
2867     ID = Intrinsic::hexagon_M2_mpyd_nac_hl_s1; break;
2868 
2869   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_nac_lh_s0:
2870     ID = Intrinsic::hexagon_M2_mpyd_nac_lh_s0; break;
2871 
2872   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_nac_lh_s1:
2873     ID = Intrinsic::hexagon_M2_mpyd_nac_lh_s1; break;
2874 
2875   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_nac_ll_s0:
2876     ID = Intrinsic::hexagon_M2_mpyd_nac_ll_s0; break;
2877 
2878   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_nac_ll_s1:
2879     ID = Intrinsic::hexagon_M2_mpyd_nac_ll_s1; break;
2880 
2881   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_hh_s0:
2882     ID = Intrinsic::hexagon_M2_mpyd_hh_s0; break;
2883 
2884   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_hh_s1:
2885     ID = Intrinsic::hexagon_M2_mpyd_hh_s1; break;
2886 
2887   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_hl_s0:
2888     ID = Intrinsic::hexagon_M2_mpyd_hl_s0; break;
2889 
2890   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_hl_s1:
2891     ID = Intrinsic::hexagon_M2_mpyd_hl_s1; break;
2892 
2893   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_lh_s0:
2894     ID = Intrinsic::hexagon_M2_mpyd_lh_s0; break;
2895 
2896   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_lh_s1:
2897     ID = Intrinsic::hexagon_M2_mpyd_lh_s1; break;
2898 
2899   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_ll_s0:
2900     ID = Intrinsic::hexagon_M2_mpyd_ll_s0; break;
2901 
2902   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_ll_s1:
2903     ID = Intrinsic::hexagon_M2_mpyd_ll_s1; break;
2904 
2905   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_rnd_hh_s0:
2906     ID = Intrinsic::hexagon_M2_mpyd_rnd_hh_s0; break;
2907 
2908   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_rnd_hh_s1:
2909     ID = Intrinsic::hexagon_M2_mpyd_rnd_hh_s1; break;
2910 
2911   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_rnd_hl_s0:
2912     ID = Intrinsic::hexagon_M2_mpyd_rnd_hl_s0; break;
2913 
2914   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_rnd_hl_s1:
2915     ID = Intrinsic::hexagon_M2_mpyd_rnd_hl_s1; break;
2916 
2917   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_rnd_lh_s0:
2918     ID = Intrinsic::hexagon_M2_mpyd_rnd_lh_s0; break;
2919 
2920   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_rnd_lh_s1:
2921     ID = Intrinsic::hexagon_M2_mpyd_rnd_lh_s1; break;
2922 
2923   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_rnd_ll_s0:
2924     ID = Intrinsic::hexagon_M2_mpyd_rnd_ll_s0; break;
2925 
2926   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_rnd_ll_s1:
2927     ID = Intrinsic::hexagon_M2_mpyd_rnd_ll_s1; break;
2928 
2929   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_acc_hh_s0:
2930     ID = Intrinsic::hexagon_M2_mpyu_acc_hh_s0; break;
2931 
2932   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_acc_hh_s1:
2933     ID = Intrinsic::hexagon_M2_mpyu_acc_hh_s1; break;
2934 
2935   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_acc_hl_s0:
2936     ID = Intrinsic::hexagon_M2_mpyu_acc_hl_s0; break;
2937 
2938   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_acc_hl_s1:
2939     ID = Intrinsic::hexagon_M2_mpyu_acc_hl_s1; break;
2940 
2941   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_acc_lh_s0:
2942     ID = Intrinsic::hexagon_M2_mpyu_acc_lh_s0; break;
2943 
2944   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_acc_lh_s1:
2945     ID = Intrinsic::hexagon_M2_mpyu_acc_lh_s1; break;
2946 
2947   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_acc_ll_s0:
2948     ID = Intrinsic::hexagon_M2_mpyu_acc_ll_s0; break;
2949 
2950   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_acc_ll_s1:
2951     ID = Intrinsic::hexagon_M2_mpyu_acc_ll_s1; break;
2952 
2953   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_nac_hh_s0:
2954     ID = Intrinsic::hexagon_M2_mpyu_nac_hh_s0; break;
2955 
2956   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_nac_hh_s1:
2957     ID = Intrinsic::hexagon_M2_mpyu_nac_hh_s1; break;
2958 
2959   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_nac_hl_s0:
2960     ID = Intrinsic::hexagon_M2_mpyu_nac_hl_s0; break;
2961 
2962   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_nac_hl_s1:
2963     ID = Intrinsic::hexagon_M2_mpyu_nac_hl_s1; break;
2964 
2965   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_nac_lh_s0:
2966     ID = Intrinsic::hexagon_M2_mpyu_nac_lh_s0; break;
2967 
2968   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_nac_lh_s1:
2969     ID = Intrinsic::hexagon_M2_mpyu_nac_lh_s1; break;
2970 
2971   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_nac_ll_s0:
2972     ID = Intrinsic::hexagon_M2_mpyu_nac_ll_s0; break;
2973 
2974   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_nac_ll_s1:
2975     ID = Intrinsic::hexagon_M2_mpyu_nac_ll_s1; break;
2976 
2977   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_hh_s0:
2978     ID = Intrinsic::hexagon_M2_mpyu_hh_s0; break;
2979 
2980   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_hh_s1:
2981     ID = Intrinsic::hexagon_M2_mpyu_hh_s1; break;
2982 
2983   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_hl_s0:
2984     ID = Intrinsic::hexagon_M2_mpyu_hl_s0; break;
2985 
2986   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_hl_s1:
2987     ID = Intrinsic::hexagon_M2_mpyu_hl_s1; break;
2988 
2989   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_lh_s0:
2990     ID = Intrinsic::hexagon_M2_mpyu_lh_s0; break;
2991 
2992   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_lh_s1:
2993     ID = Intrinsic::hexagon_M2_mpyu_lh_s1; break;
2994 
2995   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_ll_s0:
2996     ID = Intrinsic::hexagon_M2_mpyu_ll_s0; break;
2997 
2998   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_ll_s1:
2999     ID = Intrinsic::hexagon_M2_mpyu_ll_s1; break;
3000 
3001   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_acc_hh_s0:
3002     ID = Intrinsic::hexagon_M2_mpyud_acc_hh_s0; break;
3003 
3004   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_acc_hh_s1:
3005     ID = Intrinsic::hexagon_M2_mpyud_acc_hh_s1; break;
3006 
3007   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_acc_hl_s0:
3008     ID = Intrinsic::hexagon_M2_mpyud_acc_hl_s0; break;
3009 
3010   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_acc_hl_s1:
3011     ID = Intrinsic::hexagon_M2_mpyud_acc_hl_s1; break;
3012 
3013   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_acc_lh_s0:
3014     ID = Intrinsic::hexagon_M2_mpyud_acc_lh_s0; break;
3015 
3016   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_acc_lh_s1:
3017     ID = Intrinsic::hexagon_M2_mpyud_acc_lh_s1; break;
3018 
3019   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_acc_ll_s0:
3020     ID = Intrinsic::hexagon_M2_mpyud_acc_ll_s0; break;
3021 
3022   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_acc_ll_s1:
3023     ID = Intrinsic::hexagon_M2_mpyud_acc_ll_s1; break;
3024 
3025   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_nac_hh_s0:
3026     ID = Intrinsic::hexagon_M2_mpyud_nac_hh_s0; break;
3027 
3028   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_nac_hh_s1:
3029     ID = Intrinsic::hexagon_M2_mpyud_nac_hh_s1; break;
3030 
3031   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_nac_hl_s0:
3032     ID = Intrinsic::hexagon_M2_mpyud_nac_hl_s0; break;
3033 
3034   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_nac_hl_s1:
3035     ID = Intrinsic::hexagon_M2_mpyud_nac_hl_s1; break;
3036 
3037   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_nac_lh_s0:
3038     ID = Intrinsic::hexagon_M2_mpyud_nac_lh_s0; break;
3039 
3040   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_nac_lh_s1:
3041     ID = Intrinsic::hexagon_M2_mpyud_nac_lh_s1; break;
3042 
3043   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_nac_ll_s0:
3044     ID = Intrinsic::hexagon_M2_mpyud_nac_ll_s0; break;
3045 
3046   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_nac_ll_s1:
3047     ID = Intrinsic::hexagon_M2_mpyud_nac_ll_s1; break;
3048 
3049   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_hh_s0:
3050     ID = Intrinsic::hexagon_M2_mpyud_hh_s0; break;
3051 
3052   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_hh_s1:
3053     ID = Intrinsic::hexagon_M2_mpyud_hh_s1; break;
3054 
3055   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_hl_s0:
3056     ID = Intrinsic::hexagon_M2_mpyud_hl_s0; break;
3057 
3058   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_hl_s1:
3059     ID = Intrinsic::hexagon_M2_mpyud_hl_s1; break;
3060 
3061   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_lh_s0:
3062     ID = Intrinsic::hexagon_M2_mpyud_lh_s0; break;
3063 
3064   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_lh_s1:
3065     ID = Intrinsic::hexagon_M2_mpyud_lh_s1; break;
3066 
3067   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_ll_s0:
3068     ID = Intrinsic::hexagon_M2_mpyud_ll_s0; break;
3069 
3070   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_ll_s1:
3071     ID = Intrinsic::hexagon_M2_mpyud_ll_s1; break;
3072 
3073   case Hexagon::BI__builtin_HEXAGON_M2_mpysmi:
3074     ID = Intrinsic::hexagon_M2_mpysmi; break;
3075 
3076   case Hexagon::BI__builtin_HEXAGON_M2_macsip:
3077     ID = Intrinsic::hexagon_M2_macsip; break;
3078 
3079   case Hexagon::BI__builtin_HEXAGON_M2_macsin:
3080     ID = Intrinsic::hexagon_M2_macsin; break;
3081 
3082   case Hexagon::BI__builtin_HEXAGON_M2_dpmpyss_s0:
3083     ID = Intrinsic::hexagon_M2_dpmpyss_s0; break;
3084 
3085   case Hexagon::BI__builtin_HEXAGON_M2_dpmpyss_acc_s0:
3086     ID = Intrinsic::hexagon_M2_dpmpyss_acc_s0; break;
3087 
3088   case Hexagon::BI__builtin_HEXAGON_M2_dpmpyss_nac_s0:
3089     ID = Intrinsic::hexagon_M2_dpmpyss_nac_s0; break;
3090 
3091   case Hexagon::BI__builtin_HEXAGON_M2_dpmpyuu_s0:
3092     ID = Intrinsic::hexagon_M2_dpmpyuu_s0; break;
3093 
3094   case Hexagon::BI__builtin_HEXAGON_M2_dpmpyuu_acc_s0:
3095     ID = Intrinsic::hexagon_M2_dpmpyuu_acc_s0; break;
3096 
3097   case Hexagon::BI__builtin_HEXAGON_M2_dpmpyuu_nac_s0:
3098     ID = Intrinsic::hexagon_M2_dpmpyuu_nac_s0; break;
3099 
3100   case Hexagon::BI__builtin_HEXAGON_M2_mpy_up:
3101     ID = Intrinsic::hexagon_M2_mpy_up; break;
3102 
3103   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_up:
3104     ID = Intrinsic::hexagon_M2_mpyu_up; break;
3105 
3106   case Hexagon::BI__builtin_HEXAGON_M2_dpmpyss_rnd_s0:
3107     ID = Intrinsic::hexagon_M2_dpmpyss_rnd_s0; break;
3108 
3109   case Hexagon::BI__builtin_HEXAGON_M2_mpyi:
3110     ID = Intrinsic::hexagon_M2_mpyi; break;
3111 
3112   case Hexagon::BI__builtin_HEXAGON_M2_mpyui:
3113     ID = Intrinsic::hexagon_M2_mpyui; break;
3114 
3115   case Hexagon::BI__builtin_HEXAGON_M2_maci:
3116     ID = Intrinsic::hexagon_M2_maci; break;
3117 
3118   case Hexagon::BI__builtin_HEXAGON_M2_acci:
3119     ID = Intrinsic::hexagon_M2_acci; break;
3120 
3121   case Hexagon::BI__builtin_HEXAGON_M2_accii:
3122     ID = Intrinsic::hexagon_M2_accii; break;
3123 
3124   case Hexagon::BI__builtin_HEXAGON_M2_nacci:
3125     ID = Intrinsic::hexagon_M2_nacci; break;
3126 
3127   case Hexagon::BI__builtin_HEXAGON_M2_naccii:
3128     ID = Intrinsic::hexagon_M2_naccii; break;
3129 
3130   case Hexagon::BI__builtin_HEXAGON_M2_subacc:
3131     ID = Intrinsic::hexagon_M2_subacc; break;
3132 
3133   case Hexagon::BI__builtin_HEXAGON_M2_vmpy2s_s0:
3134     ID = Intrinsic::hexagon_M2_vmpy2s_s0; break;
3135 
3136   case Hexagon::BI__builtin_HEXAGON_M2_vmpy2s_s1:
3137     ID = Intrinsic::hexagon_M2_vmpy2s_s1; break;
3138 
3139   case Hexagon::BI__builtin_HEXAGON_M2_vmac2s_s0:
3140     ID = Intrinsic::hexagon_M2_vmac2s_s0; break;
3141 
3142   case Hexagon::BI__builtin_HEXAGON_M2_vmac2s_s1:
3143     ID = Intrinsic::hexagon_M2_vmac2s_s1; break;
3144 
3145   case Hexagon::BI__builtin_HEXAGON_M2_vmpy2s_s0pack:
3146     ID = Intrinsic::hexagon_M2_vmpy2s_s0pack; break;
3147 
3148   case Hexagon::BI__builtin_HEXAGON_M2_vmpy2s_s1pack:
3149     ID = Intrinsic::hexagon_M2_vmpy2s_s1pack; break;
3150 
3151   case Hexagon::BI__builtin_HEXAGON_M2_vmac2:
3152     ID = Intrinsic::hexagon_M2_vmac2; break;
3153 
3154   case Hexagon::BI__builtin_HEXAGON_M2_vmpy2es_s0:
3155     ID = Intrinsic::hexagon_M2_vmpy2es_s0; break;
3156 
3157   case Hexagon::BI__builtin_HEXAGON_M2_vmpy2es_s1:
3158     ID = Intrinsic::hexagon_M2_vmpy2es_s1; break;
3159 
3160   case Hexagon::BI__builtin_HEXAGON_M2_vmac2es_s0:
3161     ID = Intrinsic::hexagon_M2_vmac2es_s0; break;
3162 
3163   case Hexagon::BI__builtin_HEXAGON_M2_vmac2es_s1:
3164     ID = Intrinsic::hexagon_M2_vmac2es_s1; break;
3165 
3166   case Hexagon::BI__builtin_HEXAGON_M2_vmac2es:
3167     ID = Intrinsic::hexagon_M2_vmac2es; break;
3168 
3169   case Hexagon::BI__builtin_HEXAGON_M2_vrmac_s0:
3170     ID = Intrinsic::hexagon_M2_vrmac_s0; break;
3171 
3172   case Hexagon::BI__builtin_HEXAGON_M2_vrmpy_s0:
3173     ID = Intrinsic::hexagon_M2_vrmpy_s0; break;
3174 
3175   case Hexagon::BI__builtin_HEXAGON_M2_vdmpyrs_s0:
3176     ID = Intrinsic::hexagon_M2_vdmpyrs_s0; break;
3177 
3178   case Hexagon::BI__builtin_HEXAGON_M2_vdmpyrs_s1:
3179     ID = Intrinsic::hexagon_M2_vdmpyrs_s1; break;
3180 
3181   case Hexagon::BI__builtin_HEXAGON_M2_vdmacs_s0:
3182     ID = Intrinsic::hexagon_M2_vdmacs_s0; break;
3183 
3184   case Hexagon::BI__builtin_HEXAGON_M2_vdmacs_s1:
3185     ID = Intrinsic::hexagon_M2_vdmacs_s1; break;
3186 
3187   case Hexagon::BI__builtin_HEXAGON_M2_vdmpys_s0:
3188     ID = Intrinsic::hexagon_M2_vdmpys_s0; break;
3189 
3190   case Hexagon::BI__builtin_HEXAGON_M2_vdmpys_s1:
3191     ID = Intrinsic::hexagon_M2_vdmpys_s1; break;
3192 
3193   case Hexagon::BI__builtin_HEXAGON_M2_cmpyrs_s0:
3194     ID = Intrinsic::hexagon_M2_cmpyrs_s0; break;
3195 
3196   case Hexagon::BI__builtin_HEXAGON_M2_cmpyrs_s1:
3197     ID = Intrinsic::hexagon_M2_cmpyrs_s1; break;
3198 
3199   case Hexagon::BI__builtin_HEXAGON_M2_cmpyrsc_s0:
3200     ID = Intrinsic::hexagon_M2_cmpyrsc_s0; break;
3201 
3202   case Hexagon::BI__builtin_HEXAGON_M2_cmpyrsc_s1:
3203     ID = Intrinsic::hexagon_M2_cmpyrsc_s1; break;
3204 
3205   case Hexagon::BI__builtin_HEXAGON_M2_cmacs_s0:
3206     ID = Intrinsic::hexagon_M2_cmacs_s0; break;
3207 
3208   case Hexagon::BI__builtin_HEXAGON_M2_cmacs_s1:
3209     ID = Intrinsic::hexagon_M2_cmacs_s1; break;
3210 
3211   case Hexagon::BI__builtin_HEXAGON_M2_cmacsc_s0:
3212     ID = Intrinsic::hexagon_M2_cmacsc_s0; break;
3213 
3214   case Hexagon::BI__builtin_HEXAGON_M2_cmacsc_s1:
3215     ID = Intrinsic::hexagon_M2_cmacsc_s1; break;
3216 
3217   case Hexagon::BI__builtin_HEXAGON_M2_cmpys_s0:
3218     ID = Intrinsic::hexagon_M2_cmpys_s0; break;
3219 
3220   case Hexagon::BI__builtin_HEXAGON_M2_cmpys_s1:
3221     ID = Intrinsic::hexagon_M2_cmpys_s1; break;
3222 
3223   case Hexagon::BI__builtin_HEXAGON_M2_cmpysc_s0:
3224     ID = Intrinsic::hexagon_M2_cmpysc_s0; break;
3225 
3226   case Hexagon::BI__builtin_HEXAGON_M2_cmpysc_s1:
3227     ID = Intrinsic::hexagon_M2_cmpysc_s1; break;
3228 
3229   case Hexagon::BI__builtin_HEXAGON_M2_cnacs_s0:
3230     ID = Intrinsic::hexagon_M2_cnacs_s0; break;
3231 
3232   case Hexagon::BI__builtin_HEXAGON_M2_cnacs_s1:
3233     ID = Intrinsic::hexagon_M2_cnacs_s1; break;
3234 
3235   case Hexagon::BI__builtin_HEXAGON_M2_cnacsc_s0:
3236     ID = Intrinsic::hexagon_M2_cnacsc_s0; break;
3237 
3238   case Hexagon::BI__builtin_HEXAGON_M2_cnacsc_s1:
3239     ID = Intrinsic::hexagon_M2_cnacsc_s1; break;
3240 
3241   case Hexagon::BI__builtin_HEXAGON_M2_vrcmpys_s1:
3242     ID = Intrinsic::hexagon_M2_vrcmpys_s1; break;
3243 
3244   case Hexagon::BI__builtin_HEXAGON_M2_vrcmpys_acc_s1:
3245     ID = Intrinsic::hexagon_M2_vrcmpys_acc_s1; break;
3246 
3247   case Hexagon::BI__builtin_HEXAGON_M2_vrcmpys_s1rp:
3248     ID = Intrinsic::hexagon_M2_vrcmpys_s1rp; break;
3249 
3250   case Hexagon::BI__builtin_HEXAGON_M2_mmacls_s0:
3251     ID = Intrinsic::hexagon_M2_mmacls_s0; break;
3252 
3253   case Hexagon::BI__builtin_HEXAGON_M2_mmacls_s1:
3254     ID = Intrinsic::hexagon_M2_mmacls_s1; break;
3255 
3256   case Hexagon::BI__builtin_HEXAGON_M2_mmachs_s0:
3257     ID = Intrinsic::hexagon_M2_mmachs_s0; break;
3258 
3259   case Hexagon::BI__builtin_HEXAGON_M2_mmachs_s1:
3260     ID = Intrinsic::hexagon_M2_mmachs_s1; break;
3261 
3262   case Hexagon::BI__builtin_HEXAGON_M2_mmpyl_s0:
3263     ID = Intrinsic::hexagon_M2_mmpyl_s0; break;
3264 
3265   case Hexagon::BI__builtin_HEXAGON_M2_mmpyl_s1:
3266     ID = Intrinsic::hexagon_M2_mmpyl_s1; break;
3267 
3268   case Hexagon::BI__builtin_HEXAGON_M2_mmpyh_s0:
3269     ID = Intrinsic::hexagon_M2_mmpyh_s0; break;
3270 
3271   case Hexagon::BI__builtin_HEXAGON_M2_mmpyh_s1:
3272     ID = Intrinsic::hexagon_M2_mmpyh_s1; break;
3273 
3274   case Hexagon::BI__builtin_HEXAGON_M2_mmacls_rs0:
3275     ID = Intrinsic::hexagon_M2_mmacls_rs0; break;
3276 
3277   case Hexagon::BI__builtin_HEXAGON_M2_mmacls_rs1:
3278     ID = Intrinsic::hexagon_M2_mmacls_rs1; break;
3279 
3280   case Hexagon::BI__builtin_HEXAGON_M2_mmachs_rs0:
3281     ID = Intrinsic::hexagon_M2_mmachs_rs0; break;
3282 
3283   case Hexagon::BI__builtin_HEXAGON_M2_mmachs_rs1:
3284     ID = Intrinsic::hexagon_M2_mmachs_rs1; break;
3285 
3286   case Hexagon::BI__builtin_HEXAGON_M2_mmpyl_rs0:
3287     ID = Intrinsic::hexagon_M2_mmpyl_rs0; break;
3288 
3289   case Hexagon::BI__builtin_HEXAGON_M2_mmpyl_rs1:
3290     ID = Intrinsic::hexagon_M2_mmpyl_rs1; break;
3291 
3292   case Hexagon::BI__builtin_HEXAGON_M2_mmpyh_rs0:
3293     ID = Intrinsic::hexagon_M2_mmpyh_rs0; break;
3294 
3295   case Hexagon::BI__builtin_HEXAGON_M2_mmpyh_rs1:
3296     ID = Intrinsic::hexagon_M2_mmpyh_rs1; break;
3297 
3298   case Hexagon::BI__builtin_HEXAGON_M2_hmmpyl_rs1:
3299     ID = Intrinsic::hexagon_M2_hmmpyl_rs1; break;
3300 
3301   case Hexagon::BI__builtin_HEXAGON_M2_hmmpyh_rs1:
3302     ID = Intrinsic::hexagon_M2_hmmpyh_rs1; break;
3303 
3304   case Hexagon::BI__builtin_HEXAGON_M2_mmaculs_s0:
3305     ID = Intrinsic::hexagon_M2_mmaculs_s0; break;
3306 
3307   case Hexagon::BI__builtin_HEXAGON_M2_mmaculs_s1:
3308     ID = Intrinsic::hexagon_M2_mmaculs_s1; break;
3309 
3310   case Hexagon::BI__builtin_HEXAGON_M2_mmacuhs_s0:
3311     ID = Intrinsic::hexagon_M2_mmacuhs_s0; break;
3312 
3313   case Hexagon::BI__builtin_HEXAGON_M2_mmacuhs_s1:
3314     ID = Intrinsic::hexagon_M2_mmacuhs_s1; break;
3315 
3316   case Hexagon::BI__builtin_HEXAGON_M2_mmpyul_s0:
3317     ID = Intrinsic::hexagon_M2_mmpyul_s0; break;
3318 
3319   case Hexagon::BI__builtin_HEXAGON_M2_mmpyul_s1:
3320     ID = Intrinsic::hexagon_M2_mmpyul_s1; break;
3321 
3322   case Hexagon::BI__builtin_HEXAGON_M2_mmpyuh_s0:
3323     ID = Intrinsic::hexagon_M2_mmpyuh_s0; break;
3324 
3325   case Hexagon::BI__builtin_HEXAGON_M2_mmpyuh_s1:
3326     ID = Intrinsic::hexagon_M2_mmpyuh_s1; break;
3327 
3328   case Hexagon::BI__builtin_HEXAGON_M2_mmaculs_rs0:
3329     ID = Intrinsic::hexagon_M2_mmaculs_rs0; break;
3330 
3331   case Hexagon::BI__builtin_HEXAGON_M2_mmaculs_rs1:
3332     ID = Intrinsic::hexagon_M2_mmaculs_rs1; break;
3333 
3334   case Hexagon::BI__builtin_HEXAGON_M2_mmacuhs_rs0:
3335     ID = Intrinsic::hexagon_M2_mmacuhs_rs0; break;
3336 
3337   case Hexagon::BI__builtin_HEXAGON_M2_mmacuhs_rs1:
3338     ID = Intrinsic::hexagon_M2_mmacuhs_rs1; break;
3339 
3340   case Hexagon::BI__builtin_HEXAGON_M2_mmpyul_rs0:
3341     ID = Intrinsic::hexagon_M2_mmpyul_rs0; break;
3342 
3343   case Hexagon::BI__builtin_HEXAGON_M2_mmpyul_rs1:
3344     ID = Intrinsic::hexagon_M2_mmpyul_rs1; break;
3345 
3346   case Hexagon::BI__builtin_HEXAGON_M2_mmpyuh_rs0:
3347     ID = Intrinsic::hexagon_M2_mmpyuh_rs0; break;
3348 
3349   case Hexagon::BI__builtin_HEXAGON_M2_mmpyuh_rs1:
3350     ID = Intrinsic::hexagon_M2_mmpyuh_rs1; break;
3351 
3352   case Hexagon::BI__builtin_HEXAGON_M2_vrcmaci_s0:
3353     ID = Intrinsic::hexagon_M2_vrcmaci_s0; break;
3354 
3355   case Hexagon::BI__builtin_HEXAGON_M2_vrcmacr_s0:
3356     ID = Intrinsic::hexagon_M2_vrcmacr_s0; break;
3357 
3358   case Hexagon::BI__builtin_HEXAGON_M2_vrcmaci_s0c:
3359     ID = Intrinsic::hexagon_M2_vrcmaci_s0c; break;
3360 
3361   case Hexagon::BI__builtin_HEXAGON_M2_vrcmacr_s0c:
3362     ID = Intrinsic::hexagon_M2_vrcmacr_s0c; break;
3363 
3364   case Hexagon::BI__builtin_HEXAGON_M2_cmaci_s0:
3365     ID = Intrinsic::hexagon_M2_cmaci_s0; break;
3366 
3367   case Hexagon::BI__builtin_HEXAGON_M2_cmacr_s0:
3368     ID = Intrinsic::hexagon_M2_cmacr_s0; break;
3369 
3370   case Hexagon::BI__builtin_HEXAGON_M2_vrcmpyi_s0:
3371     ID = Intrinsic::hexagon_M2_vrcmpyi_s0; break;
3372 
3373   case Hexagon::BI__builtin_HEXAGON_M2_vrcmpyr_s0:
3374     ID = Intrinsic::hexagon_M2_vrcmpyr_s0; break;
3375 
3376   case Hexagon::BI__builtin_HEXAGON_M2_vrcmpyi_s0c:
3377     ID = Intrinsic::hexagon_M2_vrcmpyi_s0c; break;
3378 
3379   case Hexagon::BI__builtin_HEXAGON_M2_vrcmpyr_s0c:
3380     ID = Intrinsic::hexagon_M2_vrcmpyr_s0c; break;
3381 
3382   case Hexagon::BI__builtin_HEXAGON_M2_cmpyi_s0:
3383     ID = Intrinsic::hexagon_M2_cmpyi_s0; break;
3384 
3385   case Hexagon::BI__builtin_HEXAGON_M2_cmpyr_s0:
3386     ID = Intrinsic::hexagon_M2_cmpyr_s0; break;
3387 
3388   case Hexagon::BI__builtin_HEXAGON_M2_vcmpy_s0_sat_i:
3389     ID = Intrinsic::hexagon_M2_vcmpy_s0_sat_i; break;
3390 
3391   case Hexagon::BI__builtin_HEXAGON_M2_vcmpy_s0_sat_r:
3392     ID = Intrinsic::hexagon_M2_vcmpy_s0_sat_r; break;
3393 
3394   case Hexagon::BI__builtin_HEXAGON_M2_vcmpy_s1_sat_i:
3395     ID = Intrinsic::hexagon_M2_vcmpy_s1_sat_i; break;
3396 
3397   case Hexagon::BI__builtin_HEXAGON_M2_vcmpy_s1_sat_r:
3398     ID = Intrinsic::hexagon_M2_vcmpy_s1_sat_r; break;
3399 
3400   case Hexagon::BI__builtin_HEXAGON_M2_vcmac_s0_sat_i:
3401     ID = Intrinsic::hexagon_M2_vcmac_s0_sat_i; break;
3402 
3403   case Hexagon::BI__builtin_HEXAGON_M2_vcmac_s0_sat_r:
3404     ID = Intrinsic::hexagon_M2_vcmac_s0_sat_r; break;
3405 
3406   case Hexagon::BI__builtin_HEXAGON_S2_vcrotate:
3407     ID = Intrinsic::hexagon_S2_vcrotate; break;
3408 
3409   case Hexagon::BI__builtin_HEXAGON_A2_add:
3410     ID = Intrinsic::hexagon_A2_add; break;
3411 
3412   case Hexagon::BI__builtin_HEXAGON_A2_sub:
3413     ID = Intrinsic::hexagon_A2_sub; break;
3414 
3415   case Hexagon::BI__builtin_HEXAGON_A2_addsat:
3416     ID = Intrinsic::hexagon_A2_addsat; break;
3417 
3418   case Hexagon::BI__builtin_HEXAGON_A2_subsat:
3419     ID = Intrinsic::hexagon_A2_subsat; break;
3420 
3421   case Hexagon::BI__builtin_HEXAGON_A2_addi:
3422     ID = Intrinsic::hexagon_A2_addi; break;
3423 
3424   case Hexagon::BI__builtin_HEXAGON_A2_addh_l16_ll:
3425     ID = Intrinsic::hexagon_A2_addh_l16_ll; break;
3426 
3427   case Hexagon::BI__builtin_HEXAGON_A2_addh_l16_hl:
3428     ID = Intrinsic::hexagon_A2_addh_l16_hl; break;
3429 
3430   case Hexagon::BI__builtin_HEXAGON_A2_addh_l16_sat_ll:
3431     ID = Intrinsic::hexagon_A2_addh_l16_sat_ll; break;
3432 
3433   case Hexagon::BI__builtin_HEXAGON_A2_addh_l16_sat_hl:
3434     ID = Intrinsic::hexagon_A2_addh_l16_sat_hl; break;
3435 
3436   case Hexagon::BI__builtin_HEXAGON_A2_subh_l16_ll:
3437     ID = Intrinsic::hexagon_A2_subh_l16_ll; break;
3438 
3439   case Hexagon::BI__builtin_HEXAGON_A2_subh_l16_hl:
3440     ID = Intrinsic::hexagon_A2_subh_l16_hl; break;
3441 
3442   case Hexagon::BI__builtin_HEXAGON_A2_subh_l16_sat_ll:
3443     ID = Intrinsic::hexagon_A2_subh_l16_sat_ll; break;
3444 
3445   case Hexagon::BI__builtin_HEXAGON_A2_subh_l16_sat_hl:
3446     ID = Intrinsic::hexagon_A2_subh_l16_sat_hl; break;
3447 
3448   case Hexagon::BI__builtin_HEXAGON_A2_addh_h16_ll:
3449     ID = Intrinsic::hexagon_A2_addh_h16_ll; break;
3450 
3451   case Hexagon::BI__builtin_HEXAGON_A2_addh_h16_lh:
3452     ID = Intrinsic::hexagon_A2_addh_h16_lh; break;
3453 
3454   case Hexagon::BI__builtin_HEXAGON_A2_addh_h16_hl:
3455     ID = Intrinsic::hexagon_A2_addh_h16_hl; break;
3456 
3457   case Hexagon::BI__builtin_HEXAGON_A2_addh_h16_hh:
3458     ID = Intrinsic::hexagon_A2_addh_h16_hh; break;
3459 
3460   case Hexagon::BI__builtin_HEXAGON_A2_addh_h16_sat_ll:
3461     ID = Intrinsic::hexagon_A2_addh_h16_sat_ll; break;
3462 
3463   case Hexagon::BI__builtin_HEXAGON_A2_addh_h16_sat_lh:
3464     ID = Intrinsic::hexagon_A2_addh_h16_sat_lh; break;
3465 
3466   case Hexagon::BI__builtin_HEXAGON_A2_addh_h16_sat_hl:
3467     ID = Intrinsic::hexagon_A2_addh_h16_sat_hl; break;
3468 
3469   case Hexagon::BI__builtin_HEXAGON_A2_addh_h16_sat_hh:
3470     ID = Intrinsic::hexagon_A2_addh_h16_sat_hh; break;
3471 
3472   case Hexagon::BI__builtin_HEXAGON_A2_subh_h16_ll:
3473     ID = Intrinsic::hexagon_A2_subh_h16_ll; break;
3474 
3475   case Hexagon::BI__builtin_HEXAGON_A2_subh_h16_lh:
3476     ID = Intrinsic::hexagon_A2_subh_h16_lh; break;
3477 
3478   case Hexagon::BI__builtin_HEXAGON_A2_subh_h16_hl:
3479     ID = Intrinsic::hexagon_A2_subh_h16_hl; break;
3480 
3481   case Hexagon::BI__builtin_HEXAGON_A2_subh_h16_hh:
3482     ID = Intrinsic::hexagon_A2_subh_h16_hh; break;
3483 
3484   case Hexagon::BI__builtin_HEXAGON_A2_subh_h16_sat_ll:
3485     ID = Intrinsic::hexagon_A2_subh_h16_sat_ll; break;
3486 
3487   case Hexagon::BI__builtin_HEXAGON_A2_subh_h16_sat_lh:
3488     ID = Intrinsic::hexagon_A2_subh_h16_sat_lh; break;
3489 
3490   case Hexagon::BI__builtin_HEXAGON_A2_subh_h16_sat_hl:
3491     ID = Intrinsic::hexagon_A2_subh_h16_sat_hl; break;
3492 
3493   case Hexagon::BI__builtin_HEXAGON_A2_subh_h16_sat_hh:
3494     ID = Intrinsic::hexagon_A2_subh_h16_sat_hh; break;
3495 
3496   case Hexagon::BI__builtin_HEXAGON_A2_aslh:
3497     ID = Intrinsic::hexagon_A2_aslh; break;
3498 
3499   case Hexagon::BI__builtin_HEXAGON_A2_asrh:
3500     ID = Intrinsic::hexagon_A2_asrh; break;
3501 
3502   case Hexagon::BI__builtin_HEXAGON_A2_addp:
3503     ID = Intrinsic::hexagon_A2_addp; break;
3504 
3505   case Hexagon::BI__builtin_HEXAGON_A2_addpsat:
3506     ID = Intrinsic::hexagon_A2_addpsat; break;
3507 
3508   case Hexagon::BI__builtin_HEXAGON_A2_addsp:
3509     ID = Intrinsic::hexagon_A2_addsp; break;
3510 
3511   case Hexagon::BI__builtin_HEXAGON_A2_subp:
3512     ID = Intrinsic::hexagon_A2_subp; break;
3513 
3514   case Hexagon::BI__builtin_HEXAGON_A2_neg:
3515     ID = Intrinsic::hexagon_A2_neg; break;
3516 
3517   case Hexagon::BI__builtin_HEXAGON_A2_negsat:
3518     ID = Intrinsic::hexagon_A2_negsat; break;
3519 
3520   case Hexagon::BI__builtin_HEXAGON_A2_abs:
3521     ID = Intrinsic::hexagon_A2_abs; break;
3522 
3523   case Hexagon::BI__builtin_HEXAGON_A2_abssat:
3524     ID = Intrinsic::hexagon_A2_abssat; break;
3525 
3526   case Hexagon::BI__builtin_HEXAGON_A2_vconj:
3527     ID = Intrinsic::hexagon_A2_vconj; break;
3528 
3529   case Hexagon::BI__builtin_HEXAGON_A2_negp:
3530     ID = Intrinsic::hexagon_A2_negp; break;
3531 
3532   case Hexagon::BI__builtin_HEXAGON_A2_absp:
3533     ID = Intrinsic::hexagon_A2_absp; break;
3534 
3535   case Hexagon::BI__builtin_HEXAGON_A2_max:
3536     ID = Intrinsic::hexagon_A2_max; break;
3537 
3538   case Hexagon::BI__builtin_HEXAGON_A2_maxu:
3539     ID = Intrinsic::hexagon_A2_maxu; break;
3540 
3541   case Hexagon::BI__builtin_HEXAGON_A2_min:
3542     ID = Intrinsic::hexagon_A2_min; break;
3543 
3544   case Hexagon::BI__builtin_HEXAGON_A2_minu:
3545     ID = Intrinsic::hexagon_A2_minu; break;
3546 
3547   case Hexagon::BI__builtin_HEXAGON_A2_maxp:
3548     ID = Intrinsic::hexagon_A2_maxp; break;
3549 
3550   case Hexagon::BI__builtin_HEXAGON_A2_maxup:
3551     ID = Intrinsic::hexagon_A2_maxup; break;
3552 
3553   case Hexagon::BI__builtin_HEXAGON_A2_minp:
3554     ID = Intrinsic::hexagon_A2_minp; break;
3555 
3556   case Hexagon::BI__builtin_HEXAGON_A2_minup:
3557     ID = Intrinsic::hexagon_A2_minup; break;
3558 
3559   case Hexagon::BI__builtin_HEXAGON_A2_tfr:
3560     ID = Intrinsic::hexagon_A2_tfr; break;
3561 
3562   case Hexagon::BI__builtin_HEXAGON_A2_tfrsi:
3563     ID = Intrinsic::hexagon_A2_tfrsi; break;
3564 
3565   case Hexagon::BI__builtin_HEXAGON_A2_tfrp:
3566     ID = Intrinsic::hexagon_A2_tfrp; break;
3567 
3568   case Hexagon::BI__builtin_HEXAGON_A2_tfrpi:
3569     ID = Intrinsic::hexagon_A2_tfrpi; break;
3570 
3571   case Hexagon::BI__builtin_HEXAGON_A2_zxtb:
3572     ID = Intrinsic::hexagon_A2_zxtb; break;
3573 
3574   case Hexagon::BI__builtin_HEXAGON_A2_sxtb:
3575     ID = Intrinsic::hexagon_A2_sxtb; break;
3576 
3577   case Hexagon::BI__builtin_HEXAGON_A2_zxth:
3578     ID = Intrinsic::hexagon_A2_zxth; break;
3579 
3580   case Hexagon::BI__builtin_HEXAGON_A2_sxth:
3581     ID = Intrinsic::hexagon_A2_sxth; break;
3582 
3583   case Hexagon::BI__builtin_HEXAGON_A2_combinew:
3584     ID = Intrinsic::hexagon_A2_combinew; break;
3585 
3586   case Hexagon::BI__builtin_HEXAGON_A2_combineii:
3587     ID = Intrinsic::hexagon_A2_combineii; break;
3588 
3589   case Hexagon::BI__builtin_HEXAGON_A2_combine_hh:
3590     ID = Intrinsic::hexagon_A2_combine_hh; break;
3591 
3592   case Hexagon::BI__builtin_HEXAGON_A2_combine_hl:
3593     ID = Intrinsic::hexagon_A2_combine_hl; break;
3594 
3595   case Hexagon::BI__builtin_HEXAGON_A2_combine_lh:
3596     ID = Intrinsic::hexagon_A2_combine_lh; break;
3597 
3598   case Hexagon::BI__builtin_HEXAGON_A2_combine_ll:
3599     ID = Intrinsic::hexagon_A2_combine_ll; break;
3600 
3601   case Hexagon::BI__builtin_HEXAGON_A2_tfril:
3602     ID = Intrinsic::hexagon_A2_tfril; break;
3603 
3604   case Hexagon::BI__builtin_HEXAGON_A2_tfrih:
3605     ID = Intrinsic::hexagon_A2_tfrih; break;
3606 
3607   case Hexagon::BI__builtin_HEXAGON_A2_and:
3608     ID = Intrinsic::hexagon_A2_and; break;
3609 
3610   case Hexagon::BI__builtin_HEXAGON_A2_or:
3611     ID = Intrinsic::hexagon_A2_or; break;
3612 
3613   case Hexagon::BI__builtin_HEXAGON_A2_xor:
3614     ID = Intrinsic::hexagon_A2_xor; break;
3615 
3616   case Hexagon::BI__builtin_HEXAGON_A2_not:
3617     ID = Intrinsic::hexagon_A2_not; break;
3618 
3619   case Hexagon::BI__builtin_HEXAGON_M2_xor_xacc:
3620     ID = Intrinsic::hexagon_M2_xor_xacc; break;
3621 
3622   case Hexagon::BI__builtin_HEXAGON_A2_subri:
3623     ID = Intrinsic::hexagon_A2_subri; break;
3624 
3625   case Hexagon::BI__builtin_HEXAGON_A2_andir:
3626     ID = Intrinsic::hexagon_A2_andir; break;
3627 
3628   case Hexagon::BI__builtin_HEXAGON_A2_orir:
3629     ID = Intrinsic::hexagon_A2_orir; break;
3630 
3631   case Hexagon::BI__builtin_HEXAGON_A2_andp:
3632     ID = Intrinsic::hexagon_A2_andp; break;
3633 
3634   case Hexagon::BI__builtin_HEXAGON_A2_orp:
3635     ID = Intrinsic::hexagon_A2_orp; break;
3636 
3637   case Hexagon::BI__builtin_HEXAGON_A2_xorp:
3638     ID = Intrinsic::hexagon_A2_xorp; break;
3639 
3640   case Hexagon::BI__builtin_HEXAGON_A2_notp:
3641     ID = Intrinsic::hexagon_A2_notp; break;
3642 
3643   case Hexagon::BI__builtin_HEXAGON_A2_sxtw:
3644     ID = Intrinsic::hexagon_A2_sxtw; break;
3645 
3646   case Hexagon::BI__builtin_HEXAGON_A2_sat:
3647     ID = Intrinsic::hexagon_A2_sat; break;
3648 
3649   case Hexagon::BI__builtin_HEXAGON_A2_sath:
3650     ID = Intrinsic::hexagon_A2_sath; break;
3651 
3652   case Hexagon::BI__builtin_HEXAGON_A2_satuh:
3653     ID = Intrinsic::hexagon_A2_satuh; break;
3654 
3655   case Hexagon::BI__builtin_HEXAGON_A2_satub:
3656     ID = Intrinsic::hexagon_A2_satub; break;
3657 
3658   case Hexagon::BI__builtin_HEXAGON_A2_satb:
3659     ID = Intrinsic::hexagon_A2_satb; break;
3660 
3661   case Hexagon::BI__builtin_HEXAGON_A2_vaddub:
3662     ID = Intrinsic::hexagon_A2_vaddub; break;
3663 
3664   case Hexagon::BI__builtin_HEXAGON_A2_vaddubs:
3665     ID = Intrinsic::hexagon_A2_vaddubs; break;
3666 
3667   case Hexagon::BI__builtin_HEXAGON_A2_vaddh:
3668     ID = Intrinsic::hexagon_A2_vaddh; break;
3669 
3670   case Hexagon::BI__builtin_HEXAGON_A2_vaddhs:
3671     ID = Intrinsic::hexagon_A2_vaddhs; break;
3672 
3673   case Hexagon::BI__builtin_HEXAGON_A2_vadduhs:
3674     ID = Intrinsic::hexagon_A2_vadduhs; break;
3675 
3676   case Hexagon::BI__builtin_HEXAGON_A2_vaddw:
3677     ID = Intrinsic::hexagon_A2_vaddw; break;
3678 
3679   case Hexagon::BI__builtin_HEXAGON_A2_vaddws:
3680     ID = Intrinsic::hexagon_A2_vaddws; break;
3681 
3682   case Hexagon::BI__builtin_HEXAGON_A2_svavgh:
3683     ID = Intrinsic::hexagon_A2_svavgh; break;
3684 
3685   case Hexagon::BI__builtin_HEXAGON_A2_svavghs:
3686     ID = Intrinsic::hexagon_A2_svavghs; break;
3687 
3688   case Hexagon::BI__builtin_HEXAGON_A2_svnavgh:
3689     ID = Intrinsic::hexagon_A2_svnavgh; break;
3690 
3691   case Hexagon::BI__builtin_HEXAGON_A2_svaddh:
3692     ID = Intrinsic::hexagon_A2_svaddh; break;
3693 
3694   case Hexagon::BI__builtin_HEXAGON_A2_svaddhs:
3695     ID = Intrinsic::hexagon_A2_svaddhs; break;
3696 
3697   case Hexagon::BI__builtin_HEXAGON_A2_svadduhs:
3698     ID = Intrinsic::hexagon_A2_svadduhs; break;
3699 
3700   case Hexagon::BI__builtin_HEXAGON_A2_svsubh:
3701     ID = Intrinsic::hexagon_A2_svsubh; break;
3702 
3703   case Hexagon::BI__builtin_HEXAGON_A2_svsubhs:
3704     ID = Intrinsic::hexagon_A2_svsubhs; break;
3705 
3706   case Hexagon::BI__builtin_HEXAGON_A2_svsubuhs:
3707     ID = Intrinsic::hexagon_A2_svsubuhs; break;
3708 
3709   case Hexagon::BI__builtin_HEXAGON_A2_vraddub:
3710     ID = Intrinsic::hexagon_A2_vraddub; break;
3711 
3712   case Hexagon::BI__builtin_HEXAGON_A2_vraddub_acc:
3713     ID = Intrinsic::hexagon_A2_vraddub_acc; break;
3714 
3715   case Hexagon::BI__builtin_HEXAGON_M2_vradduh:
3716     ID = Intrinsic::hexagon_M2_vradduh; break;
3717 
3718   case Hexagon::BI__builtin_HEXAGON_A2_vsubub:
3719     ID = Intrinsic::hexagon_A2_vsubub; break;
3720 
3721   case Hexagon::BI__builtin_HEXAGON_A2_vsububs:
3722     ID = Intrinsic::hexagon_A2_vsububs; break;
3723 
3724   case Hexagon::BI__builtin_HEXAGON_A2_vsubh:
3725     ID = Intrinsic::hexagon_A2_vsubh; break;
3726 
3727   case Hexagon::BI__builtin_HEXAGON_A2_vsubhs:
3728     ID = Intrinsic::hexagon_A2_vsubhs; break;
3729 
3730   case Hexagon::BI__builtin_HEXAGON_A2_vsubuhs:
3731     ID = Intrinsic::hexagon_A2_vsubuhs; break;
3732 
3733   case Hexagon::BI__builtin_HEXAGON_A2_vsubw:
3734     ID = Intrinsic::hexagon_A2_vsubw; break;
3735 
3736   case Hexagon::BI__builtin_HEXAGON_A2_vsubws:
3737     ID = Intrinsic::hexagon_A2_vsubws; break;
3738 
3739   case Hexagon::BI__builtin_HEXAGON_A2_vabsh:
3740     ID = Intrinsic::hexagon_A2_vabsh; break;
3741 
3742   case Hexagon::BI__builtin_HEXAGON_A2_vabshsat:
3743     ID = Intrinsic::hexagon_A2_vabshsat; break;
3744 
3745   case Hexagon::BI__builtin_HEXAGON_A2_vabsw:
3746     ID = Intrinsic::hexagon_A2_vabsw; break;
3747 
3748   case Hexagon::BI__builtin_HEXAGON_A2_vabswsat:
3749     ID = Intrinsic::hexagon_A2_vabswsat; break;
3750 
3751   case Hexagon::BI__builtin_HEXAGON_M2_vabsdiffw:
3752     ID = Intrinsic::hexagon_M2_vabsdiffw; break;
3753 
3754   case Hexagon::BI__builtin_HEXAGON_M2_vabsdiffh:
3755     ID = Intrinsic::hexagon_M2_vabsdiffh; break;
3756 
3757   case Hexagon::BI__builtin_HEXAGON_A2_vrsadub:
3758     ID = Intrinsic::hexagon_A2_vrsadub; break;
3759 
3760   case Hexagon::BI__builtin_HEXAGON_A2_vrsadub_acc:
3761     ID = Intrinsic::hexagon_A2_vrsadub_acc; break;
3762 
3763   case Hexagon::BI__builtin_HEXAGON_A2_vavgub:
3764     ID = Intrinsic::hexagon_A2_vavgub; break;
3765 
3766   case Hexagon::BI__builtin_HEXAGON_A2_vavguh:
3767     ID = Intrinsic::hexagon_A2_vavguh; break;
3768 
3769   case Hexagon::BI__builtin_HEXAGON_A2_vavgh:
3770     ID = Intrinsic::hexagon_A2_vavgh; break;
3771 
3772   case Hexagon::BI__builtin_HEXAGON_A2_vnavgh:
3773     ID = Intrinsic::hexagon_A2_vnavgh; break;
3774 
3775   case Hexagon::BI__builtin_HEXAGON_A2_vavgw:
3776     ID = Intrinsic::hexagon_A2_vavgw; break;
3777 
3778   case Hexagon::BI__builtin_HEXAGON_A2_vnavgw:
3779     ID = Intrinsic::hexagon_A2_vnavgw; break;
3780 
3781   case Hexagon::BI__builtin_HEXAGON_A2_vavgwr:
3782     ID = Intrinsic::hexagon_A2_vavgwr; break;
3783 
3784   case Hexagon::BI__builtin_HEXAGON_A2_vnavgwr:
3785     ID = Intrinsic::hexagon_A2_vnavgwr; break;
3786 
3787   case Hexagon::BI__builtin_HEXAGON_A2_vavgwcr:
3788     ID = Intrinsic::hexagon_A2_vavgwcr; break;
3789 
3790   case Hexagon::BI__builtin_HEXAGON_A2_vnavgwcr:
3791     ID = Intrinsic::hexagon_A2_vnavgwcr; break;
3792 
3793   case Hexagon::BI__builtin_HEXAGON_A2_vavghcr:
3794     ID = Intrinsic::hexagon_A2_vavghcr; break;
3795 
3796   case Hexagon::BI__builtin_HEXAGON_A2_vnavghcr:
3797     ID = Intrinsic::hexagon_A2_vnavghcr; break;
3798 
3799   case Hexagon::BI__builtin_HEXAGON_A2_vavguw:
3800     ID = Intrinsic::hexagon_A2_vavguw; break;
3801 
3802   case Hexagon::BI__builtin_HEXAGON_A2_vavguwr:
3803     ID = Intrinsic::hexagon_A2_vavguwr; break;
3804 
3805   case Hexagon::BI__builtin_HEXAGON_A2_vavgubr:
3806     ID = Intrinsic::hexagon_A2_vavgubr; break;
3807 
3808   case Hexagon::BI__builtin_HEXAGON_A2_vavguhr:
3809     ID = Intrinsic::hexagon_A2_vavguhr; break;
3810 
3811   case Hexagon::BI__builtin_HEXAGON_A2_vavghr:
3812     ID = Intrinsic::hexagon_A2_vavghr; break;
3813 
3814   case Hexagon::BI__builtin_HEXAGON_A2_vnavghr:
3815     ID = Intrinsic::hexagon_A2_vnavghr; break;
3816 
3817   case Hexagon::BI__builtin_HEXAGON_A2_vminh:
3818     ID = Intrinsic::hexagon_A2_vminh; break;
3819 
3820   case Hexagon::BI__builtin_HEXAGON_A2_vmaxh:
3821     ID = Intrinsic::hexagon_A2_vmaxh; break;
3822 
3823   case Hexagon::BI__builtin_HEXAGON_A2_vminub:
3824     ID = Intrinsic::hexagon_A2_vminub; break;
3825 
3826   case Hexagon::BI__builtin_HEXAGON_A2_vmaxub:
3827     ID = Intrinsic::hexagon_A2_vmaxub; break;
3828 
3829   case Hexagon::BI__builtin_HEXAGON_A2_vminuh:
3830     ID = Intrinsic::hexagon_A2_vminuh; break;
3831 
3832   case Hexagon::BI__builtin_HEXAGON_A2_vmaxuh:
3833     ID = Intrinsic::hexagon_A2_vmaxuh; break;
3834 
3835   case Hexagon::BI__builtin_HEXAGON_A2_vminw:
3836     ID = Intrinsic::hexagon_A2_vminw; break;
3837 
3838   case Hexagon::BI__builtin_HEXAGON_A2_vmaxw:
3839     ID = Intrinsic::hexagon_A2_vmaxw; break;
3840 
3841   case Hexagon::BI__builtin_HEXAGON_A2_vminuw:
3842     ID = Intrinsic::hexagon_A2_vminuw; break;
3843 
3844   case Hexagon::BI__builtin_HEXAGON_A2_vmaxuw:
3845     ID = Intrinsic::hexagon_A2_vmaxuw; break;
3846 
3847   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_r:
3848     ID = Intrinsic::hexagon_S2_asr_r_r; break;
3849 
3850   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_r:
3851     ID = Intrinsic::hexagon_S2_asl_r_r; break;
3852 
3853   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_r:
3854     ID = Intrinsic::hexagon_S2_lsr_r_r; break;
3855 
3856   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_r:
3857     ID = Intrinsic::hexagon_S2_lsl_r_r; break;
3858 
3859   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_p:
3860     ID = Intrinsic::hexagon_S2_asr_r_p; break;
3861 
3862   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_p:
3863     ID = Intrinsic::hexagon_S2_asl_r_p; break;
3864 
3865   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_p:
3866     ID = Intrinsic::hexagon_S2_lsr_r_p; break;
3867 
3868   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_p:
3869     ID = Intrinsic::hexagon_S2_lsl_r_p; break;
3870 
3871   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_r_acc:
3872     ID = Intrinsic::hexagon_S2_asr_r_r_acc; break;
3873 
3874   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_r_acc:
3875     ID = Intrinsic::hexagon_S2_asl_r_r_acc; break;
3876 
3877   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_r_acc:
3878     ID = Intrinsic::hexagon_S2_lsr_r_r_acc; break;
3879 
3880   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_r_acc:
3881     ID = Intrinsic::hexagon_S2_lsl_r_r_acc; break;
3882 
3883   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_p_acc:
3884     ID = Intrinsic::hexagon_S2_asr_r_p_acc; break;
3885 
3886   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_p_acc:
3887     ID = Intrinsic::hexagon_S2_asl_r_p_acc; break;
3888 
3889   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_p_acc:
3890     ID = Intrinsic::hexagon_S2_lsr_r_p_acc; break;
3891 
3892   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_p_acc:
3893     ID = Intrinsic::hexagon_S2_lsl_r_p_acc; break;
3894 
3895   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_r_nac:
3896     ID = Intrinsic::hexagon_S2_asr_r_r_nac; break;
3897 
3898   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_r_nac:
3899     ID = Intrinsic::hexagon_S2_asl_r_r_nac; break;
3900 
3901   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_r_nac:
3902     ID = Intrinsic::hexagon_S2_lsr_r_r_nac; break;
3903 
3904   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_r_nac:
3905     ID = Intrinsic::hexagon_S2_lsl_r_r_nac; break;
3906 
3907   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_p_nac:
3908     ID = Intrinsic::hexagon_S2_asr_r_p_nac; break;
3909 
3910   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_p_nac:
3911     ID = Intrinsic::hexagon_S2_asl_r_p_nac; break;
3912 
3913   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_p_nac:
3914     ID = Intrinsic::hexagon_S2_lsr_r_p_nac; break;
3915 
3916   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_p_nac:
3917     ID = Intrinsic::hexagon_S2_lsl_r_p_nac; break;
3918 
3919   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_r_and:
3920     ID = Intrinsic::hexagon_S2_asr_r_r_and; break;
3921 
3922   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_r_and:
3923     ID = Intrinsic::hexagon_S2_asl_r_r_and; break;
3924 
3925   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_r_and:
3926     ID = Intrinsic::hexagon_S2_lsr_r_r_and; break;
3927 
3928   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_r_and:
3929     ID = Intrinsic::hexagon_S2_lsl_r_r_and; break;
3930 
3931   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_r_or:
3932     ID = Intrinsic::hexagon_S2_asr_r_r_or; break;
3933 
3934   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_r_or:
3935     ID = Intrinsic::hexagon_S2_asl_r_r_or; break;
3936 
3937   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_r_or:
3938     ID = Intrinsic::hexagon_S2_lsr_r_r_or; break;
3939 
3940   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_r_or:
3941     ID = Intrinsic::hexagon_S2_lsl_r_r_or; break;
3942 
3943   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_p_and:
3944     ID = Intrinsic::hexagon_S2_asr_r_p_and; break;
3945 
3946   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_p_and:
3947     ID = Intrinsic::hexagon_S2_asl_r_p_and; break;
3948 
3949   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_p_and:
3950     ID = Intrinsic::hexagon_S2_lsr_r_p_and; break;
3951 
3952   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_p_and:
3953     ID = Intrinsic::hexagon_S2_lsl_r_p_and; break;
3954 
3955   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_p_or:
3956     ID = Intrinsic::hexagon_S2_asr_r_p_or; break;
3957 
3958   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_p_or:
3959     ID = Intrinsic::hexagon_S2_asl_r_p_or; break;
3960 
3961   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_p_or:
3962     ID = Intrinsic::hexagon_S2_lsr_r_p_or; break;
3963 
3964   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_p_or:
3965     ID = Intrinsic::hexagon_S2_lsl_r_p_or; break;
3966 
3967   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_r_sat:
3968     ID = Intrinsic::hexagon_S2_asr_r_r_sat; break;
3969 
3970   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_r_sat:
3971     ID = Intrinsic::hexagon_S2_asl_r_r_sat; break;
3972 
3973   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_r:
3974     ID = Intrinsic::hexagon_S2_asr_i_r; break;
3975 
3976   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r:
3977     ID = Intrinsic::hexagon_S2_lsr_i_r; break;
3978 
3979   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_r:
3980     ID = Intrinsic::hexagon_S2_asl_i_r; break;
3981 
3982   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_p:
3983     ID = Intrinsic::hexagon_S2_asr_i_p; break;
3984 
3985   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p:
3986     ID = Intrinsic::hexagon_S2_lsr_i_p; break;
3987 
3988   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_p:
3989     ID = Intrinsic::hexagon_S2_asl_i_p; break;
3990 
3991   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_acc:
3992     ID = Intrinsic::hexagon_S2_asr_i_r_acc; break;
3993 
3994   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_acc:
3995     ID = Intrinsic::hexagon_S2_lsr_i_r_acc; break;
3996 
3997   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_acc:
3998     ID = Intrinsic::hexagon_S2_asl_i_r_acc; break;
3999 
4000   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_acc:
4001     ID = Intrinsic::hexagon_S2_asr_i_p_acc; break;
4002 
4003   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_acc:
4004     ID = Intrinsic::hexagon_S2_lsr_i_p_acc; break;
4005 
4006   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_acc:
4007     ID = Intrinsic::hexagon_S2_asl_i_p_acc; break;
4008 
4009   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_nac:
4010     ID = Intrinsic::hexagon_S2_asr_i_r_nac; break;
4011 
4012   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_nac:
4013     ID = Intrinsic::hexagon_S2_lsr_i_r_nac; break;
4014 
4015   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_nac:
4016     ID = Intrinsic::hexagon_S2_asl_i_r_nac; break;
4017 
4018   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_nac:
4019     ID = Intrinsic::hexagon_S2_asr_i_p_nac; break;
4020 
4021   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_nac:
4022     ID = Intrinsic::hexagon_S2_lsr_i_p_nac; break;
4023 
4024   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_nac:
4025     ID = Intrinsic::hexagon_S2_asl_i_p_nac; break;
4026 
4027   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_xacc:
4028     ID = Intrinsic::hexagon_S2_lsr_i_r_xacc; break;
4029 
4030   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_xacc:
4031     ID = Intrinsic::hexagon_S2_asl_i_r_xacc; break;
4032 
4033   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_xacc:
4034     ID = Intrinsic::hexagon_S2_lsr_i_p_xacc; break;
4035 
4036   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_xacc:
4037     ID = Intrinsic::hexagon_S2_asl_i_p_xacc; break;
4038 
4039   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_and:
4040     ID = Intrinsic::hexagon_S2_asr_i_r_and; break;
4041 
4042   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_and:
4043     ID = Intrinsic::hexagon_S2_lsr_i_r_and; break;
4044 
4045   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_and:
4046     ID = Intrinsic::hexagon_S2_asl_i_r_and; break;
4047 
4048   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_or:
4049     ID = Intrinsic::hexagon_S2_asr_i_r_or; break;
4050 
4051   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_or:
4052     ID = Intrinsic::hexagon_S2_lsr_i_r_or; break;
4053 
4054   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_or:
4055     ID = Intrinsic::hexagon_S2_asl_i_r_or; break;
4056 
4057   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_and:
4058     ID = Intrinsic::hexagon_S2_asr_i_p_and; break;
4059 
4060   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_and:
4061     ID = Intrinsic::hexagon_S2_lsr_i_p_and; break;
4062 
4063   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_and:
4064     ID = Intrinsic::hexagon_S2_asl_i_p_and; break;
4065 
4066   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_or:
4067     ID = Intrinsic::hexagon_S2_asr_i_p_or; break;
4068 
4069   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_or:
4070     ID = Intrinsic::hexagon_S2_lsr_i_p_or; break;
4071 
4072   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_or:
4073     ID = Intrinsic::hexagon_S2_asl_i_p_or; break;
4074 
4075   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_sat:
4076     ID = Intrinsic::hexagon_S2_asl_i_r_sat; break;
4077 
4078   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_rnd:
4079     ID = Intrinsic::hexagon_S2_asr_i_r_rnd; break;
4080 
4081   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_rnd_goodsyntax:
4082     ID = Intrinsic::hexagon_S2_asr_i_r_rnd_goodsyntax; break;
4083 
4084   case Hexagon::BI__builtin_HEXAGON_S2_addasl_rrri:
4085     ID = Intrinsic::hexagon_S2_addasl_rrri; break;
4086 
4087   case Hexagon::BI__builtin_HEXAGON_S2_valignib:
4088     ID = Intrinsic::hexagon_S2_valignib; break;
4089 
4090   case Hexagon::BI__builtin_HEXAGON_S2_valignrb:
4091     ID = Intrinsic::hexagon_S2_valignrb; break;
4092 
4093   case Hexagon::BI__builtin_HEXAGON_S2_vspliceib:
4094     ID = Intrinsic::hexagon_S2_vspliceib; break;
4095 
4096   case Hexagon::BI__builtin_HEXAGON_S2_vsplicerb:
4097     ID = Intrinsic::hexagon_S2_vsplicerb; break;
4098 
4099   case Hexagon::BI__builtin_HEXAGON_S2_vsplatrh:
4100     ID = Intrinsic::hexagon_S2_vsplatrh; break;
4101 
4102   case Hexagon::BI__builtin_HEXAGON_S2_vsplatrb:
4103     ID = Intrinsic::hexagon_S2_vsplatrb; break;
4104 
4105   case Hexagon::BI__builtin_HEXAGON_S2_insert:
4106     ID = Intrinsic::hexagon_S2_insert; break;
4107 
4108   case Hexagon::BI__builtin_HEXAGON_S2_tableidxb_goodsyntax:
4109     ID = Intrinsic::hexagon_S2_tableidxb_goodsyntax; break;
4110 
4111   case Hexagon::BI__builtin_HEXAGON_S2_tableidxh_goodsyntax:
4112     ID = Intrinsic::hexagon_S2_tableidxh_goodsyntax; break;
4113 
4114   case Hexagon::BI__builtin_HEXAGON_S2_tableidxw_goodsyntax:
4115     ID = Intrinsic::hexagon_S2_tableidxw_goodsyntax; break;
4116 
4117   case Hexagon::BI__builtin_HEXAGON_S2_tableidxd_goodsyntax:
4118     ID = Intrinsic::hexagon_S2_tableidxd_goodsyntax; break;
4119 
4120   case Hexagon::BI__builtin_HEXAGON_S2_extractu:
4121     ID = Intrinsic::hexagon_S2_extractu; break;
4122 
4123   case Hexagon::BI__builtin_HEXAGON_S2_insertp:
4124     ID = Intrinsic::hexagon_S2_insertp; break;
4125 
4126   case Hexagon::BI__builtin_HEXAGON_S2_extractup:
4127     ID = Intrinsic::hexagon_S2_extractup; break;
4128 
4129   case Hexagon::BI__builtin_HEXAGON_S2_insert_rp:
4130     ID = Intrinsic::hexagon_S2_insert_rp; break;
4131 
4132   case Hexagon::BI__builtin_HEXAGON_S2_extractu_rp:
4133     ID = Intrinsic::hexagon_S2_extractu_rp; break;
4134 
4135   case Hexagon::BI__builtin_HEXAGON_S2_insertp_rp:
4136     ID = Intrinsic::hexagon_S2_insertp_rp; break;
4137 
4138   case Hexagon::BI__builtin_HEXAGON_S2_extractup_rp:
4139     ID = Intrinsic::hexagon_S2_extractup_rp; break;
4140 
4141   case Hexagon::BI__builtin_HEXAGON_S2_tstbit_i:
4142     ID = Intrinsic::hexagon_S2_tstbit_i; break;
4143 
4144   case Hexagon::BI__builtin_HEXAGON_S2_setbit_i:
4145     ID = Intrinsic::hexagon_S2_setbit_i; break;
4146 
4147   case Hexagon::BI__builtin_HEXAGON_S2_togglebit_i:
4148     ID = Intrinsic::hexagon_S2_togglebit_i; break;
4149 
4150   case Hexagon::BI__builtin_HEXAGON_S2_clrbit_i:
4151     ID = Intrinsic::hexagon_S2_clrbit_i; break;
4152 
4153   case Hexagon::BI__builtin_HEXAGON_S2_tstbit_r:
4154     ID = Intrinsic::hexagon_S2_tstbit_r; break;
4155 
4156   case Hexagon::BI__builtin_HEXAGON_S2_setbit_r:
4157     ID = Intrinsic::hexagon_S2_setbit_r; break;
4158 
4159   case Hexagon::BI__builtin_HEXAGON_S2_togglebit_r:
4160     ID = Intrinsic::hexagon_S2_togglebit_r; break;
4161 
4162   case Hexagon::BI__builtin_HEXAGON_S2_clrbit_r:
4163     ID = Intrinsic::hexagon_S2_clrbit_r; break;
4164 
4165   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_vh:
4166     ID = Intrinsic::hexagon_S2_asr_i_vh; break;
4167 
4168   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_vh:
4169     ID = Intrinsic::hexagon_S2_lsr_i_vh; break;
4170 
4171   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_vh:
4172     ID = Intrinsic::hexagon_S2_asl_i_vh; break;
4173 
4174   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_vh:
4175     ID = Intrinsic::hexagon_S2_asr_r_vh; break;
4176 
4177   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_vh:
4178     ID = Intrinsic::hexagon_S2_asl_r_vh; break;
4179 
4180   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_vh:
4181     ID = Intrinsic::hexagon_S2_lsr_r_vh; break;
4182 
4183   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_vh:
4184     ID = Intrinsic::hexagon_S2_lsl_r_vh; break;
4185 
4186   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_vw:
4187     ID = Intrinsic::hexagon_S2_asr_i_vw; break;
4188 
4189   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_svw_trun:
4190     ID = Intrinsic::hexagon_S2_asr_i_svw_trun; break;
4191 
4192   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_svw_trun:
4193     ID = Intrinsic::hexagon_S2_asr_r_svw_trun; break;
4194 
4195   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_vw:
4196     ID = Intrinsic::hexagon_S2_lsr_i_vw; break;
4197 
4198   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_vw:
4199     ID = Intrinsic::hexagon_S2_asl_i_vw; break;
4200 
4201   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_vw:
4202     ID = Intrinsic::hexagon_S2_asr_r_vw; break;
4203 
4204   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_vw:
4205     ID = Intrinsic::hexagon_S2_asl_r_vw; break;
4206 
4207   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_vw:
4208     ID = Intrinsic::hexagon_S2_lsr_r_vw; break;
4209 
4210   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_vw:
4211     ID = Intrinsic::hexagon_S2_lsl_r_vw; break;
4212 
4213   case Hexagon::BI__builtin_HEXAGON_S2_vrndpackwh:
4214     ID = Intrinsic::hexagon_S2_vrndpackwh; break;
4215 
4216   case Hexagon::BI__builtin_HEXAGON_S2_vrndpackwhs:
4217     ID = Intrinsic::hexagon_S2_vrndpackwhs; break;
4218 
4219   case Hexagon::BI__builtin_HEXAGON_S2_vsxtbh:
4220     ID = Intrinsic::hexagon_S2_vsxtbh; break;
4221 
4222   case Hexagon::BI__builtin_HEXAGON_S2_vzxtbh:
4223     ID = Intrinsic::hexagon_S2_vzxtbh; break;
4224 
4225   case Hexagon::BI__builtin_HEXAGON_S2_vsathub:
4226     ID = Intrinsic::hexagon_S2_vsathub; break;
4227 
4228   case Hexagon::BI__builtin_HEXAGON_S2_svsathub:
4229     ID = Intrinsic::hexagon_S2_svsathub; break;
4230 
4231   case Hexagon::BI__builtin_HEXAGON_S2_svsathb:
4232     ID = Intrinsic::hexagon_S2_svsathb; break;
4233 
4234   case Hexagon::BI__builtin_HEXAGON_S2_vsathb:
4235     ID = Intrinsic::hexagon_S2_vsathb; break;
4236 
4237   case Hexagon::BI__builtin_HEXAGON_S2_vtrunohb:
4238     ID = Intrinsic::hexagon_S2_vtrunohb; break;
4239 
4240   case Hexagon::BI__builtin_HEXAGON_S2_vtrunewh:
4241     ID = Intrinsic::hexagon_S2_vtrunewh; break;
4242 
4243   case Hexagon::BI__builtin_HEXAGON_S2_vtrunowh:
4244     ID = Intrinsic::hexagon_S2_vtrunowh; break;
4245 
4246   case Hexagon::BI__builtin_HEXAGON_S2_vtrunehb:
4247     ID = Intrinsic::hexagon_S2_vtrunehb; break;
4248 
4249   case Hexagon::BI__builtin_HEXAGON_S2_vsxthw:
4250     ID = Intrinsic::hexagon_S2_vsxthw; break;
4251 
4252   case Hexagon::BI__builtin_HEXAGON_S2_vzxthw:
4253     ID = Intrinsic::hexagon_S2_vzxthw; break;
4254 
4255   case Hexagon::BI__builtin_HEXAGON_S2_vsatwh:
4256     ID = Intrinsic::hexagon_S2_vsatwh; break;
4257 
4258   case Hexagon::BI__builtin_HEXAGON_S2_vsatwuh:
4259     ID = Intrinsic::hexagon_S2_vsatwuh; break;
4260 
4261   case Hexagon::BI__builtin_HEXAGON_S2_packhl:
4262     ID = Intrinsic::hexagon_S2_packhl; break;
4263 
4264   case Hexagon::BI__builtin_HEXAGON_A2_swiz:
4265     ID = Intrinsic::hexagon_A2_swiz; break;
4266 
4267   case Hexagon::BI__builtin_HEXAGON_S2_vsathub_nopack:
4268     ID = Intrinsic::hexagon_S2_vsathub_nopack; break;
4269 
4270   case Hexagon::BI__builtin_HEXAGON_S2_vsathb_nopack:
4271     ID = Intrinsic::hexagon_S2_vsathb_nopack; break;
4272 
4273   case Hexagon::BI__builtin_HEXAGON_S2_vsatwh_nopack:
4274     ID = Intrinsic::hexagon_S2_vsatwh_nopack; break;
4275 
4276   case Hexagon::BI__builtin_HEXAGON_S2_vsatwuh_nopack:
4277     ID = Intrinsic::hexagon_S2_vsatwuh_nopack; break;
4278 
4279   case Hexagon::BI__builtin_HEXAGON_S2_shuffob:
4280     ID = Intrinsic::hexagon_S2_shuffob; break;
4281 
4282   case Hexagon::BI__builtin_HEXAGON_S2_shuffeb:
4283     ID = Intrinsic::hexagon_S2_shuffeb; break;
4284 
4285   case Hexagon::BI__builtin_HEXAGON_S2_shuffoh:
4286     ID = Intrinsic::hexagon_S2_shuffoh; break;
4287 
4288   case Hexagon::BI__builtin_HEXAGON_S2_shuffeh:
4289     ID = Intrinsic::hexagon_S2_shuffeh; break;
4290 
4291   case Hexagon::BI__builtin_HEXAGON_S2_parityp:
4292     ID = Intrinsic::hexagon_S2_parityp; break;
4293 
4294   case Hexagon::BI__builtin_HEXAGON_S2_lfsp:
4295     ID = Intrinsic::hexagon_S2_lfsp; break;
4296 
4297   case Hexagon::BI__builtin_HEXAGON_S2_clbnorm:
4298     ID = Intrinsic::hexagon_S2_clbnorm; break;
4299 
4300   case Hexagon::BI__builtin_HEXAGON_S2_clb:
4301     ID = Intrinsic::hexagon_S2_clb; break;
4302 
4303   case Hexagon::BI__builtin_HEXAGON_S2_cl0:
4304     ID = Intrinsic::hexagon_S2_cl0; break;
4305 
4306   case Hexagon::BI__builtin_HEXAGON_S2_cl1:
4307     ID = Intrinsic::hexagon_S2_cl1; break;
4308 
4309   case Hexagon::BI__builtin_HEXAGON_S2_clbp:
4310     ID = Intrinsic::hexagon_S2_clbp; break;
4311 
4312   case Hexagon::BI__builtin_HEXAGON_S2_cl0p:
4313     ID = Intrinsic::hexagon_S2_cl0p; break;
4314 
4315   case Hexagon::BI__builtin_HEXAGON_S2_cl1p:
4316     ID = Intrinsic::hexagon_S2_cl1p; break;
4317 
4318   case Hexagon::BI__builtin_HEXAGON_S2_brev:
4319     ID = Intrinsic::hexagon_S2_brev; break;
4320 
4321   case Hexagon::BI__builtin_HEXAGON_S2_ct0:
4322     ID = Intrinsic::hexagon_S2_ct0; break;
4323 
4324   case Hexagon::BI__builtin_HEXAGON_S2_ct1:
4325     ID = Intrinsic::hexagon_S2_ct1; break;
4326 
4327   case Hexagon::BI__builtin_HEXAGON_S2_interleave:
4328     ID = Intrinsic::hexagon_S2_interleave; break;
4329 
4330   case Hexagon::BI__builtin_HEXAGON_S2_deinterleave:
4331     ID = Intrinsic::hexagon_S2_deinterleave; break;
4332 
4333   case Hexagon::BI__builtin_SI_to_SXTHI_asrh:
4334     ID = Intrinsic::hexagon_SI_to_SXTHI_asrh; break;
4335 
4336   case Hexagon::BI__builtin_HEXAGON_A4_orn:
4337     ID = Intrinsic::hexagon_A4_orn; break;
4338 
4339   case Hexagon::BI__builtin_HEXAGON_A4_andn:
4340     ID = Intrinsic::hexagon_A4_andn; break;
4341 
4342   case Hexagon::BI__builtin_HEXAGON_A4_ornp:
4343     ID = Intrinsic::hexagon_A4_ornp; break;
4344 
4345   case Hexagon::BI__builtin_HEXAGON_A4_andnp:
4346     ID = Intrinsic::hexagon_A4_andnp; break;
4347 
4348   case Hexagon::BI__builtin_HEXAGON_A4_combineir:
4349     ID = Intrinsic::hexagon_A4_combineir; break;
4350 
4351   case Hexagon::BI__builtin_HEXAGON_A4_combineri:
4352     ID = Intrinsic::hexagon_A4_combineri; break;
4353 
4354   case Hexagon::BI__builtin_HEXAGON_C4_cmpneqi:
4355     ID = Intrinsic::hexagon_C4_cmpneqi; break;
4356 
4357   case Hexagon::BI__builtin_HEXAGON_C4_cmpneq:
4358     ID = Intrinsic::hexagon_C4_cmpneq; break;
4359 
4360   case Hexagon::BI__builtin_HEXAGON_C4_cmpltei:
4361     ID = Intrinsic::hexagon_C4_cmpltei; break;
4362 
4363   case Hexagon::BI__builtin_HEXAGON_C4_cmplte:
4364     ID = Intrinsic::hexagon_C4_cmplte; break;
4365 
4366   case Hexagon::BI__builtin_HEXAGON_C4_cmplteui:
4367     ID = Intrinsic::hexagon_C4_cmplteui; break;
4368 
4369   case Hexagon::BI__builtin_HEXAGON_C4_cmplteu:
4370     ID = Intrinsic::hexagon_C4_cmplteu; break;
4371 
4372   case Hexagon::BI__builtin_HEXAGON_A4_rcmpneq:
4373     ID = Intrinsic::hexagon_A4_rcmpneq; break;
4374 
4375   case Hexagon::BI__builtin_HEXAGON_A4_rcmpneqi:
4376     ID = Intrinsic::hexagon_A4_rcmpneqi; break;
4377 
4378   case Hexagon::BI__builtin_HEXAGON_A4_rcmpeq:
4379     ID = Intrinsic::hexagon_A4_rcmpeq; break;
4380 
4381   case Hexagon::BI__builtin_HEXAGON_A4_rcmpeqi:
4382     ID = Intrinsic::hexagon_A4_rcmpeqi; break;
4383 
4384   case Hexagon::BI__builtin_HEXAGON_C4_fastcorner9:
4385     ID = Intrinsic::hexagon_C4_fastcorner9; break;
4386 
4387   case Hexagon::BI__builtin_HEXAGON_C4_fastcorner9_not:
4388     ID = Intrinsic::hexagon_C4_fastcorner9_not; break;
4389 
4390   case Hexagon::BI__builtin_HEXAGON_C4_and_andn:
4391     ID = Intrinsic::hexagon_C4_and_andn; break;
4392 
4393   case Hexagon::BI__builtin_HEXAGON_C4_and_and:
4394     ID = Intrinsic::hexagon_C4_and_and; break;
4395 
4396   case Hexagon::BI__builtin_HEXAGON_C4_and_orn:
4397     ID = Intrinsic::hexagon_C4_and_orn; break;
4398 
4399   case Hexagon::BI__builtin_HEXAGON_C4_and_or:
4400     ID = Intrinsic::hexagon_C4_and_or; break;
4401 
4402   case Hexagon::BI__builtin_HEXAGON_C4_or_andn:
4403     ID = Intrinsic::hexagon_C4_or_andn; break;
4404 
4405   case Hexagon::BI__builtin_HEXAGON_C4_or_and:
4406     ID = Intrinsic::hexagon_C4_or_and; break;
4407 
4408   case Hexagon::BI__builtin_HEXAGON_C4_or_orn:
4409     ID = Intrinsic::hexagon_C4_or_orn; break;
4410 
4411   case Hexagon::BI__builtin_HEXAGON_C4_or_or:
4412     ID = Intrinsic::hexagon_C4_or_or; break;
4413 
4414   case Hexagon::BI__builtin_HEXAGON_S4_addaddi:
4415     ID = Intrinsic::hexagon_S4_addaddi; break;
4416 
4417   case Hexagon::BI__builtin_HEXAGON_S4_subaddi:
4418     ID = Intrinsic::hexagon_S4_subaddi; break;
4419 
4420   case Hexagon::BI__builtin_HEXAGON_M4_xor_xacc:
4421     ID = Intrinsic::hexagon_M4_xor_xacc; break;
4422 
4423   case Hexagon::BI__builtin_HEXAGON_M4_and_and:
4424     ID = Intrinsic::hexagon_M4_and_and; break;
4425 
4426   case Hexagon::BI__builtin_HEXAGON_M4_and_or:
4427     ID = Intrinsic::hexagon_M4_and_or; break;
4428 
4429   case Hexagon::BI__builtin_HEXAGON_M4_and_xor:
4430     ID = Intrinsic::hexagon_M4_and_xor; break;
4431 
4432   case Hexagon::BI__builtin_HEXAGON_M4_and_andn:
4433     ID = Intrinsic::hexagon_M4_and_andn; break;
4434 
4435   case Hexagon::BI__builtin_HEXAGON_M4_xor_and:
4436     ID = Intrinsic::hexagon_M4_xor_and; break;
4437 
4438   case Hexagon::BI__builtin_HEXAGON_M4_xor_or:
4439     ID = Intrinsic::hexagon_M4_xor_or; break;
4440 
4441   case Hexagon::BI__builtin_HEXAGON_M4_xor_andn:
4442     ID = Intrinsic::hexagon_M4_xor_andn; break;
4443 
4444   case Hexagon::BI__builtin_HEXAGON_M4_or_and:
4445     ID = Intrinsic::hexagon_M4_or_and; break;
4446 
4447   case Hexagon::BI__builtin_HEXAGON_M4_or_or:
4448     ID = Intrinsic::hexagon_M4_or_or; break;
4449 
4450   case Hexagon::BI__builtin_HEXAGON_M4_or_xor:
4451     ID = Intrinsic::hexagon_M4_or_xor; break;
4452 
4453   case Hexagon::BI__builtin_HEXAGON_M4_or_andn:
4454     ID = Intrinsic::hexagon_M4_or_andn; break;
4455 
4456   case Hexagon::BI__builtin_HEXAGON_S4_or_andix:
4457     ID = Intrinsic::hexagon_S4_or_andix; break;
4458 
4459   case Hexagon::BI__builtin_HEXAGON_S4_or_andi:
4460     ID = Intrinsic::hexagon_S4_or_andi; break;
4461 
4462   case Hexagon::BI__builtin_HEXAGON_S4_or_ori:
4463     ID = Intrinsic::hexagon_S4_or_ori; break;
4464 
4465   case Hexagon::BI__builtin_HEXAGON_A4_modwrapu:
4466     ID = Intrinsic::hexagon_A4_modwrapu; break;
4467 
4468   case Hexagon::BI__builtin_HEXAGON_A4_cround_rr:
4469     ID = Intrinsic::hexagon_A4_cround_rr; break;
4470 
4471   case Hexagon::BI__builtin_HEXAGON_A4_round_ri:
4472     ID = Intrinsic::hexagon_A4_round_ri; break;
4473 
4474   case Hexagon::BI__builtin_HEXAGON_A4_round_rr:
4475     ID = Intrinsic::hexagon_A4_round_rr; break;
4476 
4477   case Hexagon::BI__builtin_HEXAGON_A4_round_ri_sat:
4478     ID = Intrinsic::hexagon_A4_round_ri_sat; break;
4479 
4480   case Hexagon::BI__builtin_HEXAGON_A4_round_rr_sat:
4481     ID = Intrinsic::hexagon_A4_round_rr_sat; break;
4482 
4483   }
4484 
4485   llvm::Function *F = CGM.getIntrinsic(ID);
4486   return Builder.CreateCall(F, Ops, "");
4487 }
4488 
4489 Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
4490                                            const CallExpr *E) {
4491   SmallVector<Value*, 4> Ops;
4492 
4493   for (unsigned i = 0, e = E->getNumArgs(); i != e; i++)
4494     Ops.push_back(EmitScalarExpr(E->getArg(i)));
4495 
4496   Intrinsic::ID ID = Intrinsic::not_intrinsic;
4497 
4498   switch (BuiltinID) {
4499   default: return 0;
4500 
4501   // vec_ld, vec_lvsl, vec_lvsr
4502   case PPC::BI__builtin_altivec_lvx:
4503   case PPC::BI__builtin_altivec_lvxl:
4504   case PPC::BI__builtin_altivec_lvebx:
4505   case PPC::BI__builtin_altivec_lvehx:
4506   case PPC::BI__builtin_altivec_lvewx:
4507   case PPC::BI__builtin_altivec_lvsl:
4508   case PPC::BI__builtin_altivec_lvsr:
4509   {
4510     Ops[1] = Builder.CreateBitCast(Ops[1], Int8PtrTy);
4511 
4512     Ops[0] = Builder.CreateGEP(Ops[1], Ops[0]);
4513     Ops.pop_back();
4514 
4515     switch (BuiltinID) {
4516     default: llvm_unreachable("Unsupported ld/lvsl/lvsr intrinsic!");
4517     case PPC::BI__builtin_altivec_lvx:
4518       ID = Intrinsic::ppc_altivec_lvx;
4519       break;
4520     case PPC::BI__builtin_altivec_lvxl:
4521       ID = Intrinsic::ppc_altivec_lvxl;
4522       break;
4523     case PPC::BI__builtin_altivec_lvebx:
4524       ID = Intrinsic::ppc_altivec_lvebx;
4525       break;
4526     case PPC::BI__builtin_altivec_lvehx:
4527       ID = Intrinsic::ppc_altivec_lvehx;
4528       break;
4529     case PPC::BI__builtin_altivec_lvewx:
4530       ID = Intrinsic::ppc_altivec_lvewx;
4531       break;
4532     case PPC::BI__builtin_altivec_lvsl:
4533       ID = Intrinsic::ppc_altivec_lvsl;
4534       break;
4535     case PPC::BI__builtin_altivec_lvsr:
4536       ID = Intrinsic::ppc_altivec_lvsr;
4537       break;
4538     }
4539     llvm::Function *F = CGM.getIntrinsic(ID);
4540     return Builder.CreateCall(F, Ops, "");
4541   }
4542 
4543   // vec_st
4544   case PPC::BI__builtin_altivec_stvx:
4545   case PPC::BI__builtin_altivec_stvxl:
4546   case PPC::BI__builtin_altivec_stvebx:
4547   case PPC::BI__builtin_altivec_stvehx:
4548   case PPC::BI__builtin_altivec_stvewx:
4549   {
4550     Ops[2] = Builder.CreateBitCast(Ops[2], Int8PtrTy);
4551     Ops[1] = Builder.CreateGEP(Ops[2], Ops[1]);
4552     Ops.pop_back();
4553 
4554     switch (BuiltinID) {
4555     default: llvm_unreachable("Unsupported st intrinsic!");
4556     case PPC::BI__builtin_altivec_stvx:
4557       ID = Intrinsic::ppc_altivec_stvx;
4558       break;
4559     case PPC::BI__builtin_altivec_stvxl:
4560       ID = Intrinsic::ppc_altivec_stvxl;
4561       break;
4562     case PPC::BI__builtin_altivec_stvebx:
4563       ID = Intrinsic::ppc_altivec_stvebx;
4564       break;
4565     case PPC::BI__builtin_altivec_stvehx:
4566       ID = Intrinsic::ppc_altivec_stvehx;
4567       break;
4568     case PPC::BI__builtin_altivec_stvewx:
4569       ID = Intrinsic::ppc_altivec_stvewx;
4570       break;
4571     }
4572     llvm::Function *F = CGM.getIntrinsic(ID);
4573     return Builder.CreateCall(F, Ops, "");
4574   }
4575   }
4576 }
4577