clang API Documentation

CGBuiltin.cpp
Go to the documentation of this file.
00001 //===---- CGBuiltin.cpp - Emit LLVM Code for builtins ---------------------===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 // This contains code to emit Builtin calls as LLVM code.
00011 //
00012 //===----------------------------------------------------------------------===//
00013 
00014 #include "TargetInfo.h"
00015 #include "CodeGenFunction.h"
00016 #include "CodeGenModule.h"
00017 #include "CGObjCRuntime.h"
00018 #include "clang/Basic/TargetInfo.h"
00019 #include "clang/AST/ASTContext.h"
00020 #include "clang/AST/Decl.h"
00021 #include "clang/Basic/TargetBuiltins.h"
00022 #include "llvm/Intrinsics.h"
00023 #include "llvm/Target/TargetData.h"
00024 
00025 using namespace clang;
00026 using namespace CodeGen;
00027 using namespace llvm;
00028 
00029 /// getBuiltinLibFunction - Given a builtin id for a function like
00030 /// "__builtin_fabsf", return a Function* for "fabsf".
00031 llvm::Value *CodeGenModule::getBuiltinLibFunction(const FunctionDecl *FD,
00032                                                   unsigned BuiltinID) {
00033   assert(Context.BuiltinInfo.isLibFunction(BuiltinID));
00034 
00035   // Get the name, skip over the __builtin_ prefix (if necessary).
00036   StringRef Name;
00037   GlobalDecl D(FD);
00038 
00039   // If the builtin has been declared explicitly with an assembler label,
00040   // use the mangled name. This differs from the plain label on platforms
00041   // that prefix labels.
00042   if (FD->hasAttr<AsmLabelAttr>())
00043     Name = getMangledName(D);
00044   else
00045     Name = Context.BuiltinInfo.GetName(BuiltinID) + 10;
00046 
00047   llvm::FunctionType *Ty =
00048     cast<llvm::FunctionType>(getTypes().ConvertType(FD->getType()));
00049 
00050   return GetOrCreateLLVMFunction(Name, Ty, D, /*ForVTable=*/false);
00051 }
00052 
00053 /// Emit the conversions required to turn the given value into an
00054 /// integer of the given size.
00055 static Value *EmitToInt(CodeGenFunction &CGF, llvm::Value *V,
00056                         QualType T, llvm::IntegerType *IntType) {
00057   V = CGF.EmitToMemory(V, T);
00058 
00059   if (V->getType()->isPointerTy())
00060     return CGF.Builder.CreatePtrToInt(V, IntType);
00061 
00062   assert(V->getType() == IntType);
00063   return V;
00064 }
00065 
00066 static Value *EmitFromInt(CodeGenFunction &CGF, llvm::Value *V,
00067                           QualType T, llvm::Type *ResultType) {
00068   V = CGF.EmitFromMemory(V, T);
00069 
00070   if (ResultType->isPointerTy())
00071     return CGF.Builder.CreateIntToPtr(V, ResultType);
00072 
00073   assert(V->getType() == ResultType);
00074   return V;
00075 }
00076 
00077 /// Utility to insert an atomic instruction based on Instrinsic::ID
00078 /// and the expression node.
00079 static RValue EmitBinaryAtomic(CodeGenFunction &CGF,
00080                                llvm::AtomicRMWInst::BinOp Kind,
00081                                const CallExpr *E) {
00082   QualType T = E->getType();
00083   assert(E->getArg(0)->getType()->isPointerType());
00084   assert(CGF.getContext().hasSameUnqualifiedType(T,
00085                                   E->getArg(0)->getType()->getPointeeType()));
00086   assert(CGF.getContext().hasSameUnqualifiedType(T, E->getArg(1)->getType()));
00087 
00088   llvm::Value *DestPtr = CGF.EmitScalarExpr(E->getArg(0));
00089   unsigned AddrSpace =
00090     cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
00091 
00092   llvm::IntegerType *IntType =
00093     llvm::IntegerType::get(CGF.getLLVMContext(),
00094                            CGF.getContext().getTypeSize(T));
00095   llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
00096 
00097   llvm::Value *Args[2];
00098   Args[0] = CGF.Builder.CreateBitCast(DestPtr, IntPtrType);
00099   Args[1] = CGF.EmitScalarExpr(E->getArg(1));
00100   llvm::Type *ValueType = Args[1]->getType();
00101   Args[1] = EmitToInt(CGF, Args[1], T, IntType);
00102 
00103   llvm::Value *Result =
00104       CGF.Builder.CreateAtomicRMW(Kind, Args[0], Args[1],
00105                                   llvm::SequentiallyConsistent);
00106   Result = EmitFromInt(CGF, Result, T, ValueType);
00107   return RValue::get(Result);
00108 }
00109 
00110 /// Utility to insert an atomic instruction based Instrinsic::ID and
00111 /// the expression node, where the return value is the result of the
00112 /// operation.
00113 static RValue EmitBinaryAtomicPost(CodeGenFunction &CGF,
00114                                    llvm::AtomicRMWInst::BinOp Kind,
00115                                    const CallExpr *E,
00116                                    Instruction::BinaryOps Op) {
00117   QualType T = E->getType();
00118   assert(E->getArg(0)->getType()->isPointerType());
00119   assert(CGF.getContext().hasSameUnqualifiedType(T,
00120                                   E->getArg(0)->getType()->getPointeeType()));
00121   assert(CGF.getContext().hasSameUnqualifiedType(T, E->getArg(1)->getType()));
00122 
00123   llvm::Value *DestPtr = CGF.EmitScalarExpr(E->getArg(0));
00124   unsigned AddrSpace =
00125     cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
00126 
00127   llvm::IntegerType *IntType =
00128     llvm::IntegerType::get(CGF.getLLVMContext(),
00129                            CGF.getContext().getTypeSize(T));
00130   llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
00131 
00132   llvm::Value *Args[2];
00133   Args[1] = CGF.EmitScalarExpr(E->getArg(1));
00134   llvm::Type *ValueType = Args[1]->getType();
00135   Args[1] = EmitToInt(CGF, Args[1], T, IntType);
00136   Args[0] = CGF.Builder.CreateBitCast(DestPtr, IntPtrType);
00137 
00138   llvm::Value *Result =
00139       CGF.Builder.CreateAtomicRMW(Kind, Args[0], Args[1],
00140                                   llvm::SequentiallyConsistent);
00141   Result = CGF.Builder.CreateBinOp(Op, Result, Args[1]);
00142   Result = EmitFromInt(CGF, Result, T, ValueType);
00143   return RValue::get(Result);
00144 }
00145 
00146 /// EmitFAbs - Emit a call to fabs/fabsf/fabsl, depending on the type of ValTy,
00147 /// which must be a scalar floating point type.
00148 static Value *EmitFAbs(CodeGenFunction &CGF, Value *V, QualType ValTy) {
00149   const BuiltinType *ValTyP = ValTy->getAs<BuiltinType>();
00150   assert(ValTyP && "isn't scalar fp type!");
00151   
00152   StringRef FnName;
00153   switch (ValTyP->getKind()) {
00154   default: llvm_unreachable("Isn't a scalar fp type!");
00155   case BuiltinType::Float:      FnName = "fabsf"; break;
00156   case BuiltinType::Double:     FnName = "fabs"; break;
00157   case BuiltinType::LongDouble: FnName = "fabsl"; break;
00158   }
00159   
00160   // The prototype is something that takes and returns whatever V's type is.
00161   llvm::FunctionType *FT = llvm::FunctionType::get(V->getType(), V->getType(),
00162                                                    false);
00163   llvm::Value *Fn = CGF.CGM.CreateRuntimeFunction(FT, FnName);
00164 
00165   return CGF.Builder.CreateCall(Fn, V, "abs");
00166 }
00167 
00168 static RValue emitLibraryCall(CodeGenFunction &CGF, const FunctionDecl *Fn,
00169                               const CallExpr *E, llvm::Value *calleeValue) {
00170   return CGF.EmitCall(E->getCallee()->getType(), calleeValue,
00171                       ReturnValueSlot(), E->arg_begin(), E->arg_end(), Fn);
00172 }
00173 
00174 RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
00175                                         unsigned BuiltinID, const CallExpr *E) {
00176   // See if we can constant fold this builtin.  If so, don't emit it at all.
00177   Expr::EvalResult Result;
00178   if (E->EvaluateAsRValue(Result, CGM.getContext()) &&
00179       !Result.hasSideEffects()) {
00180     if (Result.Val.isInt())
00181       return RValue::get(llvm::ConstantInt::get(getLLVMContext(),
00182                                                 Result.Val.getInt()));
00183     if (Result.Val.isFloat())
00184       return RValue::get(llvm::ConstantFP::get(getLLVMContext(),
00185                                                Result.Val.getFloat()));
00186   }
00187 
00188   switch (BuiltinID) {
00189   default: break;  // Handle intrinsics and libm functions below.
00190   case Builtin::BI__builtin___CFStringMakeConstantString:
00191   case Builtin::BI__builtin___NSStringMakeConstantString:
00192     return RValue::get(CGM.EmitConstantExpr(E, E->getType(), 0));
00193   case Builtin::BI__builtin_stdarg_start:
00194   case Builtin::BI__builtin_va_start:
00195   case Builtin::BI__builtin_va_end: {
00196     Value *ArgValue = EmitVAListRef(E->getArg(0));
00197     llvm::Type *DestType = Int8PtrTy;
00198     if (ArgValue->getType() != DestType)
00199       ArgValue = Builder.CreateBitCast(ArgValue, DestType,
00200                                        ArgValue->getName().data());
00201 
00202     Intrinsic::ID inst = (BuiltinID == Builtin::BI__builtin_va_end) ?
00203       Intrinsic::vaend : Intrinsic::vastart;
00204     return RValue::get(Builder.CreateCall(CGM.getIntrinsic(inst), ArgValue));
00205   }
00206   case Builtin::BI__builtin_va_copy: {
00207     Value *DstPtr = EmitVAListRef(E->getArg(0));
00208     Value *SrcPtr = EmitVAListRef(E->getArg(1));
00209 
00210     llvm::Type *Type = Int8PtrTy;
00211 
00212     DstPtr = Builder.CreateBitCast(DstPtr, Type);
00213     SrcPtr = Builder.CreateBitCast(SrcPtr, Type);
00214     return RValue::get(Builder.CreateCall2(CGM.getIntrinsic(Intrinsic::vacopy),
00215                                            DstPtr, SrcPtr));
00216   }
00217   case Builtin::BI__builtin_abs: 
00218   case Builtin::BI__builtin_labs:
00219   case Builtin::BI__builtin_llabs: {
00220     Value *ArgValue = EmitScalarExpr(E->getArg(0));
00221 
00222     Value *NegOp = Builder.CreateNeg(ArgValue, "neg");
00223     Value *CmpResult =
00224     Builder.CreateICmpSGE(ArgValue,
00225                           llvm::Constant::getNullValue(ArgValue->getType()),
00226                                                             "abscond");
00227     Value *Result =
00228       Builder.CreateSelect(CmpResult, ArgValue, NegOp, "abs");
00229 
00230     return RValue::get(Result);
00231   }
00232   case Builtin::BI__builtin_ctzs:
00233   case Builtin::BI__builtin_ctz:
00234   case Builtin::BI__builtin_ctzl:
00235   case Builtin::BI__builtin_ctzll: {
00236     Value *ArgValue = EmitScalarExpr(E->getArg(0));
00237 
00238     llvm::Type *ArgType = ArgValue->getType();
00239     Value *F = CGM.getIntrinsic(Intrinsic::cttz, ArgType);
00240 
00241     llvm::Type *ResultType = ConvertType(E->getType());
00242     Value *ZeroUndef = Builder.getInt1(Target.isCLZForZeroUndef());
00243     Value *Result = Builder.CreateCall2(F, ArgValue, ZeroUndef);
00244     if (Result->getType() != ResultType)
00245       Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true,
00246                                      "cast");
00247     return RValue::get(Result);
00248   }
00249   case Builtin::BI__builtin_clzs:
00250   case Builtin::BI__builtin_clz:
00251   case Builtin::BI__builtin_clzl:
00252   case Builtin::BI__builtin_clzll: {
00253     Value *ArgValue = EmitScalarExpr(E->getArg(0));
00254 
00255     llvm::Type *ArgType = ArgValue->getType();
00256     Value *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType);
00257 
00258     llvm::Type *ResultType = ConvertType(E->getType());
00259     Value *ZeroUndef = Builder.getInt1(Target.isCLZForZeroUndef());
00260     Value *Result = Builder.CreateCall2(F, ArgValue, ZeroUndef);
00261     if (Result->getType() != ResultType)
00262       Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true,
00263                                      "cast");
00264     return RValue::get(Result);
00265   }
00266   case Builtin::BI__builtin_ffs:
00267   case Builtin::BI__builtin_ffsl:
00268   case Builtin::BI__builtin_ffsll: {
00269     // ffs(x) -> x ? cttz(x) + 1 : 0
00270     Value *ArgValue = EmitScalarExpr(E->getArg(0));
00271 
00272     llvm::Type *ArgType = ArgValue->getType();
00273     Value *F = CGM.getIntrinsic(Intrinsic::cttz, ArgType);
00274 
00275     llvm::Type *ResultType = ConvertType(E->getType());
00276     Value *Tmp = Builder.CreateAdd(Builder.CreateCall2(F, ArgValue,
00277                                                        Builder.getTrue()),
00278                                    llvm::ConstantInt::get(ArgType, 1));
00279     Value *Zero = llvm::Constant::getNullValue(ArgType);
00280     Value *IsZero = Builder.CreateICmpEQ(ArgValue, Zero, "iszero");
00281     Value *Result = Builder.CreateSelect(IsZero, Zero, Tmp, "ffs");
00282     if (Result->getType() != ResultType)
00283       Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true,
00284                                      "cast");
00285     return RValue::get(Result);
00286   }
00287   case Builtin::BI__builtin_parity:
00288   case Builtin::BI__builtin_parityl:
00289   case Builtin::BI__builtin_parityll: {
00290     // parity(x) -> ctpop(x) & 1
00291     Value *ArgValue = EmitScalarExpr(E->getArg(0));
00292 
00293     llvm::Type *ArgType = ArgValue->getType();
00294     Value *F = CGM.getIntrinsic(Intrinsic::ctpop, ArgType);
00295 
00296     llvm::Type *ResultType = ConvertType(E->getType());
00297     Value *Tmp = Builder.CreateCall(F, ArgValue);
00298     Value *Result = Builder.CreateAnd(Tmp, llvm::ConstantInt::get(ArgType, 1));
00299     if (Result->getType() != ResultType)
00300       Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true,
00301                                      "cast");
00302     return RValue::get(Result);
00303   }
00304   case Builtin::BI__builtin_popcount:
00305   case Builtin::BI__builtin_popcountl:
00306   case Builtin::BI__builtin_popcountll: {
00307     Value *ArgValue = EmitScalarExpr(E->getArg(0));
00308 
00309     llvm::Type *ArgType = ArgValue->getType();
00310     Value *F = CGM.getIntrinsic(Intrinsic::ctpop, ArgType);
00311 
00312     llvm::Type *ResultType = ConvertType(E->getType());
00313     Value *Result = Builder.CreateCall(F, ArgValue);
00314     if (Result->getType() != ResultType)
00315       Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true,
00316                                      "cast");
00317     return RValue::get(Result);
00318   }
00319   case Builtin::BI__builtin_expect: {
00320     Value *ArgValue = EmitScalarExpr(E->getArg(0));
00321     llvm::Type *ArgType = ArgValue->getType();
00322 
00323     Value *FnExpect = CGM.getIntrinsic(Intrinsic::expect, ArgType);
00324     Value *ExpectedValue = EmitScalarExpr(E->getArg(1));
00325 
00326     Value *Result = Builder.CreateCall2(FnExpect, ArgValue, ExpectedValue,
00327                                         "expval");
00328     return RValue::get(Result);
00329   }
00330   case Builtin::BI__builtin_bswap32:
00331   case Builtin::BI__builtin_bswap64: {
00332     Value *ArgValue = EmitScalarExpr(E->getArg(0));
00333     llvm::Type *ArgType = ArgValue->getType();
00334     Value *F = CGM.getIntrinsic(Intrinsic::bswap, ArgType);
00335     return RValue::get(Builder.CreateCall(F, ArgValue));
00336   }
00337   case Builtin::BI__builtin_object_size: {
00338     // We pass this builtin onto the optimizer so that it can
00339     // figure out the object size in more complex cases.
00340     llvm::Type *ResType = ConvertType(E->getType());
00341     
00342     // LLVM only supports 0 and 2, make sure that we pass along that
00343     // as a boolean.
00344     Value *Ty = EmitScalarExpr(E->getArg(1));
00345     ConstantInt *CI = dyn_cast<ConstantInt>(Ty);
00346     assert(CI);
00347     uint64_t val = CI->getZExtValue();
00348     CI = ConstantInt::get(Builder.getInt1Ty(), (val & 0x2) >> 1);    
00349     Value *Runtime = Builder.getInt32(0);  // FIXME: use BoundsChecking here?
00350     
00351     Value *F = CGM.getIntrinsic(Intrinsic::objectsize, ResType);
00352     return RValue::get(Builder.CreateCall3(F,
00353                                            EmitScalarExpr(E->getArg(0)),
00354                                            CI, Runtime));
00355   }
00356   case Builtin::BI__builtin_prefetch: {
00357     Value *Locality, *RW, *Address = EmitScalarExpr(E->getArg(0));
00358     // FIXME: Technically these constants should of type 'int', yes?
00359     RW = (E->getNumArgs() > 1) ? EmitScalarExpr(E->getArg(1)) :
00360       llvm::ConstantInt::get(Int32Ty, 0);
00361     Locality = (E->getNumArgs() > 2) ? EmitScalarExpr(E->getArg(2)) :
00362       llvm::ConstantInt::get(Int32Ty, 3);
00363     Value *Data = llvm::ConstantInt::get(Int32Ty, 1);
00364     Value *F = CGM.getIntrinsic(Intrinsic::prefetch);
00365     return RValue::get(Builder.CreateCall4(F, Address, RW, Locality, Data));
00366   }
00367   case Builtin::BI__builtin_trap: {
00368     Value *F = CGM.getIntrinsic(Intrinsic::trap);
00369     return RValue::get(Builder.CreateCall(F));
00370   }
00371   case Builtin::BI__builtin_unreachable: {
00372     if (CatchUndefined)
00373       EmitBranch(getTrapBB());
00374     else
00375       Builder.CreateUnreachable();
00376 
00377     // We do need to preserve an insertion point.
00378     EmitBlock(createBasicBlock("unreachable.cont"));
00379 
00380     return RValue::get(0);
00381   }
00382       
00383   case Builtin::BI__builtin_powi:
00384   case Builtin::BI__builtin_powif:
00385   case Builtin::BI__builtin_powil: {
00386     Value *Base = EmitScalarExpr(E->getArg(0));
00387     Value *Exponent = EmitScalarExpr(E->getArg(1));
00388     llvm::Type *ArgType = Base->getType();
00389     Value *F = CGM.getIntrinsic(Intrinsic::powi, ArgType);
00390     return RValue::get(Builder.CreateCall2(F, Base, Exponent));
00391   }
00392 
00393   case Builtin::BI__builtin_isgreater:
00394   case Builtin::BI__builtin_isgreaterequal:
00395   case Builtin::BI__builtin_isless:
00396   case Builtin::BI__builtin_islessequal:
00397   case Builtin::BI__builtin_islessgreater:
00398   case Builtin::BI__builtin_isunordered: {
00399     // Ordered comparisons: we know the arguments to these are matching scalar
00400     // floating point values.
00401     Value *LHS = EmitScalarExpr(E->getArg(0));
00402     Value *RHS = EmitScalarExpr(E->getArg(1));
00403 
00404     switch (BuiltinID) {
00405     default: llvm_unreachable("Unknown ordered comparison");
00406     case Builtin::BI__builtin_isgreater:
00407       LHS = Builder.CreateFCmpOGT(LHS, RHS, "cmp");
00408       break;
00409     case Builtin::BI__builtin_isgreaterequal:
00410       LHS = Builder.CreateFCmpOGE(LHS, RHS, "cmp");
00411       break;
00412     case Builtin::BI__builtin_isless:
00413       LHS = Builder.CreateFCmpOLT(LHS, RHS, "cmp");
00414       break;
00415     case Builtin::BI__builtin_islessequal:
00416       LHS = Builder.CreateFCmpOLE(LHS, RHS, "cmp");
00417       break;
00418     case Builtin::BI__builtin_islessgreater:
00419       LHS = Builder.CreateFCmpONE(LHS, RHS, "cmp");
00420       break;
00421     case Builtin::BI__builtin_isunordered:
00422       LHS = Builder.CreateFCmpUNO(LHS, RHS, "cmp");
00423       break;
00424     }
00425     // ZExt bool to int type.
00426     return RValue::get(Builder.CreateZExt(LHS, ConvertType(E->getType())));
00427   }
00428   case Builtin::BI__builtin_isnan: {
00429     Value *V = EmitScalarExpr(E->getArg(0));
00430     V = Builder.CreateFCmpUNO(V, V, "cmp");
00431     return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType())));
00432   }
00433   
00434   case Builtin::BI__builtin_isinf: {
00435     // isinf(x) --> fabs(x) == infinity
00436     Value *V = EmitScalarExpr(E->getArg(0));
00437     V = EmitFAbs(*this, V, E->getArg(0)->getType());
00438     
00439     V = Builder.CreateFCmpOEQ(V, ConstantFP::getInfinity(V->getType()),"isinf");
00440     return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType())));
00441   }
00442       
00443   // TODO: BI__builtin_isinf_sign
00444   //   isinf_sign(x) -> isinf(x) ? (signbit(x) ? -1 : 1) : 0
00445 
00446   case Builtin::BI__builtin_isnormal: {
00447     // isnormal(x) --> x == x && fabsf(x) < infinity && fabsf(x) >= float_min
00448     Value *V = EmitScalarExpr(E->getArg(0));
00449     Value *Eq = Builder.CreateFCmpOEQ(V, V, "iseq");
00450 
00451     Value *Abs = EmitFAbs(*this, V, E->getArg(0)->getType());
00452     Value *IsLessThanInf =
00453       Builder.CreateFCmpULT(Abs, ConstantFP::getInfinity(V->getType()),"isinf");
00454     APFloat Smallest = APFloat::getSmallestNormalized(
00455                    getContext().getFloatTypeSemantics(E->getArg(0)->getType()));
00456     Value *IsNormal =
00457       Builder.CreateFCmpUGE(Abs, ConstantFP::get(V->getContext(), Smallest),
00458                             "isnormal");
00459     V = Builder.CreateAnd(Eq, IsLessThanInf, "and");
00460     V = Builder.CreateAnd(V, IsNormal, "and");
00461     return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType())));
00462   }
00463 
00464   case Builtin::BI__builtin_isfinite: {
00465     // isfinite(x) --> x == x && fabs(x) != infinity;
00466     Value *V = EmitScalarExpr(E->getArg(0));
00467     Value *Eq = Builder.CreateFCmpOEQ(V, V, "iseq");
00468     
00469     Value *Abs = EmitFAbs(*this, V, E->getArg(0)->getType());
00470     Value *IsNotInf =
00471       Builder.CreateFCmpUNE(Abs, ConstantFP::getInfinity(V->getType()),"isinf");
00472     
00473     V = Builder.CreateAnd(Eq, IsNotInf, "and");
00474     return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType())));
00475   }
00476 
00477   case Builtin::BI__builtin_fpclassify: {
00478     Value *V = EmitScalarExpr(E->getArg(5));
00479     llvm::Type *Ty = ConvertType(E->getArg(5)->getType());
00480 
00481     // Create Result
00482     BasicBlock *Begin = Builder.GetInsertBlock();
00483     BasicBlock *End = createBasicBlock("fpclassify_end", this->CurFn);
00484     Builder.SetInsertPoint(End);
00485     PHINode *Result =
00486       Builder.CreatePHI(ConvertType(E->getArg(0)->getType()), 4,
00487                         "fpclassify_result");
00488 
00489     // if (V==0) return FP_ZERO
00490     Builder.SetInsertPoint(Begin);
00491     Value *IsZero = Builder.CreateFCmpOEQ(V, Constant::getNullValue(Ty),
00492                                           "iszero");
00493     Value *ZeroLiteral = EmitScalarExpr(E->getArg(4));
00494     BasicBlock *NotZero = createBasicBlock("fpclassify_not_zero", this->CurFn);
00495     Builder.CreateCondBr(IsZero, End, NotZero);
00496     Result->addIncoming(ZeroLiteral, Begin);
00497 
00498     // if (V != V) return FP_NAN
00499     Builder.SetInsertPoint(NotZero);
00500     Value *IsNan = Builder.CreateFCmpUNO(V, V, "cmp");
00501     Value *NanLiteral = EmitScalarExpr(E->getArg(0));
00502     BasicBlock *NotNan = createBasicBlock("fpclassify_not_nan", this->CurFn);
00503     Builder.CreateCondBr(IsNan, End, NotNan);
00504     Result->addIncoming(NanLiteral, NotZero);
00505 
00506     // if (fabs(V) == infinity) return FP_INFINITY
00507     Builder.SetInsertPoint(NotNan);
00508     Value *VAbs = EmitFAbs(*this, V, E->getArg(5)->getType());
00509     Value *IsInf =
00510       Builder.CreateFCmpOEQ(VAbs, ConstantFP::getInfinity(V->getType()),
00511                             "isinf");
00512     Value *InfLiteral = EmitScalarExpr(E->getArg(1));
00513     BasicBlock *NotInf = createBasicBlock("fpclassify_not_inf", this->CurFn);
00514     Builder.CreateCondBr(IsInf, End, NotInf);
00515     Result->addIncoming(InfLiteral, NotNan);
00516 
00517     // if (fabs(V) >= MIN_NORMAL) return FP_NORMAL else FP_SUBNORMAL
00518     Builder.SetInsertPoint(NotInf);
00519     APFloat Smallest = APFloat::getSmallestNormalized(
00520         getContext().getFloatTypeSemantics(E->getArg(5)->getType()));
00521     Value *IsNormal =
00522       Builder.CreateFCmpUGE(VAbs, ConstantFP::get(V->getContext(), Smallest),
00523                             "isnormal");
00524     Value *NormalResult =
00525       Builder.CreateSelect(IsNormal, EmitScalarExpr(E->getArg(2)),
00526                            EmitScalarExpr(E->getArg(3)));
00527     Builder.CreateBr(End);
00528     Result->addIncoming(NormalResult, NotInf);
00529 
00530     // return Result
00531     Builder.SetInsertPoint(End);
00532     return RValue::get(Result);
00533   }
00534       
00535   case Builtin::BIalloca:
00536   case Builtin::BI__builtin_alloca: {
00537     Value *Size = EmitScalarExpr(E->getArg(0));
00538     return RValue::get(Builder.CreateAlloca(Builder.getInt8Ty(), Size));
00539   }
00540   case Builtin::BIbzero:
00541   case Builtin::BI__builtin_bzero: {
00542     Value *Address = EmitScalarExpr(E->getArg(0));
00543     Value *SizeVal = EmitScalarExpr(E->getArg(1));
00544     unsigned Align = GetPointeeAlignment(E->getArg(0));
00545     Builder.CreateMemSet(Address, Builder.getInt8(0), SizeVal, Align, false);
00546     return RValue::get(Address);
00547   }
00548   case Builtin::BImemcpy:
00549   case Builtin::BI__builtin_memcpy: {
00550     Value *Address = EmitScalarExpr(E->getArg(0));
00551     Value *SrcAddr = EmitScalarExpr(E->getArg(1));
00552     Value *SizeVal = EmitScalarExpr(E->getArg(2));
00553     unsigned Align = std::min(GetPointeeAlignment(E->getArg(0)),
00554                               GetPointeeAlignment(E->getArg(1)));
00555     Builder.CreateMemCpy(Address, SrcAddr, SizeVal, Align, false);
00556     return RValue::get(Address);
00557   }
00558       
00559   case Builtin::BI__builtin___memcpy_chk: {
00560     // fold __builtin_memcpy_chk(x, y, cst1, cst2) to memset iff cst1<=cst2.
00561     llvm::APSInt Size, DstSize;
00562     if (!E->getArg(2)->EvaluateAsInt(Size, CGM.getContext()) ||
00563         !E->getArg(3)->EvaluateAsInt(DstSize, CGM.getContext()))
00564       break;
00565     if (Size.ugt(DstSize))
00566       break;
00567     Value *Dest = EmitScalarExpr(E->getArg(0));
00568     Value *Src = EmitScalarExpr(E->getArg(1));
00569     Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size);
00570     unsigned Align = std::min(GetPointeeAlignment(E->getArg(0)),
00571                               GetPointeeAlignment(E->getArg(1)));
00572     Builder.CreateMemCpy(Dest, Src, SizeVal, Align, false);
00573     return RValue::get(Dest);
00574   }
00575       
00576   case Builtin::BI__builtin_objc_memmove_collectable: {
00577     Value *Address = EmitScalarExpr(E->getArg(0));
00578     Value *SrcAddr = EmitScalarExpr(E->getArg(1));
00579     Value *SizeVal = EmitScalarExpr(E->getArg(2));
00580     CGM.getObjCRuntime().EmitGCMemmoveCollectable(*this, 
00581                                                   Address, SrcAddr, SizeVal);
00582     return RValue::get(Address);
00583   }
00584 
00585   case Builtin::BI__builtin___memmove_chk: {
00586     // fold __builtin_memmove_chk(x, y, cst1, cst2) to memset iff cst1<=cst2.
00587     llvm::APSInt Size, DstSize;
00588     if (!E->getArg(2)->EvaluateAsInt(Size, CGM.getContext()) ||
00589         !E->getArg(3)->EvaluateAsInt(DstSize, CGM.getContext()))
00590       break;
00591     if (Size.ugt(DstSize))
00592       break;
00593     Value *Dest = EmitScalarExpr(E->getArg(0));
00594     Value *Src = EmitScalarExpr(E->getArg(1));
00595     Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size);
00596     unsigned Align = std::min(GetPointeeAlignment(E->getArg(0)),
00597                               GetPointeeAlignment(E->getArg(1)));
00598     Builder.CreateMemMove(Dest, Src, SizeVal, Align, false);
00599     return RValue::get(Dest);
00600   }
00601 
00602   case Builtin::BImemmove:
00603   case Builtin::BI__builtin_memmove: {
00604     Value *Address = EmitScalarExpr(E->getArg(0));
00605     Value *SrcAddr = EmitScalarExpr(E->getArg(1));
00606     Value *SizeVal = EmitScalarExpr(E->getArg(2));
00607     unsigned Align = std::min(GetPointeeAlignment(E->getArg(0)),
00608                               GetPointeeAlignment(E->getArg(1)));
00609     Builder.CreateMemMove(Address, SrcAddr, SizeVal, Align, false);
00610     return RValue::get(Address);
00611   }
00612   case Builtin::BImemset:
00613   case Builtin::BI__builtin_memset: {
00614     Value *Address = EmitScalarExpr(E->getArg(0));
00615     Value *ByteVal = Builder.CreateTrunc(EmitScalarExpr(E->getArg(1)),
00616                                          Builder.getInt8Ty());
00617     Value *SizeVal = EmitScalarExpr(E->getArg(2));
00618     unsigned Align = GetPointeeAlignment(E->getArg(0));
00619     Builder.CreateMemSet(Address, ByteVal, SizeVal, Align, false);
00620     return RValue::get(Address);
00621   }
00622   case Builtin::BI__builtin___memset_chk: {
00623     // fold __builtin_memset_chk(x, y, cst1, cst2) to memset iff cst1<=cst2.
00624     llvm::APSInt Size, DstSize;
00625     if (!E->getArg(2)->EvaluateAsInt(Size, CGM.getContext()) ||
00626         !E->getArg(3)->EvaluateAsInt(DstSize, CGM.getContext()))
00627       break;
00628     if (Size.ugt(DstSize))
00629       break;
00630     Value *Address = EmitScalarExpr(E->getArg(0));
00631     Value *ByteVal = Builder.CreateTrunc(EmitScalarExpr(E->getArg(1)),
00632                                          Builder.getInt8Ty());
00633     Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size);
00634     unsigned Align = GetPointeeAlignment(E->getArg(0));
00635     Builder.CreateMemSet(Address, ByteVal, SizeVal, Align, false);
00636     
00637     return RValue::get(Address);
00638   }
00639   case Builtin::BI__builtin_dwarf_cfa: {
00640     // The offset in bytes from the first argument to the CFA.
00641     //
00642     // Why on earth is this in the frontend?  Is there any reason at
00643     // all that the backend can't reasonably determine this while
00644     // lowering llvm.eh.dwarf.cfa()?
00645     //
00646     // TODO: If there's a satisfactory reason, add a target hook for
00647     // this instead of hard-coding 0, which is correct for most targets.
00648     int32_t Offset = 0;
00649 
00650     Value *F = CGM.getIntrinsic(Intrinsic::eh_dwarf_cfa);
00651     return RValue::get(Builder.CreateCall(F, 
00652                                       llvm::ConstantInt::get(Int32Ty, Offset)));
00653   }
00654   case Builtin::BI__builtin_return_address: {
00655     Value *Depth = EmitScalarExpr(E->getArg(0));
00656     Depth = Builder.CreateIntCast(Depth, Int32Ty, false);
00657     Value *F = CGM.getIntrinsic(Intrinsic::returnaddress);
00658     return RValue::get(Builder.CreateCall(F, Depth));
00659   }
00660   case Builtin::BI__builtin_frame_address: {
00661     Value *Depth = EmitScalarExpr(E->getArg(0));
00662     Depth = Builder.CreateIntCast(Depth, Int32Ty, false);
00663     Value *F = CGM.getIntrinsic(Intrinsic::frameaddress);
00664     return RValue::get(Builder.CreateCall(F, Depth));
00665   }
00666   case Builtin::BI__builtin_extract_return_addr: {
00667     Value *Address = EmitScalarExpr(E->getArg(0));
00668     Value *Result = getTargetHooks().decodeReturnAddress(*this, Address);
00669     return RValue::get(Result);
00670   }
00671   case Builtin::BI__builtin_frob_return_addr: {
00672     Value *Address = EmitScalarExpr(E->getArg(0));
00673     Value *Result = getTargetHooks().encodeReturnAddress(*this, Address);
00674     return RValue::get(Result);
00675   }
00676   case Builtin::BI__builtin_dwarf_sp_column: {
00677     llvm::IntegerType *Ty
00678       = cast<llvm::IntegerType>(ConvertType(E->getType()));
00679     int Column = getTargetHooks().getDwarfEHStackPointer(CGM);
00680     if (Column == -1) {
00681       CGM.ErrorUnsupported(E, "__builtin_dwarf_sp_column");
00682       return RValue::get(llvm::UndefValue::get(Ty));
00683     }
00684     return RValue::get(llvm::ConstantInt::get(Ty, Column, true));
00685   }
00686   case Builtin::BI__builtin_init_dwarf_reg_size_table: {
00687     Value *Address = EmitScalarExpr(E->getArg(0));
00688     if (getTargetHooks().initDwarfEHRegSizeTable(*this, Address))
00689       CGM.ErrorUnsupported(E, "__builtin_init_dwarf_reg_size_table");
00690     return RValue::get(llvm::UndefValue::get(ConvertType(E->getType())));
00691   }
00692   case Builtin::BI__builtin_eh_return: {
00693     Value *Int = EmitScalarExpr(E->getArg(0));
00694     Value *Ptr = EmitScalarExpr(E->getArg(1));
00695 
00696     llvm::IntegerType *IntTy = cast<llvm::IntegerType>(Int->getType());
00697     assert((IntTy->getBitWidth() == 32 || IntTy->getBitWidth() == 64) &&
00698            "LLVM's __builtin_eh_return only supports 32- and 64-bit variants");
00699     Value *F = CGM.getIntrinsic(IntTy->getBitWidth() == 32
00700                                   ? Intrinsic::eh_return_i32
00701                                   : Intrinsic::eh_return_i64);
00702     Builder.CreateCall2(F, Int, Ptr);
00703     Builder.CreateUnreachable();
00704 
00705     // We do need to preserve an insertion point.
00706     EmitBlock(createBasicBlock("builtin_eh_return.cont"));
00707 
00708     return RValue::get(0);
00709   }
00710   case Builtin::BI__builtin_unwind_init: {
00711     Value *F = CGM.getIntrinsic(Intrinsic::eh_unwind_init);
00712     return RValue::get(Builder.CreateCall(F));
00713   }
00714   case Builtin::BI__builtin_extend_pointer: {
00715     // Extends a pointer to the size of an _Unwind_Word, which is
00716     // uint64_t on all platforms.  Generally this gets poked into a
00717     // register and eventually used as an address, so if the
00718     // addressing registers are wider than pointers and the platform
00719     // doesn't implicitly ignore high-order bits when doing
00720     // addressing, we need to make sure we zext / sext based on
00721     // the platform's expectations.
00722     //
00723     // See: http://gcc.gnu.org/ml/gcc-bugs/2002-02/msg00237.html
00724 
00725     // Cast the pointer to intptr_t.
00726     Value *Ptr = EmitScalarExpr(E->getArg(0));
00727     Value *Result = Builder.CreatePtrToInt(Ptr, IntPtrTy, "extend.cast");
00728 
00729     // If that's 64 bits, we're done.
00730     if (IntPtrTy->getBitWidth() == 64)
00731       return RValue::get(Result);
00732 
00733     // Otherwise, ask the codegen data what to do.
00734     if (getTargetHooks().extendPointerWithSExt())
00735       return RValue::get(Builder.CreateSExt(Result, Int64Ty, "extend.sext"));
00736     else
00737       return RValue::get(Builder.CreateZExt(Result, Int64Ty, "extend.zext"));
00738   }
00739   case Builtin::BI__builtin_setjmp: {
00740     // Buffer is a void**.
00741     Value *Buf = EmitScalarExpr(E->getArg(0));
00742 
00743     // Store the frame pointer to the setjmp buffer.
00744     Value *FrameAddr =
00745       Builder.CreateCall(CGM.getIntrinsic(Intrinsic::frameaddress),
00746                          ConstantInt::get(Int32Ty, 0));
00747     Builder.CreateStore(FrameAddr, Buf);
00748 
00749     // Store the stack pointer to the setjmp buffer.
00750     Value *StackAddr =
00751       Builder.CreateCall(CGM.getIntrinsic(Intrinsic::stacksave));
00752     Value *StackSaveSlot =
00753       Builder.CreateGEP(Buf, ConstantInt::get(Int32Ty, 2));
00754     Builder.CreateStore(StackAddr, StackSaveSlot);
00755 
00756     // Call LLVM's EH setjmp, which is lightweight.
00757     Value *F = CGM.getIntrinsic(Intrinsic::eh_sjlj_setjmp);
00758     Buf = Builder.CreateBitCast(Buf, Int8PtrTy);
00759     return RValue::get(Builder.CreateCall(F, Buf));
00760   }
00761   case Builtin::BI__builtin_longjmp: {
00762     Value *Buf = EmitScalarExpr(E->getArg(0));
00763     Buf = Builder.CreateBitCast(Buf, Int8PtrTy);
00764 
00765     // Call LLVM's EH longjmp, which is lightweight.
00766     Builder.CreateCall(CGM.getIntrinsic(Intrinsic::eh_sjlj_longjmp), Buf);
00767 
00768     // longjmp doesn't return; mark this as unreachable.
00769     Builder.CreateUnreachable();
00770 
00771     // We do need to preserve an insertion point.
00772     EmitBlock(createBasicBlock("longjmp.cont"));
00773 
00774     return RValue::get(0);
00775   }
00776   case Builtin::BI__sync_fetch_and_add:
00777   case Builtin::BI__sync_fetch_and_sub:
00778   case Builtin::BI__sync_fetch_and_or:
00779   case Builtin::BI__sync_fetch_and_and:
00780   case Builtin::BI__sync_fetch_and_xor:
00781   case Builtin::BI__sync_add_and_fetch:
00782   case Builtin::BI__sync_sub_and_fetch:
00783   case Builtin::BI__sync_and_and_fetch:
00784   case Builtin::BI__sync_or_and_fetch:
00785   case Builtin::BI__sync_xor_and_fetch:
00786   case Builtin::BI__sync_val_compare_and_swap:
00787   case Builtin::BI__sync_bool_compare_and_swap:
00788   case Builtin::BI__sync_lock_test_and_set:
00789   case Builtin::BI__sync_lock_release:
00790   case Builtin::BI__sync_swap:
00791     llvm_unreachable("Shouldn't make it through sema");
00792   case Builtin::BI__sync_fetch_and_add_1:
00793   case Builtin::BI__sync_fetch_and_add_2:
00794   case Builtin::BI__sync_fetch_and_add_4:
00795   case Builtin::BI__sync_fetch_and_add_8:
00796   case Builtin::BI__sync_fetch_and_add_16:
00797     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Add, E);
00798   case Builtin::BI__sync_fetch_and_sub_1:
00799   case Builtin::BI__sync_fetch_and_sub_2:
00800   case Builtin::BI__sync_fetch_and_sub_4:
00801   case Builtin::BI__sync_fetch_and_sub_8:
00802   case Builtin::BI__sync_fetch_and_sub_16:
00803     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Sub, E);
00804   case Builtin::BI__sync_fetch_and_or_1:
00805   case Builtin::BI__sync_fetch_and_or_2:
00806   case Builtin::BI__sync_fetch_and_or_4:
00807   case Builtin::BI__sync_fetch_and_or_8:
00808   case Builtin::BI__sync_fetch_and_or_16:
00809     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Or, E);
00810   case Builtin::BI__sync_fetch_and_and_1:
00811   case Builtin::BI__sync_fetch_and_and_2:
00812   case Builtin::BI__sync_fetch_and_and_4:
00813   case Builtin::BI__sync_fetch_and_and_8:
00814   case Builtin::BI__sync_fetch_and_and_16:
00815     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::And, E);
00816   case Builtin::BI__sync_fetch_and_xor_1:
00817   case Builtin::BI__sync_fetch_and_xor_2:
00818   case Builtin::BI__sync_fetch_and_xor_4:
00819   case Builtin::BI__sync_fetch_and_xor_8:
00820   case Builtin::BI__sync_fetch_and_xor_16:
00821     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Xor, E);
00822 
00823   // Clang extensions: not overloaded yet.
00824   case Builtin::BI__sync_fetch_and_min:
00825     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Min, E);
00826   case Builtin::BI__sync_fetch_and_max:
00827     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Max, E);
00828   case Builtin::BI__sync_fetch_and_umin:
00829     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::UMin, E);
00830   case Builtin::BI__sync_fetch_and_umax:
00831     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::UMax, E);
00832 
00833   case Builtin::BI__sync_add_and_fetch_1:
00834   case Builtin::BI__sync_add_and_fetch_2:
00835   case Builtin::BI__sync_add_and_fetch_4:
00836   case Builtin::BI__sync_add_and_fetch_8:
00837   case Builtin::BI__sync_add_and_fetch_16:
00838     return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Add, E,
00839                                 llvm::Instruction::Add);
00840   case Builtin::BI__sync_sub_and_fetch_1:
00841   case Builtin::BI__sync_sub_and_fetch_2:
00842   case Builtin::BI__sync_sub_and_fetch_4:
00843   case Builtin::BI__sync_sub_and_fetch_8:
00844   case Builtin::BI__sync_sub_and_fetch_16:
00845     return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Sub, E,
00846                                 llvm::Instruction::Sub);
00847   case Builtin::BI__sync_and_and_fetch_1:
00848   case Builtin::BI__sync_and_and_fetch_2:
00849   case Builtin::BI__sync_and_and_fetch_4:
00850   case Builtin::BI__sync_and_and_fetch_8:
00851   case Builtin::BI__sync_and_and_fetch_16:
00852     return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::And, E,
00853                                 llvm::Instruction::And);
00854   case Builtin::BI__sync_or_and_fetch_1:
00855   case Builtin::BI__sync_or_and_fetch_2:
00856   case Builtin::BI__sync_or_and_fetch_4:
00857   case Builtin::BI__sync_or_and_fetch_8:
00858   case Builtin::BI__sync_or_and_fetch_16:
00859     return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Or, E,
00860                                 llvm::Instruction::Or);
00861   case Builtin::BI__sync_xor_and_fetch_1:
00862   case Builtin::BI__sync_xor_and_fetch_2:
00863   case Builtin::BI__sync_xor_and_fetch_4:
00864   case Builtin::BI__sync_xor_and_fetch_8:
00865   case Builtin::BI__sync_xor_and_fetch_16:
00866     return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Xor, E,
00867                                 llvm::Instruction::Xor);
00868 
00869   case Builtin::BI__sync_val_compare_and_swap_1:
00870   case Builtin::BI__sync_val_compare_and_swap_2:
00871   case Builtin::BI__sync_val_compare_and_swap_4:
00872   case Builtin::BI__sync_val_compare_and_swap_8:
00873   case Builtin::BI__sync_val_compare_and_swap_16: {
00874     QualType T = E->getType();
00875     llvm::Value *DestPtr = EmitScalarExpr(E->getArg(0));
00876     unsigned AddrSpace =
00877       cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
00878     
00879     llvm::IntegerType *IntType =
00880       llvm::IntegerType::get(getLLVMContext(),
00881                              getContext().getTypeSize(T));
00882     llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
00883 
00884     Value *Args[3];
00885     Args[0] = Builder.CreateBitCast(DestPtr, IntPtrType);
00886     Args[1] = EmitScalarExpr(E->getArg(1));
00887     llvm::Type *ValueType = Args[1]->getType();
00888     Args[1] = EmitToInt(*this, Args[1], T, IntType);
00889     Args[2] = EmitToInt(*this, EmitScalarExpr(E->getArg(2)), T, IntType);
00890 
00891     Value *Result = Builder.CreateAtomicCmpXchg(Args[0], Args[1], Args[2],
00892                                                 llvm::SequentiallyConsistent);
00893     Result = EmitFromInt(*this, Result, T, ValueType);
00894     return RValue::get(Result);
00895   }
00896 
00897   case Builtin::BI__sync_bool_compare_and_swap_1:
00898   case Builtin::BI__sync_bool_compare_and_swap_2:
00899   case Builtin::BI__sync_bool_compare_and_swap_4:
00900   case Builtin::BI__sync_bool_compare_and_swap_8:
00901   case Builtin::BI__sync_bool_compare_and_swap_16: {
00902     QualType T = E->getArg(1)->getType();
00903     llvm::Value *DestPtr = EmitScalarExpr(E->getArg(0));
00904     unsigned AddrSpace =
00905       cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
00906     
00907     llvm::IntegerType *IntType =
00908       llvm::IntegerType::get(getLLVMContext(),
00909                              getContext().getTypeSize(T));
00910     llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
00911 
00912     Value *Args[3];
00913     Args[0] = Builder.CreateBitCast(DestPtr, IntPtrType);
00914     Args[1] = EmitToInt(*this, EmitScalarExpr(E->getArg(1)), T, IntType);
00915     Args[2] = EmitToInt(*this, EmitScalarExpr(E->getArg(2)), T, IntType);
00916 
00917     Value *OldVal = Args[1];
00918     Value *PrevVal = Builder.CreateAtomicCmpXchg(Args[0], Args[1], Args[2],
00919                                                  llvm::SequentiallyConsistent);
00920     Value *Result = Builder.CreateICmpEQ(PrevVal, OldVal);
00921     // zext bool to int.
00922     Result = Builder.CreateZExt(Result, ConvertType(E->getType()));
00923     return RValue::get(Result);
00924   }
00925 
00926   case Builtin::BI__sync_swap_1:
00927   case Builtin::BI__sync_swap_2:
00928   case Builtin::BI__sync_swap_4:
00929   case Builtin::BI__sync_swap_8:
00930   case Builtin::BI__sync_swap_16:
00931     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Xchg, E);
00932 
00933   case Builtin::BI__sync_lock_test_and_set_1:
00934   case Builtin::BI__sync_lock_test_and_set_2:
00935   case Builtin::BI__sync_lock_test_and_set_4:
00936   case Builtin::BI__sync_lock_test_and_set_8:
00937   case Builtin::BI__sync_lock_test_and_set_16:
00938     return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Xchg, E);
00939 
00940   case Builtin::BI__sync_lock_release_1:
00941   case Builtin::BI__sync_lock_release_2:
00942   case Builtin::BI__sync_lock_release_4:
00943   case Builtin::BI__sync_lock_release_8:
00944   case Builtin::BI__sync_lock_release_16: {
00945     Value *Ptr = EmitScalarExpr(E->getArg(0));
00946     QualType ElTy = E->getArg(0)->getType()->getPointeeType();
00947     CharUnits StoreSize = getContext().getTypeSizeInChars(ElTy);
00948     llvm::Type *ITy = llvm::IntegerType::get(getLLVMContext(),
00949                                              StoreSize.getQuantity() * 8);
00950     Ptr = Builder.CreateBitCast(Ptr, ITy->getPointerTo());
00951     llvm::StoreInst *Store = 
00952       Builder.CreateStore(llvm::Constant::getNullValue(ITy), Ptr);
00953     Store->setAlignment(StoreSize.getQuantity());
00954     Store->setAtomic(llvm::Release);
00955     return RValue::get(0);
00956   }
00957 
00958   case Builtin::BI__sync_synchronize: {
00959     // We assume this is supposed to correspond to a C++0x-style
00960     // sequentially-consistent fence (i.e. this is only usable for
00961     // synchonization, not device I/O or anything like that). This intrinsic
00962     // is really badly designed in the sense that in theory, there isn't 
00963     // any way to safely use it... but in practice, it mostly works
00964     // to use it with non-atomic loads and stores to get acquire/release
00965     // semantics.
00966     Builder.CreateFence(llvm::SequentiallyConsistent);
00967     return RValue::get(0);
00968   }
00969 
00970   case Builtin::BI__c11_atomic_is_lock_free:
00971   case Builtin::BI__atomic_is_lock_free: {
00972     // Call "bool __atomic_is_lock_free(size_t size, void *ptr)". For the
00973     // __c11 builtin, ptr is 0 (indicating a properly-aligned object), since
00974     // _Atomic(T) is always properly-aligned.
00975     const char *LibCallName = "__atomic_is_lock_free";
00976     CallArgList Args;
00977     Args.add(RValue::get(EmitScalarExpr(E->getArg(0))),
00978              getContext().getSizeType());
00979     if (BuiltinID == Builtin::BI__atomic_is_lock_free)
00980       Args.add(RValue::get(EmitScalarExpr(E->getArg(1))),
00981                getContext().VoidPtrTy);
00982     else
00983       Args.add(RValue::get(llvm::Constant::getNullValue(VoidPtrTy)),
00984                getContext().VoidPtrTy);
00985     const CGFunctionInfo &FuncInfo =
00986         CGM.getTypes().arrangeFunctionCall(E->getType(), Args,
00987                                            FunctionType::ExtInfo(),
00988                                            RequiredArgs::All);
00989     llvm::FunctionType *FTy = CGM.getTypes().GetFunctionType(FuncInfo);
00990     llvm::Constant *Func = CGM.CreateRuntimeFunction(FTy, LibCallName);
00991     return EmitCall(FuncInfo, Func, ReturnValueSlot(), Args);
00992   }
00993 
00994   case Builtin::BI__atomic_test_and_set: {
00995     // Look at the argument type to determine whether this is a volatile
00996     // operation. The parameter type is always volatile.
00997     QualType PtrTy = E->getArg(0)->IgnoreImpCasts()->getType();
00998     bool Volatile =
00999         PtrTy->castAs<PointerType>()->getPointeeType().isVolatileQualified();
01000 
01001     Value *Ptr = EmitScalarExpr(E->getArg(0));
01002     unsigned AddrSpace =
01003         cast<llvm::PointerType>(Ptr->getType())->getAddressSpace();
01004     Ptr = Builder.CreateBitCast(Ptr, Int8Ty->getPointerTo(AddrSpace));
01005     Value *NewVal = Builder.getInt8(1);
01006     Value *Order = EmitScalarExpr(E->getArg(1));
01007     if (isa<llvm::ConstantInt>(Order)) {
01008       int ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
01009       AtomicRMWInst *Result = 0;
01010       switch (ord) {
01011       case 0:  // memory_order_relaxed
01012       default: // invalid order
01013         Result = Builder.CreateAtomicRMW(llvm::AtomicRMWInst::Xchg,
01014                                          Ptr, NewVal,
01015                                          llvm::Monotonic);
01016         break;
01017       case 1:  // memory_order_consume
01018       case 2:  // memory_order_acquire
01019         Result = Builder.CreateAtomicRMW(llvm::AtomicRMWInst::Xchg,
01020                                          Ptr, NewVal,
01021                                          llvm::Acquire);
01022         break;
01023       case 3:  // memory_order_release
01024         Result = Builder.CreateAtomicRMW(llvm::AtomicRMWInst::Xchg,
01025                                          Ptr, NewVal,
01026                                          llvm::Release);
01027         break;
01028       case 4:  // memory_order_acq_rel
01029         Result = Builder.CreateAtomicRMW(llvm::AtomicRMWInst::Xchg,
01030                                          Ptr, NewVal,
01031                                          llvm::AcquireRelease);
01032         break;
01033       case 5:  // memory_order_seq_cst
01034         Result = Builder.CreateAtomicRMW(llvm::AtomicRMWInst::Xchg,
01035                                          Ptr, NewVal,
01036                                          llvm::SequentiallyConsistent);
01037         break;
01038       }
01039       Result->setVolatile(Volatile);
01040       return RValue::get(Builder.CreateIsNotNull(Result, "tobool"));
01041     }
01042 
01043     llvm::BasicBlock *ContBB = createBasicBlock("atomic.continue", CurFn);
01044 
01045     llvm::BasicBlock *BBs[5] = {
01046       createBasicBlock("monotonic", CurFn),
01047       createBasicBlock("acquire", CurFn),
01048       createBasicBlock("release", CurFn),
01049       createBasicBlock("acqrel", CurFn),
01050       createBasicBlock("seqcst", CurFn)
01051     };
01052     llvm::AtomicOrdering Orders[5] = {
01053       llvm::Monotonic, llvm::Acquire, llvm::Release,
01054       llvm::AcquireRelease, llvm::SequentiallyConsistent
01055     };
01056 
01057     Order = Builder.CreateIntCast(Order, Builder.getInt32Ty(), false);
01058     llvm::SwitchInst *SI = Builder.CreateSwitch(Order, BBs[0]);
01059 
01060     Builder.SetInsertPoint(ContBB);
01061     PHINode *Result = Builder.CreatePHI(Int8Ty, 5, "was_set");
01062 
01063     for (unsigned i = 0; i < 5; ++i) {
01064       Builder.SetInsertPoint(BBs[i]);
01065       AtomicRMWInst *RMW = Builder.CreateAtomicRMW(llvm::AtomicRMWInst::Xchg,
01066                                                    Ptr, NewVal, Orders[i]);
01067       RMW->setVolatile(Volatile);
01068       Result->addIncoming(RMW, BBs[i]);
01069       Builder.CreateBr(ContBB);
01070     }
01071 
01072     SI->addCase(Builder.getInt32(0), BBs[0]);
01073     SI->addCase(Builder.getInt32(1), BBs[1]);
01074     SI->addCase(Builder.getInt32(2), BBs[1]);
01075     SI->addCase(Builder.getInt32(3), BBs[2]);
01076     SI->addCase(Builder.getInt32(4), BBs[3]);
01077     SI->addCase(Builder.getInt32(5), BBs[4]);
01078 
01079     Builder.SetInsertPoint(ContBB);
01080     return RValue::get(Builder.CreateIsNotNull(Result, "tobool"));
01081   }
01082 
01083   case Builtin::BI__atomic_clear: {
01084     QualType PtrTy = E->getArg(0)->IgnoreImpCasts()->getType();
01085     bool Volatile =
01086         PtrTy->castAs<PointerType>()->getPointeeType().isVolatileQualified();
01087 
01088     Value *Ptr = EmitScalarExpr(E->getArg(0));
01089     unsigned AddrSpace =
01090         cast<llvm::PointerType>(Ptr->getType())->getAddressSpace();
01091     Ptr = Builder.CreateBitCast(Ptr, Int8Ty->getPointerTo(AddrSpace));
01092     Value *NewVal = Builder.getInt8(0);
01093     Value *Order = EmitScalarExpr(E->getArg(1));
01094     if (isa<llvm::ConstantInt>(Order)) {
01095       int ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
01096       StoreInst *Store = Builder.CreateStore(NewVal, Ptr, Volatile);
01097       Store->setAlignment(1);
01098       switch (ord) {
01099       case 0:  // memory_order_relaxed
01100       default: // invalid order
01101         Store->setOrdering(llvm::Monotonic);
01102         break;
01103       case 3:  // memory_order_release
01104         Store->setOrdering(llvm::Release);
01105         break;
01106       case 5:  // memory_order_seq_cst
01107         Store->setOrdering(llvm::SequentiallyConsistent);
01108         break;
01109       }
01110       return RValue::get(0);
01111     }
01112 
01113     llvm::BasicBlock *ContBB = createBasicBlock("atomic.continue", CurFn);
01114 
01115     llvm::BasicBlock *BBs[3] = {
01116       createBasicBlock("monotonic", CurFn),
01117       createBasicBlock("release", CurFn),
01118       createBasicBlock("seqcst", CurFn)
01119     };
01120     llvm::AtomicOrdering Orders[3] = {
01121       llvm::Monotonic, llvm::Release, llvm::SequentiallyConsistent
01122     };
01123 
01124     Order = Builder.CreateIntCast(Order, Builder.getInt32Ty(), false);
01125     llvm::SwitchInst *SI = Builder.CreateSwitch(Order, BBs[0]);
01126 
01127     for (unsigned i = 0; i < 3; ++i) {
01128       Builder.SetInsertPoint(BBs[i]);
01129       StoreInst *Store = Builder.CreateStore(NewVal, Ptr, Volatile);
01130       Store->setAlignment(1);
01131       Store->setOrdering(Orders[i]);
01132       Builder.CreateBr(ContBB);
01133     }
01134 
01135     SI->addCase(Builder.getInt32(0), BBs[0]);
01136     SI->addCase(Builder.getInt32(3), BBs[1]);
01137     SI->addCase(Builder.getInt32(5), BBs[2]);
01138 
01139     Builder.SetInsertPoint(ContBB);
01140     return RValue::get(0);
01141   }
01142 
01143   case Builtin::BI__atomic_thread_fence:
01144   case Builtin::BI__atomic_signal_fence:
01145   case Builtin::BI__c11_atomic_thread_fence:
01146   case Builtin::BI__c11_atomic_signal_fence: {
01147     llvm::SynchronizationScope Scope;
01148     if (BuiltinID == Builtin::BI__atomic_signal_fence ||
01149         BuiltinID == Builtin::BI__c11_atomic_signal_fence)
01150       Scope = llvm::SingleThread;
01151     else
01152       Scope = llvm::CrossThread;
01153     Value *Order = EmitScalarExpr(E->getArg(0));
01154     if (isa<llvm::ConstantInt>(Order)) {
01155       int ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
01156       switch (ord) {
01157       case 0:  // memory_order_relaxed
01158       default: // invalid order
01159         break;
01160       case 1:  // memory_order_consume
01161       case 2:  // memory_order_acquire
01162         Builder.CreateFence(llvm::Acquire, Scope);
01163         break;
01164       case 3:  // memory_order_release
01165         Builder.CreateFence(llvm::Release, Scope);
01166         break;
01167       case 4:  // memory_order_acq_rel
01168         Builder.CreateFence(llvm::AcquireRelease, Scope);
01169         break;
01170       case 5:  // memory_order_seq_cst
01171         Builder.CreateFence(llvm::SequentiallyConsistent, Scope);
01172         break;
01173       }
01174       return RValue::get(0);
01175     }
01176 
01177     llvm::BasicBlock *AcquireBB, *ReleaseBB, *AcqRelBB, *SeqCstBB;
01178     AcquireBB = createBasicBlock("acquire", CurFn);
01179     ReleaseBB = createBasicBlock("release", CurFn);
01180     AcqRelBB = createBasicBlock("acqrel", CurFn);
01181     SeqCstBB = createBasicBlock("seqcst", CurFn);
01182     llvm::BasicBlock *ContBB = createBasicBlock("atomic.continue", CurFn);
01183 
01184     Order = Builder.CreateIntCast(Order, Builder.getInt32Ty(), false);
01185     llvm::SwitchInst *SI = Builder.CreateSwitch(Order, ContBB);
01186 
01187     Builder.SetInsertPoint(AcquireBB);
01188     Builder.CreateFence(llvm::Acquire, Scope);
01189     Builder.CreateBr(ContBB);
01190     SI->addCase(Builder.getInt32(1), AcquireBB);
01191     SI->addCase(Builder.getInt32(2), AcquireBB);
01192 
01193     Builder.SetInsertPoint(ReleaseBB);
01194     Builder.CreateFence(llvm::Release, Scope);
01195     Builder.CreateBr(ContBB);
01196     SI->addCase(Builder.getInt32(3), ReleaseBB);
01197 
01198     Builder.SetInsertPoint(AcqRelBB);
01199     Builder.CreateFence(llvm::AcquireRelease, Scope);
01200     Builder.CreateBr(ContBB);
01201     SI->addCase(Builder.getInt32(4), AcqRelBB);
01202 
01203     Builder.SetInsertPoint(SeqCstBB);
01204     Builder.CreateFence(llvm::SequentiallyConsistent, Scope);
01205     Builder.CreateBr(ContBB);
01206     SI->addCase(Builder.getInt32(5), SeqCstBB);
01207 
01208     Builder.SetInsertPoint(ContBB);
01209     return RValue::get(0);
01210   }
01211 
01212     // Library functions with special handling.
01213   case Builtin::BIsqrt:
01214   case Builtin::BIsqrtf:
01215   case Builtin::BIsqrtl: {
01216     // TODO: there is currently no set of optimizer flags
01217     // sufficient for us to rewrite sqrt to @llvm.sqrt.
01218     // -fmath-errno=0 is not good enough; we need finiteness.
01219     // We could probably precondition the call with an ult
01220     // against 0, but is that worth the complexity?
01221     break;
01222   }
01223 
01224   case Builtin::BIpow:
01225   case Builtin::BIpowf:
01226   case Builtin::BIpowl: {
01227     // Rewrite sqrt to intrinsic if allowed.
01228     if (!FD->hasAttr<ConstAttr>())
01229       break;
01230     Value *Base = EmitScalarExpr(E->getArg(0));
01231     Value *Exponent = EmitScalarExpr(E->getArg(1));
01232     llvm::Type *ArgType = Base->getType();
01233     Value *F = CGM.getIntrinsic(Intrinsic::pow, ArgType);
01234     return RValue::get(Builder.CreateCall2(F, Base, Exponent));
01235   }
01236 
01237   case Builtin::BIfma:
01238   case Builtin::BIfmaf:
01239   case Builtin::BIfmal:
01240   case Builtin::BI__builtin_fma:
01241   case Builtin::BI__builtin_fmaf:
01242   case Builtin::BI__builtin_fmal: {
01243     // Rewrite fma to intrinsic.
01244     Value *FirstArg = EmitScalarExpr(E->getArg(0));
01245     llvm::Type *ArgType = FirstArg->getType();
01246     Value *F = CGM.getIntrinsic(Intrinsic::fma, ArgType);
01247     return RValue::get(Builder.CreateCall3(F, FirstArg,
01248                                               EmitScalarExpr(E->getArg(1)),
01249                                               EmitScalarExpr(E->getArg(2))));
01250   }
01251 
01252   case Builtin::BI__builtin_signbit:
01253   case Builtin::BI__builtin_signbitf:
01254   case Builtin::BI__builtin_signbitl: {
01255     LLVMContext &C = CGM.getLLVMContext();
01256 
01257     Value *Arg = EmitScalarExpr(E->getArg(0));
01258     llvm::Type *ArgTy = Arg->getType();
01259     if (ArgTy->isPPC_FP128Ty())
01260       break; // FIXME: I'm not sure what the right implementation is here.
01261     int ArgWidth = ArgTy->getPrimitiveSizeInBits();
01262     llvm::Type *ArgIntTy = llvm::IntegerType::get(C, ArgWidth);
01263     Value *BCArg = Builder.CreateBitCast(Arg, ArgIntTy);
01264     Value *ZeroCmp = llvm::Constant::getNullValue(ArgIntTy);
01265     Value *Result = Builder.CreateICmpSLT(BCArg, ZeroCmp);
01266     return RValue::get(Builder.CreateZExt(Result, ConvertType(E->getType())));
01267   }
01268   case Builtin::BI__builtin_annotation: {
01269     llvm::Value *AnnVal = EmitScalarExpr(E->getArg(0));
01270     llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::annotation,
01271                                       AnnVal->getType());
01272 
01273     // Get the annotation string, go through casts. Sema requires this to be a
01274     // non-wide string literal, potentially casted, so the cast<> is safe.
01275     const Expr *AnnotationStrExpr = E->getArg(1)->IgnoreParenCasts();
01276     llvm::StringRef Str = cast<StringLiteral>(AnnotationStrExpr)->getString();
01277     return RValue::get(EmitAnnotationCall(F, AnnVal, Str, E->getExprLoc()));
01278   }
01279   }
01280 
01281   // If this is an alias for a lib function (e.g. __builtin_sin), emit
01282   // the call using the normal call path, but using the unmangled
01283   // version of the function name.
01284   if (getContext().BuiltinInfo.isLibFunction(BuiltinID))
01285     return emitLibraryCall(*this, FD, E,
01286                            CGM.getBuiltinLibFunction(FD, BuiltinID));
01287   
01288   // If this is a predefined lib function (e.g. malloc), emit the call
01289   // using exactly the normal call path.
01290   if (getContext().BuiltinInfo.isPredefinedLibFunction(BuiltinID))
01291     return emitLibraryCall(*this, FD, E, EmitScalarExpr(E->getCallee()));
01292 
01293   // See if we have a target specific intrinsic.
01294   const char *Name = getContext().BuiltinInfo.GetName(BuiltinID);
01295   Intrinsic::ID IntrinsicID = Intrinsic::not_intrinsic;
01296   if (const char *Prefix =
01297       llvm::Triple::getArchTypePrefix(Target.getTriple().getArch()))
01298     IntrinsicID = Intrinsic::getIntrinsicForGCCBuiltin(Prefix, Name);
01299 
01300   if (IntrinsicID != Intrinsic::not_intrinsic) {
01301     SmallVector<Value*, 16> Args;
01302 
01303     // Find out if any arguments are required to be integer constant
01304     // expressions.
01305     unsigned ICEArguments = 0;
01306     ASTContext::GetBuiltinTypeError Error;
01307     getContext().GetBuiltinType(BuiltinID, Error, &ICEArguments);
01308     assert(Error == ASTContext::GE_None && "Should not codegen an error");
01309 
01310     Function *F = CGM.getIntrinsic(IntrinsicID);
01311     llvm::FunctionType *FTy = F->getFunctionType();
01312 
01313     for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) {
01314       Value *ArgValue;
01315       // If this is a normal argument, just emit it as a scalar.
01316       if ((ICEArguments & (1 << i)) == 0) {
01317         ArgValue = EmitScalarExpr(E->getArg(i));
01318       } else {
01319         // If this is required to be a constant, constant fold it so that we 
01320         // know that the generated intrinsic gets a ConstantInt.
01321         llvm::APSInt Result;
01322         bool IsConst = E->getArg(i)->isIntegerConstantExpr(Result,getContext());
01323         assert(IsConst && "Constant arg isn't actually constant?");
01324         (void)IsConst;
01325         ArgValue = llvm::ConstantInt::get(getLLVMContext(), Result);
01326       }
01327 
01328       // If the intrinsic arg type is different from the builtin arg type
01329       // we need to do a bit cast.
01330       llvm::Type *PTy = FTy->getParamType(i);
01331       if (PTy != ArgValue->getType()) {
01332         assert(PTy->canLosslesslyBitCastTo(FTy->getParamType(i)) &&
01333                "Must be able to losslessly bit cast to param");
01334         ArgValue = Builder.CreateBitCast(ArgValue, PTy);
01335       }
01336 
01337       Args.push_back(ArgValue);
01338     }
01339 
01340     Value *V = Builder.CreateCall(F, Args);
01341     QualType BuiltinRetType = E->getType();
01342 
01343     llvm::Type *RetTy = VoidTy;
01344     if (!BuiltinRetType->isVoidType()) 
01345       RetTy = ConvertType(BuiltinRetType);
01346 
01347     if (RetTy != V->getType()) {
01348       assert(V->getType()->canLosslesslyBitCastTo(RetTy) &&
01349              "Must be able to losslessly bit cast result type");
01350       V = Builder.CreateBitCast(V, RetTy);
01351     }
01352 
01353     return RValue::get(V);
01354   }
01355 
01356   // See if we have a target specific builtin that needs to be lowered.
01357   if (Value *V = EmitTargetBuiltinExpr(BuiltinID, E))
01358     return RValue::get(V);
01359 
01360   ErrorUnsupported(E, "builtin function");
01361 
01362   // Unknown builtin, for now just dump it out and return undef.
01363   if (hasAggregateLLVMType(E->getType()))
01364     return RValue::getAggregate(CreateMemTemp(E->getType()));
01365   return RValue::get(llvm::UndefValue::get(ConvertType(E->getType())));
01366 }
01367 
01368 Value *CodeGenFunction::EmitTargetBuiltinExpr(unsigned BuiltinID,
01369                                               const CallExpr *E) {
01370   switch (Target.getTriple().getArch()) {
01371   case llvm::Triple::arm:
01372   case llvm::Triple::thumb:
01373     return EmitARMBuiltinExpr(BuiltinID, E);
01374   case llvm::Triple::x86:
01375   case llvm::Triple::x86_64:
01376     return EmitX86BuiltinExpr(BuiltinID, E);
01377   case llvm::Triple::ppc:
01378   case llvm::Triple::ppc64:
01379     return EmitPPCBuiltinExpr(BuiltinID, E);
01380   case llvm::Triple::hexagon:
01381     return EmitHexagonBuiltinExpr(BuiltinID, E);
01382   default:
01383     return 0;
01384   }
01385 }
01386 
01387 static llvm::VectorType *GetNeonType(CodeGenFunction *CGF,
01388                                      NeonTypeFlags TypeFlags) {
01389   int IsQuad = TypeFlags.isQuad();
01390   switch (TypeFlags.getEltType()) {
01391   case NeonTypeFlags::Int8:
01392   case NeonTypeFlags::Poly8:
01393     return llvm::VectorType::get(CGF->Int8Ty, 8 << IsQuad);
01394   case NeonTypeFlags::Int16:
01395   case NeonTypeFlags::Poly16:
01396   case NeonTypeFlags::Float16:
01397     return llvm::VectorType::get(CGF->Int16Ty, 4 << IsQuad);
01398   case NeonTypeFlags::Int32:
01399     return llvm::VectorType::get(CGF->Int32Ty, 2 << IsQuad);
01400   case NeonTypeFlags::Int64:
01401     return llvm::VectorType::get(CGF->Int64Ty, 1 << IsQuad);
01402   case NeonTypeFlags::Float32:
01403     return llvm::VectorType::get(CGF->FloatTy, 2 << IsQuad);
01404   }
01405   llvm_unreachable("Invalid NeonTypeFlags element type!");
01406 }
01407 
01408 Value *CodeGenFunction::EmitNeonSplat(Value *V, Constant *C) {
01409   unsigned nElts = cast<llvm::VectorType>(V->getType())->getNumElements();
01410   Value* SV = llvm::ConstantVector::getSplat(nElts, C);
01411   return Builder.CreateShuffleVector(V, V, SV, "lane");
01412 }
01413 
01414 Value *CodeGenFunction::EmitNeonCall(Function *F, SmallVectorImpl<Value*> &Ops,
01415                                      const char *name,
01416                                      unsigned shift, bool rightshift) {
01417   unsigned j = 0;
01418   for (Function::const_arg_iterator ai = F->arg_begin(), ae = F->arg_end();
01419        ai != ae; ++ai, ++j)
01420     if (shift > 0 && shift == j)
01421       Ops[j] = EmitNeonShiftVector(Ops[j], ai->getType(), rightshift);
01422     else
01423       Ops[j] = Builder.CreateBitCast(Ops[j], ai->getType(), name);
01424 
01425   return Builder.CreateCall(F, Ops, name);
01426 }
01427 
01428 Value *CodeGenFunction::EmitNeonShiftVector(Value *V, llvm::Type *Ty, 
01429                                             bool neg) {
01430   int SV = cast<ConstantInt>(V)->getSExtValue();
01431   
01432   llvm::VectorType *VTy = cast<llvm::VectorType>(Ty);
01433   llvm::Constant *C = ConstantInt::get(VTy->getElementType(), neg ? -SV : SV);
01434   return llvm::ConstantVector::getSplat(VTy->getNumElements(), C);
01435 }
01436 
01437 /// GetPointeeAlignment - Given an expression with a pointer type, find the
01438 /// alignment of the type referenced by the pointer.  Skip over implicit
01439 /// casts.
01440 unsigned CodeGenFunction::GetPointeeAlignment(const Expr *Addr) {
01441   unsigned Align = 1;
01442   // Check if the type is a pointer.  The implicit cast operand might not be.
01443   while (Addr->getType()->isPointerType()) {
01444     QualType PtTy = Addr->getType()->getPointeeType();
01445     
01446     // Can't get alignment of incomplete types.
01447     if (!PtTy->isIncompleteType()) {
01448       unsigned NewA = getContext().getTypeAlignInChars(PtTy).getQuantity();
01449       if (NewA > Align)
01450         Align = NewA;
01451     }
01452 
01453     // If the address is an implicit cast, repeat with the cast operand.
01454     if (const ImplicitCastExpr *CastAddr = dyn_cast<ImplicitCastExpr>(Addr)) {
01455       Addr = CastAddr->getSubExpr();
01456       continue;
01457     }
01458     break;
01459   }
01460   return Align;
01461 }
01462 
01463 /// GetPointeeAlignmentValue - Given an expression with a pointer type, find
01464 /// the alignment of the type referenced by the pointer.  Skip over implicit
01465 /// casts.  Return the alignment as an llvm::Value.
01466 Value *CodeGenFunction::GetPointeeAlignmentValue(const Expr *Addr) {
01467   return llvm::ConstantInt::get(Int32Ty, GetPointeeAlignment(Addr));
01468 }
01469 
01470 Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
01471                                            const CallExpr *E) {
01472   if (BuiltinID == ARM::BI__clear_cache) {
01473     const FunctionDecl *FD = E->getDirectCallee();
01474     // Oddly people write this call without args on occasion and gcc accepts
01475     // it - it's also marked as varargs in the description file.
01476     SmallVector<Value*, 2> Ops;
01477     for (unsigned i = 0; i < E->getNumArgs(); i++)
01478       Ops.push_back(EmitScalarExpr(E->getArg(i)));
01479     llvm::Type *Ty = CGM.getTypes().ConvertType(FD->getType());
01480     llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty);
01481     StringRef Name = FD->getName();
01482     return Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, Name), Ops);
01483   }
01484 
01485   if (BuiltinID == ARM::BI__builtin_arm_ldrexd) {
01486     Function *F = CGM.getIntrinsic(Intrinsic::arm_ldrexd);
01487 
01488     Value *LdPtr = EmitScalarExpr(E->getArg(0));
01489     Value *Val = Builder.CreateCall(F, LdPtr, "ldrexd");
01490 
01491     Value *Val0 = Builder.CreateExtractValue(Val, 1);
01492     Value *Val1 = Builder.CreateExtractValue(Val, 0);
01493     Val0 = Builder.CreateZExt(Val0, Int64Ty);
01494     Val1 = Builder.CreateZExt(Val1, Int64Ty);
01495 
01496     Value *ShiftCst = llvm::ConstantInt::get(Int64Ty, 32);
01497     Val = Builder.CreateShl(Val0, ShiftCst, "shl", true /* nuw */);
01498     return Builder.CreateOr(Val, Val1);
01499   }
01500 
01501   if (BuiltinID == ARM::BI__builtin_arm_strexd) {
01502     Function *F = CGM.getIntrinsic(Intrinsic::arm_strexd);
01503     llvm::Type *STy = llvm::StructType::get(Int32Ty, Int32Ty, NULL);
01504 
01505     Value *One = llvm::ConstantInt::get(Int32Ty, 1);
01506     Value *Tmp = Builder.CreateAlloca(Int64Ty, One);
01507     Value *Val = EmitScalarExpr(E->getArg(0));
01508     Builder.CreateStore(Val, Tmp);
01509 
01510     Value *LdPtr = Builder.CreateBitCast(Tmp,llvm::PointerType::getUnqual(STy));
01511     Val = Builder.CreateLoad(LdPtr);
01512 
01513     Value *Arg0 = Builder.CreateExtractValue(Val, 0);
01514     Value *Arg1 = Builder.CreateExtractValue(Val, 1);
01515     Value *StPtr = EmitScalarExpr(E->getArg(1));
01516     return Builder.CreateCall3(F, Arg0, Arg1, StPtr, "strexd");
01517   }
01518 
01519   SmallVector<Value*, 4> Ops;
01520   for (unsigned i = 0, e = E->getNumArgs() - 1; i != e; i++)
01521     Ops.push_back(EmitScalarExpr(E->getArg(i)));
01522 
01523   // vget_lane and vset_lane are not overloaded and do not have an extra
01524   // argument that specifies the vector type.
01525   switch (BuiltinID) {
01526   default: break;
01527   case ARM::BI__builtin_neon_vget_lane_i8:
01528   case ARM::BI__builtin_neon_vget_lane_i16:
01529   case ARM::BI__builtin_neon_vget_lane_i32:
01530   case ARM::BI__builtin_neon_vget_lane_i64:
01531   case ARM::BI__builtin_neon_vget_lane_f32:
01532   case ARM::BI__builtin_neon_vgetq_lane_i8:
01533   case ARM::BI__builtin_neon_vgetq_lane_i16:
01534   case ARM::BI__builtin_neon_vgetq_lane_i32:
01535   case ARM::BI__builtin_neon_vgetq_lane_i64:
01536   case ARM::BI__builtin_neon_vgetq_lane_f32:
01537     return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),
01538                                         "vget_lane");
01539   case ARM::BI__builtin_neon_vset_lane_i8:
01540   case ARM::BI__builtin_neon_vset_lane_i16:
01541   case ARM::BI__builtin_neon_vset_lane_i32:
01542   case ARM::BI__builtin_neon_vset_lane_i64:
01543   case ARM::BI__builtin_neon_vset_lane_f32:
01544   case ARM::BI__builtin_neon_vsetq_lane_i8:
01545   case ARM::BI__builtin_neon_vsetq_lane_i16:
01546   case ARM::BI__builtin_neon_vsetq_lane_i32:
01547   case ARM::BI__builtin_neon_vsetq_lane_i64:
01548   case ARM::BI__builtin_neon_vsetq_lane_f32:
01549     Ops.push_back(EmitScalarExpr(E->getArg(2)));
01550     return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vset_lane");
01551   }
01552 
01553   // Get the last argument, which specifies the vector type.
01554   llvm::APSInt Result;
01555   const Expr *Arg = E->getArg(E->getNumArgs()-1);
01556   if (!Arg->isIntegerConstantExpr(Result, getContext()))
01557     return 0;
01558 
01559   if (BuiltinID == ARM::BI__builtin_arm_vcvtr_f ||
01560       BuiltinID == ARM::BI__builtin_arm_vcvtr_d) {
01561     // Determine the overloaded type of this builtin.
01562     llvm::Type *Ty;
01563     if (BuiltinID == ARM::BI__builtin_arm_vcvtr_f)
01564       Ty = FloatTy;
01565     else
01566       Ty = DoubleTy;
01567     
01568     // Determine whether this is an unsigned conversion or not.
01569     bool usgn = Result.getZExtValue() == 1;
01570     unsigned Int = usgn ? Intrinsic::arm_vcvtru : Intrinsic::arm_vcvtr;
01571 
01572     // Call the appropriate intrinsic.
01573     Function *F = CGM.getIntrinsic(Int, Ty);
01574     return Builder.CreateCall(F, Ops, "vcvtr");
01575   }
01576   
01577   // Determine the type of this overloaded NEON intrinsic.
01578   NeonTypeFlags Type(Result.getZExtValue());
01579   bool usgn = Type.isUnsigned();
01580   bool quad = Type.isQuad();
01581   bool rightShift = false;
01582 
01583   llvm::VectorType *VTy = GetNeonType(this, Type);
01584   llvm::Type *Ty = VTy;
01585   if (!Ty)
01586     return 0;
01587 
01588   unsigned Int;
01589   switch (BuiltinID) {
01590   default: return 0;
01591   case ARM::BI__builtin_neon_vabd_v:
01592   case ARM::BI__builtin_neon_vabdq_v:
01593     Int = usgn ? Intrinsic::arm_neon_vabdu : Intrinsic::arm_neon_vabds;
01594     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vabd");
01595   case ARM::BI__builtin_neon_vabs_v:
01596   case ARM::BI__builtin_neon_vabsq_v:
01597     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vabs, Ty),
01598                         Ops, "vabs");
01599   case ARM::BI__builtin_neon_vaddhn_v:
01600     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vaddhn, Ty),
01601                         Ops, "vaddhn");
01602   case ARM::BI__builtin_neon_vcale_v:
01603     std::swap(Ops[0], Ops[1]);
01604   case ARM::BI__builtin_neon_vcage_v: {
01605     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vacged);
01606     return EmitNeonCall(F, Ops, "vcage");
01607   }
01608   case ARM::BI__builtin_neon_vcaleq_v:
01609     std::swap(Ops[0], Ops[1]);
01610   case ARM::BI__builtin_neon_vcageq_v: {
01611     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vacgeq);
01612     return EmitNeonCall(F, Ops, "vcage");
01613   }
01614   case ARM::BI__builtin_neon_vcalt_v:
01615     std::swap(Ops[0], Ops[1]);
01616   case ARM::BI__builtin_neon_vcagt_v: {
01617     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vacgtd);
01618     return EmitNeonCall(F, Ops, "vcagt");
01619   }
01620   case ARM::BI__builtin_neon_vcaltq_v:
01621     std::swap(Ops[0], Ops[1]);
01622   case ARM::BI__builtin_neon_vcagtq_v: {
01623     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vacgtq);
01624     return EmitNeonCall(F, Ops, "vcagt");
01625   }
01626   case ARM::BI__builtin_neon_vcls_v:
01627   case ARM::BI__builtin_neon_vclsq_v: {
01628     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vcls, Ty);
01629     return EmitNeonCall(F, Ops, "vcls");
01630   }
01631   case ARM::BI__builtin_neon_vclz_v:
01632   case ARM::BI__builtin_neon_vclzq_v: {
01633     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vclz, Ty);
01634     return EmitNeonCall(F, Ops, "vclz");
01635   }
01636   case ARM::BI__builtin_neon_vcnt_v:
01637   case ARM::BI__builtin_neon_vcntq_v: {
01638     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vcnt, Ty);
01639     return EmitNeonCall(F, Ops, "vcnt");
01640   }
01641   case ARM::BI__builtin_neon_vcvt_f16_v: {
01642     assert(Type.getEltType() == NeonTypeFlags::Float16 && !quad &&
01643            "unexpected vcvt_f16_v builtin");
01644     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vcvtfp2hf);
01645     return EmitNeonCall(F, Ops, "vcvt");
01646   }
01647   case ARM::BI__builtin_neon_vcvt_f32_f16: {
01648     assert(Type.getEltType() == NeonTypeFlags::Float16 && !quad &&
01649            "unexpected vcvt_f32_f16 builtin");
01650     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vcvthf2fp);
01651     return EmitNeonCall(F, Ops, "vcvt");
01652   }
01653   case ARM::BI__builtin_neon_vcvt_f32_v:
01654   case ARM::BI__builtin_neon_vcvtq_f32_v:
01655     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
01656     Ty = GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float32, false, quad));
01657     return usgn ? Builder.CreateUIToFP(Ops[0], Ty, "vcvt") 
01658                 : Builder.CreateSIToFP(Ops[0], Ty, "vcvt");
01659   case ARM::BI__builtin_neon_vcvt_s32_v:
01660   case ARM::BI__builtin_neon_vcvt_u32_v:
01661   case ARM::BI__builtin_neon_vcvtq_s32_v:
01662   case ARM::BI__builtin_neon_vcvtq_u32_v: {
01663     llvm::Type *FloatTy =
01664       GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float32, false, quad));
01665     Ops[0] = Builder.CreateBitCast(Ops[0], FloatTy);
01666     return usgn ? Builder.CreateFPToUI(Ops[0], Ty, "vcvt") 
01667                 : Builder.CreateFPToSI(Ops[0], Ty, "vcvt");
01668   }
01669   case ARM::BI__builtin_neon_vcvt_n_f32_v:
01670   case ARM::BI__builtin_neon_vcvtq_n_f32_v: {
01671     llvm::Type *FloatTy =
01672       GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float32, false, quad));
01673     llvm::Type *Tys[2] = { FloatTy, Ty };
01674     Int = usgn ? Intrinsic::arm_neon_vcvtfxu2fp
01675                : Intrinsic::arm_neon_vcvtfxs2fp;
01676     Function *F = CGM.getIntrinsic(Int, Tys);
01677     return EmitNeonCall(F, Ops, "vcvt_n");
01678   }
01679   case ARM::BI__builtin_neon_vcvt_n_s32_v:
01680   case ARM::BI__builtin_neon_vcvt_n_u32_v:
01681   case ARM::BI__builtin_neon_vcvtq_n_s32_v:
01682   case ARM::BI__builtin_neon_vcvtq_n_u32_v: {
01683     llvm::Type *FloatTy =
01684       GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float32, false, quad));
01685     llvm::Type *Tys[2] = { Ty, FloatTy };
01686     Int = usgn ? Intrinsic::arm_neon_vcvtfp2fxu
01687                : Intrinsic::arm_neon_vcvtfp2fxs;
01688     Function *F = CGM.getIntrinsic(Int, Tys);
01689     return EmitNeonCall(F, Ops, "vcvt_n");
01690   }
01691   case ARM::BI__builtin_neon_vext_v:
01692   case ARM::BI__builtin_neon_vextq_v: {
01693     int CV = cast<ConstantInt>(Ops[2])->getSExtValue();
01694     SmallVector<Constant*, 16> Indices;
01695     for (unsigned i = 0, e = VTy->getNumElements(); i != e; ++i)
01696       Indices.push_back(ConstantInt::get(Int32Ty, i+CV));
01697     
01698     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
01699     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
01700     Value *SV = llvm::ConstantVector::get(Indices);
01701     return Builder.CreateShuffleVector(Ops[0], Ops[1], SV, "vext");
01702   }
01703   case ARM::BI__builtin_neon_vhadd_v:
01704   case ARM::BI__builtin_neon_vhaddq_v:
01705     Int = usgn ? Intrinsic::arm_neon_vhaddu : Intrinsic::arm_neon_vhadds;
01706     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vhadd");
01707   case ARM::BI__builtin_neon_vhsub_v:
01708   case ARM::BI__builtin_neon_vhsubq_v:
01709     Int = usgn ? Intrinsic::arm_neon_vhsubu : Intrinsic::arm_neon_vhsubs;
01710     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vhsub");
01711   case ARM::BI__builtin_neon_vld1_v:
01712   case ARM::BI__builtin_neon_vld1q_v:
01713     Ops.push_back(GetPointeeAlignmentValue(E->getArg(0)));
01714     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vld1, Ty),
01715                         Ops, "vld1");
01716   case ARM::BI__builtin_neon_vld1_lane_v:
01717   case ARM::BI__builtin_neon_vld1q_lane_v: {
01718     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
01719     Ty = llvm::PointerType::getUnqual(VTy->getElementType());
01720     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
01721     LoadInst *Ld = Builder.CreateLoad(Ops[0]);
01722     Value *Align = GetPointeeAlignmentValue(E->getArg(0));
01723     Ld->setAlignment(cast<ConstantInt>(Align)->getZExtValue());
01724     return Builder.CreateInsertElement(Ops[1], Ld, Ops[2], "vld1_lane");
01725   }
01726   case ARM::BI__builtin_neon_vld1_dup_v:
01727   case ARM::BI__builtin_neon_vld1q_dup_v: {
01728     Value *V = UndefValue::get(Ty);
01729     Ty = llvm::PointerType::getUnqual(VTy->getElementType());
01730     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
01731     LoadInst *Ld = Builder.CreateLoad(Ops[0]);
01732     Value *Align = GetPointeeAlignmentValue(E->getArg(0));
01733     Ld->setAlignment(cast<ConstantInt>(Align)->getZExtValue());
01734     llvm::Constant *CI = ConstantInt::get(Int32Ty, 0);
01735     Ops[0] = Builder.CreateInsertElement(V, Ld, CI);
01736     return EmitNeonSplat(Ops[0], CI);
01737   }
01738   case ARM::BI__builtin_neon_vld2_v:
01739   case ARM::BI__builtin_neon_vld2q_v: {
01740     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld2, Ty);
01741     Value *Align = GetPointeeAlignmentValue(E->getArg(1));
01742     Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld2");
01743     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
01744     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
01745     return Builder.CreateStore(Ops[1], Ops[0]);
01746   }
01747   case ARM::BI__builtin_neon_vld3_v:
01748   case ARM::BI__builtin_neon_vld3q_v: {
01749     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld3, Ty);
01750     Value *Align = GetPointeeAlignmentValue(E->getArg(1));
01751     Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld3");
01752     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
01753     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
01754     return Builder.CreateStore(Ops[1], Ops[0]);
01755   }
01756   case ARM::BI__builtin_neon_vld4_v:
01757   case ARM::BI__builtin_neon_vld4q_v: {
01758     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld4, Ty);
01759     Value *Align = GetPointeeAlignmentValue(E->getArg(1));
01760     Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld4");
01761     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
01762     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
01763     return Builder.CreateStore(Ops[1], Ops[0]);
01764   }
01765   case ARM::BI__builtin_neon_vld2_lane_v:
01766   case ARM::BI__builtin_neon_vld2q_lane_v: {
01767     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld2lane, Ty);
01768     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
01769     Ops[3] = Builder.CreateBitCast(Ops[3], Ty);
01770     Ops.push_back(GetPointeeAlignmentValue(E->getArg(1)));
01771     Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld2_lane");
01772     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
01773     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
01774     return Builder.CreateStore(Ops[1], Ops[0]);
01775   }
01776   case ARM::BI__builtin_neon_vld3_lane_v:
01777   case ARM::BI__builtin_neon_vld3q_lane_v: {
01778     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld3lane, Ty);
01779     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
01780     Ops[3] = Builder.CreateBitCast(Ops[3], Ty);
01781     Ops[4] = Builder.CreateBitCast(Ops[4], Ty);
01782     Ops.push_back(GetPointeeAlignmentValue(E->getArg(1)));
01783     Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld3_lane");
01784     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
01785     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
01786     return Builder.CreateStore(Ops[1], Ops[0]);
01787   }
01788   case ARM::BI__builtin_neon_vld4_lane_v:
01789   case ARM::BI__builtin_neon_vld4q_lane_v: {
01790     Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld4lane, Ty);
01791     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
01792     Ops[3] = Builder.CreateBitCast(Ops[3], Ty);
01793     Ops[4] = Builder.CreateBitCast(Ops[4], Ty);
01794     Ops[5] = Builder.CreateBitCast(Ops[5], Ty);
01795     Ops.push_back(GetPointeeAlignmentValue(E->getArg(1)));
01796     Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld3_lane");
01797     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
01798     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
01799     return Builder.CreateStore(Ops[1], Ops[0]);
01800   }
01801   case ARM::BI__builtin_neon_vld2_dup_v:
01802   case ARM::BI__builtin_neon_vld3_dup_v:
01803   case ARM::BI__builtin_neon_vld4_dup_v: {
01804     // Handle 64-bit elements as a special-case.  There is no "dup" needed.
01805     if (VTy->getElementType()->getPrimitiveSizeInBits() == 64) {
01806       switch (BuiltinID) {
01807       case ARM::BI__builtin_neon_vld2_dup_v: 
01808         Int = Intrinsic::arm_neon_vld2; 
01809         break;
01810       case ARM::BI__builtin_neon_vld3_dup_v:
01811         Int = Intrinsic::arm_neon_vld3; 
01812         break;
01813       case ARM::BI__builtin_neon_vld4_dup_v:
01814         Int = Intrinsic::arm_neon_vld4; 
01815         break;
01816       default: llvm_unreachable("unknown vld_dup intrinsic?");
01817       }
01818       Function *F = CGM.getIntrinsic(Int, Ty);
01819       Value *Align = GetPointeeAlignmentValue(E->getArg(1));
01820       Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld_dup");
01821       Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
01822       Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
01823       return Builder.CreateStore(Ops[1], Ops[0]);
01824     }
01825     switch (BuiltinID) {
01826     case ARM::BI__builtin_neon_vld2_dup_v: 
01827       Int = Intrinsic::arm_neon_vld2lane; 
01828       break;
01829     case ARM::BI__builtin_neon_vld3_dup_v:
01830       Int = Intrinsic::arm_neon_vld3lane; 
01831       break;
01832     case ARM::BI__builtin_neon_vld4_dup_v:
01833       Int = Intrinsic::arm_neon_vld4lane; 
01834       break;
01835     default: llvm_unreachable("unknown vld_dup intrinsic?");
01836     }
01837     Function *F = CGM.getIntrinsic(Int, Ty);
01838     llvm::StructType *STy = cast<llvm::StructType>(F->getReturnType());
01839     
01840     SmallVector<Value*, 6> Args;
01841     Args.push_back(Ops[1]);
01842     Args.append(STy->getNumElements(), UndefValue::get(Ty));
01843 
01844     llvm::Constant *CI = ConstantInt::get(Int32Ty, 0);
01845     Args.push_back(CI);
01846     Args.push_back(GetPointeeAlignmentValue(E->getArg(1)));
01847     
01848     Ops[1] = Builder.CreateCall(F, Args, "vld_dup");
01849     // splat lane 0 to all elts in each vector of the result.
01850     for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
01851       Value *Val = Builder.CreateExtractValue(Ops[1], i);
01852       Value *Elt = Builder.CreateBitCast(Val, Ty);
01853       Elt = EmitNeonSplat(Elt, CI);
01854       Elt = Builder.CreateBitCast(Elt, Val->getType());
01855       Ops[1] = Builder.CreateInsertValue(Ops[1], Elt, i);
01856     }
01857     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
01858     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
01859     return Builder.CreateStore(Ops[1], Ops[0]);
01860   }
01861   case ARM::BI__builtin_neon_vmax_v:
01862   case ARM::BI__builtin_neon_vmaxq_v:
01863     Int = usgn ? Intrinsic::arm_neon_vmaxu : Intrinsic::arm_neon_vmaxs;
01864     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmax");
01865   case ARM::BI__builtin_neon_vmin_v:
01866   case ARM::BI__builtin_neon_vminq_v:
01867     Int = usgn ? Intrinsic::arm_neon_vminu : Intrinsic::arm_neon_vmins;
01868     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmin");
01869   case ARM::BI__builtin_neon_vmovl_v: {
01870     llvm::Type *DTy =llvm::VectorType::getTruncatedElementVectorType(VTy);
01871     Ops[0] = Builder.CreateBitCast(Ops[0], DTy);
01872     if (usgn)
01873       return Builder.CreateZExt(Ops[0], Ty, "vmovl");
01874     return Builder.CreateSExt(Ops[0], Ty, "vmovl");
01875   }
01876   case ARM::BI__builtin_neon_vmovn_v: {
01877     llvm::Type *QTy = llvm::VectorType::getExtendedElementVectorType(VTy);
01878     Ops[0] = Builder.CreateBitCast(Ops[0], QTy);
01879     return Builder.CreateTrunc(Ops[0], Ty, "vmovn");
01880   }
01881   case ARM::BI__builtin_neon_vmul_v:
01882   case ARM::BI__builtin_neon_vmulq_v:
01883     assert(Type.isPoly() && "vmul builtin only supported for polynomial types");
01884     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vmulp, Ty),
01885                         Ops, "vmul");
01886   case ARM::BI__builtin_neon_vmull_v:
01887     Int = usgn ? Intrinsic::arm_neon_vmullu : Intrinsic::arm_neon_vmulls;
01888     Int = Type.isPoly() ? (unsigned)Intrinsic::arm_neon_vmullp : Int;
01889     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmull");
01890   case ARM::BI__builtin_neon_vpadal_v:
01891   case ARM::BI__builtin_neon_vpadalq_v: {
01892     Int = usgn ? Intrinsic::arm_neon_vpadalu : Intrinsic::arm_neon_vpadals;
01893     // The source operand type has twice as many elements of half the size.
01894     unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits();
01895     llvm::Type *EltTy =
01896       llvm::IntegerType::get(getLLVMContext(), EltBits / 2);
01897     llvm::Type *NarrowTy =
01898       llvm::VectorType::get(EltTy, VTy->getNumElements() * 2);
01899     llvm::Type *Tys[2] = { Ty, NarrowTy };
01900     return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vpadal");
01901   }
01902   case ARM::BI__builtin_neon_vpadd_v:
01903     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vpadd, Ty),
01904                         Ops, "vpadd");
01905   case ARM::BI__builtin_neon_vpaddl_v:
01906   case ARM::BI__builtin_neon_vpaddlq_v: {
01907     Int = usgn ? Intrinsic::arm_neon_vpaddlu : Intrinsic::arm_neon_vpaddls;
01908     // The source operand type has twice as many elements of half the size.
01909     unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits();
01910     llvm::Type *EltTy = llvm::IntegerType::get(getLLVMContext(), EltBits / 2);
01911     llvm::Type *NarrowTy =
01912       llvm::VectorType::get(EltTy, VTy->getNumElements() * 2);
01913     llvm::Type *Tys[2] = { Ty, NarrowTy };
01914     return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vpaddl");
01915   }
01916   case ARM::BI__builtin_neon_vpmax_v:
01917     Int = usgn ? Intrinsic::arm_neon_vpmaxu : Intrinsic::arm_neon_vpmaxs;
01918     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpmax");
01919   case ARM::BI__builtin_neon_vpmin_v:
01920     Int = usgn ? Intrinsic::arm_neon_vpminu : Intrinsic::arm_neon_vpmins;
01921     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpmin");
01922   case ARM::BI__builtin_neon_vqabs_v:
01923   case ARM::BI__builtin_neon_vqabsq_v:
01924     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqabs, Ty),
01925                         Ops, "vqabs");
01926   case ARM::BI__builtin_neon_vqadd_v:
01927   case ARM::BI__builtin_neon_vqaddq_v:
01928     Int = usgn ? Intrinsic::arm_neon_vqaddu : Intrinsic::arm_neon_vqadds;
01929     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqadd");
01930   case ARM::BI__builtin_neon_vqdmlal_v:
01931     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmlal, Ty),
01932                         Ops, "vqdmlal");
01933   case ARM::BI__builtin_neon_vqdmlsl_v:
01934     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmlsl, Ty),
01935                         Ops, "vqdmlsl");
01936   case ARM::BI__builtin_neon_vqdmulh_v:
01937   case ARM::BI__builtin_neon_vqdmulhq_v:
01938     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmulh, Ty),
01939                         Ops, "vqdmulh");
01940   case ARM::BI__builtin_neon_vqdmull_v:
01941     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmull, Ty),
01942                         Ops, "vqdmull");
01943   case ARM::BI__builtin_neon_vqmovn_v:
01944     Int = usgn ? Intrinsic::arm_neon_vqmovnu : Intrinsic::arm_neon_vqmovns;
01945     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqmovn");
01946   case ARM::BI__builtin_neon_vqmovun_v:
01947     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqmovnsu, Ty),
01948                         Ops, "vqdmull");
01949   case ARM::BI__builtin_neon_vqneg_v:
01950   case ARM::BI__builtin_neon_vqnegq_v:
01951     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqneg, Ty),
01952                         Ops, "vqneg");
01953   case ARM::BI__builtin_neon_vqrdmulh_v:
01954   case ARM::BI__builtin_neon_vqrdmulhq_v:
01955     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqrdmulh, Ty),
01956                         Ops, "vqrdmulh");
01957   case ARM::BI__builtin_neon_vqrshl_v:
01958   case ARM::BI__builtin_neon_vqrshlq_v:
01959     Int = usgn ? Intrinsic::arm_neon_vqrshiftu : Intrinsic::arm_neon_vqrshifts;
01960     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqrshl");
01961   case ARM::BI__builtin_neon_vqrshrn_n_v:
01962     Int = usgn ? Intrinsic::arm_neon_vqrshiftnu : Intrinsic::arm_neon_vqrshiftns;
01963     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqrshrn_n",
01964                         1, true);
01965   case ARM::BI__builtin_neon_vqrshrun_n_v:
01966     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqrshiftnsu, Ty),
01967                         Ops, "vqrshrun_n", 1, true);
01968   case ARM::BI__builtin_neon_vqshl_v:
01969   case ARM::BI__builtin_neon_vqshlq_v:
01970     Int = usgn ? Intrinsic::arm_neon_vqshiftu : Intrinsic::arm_neon_vqshifts;
01971     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshl");
01972   case ARM::BI__builtin_neon_vqshl_n_v:
01973   case ARM::BI__builtin_neon_vqshlq_n_v:
01974     Int = usgn ? Intrinsic::arm_neon_vqshiftu : Intrinsic::arm_neon_vqshifts;
01975     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshl_n",
01976                         1, false);
01977   case ARM::BI__builtin_neon_vqshlu_n_v:
01978   case ARM::BI__builtin_neon_vqshluq_n_v:
01979     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqshiftsu, Ty),
01980                         Ops, "vqshlu", 1, false);
01981   case ARM::BI__builtin_neon_vqshrn_n_v:
01982     Int = usgn ? Intrinsic::arm_neon_vqshiftnu : Intrinsic::arm_neon_vqshiftns;
01983     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshrn_n",
01984                         1, true);
01985   case ARM::BI__builtin_neon_vqshrun_n_v:
01986     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqshiftnsu, Ty),
01987                         Ops, "vqshrun_n", 1, true);
01988   case ARM::BI__builtin_neon_vqsub_v:
01989   case ARM::BI__builtin_neon_vqsubq_v:
01990     Int = usgn ? Intrinsic::arm_neon_vqsubu : Intrinsic::arm_neon_vqsubs;
01991     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqsub");
01992   case ARM::BI__builtin_neon_vraddhn_v:
01993     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vraddhn, Ty),
01994                         Ops, "vraddhn");
01995   case ARM::BI__builtin_neon_vrecpe_v:
01996   case ARM::BI__builtin_neon_vrecpeq_v:
01997     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrecpe, Ty),
01998                         Ops, "vrecpe");
01999   case ARM::BI__builtin_neon_vrecps_v:
02000   case ARM::BI__builtin_neon_vrecpsq_v:
02001     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrecps, Ty),
02002                         Ops, "vrecps");
02003   case ARM::BI__builtin_neon_vrhadd_v:
02004   case ARM::BI__builtin_neon_vrhaddq_v:
02005     Int = usgn ? Intrinsic::arm_neon_vrhaddu : Intrinsic::arm_neon_vrhadds;
02006     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrhadd");
02007   case ARM::BI__builtin_neon_vrshl_v:
02008   case ARM::BI__builtin_neon_vrshlq_v:
02009     Int = usgn ? Intrinsic::arm_neon_vrshiftu : Intrinsic::arm_neon_vrshifts;
02010     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrshl");
02011   case ARM::BI__builtin_neon_vrshrn_n_v:
02012     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrshiftn, Ty),
02013                         Ops, "vrshrn_n", 1, true);
02014   case ARM::BI__builtin_neon_vrshr_n_v:
02015   case ARM::BI__builtin_neon_vrshrq_n_v:
02016     Int = usgn ? Intrinsic::arm_neon_vrshiftu : Intrinsic::arm_neon_vrshifts;
02017     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrshr_n", 1, true);
02018   case ARM::BI__builtin_neon_vrsqrte_v:
02019   case ARM::BI__builtin_neon_vrsqrteq_v:
02020     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrsqrte, Ty),
02021                         Ops, "vrsqrte");
02022   case ARM::BI__builtin_neon_vrsqrts_v:
02023   case ARM::BI__builtin_neon_vrsqrtsq_v:
02024     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrsqrts, Ty),
02025                         Ops, "vrsqrts");
02026   case ARM::BI__builtin_neon_vrsra_n_v:
02027   case ARM::BI__builtin_neon_vrsraq_n_v:
02028     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
02029     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
02030     Ops[2] = EmitNeonShiftVector(Ops[2], Ty, true);
02031     Int = usgn ? Intrinsic::arm_neon_vrshiftu : Intrinsic::arm_neon_vrshifts;
02032     Ops[1] = Builder.CreateCall2(CGM.getIntrinsic(Int, Ty), Ops[1], Ops[2]); 
02033     return Builder.CreateAdd(Ops[0], Ops[1], "vrsra_n");
02034   case ARM::BI__builtin_neon_vrsubhn_v:
02035     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrsubhn, Ty),
02036                         Ops, "vrsubhn");
02037   case ARM::BI__builtin_neon_vshl_v:
02038   case ARM::BI__builtin_neon_vshlq_v:
02039     Int = usgn ? Intrinsic::arm_neon_vshiftu : Intrinsic::arm_neon_vshifts;
02040     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vshl");
02041   case ARM::BI__builtin_neon_vshll_n_v:
02042     Int = usgn ? Intrinsic::arm_neon_vshiftlu : Intrinsic::arm_neon_vshiftls;
02043     return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vshll", 1);
02044   case ARM::BI__builtin_neon_vshl_n_v:
02045   case ARM::BI__builtin_neon_vshlq_n_v:
02046     Ops[1] = EmitNeonShiftVector(Ops[1], Ty, false);
02047     return Builder.CreateShl(Builder.CreateBitCast(Ops[0],Ty), Ops[1], "vshl_n");
02048   case ARM::BI__builtin_neon_vshrn_n_v:
02049     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vshiftn, Ty),
02050                         Ops, "vshrn_n", 1, true);
02051   case ARM::BI__builtin_neon_vshr_n_v:
02052   case ARM::BI__builtin_neon_vshrq_n_v:
02053     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
02054     Ops[1] = EmitNeonShiftVector(Ops[1], Ty, false);
02055     if (usgn)
02056       return Builder.CreateLShr(Ops[0], Ops[1], "vshr_n");
02057     else
02058       return Builder.CreateAShr(Ops[0], Ops[1], "vshr_n");
02059   case ARM::BI__builtin_neon_vsri_n_v:
02060   case ARM::BI__builtin_neon_vsriq_n_v:
02061     rightShift = true;
02062   case ARM::BI__builtin_neon_vsli_n_v:
02063   case ARM::BI__builtin_neon_vsliq_n_v:
02064     Ops[2] = EmitNeonShiftVector(Ops[2], Ty, rightShift);
02065     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vshiftins, Ty),
02066                         Ops, "vsli_n");
02067   case ARM::BI__builtin_neon_vsra_n_v:
02068   case ARM::BI__builtin_neon_vsraq_n_v:
02069     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
02070     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
02071     Ops[2] = EmitNeonShiftVector(Ops[2], Ty, false);
02072     if (usgn)
02073       Ops[1] = Builder.CreateLShr(Ops[1], Ops[2], "vsra_n");
02074     else
02075       Ops[1] = Builder.CreateAShr(Ops[1], Ops[2], "vsra_n");
02076     return Builder.CreateAdd(Ops[0], Ops[1]);
02077   case ARM::BI__builtin_neon_vst1_v:
02078   case ARM::BI__builtin_neon_vst1q_v:
02079     Ops.push_back(GetPointeeAlignmentValue(E->getArg(0)));
02080     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst1, Ty),
02081                         Ops, "");
02082   case ARM::BI__builtin_neon_vst1_lane_v:
02083   case ARM::BI__builtin_neon_vst1q_lane_v: {
02084     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
02085     Ops[1] = Builder.CreateExtractElement(Ops[1], Ops[2]);
02086     Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
02087     StoreInst *St = Builder.CreateStore(Ops[1],
02088                                         Builder.CreateBitCast(Ops[0], Ty));
02089     Value *Align = GetPointeeAlignmentValue(E->getArg(0));
02090     St->setAlignment(cast<ConstantInt>(Align)->getZExtValue());
02091     return St;
02092   }
02093   case ARM::BI__builtin_neon_vst2_v:
02094   case ARM::BI__builtin_neon_vst2q_v:
02095     Ops.push_back(GetPointeeAlignmentValue(E->getArg(0)));
02096     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst2, Ty),
02097                         Ops, "");
02098   case ARM::BI__builtin_neon_vst2_lane_v:
02099   case ARM::BI__builtin_neon_vst2q_lane_v:
02100     Ops.push_back(GetPointeeAlignmentValue(E->getArg(0)));
02101     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst2lane, Ty),
02102                         Ops, "");
02103   case ARM::BI__builtin_neon_vst3_v:
02104   case ARM::BI__builtin_neon_vst3q_v:
02105     Ops.push_back(GetPointeeAlignmentValue(E->getArg(0)));
02106     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst3, Ty),
02107                         Ops, "");
02108   case ARM::BI__builtin_neon_vst3_lane_v:
02109   case ARM::BI__builtin_neon_vst3q_lane_v:
02110     Ops.push_back(GetPointeeAlignmentValue(E->getArg(0)));
02111     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst3lane, Ty),
02112                         Ops, "");
02113   case ARM::BI__builtin_neon_vst4_v:
02114   case ARM::BI__builtin_neon_vst4q_v:
02115     Ops.push_back(GetPointeeAlignmentValue(E->getArg(0)));
02116     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst4, Ty),
02117                         Ops, "");
02118   case ARM::BI__builtin_neon_vst4_lane_v:
02119   case ARM::BI__builtin_neon_vst4q_lane_v:
02120     Ops.push_back(GetPointeeAlignmentValue(E->getArg(0)));
02121     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst4lane, Ty),
02122                         Ops, "");
02123   case ARM::BI__builtin_neon_vsubhn_v:
02124     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vsubhn, Ty),
02125                         Ops, "vsubhn");
02126   case ARM::BI__builtin_neon_vtbl1_v:
02127     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl1),
02128                         Ops, "vtbl1");
02129   case ARM::BI__builtin_neon_vtbl2_v:
02130     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl2),
02131                         Ops, "vtbl2");
02132   case ARM::BI__builtin_neon_vtbl3_v:
02133     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl3),
02134                         Ops, "vtbl3");
02135   case ARM::BI__builtin_neon_vtbl4_v:
02136     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl4),
02137                         Ops, "vtbl4");
02138   case ARM::BI__builtin_neon_vtbx1_v:
02139     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx1),
02140                         Ops, "vtbx1");
02141   case ARM::BI__builtin_neon_vtbx2_v:
02142     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx2),
02143                         Ops, "vtbx2");
02144   case ARM::BI__builtin_neon_vtbx3_v:
02145     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx3),
02146                         Ops, "vtbx3");
02147   case ARM::BI__builtin_neon_vtbx4_v:
02148     return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbx4),
02149                         Ops, "vtbx4");
02150   case ARM::BI__builtin_neon_vtst_v:
02151   case ARM::BI__builtin_neon_vtstq_v: {
02152     Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
02153     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
02154     Ops[0] = Builder.CreateAnd(Ops[0], Ops[1]);
02155     Ops[0] = Builder.CreateICmp(ICmpInst::ICMP_NE, Ops[0], 
02156                                 ConstantAggregateZero::get(Ty));
02157     return Builder.CreateSExt(Ops[0], Ty, "vtst");
02158   }
02159   case ARM::BI__builtin_neon_vtrn_v:
02160   case ARM::BI__builtin_neon_vtrnq_v: {
02161     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty));
02162     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
02163     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
02164     Value *SV = 0;
02165 
02166     for (unsigned vi = 0; vi != 2; ++vi) {
02167       SmallVector<Constant*, 16> Indices;
02168       for (unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) {
02169         Indices.push_back(Builder.getInt32(i+vi));
02170         Indices.push_back(Builder.getInt32(i+e+vi));
02171       }
02172       Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ops[0], vi);
02173       SV = llvm::ConstantVector::get(Indices);
02174       SV = Builder.CreateShuffleVector(Ops[1], Ops[2], SV, "vtrn");
02175       SV = Builder.CreateStore(SV, Addr);
02176     }
02177     return SV;
02178   }
02179   case ARM::BI__builtin_neon_vuzp_v:
02180   case ARM::BI__builtin_neon_vuzpq_v: {
02181     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty));
02182     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
02183     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
02184     Value *SV = 0;
02185     
02186     for (unsigned vi = 0; vi != 2; ++vi) {
02187       SmallVector<Constant*, 16> Indices;
02188       for (unsigned i = 0, e = VTy->getNumElements(); i != e; ++i)
02189         Indices.push_back(ConstantInt::get(Int32Ty, 2*i+vi));
02190 
02191       Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ops[0], vi);
02192       SV = llvm::ConstantVector::get(Indices);
02193       SV = Builder.CreateShuffleVector(Ops[1], Ops[2], SV, "vuzp");
02194       SV = Builder.CreateStore(SV, Addr);
02195     }
02196     return SV;
02197   }
02198   case ARM::BI__builtin_neon_vzip_v: 
02199   case ARM::BI__builtin_neon_vzipq_v: {
02200     Ops[0] = Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty));
02201     Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
02202     Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
02203     Value *SV = 0;
02204     
02205     for (unsigned vi = 0; vi != 2; ++vi) {
02206       SmallVector<Constant*, 16> Indices;
02207       for (unsigned i = 0, e = VTy->getNumElements(); i != e; i += 2) {
02208         Indices.push_back(ConstantInt::get(Int32Ty, (i + vi*e) >> 1));
02209         Indices.push_back(ConstantInt::get(Int32Ty, ((i + vi*e) >> 1)+e));
02210       }
02211       Value *Addr = Builder.CreateConstInBoundsGEP1_32(Ops[0], vi);
02212       SV = llvm::ConstantVector::get(Indices);
02213       SV = Builder.CreateShuffleVector(Ops[1], Ops[2], SV, "vzip");
02214       SV = Builder.CreateStore(SV, Addr);
02215     }
02216     return SV;
02217   }
02218   }
02219 }
02220 
02221 llvm::Value *CodeGenFunction::
02222 BuildVector(ArrayRef<llvm::Value*> Ops) {
02223   assert((Ops.size() & (Ops.size() - 1)) == 0 &&
02224          "Not a power-of-two sized vector!");
02225   bool AllConstants = true;
02226   for (unsigned i = 0, e = Ops.size(); i != e && AllConstants; ++i)
02227     AllConstants &= isa<Constant>(Ops[i]);
02228 
02229   // If this is a constant vector, create a ConstantVector.
02230   if (AllConstants) {
02231     SmallVector<llvm::Constant*, 16> CstOps;
02232     for (unsigned i = 0, e = Ops.size(); i != e; ++i)
02233       CstOps.push_back(cast<Constant>(Ops[i]));
02234     return llvm::ConstantVector::get(CstOps);
02235   }
02236 
02237   // Otherwise, insertelement the values to build the vector.
02238   Value *Result =
02239     llvm::UndefValue::get(llvm::VectorType::get(Ops[0]->getType(), Ops.size()));
02240 
02241   for (unsigned i = 0, e = Ops.size(); i != e; ++i)
02242     Result = Builder.CreateInsertElement(Result, Ops[i], Builder.getInt32(i));
02243 
02244   return Result;
02245 }
02246 
02247 Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
02248                                            const CallExpr *E) {
02249   SmallVector<Value*, 4> Ops;
02250 
02251   // Find out if any arguments are required to be integer constant expressions.
02252   unsigned ICEArguments = 0;
02253   ASTContext::GetBuiltinTypeError Error;
02254   getContext().GetBuiltinType(BuiltinID, Error, &ICEArguments);
02255   assert(Error == ASTContext::GE_None && "Should not codegen an error");
02256 
02257   for (unsigned i = 0, e = E->getNumArgs(); i != e; i++) {
02258     // If this is a normal argument, just emit it as a scalar.
02259     if ((ICEArguments & (1 << i)) == 0) {
02260       Ops.push_back(EmitScalarExpr(E->getArg(i)));
02261       continue;
02262     }
02263 
02264     // If this is required to be a constant, constant fold it so that we know
02265     // that the generated intrinsic gets a ConstantInt.
02266     llvm::APSInt Result;
02267     bool IsConst = E->getArg(i)->isIntegerConstantExpr(Result, getContext());
02268     assert(IsConst && "Constant arg isn't actually constant?"); (void)IsConst;
02269     Ops.push_back(llvm::ConstantInt::get(getLLVMContext(), Result));
02270   }
02271 
02272   switch (BuiltinID) {
02273   default: return 0;
02274   case X86::BI__builtin_ia32_vec_init_v8qi:
02275   case X86::BI__builtin_ia32_vec_init_v4hi:
02276   case X86::BI__builtin_ia32_vec_init_v2si:
02277     return Builder.CreateBitCast(BuildVector(Ops),
02278                                  llvm::Type::getX86_MMXTy(getLLVMContext()));
02279   case X86::BI__builtin_ia32_vec_ext_v2si:
02280     return Builder.CreateExtractElement(Ops[0],
02281                                   llvm::ConstantInt::get(Ops[1]->getType(), 0));
02282   case X86::BI__builtin_ia32_ldmxcsr: {
02283     llvm::Type *PtrTy = Int8PtrTy;
02284     Value *One = llvm::ConstantInt::get(Int32Ty, 1);
02285     Value *Tmp = Builder.CreateAlloca(Int32Ty, One);
02286     Builder.CreateStore(Ops[0], Tmp);
02287     return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_ldmxcsr),
02288                               Builder.CreateBitCast(Tmp, PtrTy));
02289   }
02290   case X86::BI__builtin_ia32_stmxcsr: {
02291     llvm::Type *PtrTy = Int8PtrTy;
02292     Value *One = llvm::ConstantInt::get(Int32Ty, 1);
02293     Value *Tmp = Builder.CreateAlloca(Int32Ty, One);
02294     Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_stmxcsr),
02295                        Builder.CreateBitCast(Tmp, PtrTy));
02296     return Builder.CreateLoad(Tmp, "stmxcsr");
02297   }
02298   case X86::BI__builtin_ia32_storehps:
02299   case X86::BI__builtin_ia32_storelps: {
02300     llvm::Type *PtrTy = llvm::PointerType::getUnqual(Int64Ty);
02301     llvm::Type *VecTy = llvm::VectorType::get(Int64Ty, 2);
02302 
02303     // cast val v2i64
02304     Ops[1] = Builder.CreateBitCast(Ops[1], VecTy, "cast");
02305 
02306     // extract (0, 1)
02307     unsigned Index = BuiltinID == X86::BI__builtin_ia32_storelps ? 0 : 1;
02308     llvm::Value *Idx = llvm::ConstantInt::get(Int32Ty, Index);
02309     Ops[1] = Builder.CreateExtractElement(Ops[1], Idx, "extract");
02310 
02311     // cast pointer to i64 & store
02312     Ops[0] = Builder.CreateBitCast(Ops[0], PtrTy);
02313     return Builder.CreateStore(Ops[1], Ops[0]);
02314   }
02315   case X86::BI__builtin_ia32_palignr: {
02316     unsigned shiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
02317     
02318     // If palignr is shifting the pair of input vectors less than 9 bytes,
02319     // emit a shuffle instruction.
02320     if (shiftVal <= 8) {
02321       SmallVector<llvm::Constant*, 8> Indices;
02322       for (unsigned i = 0; i != 8; ++i)
02323         Indices.push_back(llvm::ConstantInt::get(Int32Ty, shiftVal + i));
02324       
02325       Value* SV = llvm::ConstantVector::get(Indices);
02326       return Builder.CreateShuffleVector(Ops[1], Ops[0], SV, "palignr");
02327     }
02328     
02329     // If palignr is shifting the pair of input vectors more than 8 but less
02330     // than 16 bytes, emit a logical right shift of the destination.
02331     if (shiftVal < 16) {
02332       // MMX has these as 1 x i64 vectors for some odd optimization reasons.
02333       llvm::Type *VecTy = llvm::VectorType::get(Int64Ty, 1);
02334       
02335       Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast");
02336       Ops[1] = llvm::ConstantInt::get(VecTy, (shiftVal-8) * 8);
02337       
02338       // create i32 constant
02339       llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_mmx_psrl_q);
02340       return Builder.CreateCall(F, makeArrayRef(&Ops[0], 2), "palignr");
02341     }
02342     
02343     // If palignr is shifting the pair of vectors more than 16 bytes, emit zero.
02344     return llvm::Constant::getNullValue(ConvertType(E->getType()));
02345   }
02346   case X86::BI__builtin_ia32_palignr128: {
02347     unsigned shiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
02348     
02349     // If palignr is shifting the pair of input vectors less than 17 bytes,
02350     // emit a shuffle instruction.
02351     if (shiftVal <= 16) {
02352       SmallVector<llvm::Constant*, 16> Indices;
02353       for (unsigned i = 0; i != 16; ++i)
02354         Indices.push_back(llvm::ConstantInt::get(Int32Ty, shiftVal + i));
02355       
02356       Value* SV = llvm::ConstantVector::get(Indices);
02357       return Builder.CreateShuffleVector(Ops[1], Ops[0], SV, "palignr");
02358     }
02359     
02360     // If palignr is shifting the pair of input vectors more than 16 but less
02361     // than 32 bytes, emit a logical right shift of the destination.
02362     if (shiftVal < 32) {
02363       llvm::Type *VecTy = llvm::VectorType::get(Int64Ty, 2);
02364       
02365       Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast");
02366       Ops[1] = llvm::ConstantInt::get(Int32Ty, (shiftVal-16) * 8);
02367       
02368       // create i32 constant
02369       llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse2_psrl_dq);
02370       return Builder.CreateCall(F, makeArrayRef(&Ops[0], 2), "palignr");
02371     }
02372     
02373     // If palignr is shifting the pair of vectors more than 32 bytes, emit zero.
02374     return llvm::Constant::getNullValue(ConvertType(E->getType()));
02375   }
02376   case X86::BI__builtin_ia32_palignr256: {
02377     unsigned shiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue();
02378 
02379     // If palignr is shifting the pair of input vectors less than 17 bytes,
02380     // emit a shuffle instruction.
02381     if (shiftVal <= 16) {
02382       SmallVector<llvm::Constant*, 32> Indices;
02383       // 256-bit palignr operates on 128-bit lanes so we need to handle that
02384       for (unsigned l = 0; l != 2; ++l) {
02385         unsigned LaneStart = l * 16;
02386         unsigned LaneEnd = (l+1) * 16;
02387         for (unsigned i = 0; i != 16; ++i) {
02388           unsigned Idx = shiftVal + i + LaneStart;
02389           if (Idx >= LaneEnd) Idx += 16; // end of lane, switch operand
02390           Indices.push_back(llvm::ConstantInt::get(Int32Ty, Idx));
02391         }
02392       }
02393 
02394       Value* SV = llvm::ConstantVector::get(Indices);
02395       return Builder.CreateShuffleVector(Ops[1], Ops[0], SV, "palignr");
02396     }
02397 
02398     // If palignr is shifting the pair of input vectors more than 16 but less
02399     // than 32 bytes, emit a logical right shift of the destination.
02400     if (shiftVal < 32) {
02401       llvm::Type *VecTy = llvm::VectorType::get(Int64Ty, 4);
02402 
02403       Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast");
02404       Ops[1] = llvm::ConstantInt::get(Int32Ty, (shiftVal-16) * 8);
02405 
02406       // create i32 constant
02407       llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_avx2_psrl_dq);
02408       return Builder.CreateCall(F, makeArrayRef(&Ops[0], 2), "palignr");
02409     }
02410 
02411     // If palignr is shifting the pair of vectors more than 32 bytes, emit zero.
02412     return llvm::Constant::getNullValue(ConvertType(E->getType()));
02413   }
02414   case X86::BI__builtin_ia32_movntps:
02415   case X86::BI__builtin_ia32_movntps256:
02416   case X86::BI__builtin_ia32_movntpd:
02417   case X86::BI__builtin_ia32_movntpd256:
02418   case X86::BI__builtin_ia32_movntdq:
02419   case X86::BI__builtin_ia32_movntdq256:
02420   case X86::BI__builtin_ia32_movnti: {
02421     llvm::MDNode *Node = llvm::MDNode::get(getLLVMContext(),
02422                                            Builder.getInt32(1));
02423 
02424     // Convert the type of the pointer to a pointer to the stored type.
02425     Value *BC = Builder.CreateBitCast(Ops[0],
02426                                 llvm::PointerType::getUnqual(Ops[1]->getType()),
02427                                       "cast");
02428     StoreInst *SI = Builder.CreateStore(Ops[1], BC);
02429     SI->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node);
02430     SI->setAlignment(16);
02431     return SI;
02432   }
02433   // 3DNow!
02434   case X86::BI__builtin_ia32_pswapdsf:
02435   case X86::BI__builtin_ia32_pswapdsi: {
02436     const char *name = 0;
02437     Intrinsic::ID ID = Intrinsic::not_intrinsic;
02438     switch(BuiltinID) {
02439     default: llvm_unreachable("Unsupported intrinsic!");
02440     case X86::BI__builtin_ia32_pswapdsf:
02441     case X86::BI__builtin_ia32_pswapdsi:
02442       name = "pswapd";
02443       ID = Intrinsic::x86_3dnowa_pswapd;
02444       break;
02445     }
02446     llvm::Type *MMXTy = llvm::Type::getX86_MMXTy(getLLVMContext());
02447     Ops[0] = Builder.CreateBitCast(Ops[0], MMXTy, "cast");
02448     llvm::Function *F = CGM.getIntrinsic(ID);
02449     return Builder.CreateCall(F, Ops, name);
02450   }
02451   }
02452 }
02453 
02454 
02455 Value *CodeGenFunction::EmitHexagonBuiltinExpr(unsigned BuiltinID,
02456                                              const CallExpr *E) {
02457   llvm::SmallVector<Value*, 4> Ops;
02458 
02459   for (unsigned i = 0, e = E->getNumArgs(); i != e; i++)
02460     Ops.push_back(EmitScalarExpr(E->getArg(i)));
02461 
02462   Intrinsic::ID ID = Intrinsic::not_intrinsic;
02463 
02464   switch (BuiltinID) {
02465   default: return 0;
02466 
02467 // The builtins below are not autogenerated from iset.py.
02468 // Make sure you do not overwrite these.
02469 
02470   case Hexagon::BI__builtin_SI_to_SXTHI_asrh:
02471     ID = Intrinsic::hexagon_SI_to_SXTHI_asrh; break;
02472 
02473   case Hexagon::BI__builtin_circ_ldd:
02474     ID = Intrinsic::hexagon_circ_ldd; break;
02475 
02476 // The builtins above are not autogenerated from iset.py.
02477 // Make sure you do not overwrite these.
02478 
02479   case Hexagon::BI__builtin_HEXAGON_C2_cmpeq:
02480     ID = Intrinsic::hexagon_C2_cmpeq; break;
02481 
02482   case Hexagon::BI__builtin_HEXAGON_C2_cmpgt:
02483     ID = Intrinsic::hexagon_C2_cmpgt; break;
02484 
02485   case Hexagon::BI__builtin_HEXAGON_C2_cmpgtu:
02486     ID = Intrinsic::hexagon_C2_cmpgtu; break;
02487 
02488   case Hexagon::BI__builtin_HEXAGON_C2_cmpeqp:
02489     ID = Intrinsic::hexagon_C2_cmpeqp; break;
02490 
02491   case Hexagon::BI__builtin_HEXAGON_C2_cmpgtp:
02492     ID = Intrinsic::hexagon_C2_cmpgtp; break;
02493 
02494   case Hexagon::BI__builtin_HEXAGON_C2_cmpgtup:
02495     ID = Intrinsic::hexagon_C2_cmpgtup; break;
02496 
02497   case Hexagon::BI__builtin_HEXAGON_A4_rcmpeqi:
02498     ID = Intrinsic::hexagon_A4_rcmpeqi; break;
02499 
02500   case Hexagon::BI__builtin_HEXAGON_A4_rcmpneqi:
02501     ID = Intrinsic::hexagon_A4_rcmpneqi; break;
02502 
02503   case Hexagon::BI__builtin_HEXAGON_A4_rcmpeq:
02504     ID = Intrinsic::hexagon_A4_rcmpeq; break;
02505 
02506   case Hexagon::BI__builtin_HEXAGON_A4_rcmpneq:
02507     ID = Intrinsic::hexagon_A4_rcmpneq; break;
02508 
02509   case Hexagon::BI__builtin_HEXAGON_C2_bitsset:
02510     ID = Intrinsic::hexagon_C2_bitsset; break;
02511 
02512   case Hexagon::BI__builtin_HEXAGON_C2_bitsclr:
02513     ID = Intrinsic::hexagon_C2_bitsclr; break;
02514 
02515   case Hexagon::BI__builtin_HEXAGON_C4_nbitsset:
02516     ID = Intrinsic::hexagon_C4_nbitsset; break;
02517 
02518   case Hexagon::BI__builtin_HEXAGON_C4_nbitsclr:
02519     ID = Intrinsic::hexagon_C4_nbitsclr; break;
02520 
02521   case Hexagon::BI__builtin_HEXAGON_C2_cmpeqi:
02522     ID = Intrinsic::hexagon_C2_cmpeqi; break;
02523 
02524   case Hexagon::BI__builtin_HEXAGON_C2_cmpgti:
02525     ID = Intrinsic::hexagon_C2_cmpgti; break;
02526 
02527   case Hexagon::BI__builtin_HEXAGON_C2_cmpgtui:
02528     ID = Intrinsic::hexagon_C2_cmpgtui; break;
02529 
02530   case Hexagon::BI__builtin_HEXAGON_C2_cmpgei:
02531     ID = Intrinsic::hexagon_C2_cmpgei; break;
02532 
02533   case Hexagon::BI__builtin_HEXAGON_C2_cmpgeui:
02534     ID = Intrinsic::hexagon_C2_cmpgeui; break;
02535 
02536   case Hexagon::BI__builtin_HEXAGON_C2_cmplt:
02537     ID = Intrinsic::hexagon_C2_cmplt; break;
02538 
02539   case Hexagon::BI__builtin_HEXAGON_C2_cmpltu:
02540     ID = Intrinsic::hexagon_C2_cmpltu; break;
02541 
02542   case Hexagon::BI__builtin_HEXAGON_C2_bitsclri:
02543     ID = Intrinsic::hexagon_C2_bitsclri; break;
02544 
02545   case Hexagon::BI__builtin_HEXAGON_C4_nbitsclri:
02546     ID = Intrinsic::hexagon_C4_nbitsclri; break;
02547 
02548   case Hexagon::BI__builtin_HEXAGON_C4_cmpneqi:
02549     ID = Intrinsic::hexagon_C4_cmpneqi; break;
02550 
02551   case Hexagon::BI__builtin_HEXAGON_C4_cmpltei:
02552     ID = Intrinsic::hexagon_C4_cmpltei; break;
02553 
02554   case Hexagon::BI__builtin_HEXAGON_C4_cmplteui:
02555     ID = Intrinsic::hexagon_C4_cmplteui; break;
02556 
02557   case Hexagon::BI__builtin_HEXAGON_C4_cmpneq:
02558     ID = Intrinsic::hexagon_C4_cmpneq; break;
02559 
02560   case Hexagon::BI__builtin_HEXAGON_C4_cmplte:
02561     ID = Intrinsic::hexagon_C4_cmplte; break;
02562 
02563   case Hexagon::BI__builtin_HEXAGON_C4_cmplteu:
02564     ID = Intrinsic::hexagon_C4_cmplteu; break;
02565 
02566   case Hexagon::BI__builtin_HEXAGON_C2_and:
02567     ID = Intrinsic::hexagon_C2_and; break;
02568 
02569   case Hexagon::BI__builtin_HEXAGON_C2_or:
02570     ID = Intrinsic::hexagon_C2_or; break;
02571 
02572   case Hexagon::BI__builtin_HEXAGON_C2_xor:
02573     ID = Intrinsic::hexagon_C2_xor; break;
02574 
02575   case Hexagon::BI__builtin_HEXAGON_C2_andn:
02576     ID = Intrinsic::hexagon_C2_andn; break;
02577 
02578   case Hexagon::BI__builtin_HEXAGON_C2_not:
02579     ID = Intrinsic::hexagon_C2_not; break;
02580 
02581   case Hexagon::BI__builtin_HEXAGON_C2_orn:
02582     ID = Intrinsic::hexagon_C2_orn; break;
02583 
02584   case Hexagon::BI__builtin_HEXAGON_C4_and_and:
02585     ID = Intrinsic::hexagon_C4_and_and; break;
02586 
02587   case Hexagon::BI__builtin_HEXAGON_C4_and_or:
02588     ID = Intrinsic::hexagon_C4_and_or; break;
02589 
02590   case Hexagon::BI__builtin_HEXAGON_C4_or_and:
02591     ID = Intrinsic::hexagon_C4_or_and; break;
02592 
02593   case Hexagon::BI__builtin_HEXAGON_C4_or_or:
02594     ID = Intrinsic::hexagon_C4_or_or; break;
02595 
02596   case Hexagon::BI__builtin_HEXAGON_C4_and_andn:
02597     ID = Intrinsic::hexagon_C4_and_andn; break;
02598 
02599   case Hexagon::BI__builtin_HEXAGON_C4_and_orn:
02600     ID = Intrinsic::hexagon_C4_and_orn; break;
02601 
02602   case Hexagon::BI__builtin_HEXAGON_C4_or_andn:
02603     ID = Intrinsic::hexagon_C4_or_andn; break;
02604 
02605   case Hexagon::BI__builtin_HEXAGON_C4_or_orn:
02606     ID = Intrinsic::hexagon_C4_or_orn; break;
02607 
02608   case Hexagon::BI__builtin_HEXAGON_C2_pxfer_map:
02609     ID = Intrinsic::hexagon_C2_pxfer_map; break;
02610 
02611   case Hexagon::BI__builtin_HEXAGON_C2_any8:
02612     ID = Intrinsic::hexagon_C2_any8; break;
02613 
02614   case Hexagon::BI__builtin_HEXAGON_C2_all8:
02615     ID = Intrinsic::hexagon_C2_all8; break;
02616 
02617   case Hexagon::BI__builtin_HEXAGON_C2_vitpack:
02618     ID = Intrinsic::hexagon_C2_vitpack; break;
02619 
02620   case Hexagon::BI__builtin_HEXAGON_C2_mux:
02621     ID = Intrinsic::hexagon_C2_mux; break;
02622 
02623   case Hexagon::BI__builtin_HEXAGON_C2_muxii:
02624     ID = Intrinsic::hexagon_C2_muxii; break;
02625 
02626   case Hexagon::BI__builtin_HEXAGON_C2_muxir:
02627     ID = Intrinsic::hexagon_C2_muxir; break;
02628 
02629   case Hexagon::BI__builtin_HEXAGON_C2_muxri:
02630     ID = Intrinsic::hexagon_C2_muxri; break;
02631 
02632   case Hexagon::BI__builtin_HEXAGON_C2_vmux:
02633     ID = Intrinsic::hexagon_C2_vmux; break;
02634 
02635   case Hexagon::BI__builtin_HEXAGON_C2_mask:
02636     ID = Intrinsic::hexagon_C2_mask; break;
02637 
02638   case Hexagon::BI__builtin_HEXAGON_A2_vcmpbeq:
02639     ID = Intrinsic::hexagon_A2_vcmpbeq; break;
02640 
02641   case Hexagon::BI__builtin_HEXAGON_A4_vcmpbeqi:
02642     ID = Intrinsic::hexagon_A4_vcmpbeqi; break;
02643 
02644   case Hexagon::BI__builtin_HEXAGON_A4_vcmpbeq_any:
02645     ID = Intrinsic::hexagon_A4_vcmpbeq_any; break;
02646 
02647   case Hexagon::BI__builtin_HEXAGON_A2_vcmpbgtu:
02648     ID = Intrinsic::hexagon_A2_vcmpbgtu; break;
02649 
02650   case Hexagon::BI__builtin_HEXAGON_A4_vcmpbgtui:
02651     ID = Intrinsic::hexagon_A4_vcmpbgtui; break;
02652 
02653   case Hexagon::BI__builtin_HEXAGON_A4_vcmpbgt:
02654     ID = Intrinsic::hexagon_A4_vcmpbgt; break;
02655 
02656   case Hexagon::BI__builtin_HEXAGON_A4_vcmpbgti:
02657     ID = Intrinsic::hexagon_A4_vcmpbgti; break;
02658 
02659   case Hexagon::BI__builtin_HEXAGON_A4_cmpbeq:
02660     ID = Intrinsic::hexagon_A4_cmpbeq; break;
02661 
02662   case Hexagon::BI__builtin_HEXAGON_A4_cmpbeqi:
02663     ID = Intrinsic::hexagon_A4_cmpbeqi; break;
02664 
02665   case Hexagon::BI__builtin_HEXAGON_A4_cmpbgtu:
02666     ID = Intrinsic::hexagon_A4_cmpbgtu; break;
02667 
02668   case Hexagon::BI__builtin_HEXAGON_A4_cmpbgtui:
02669     ID = Intrinsic::hexagon_A4_cmpbgtui; break;
02670 
02671   case Hexagon::BI__builtin_HEXAGON_A4_cmpbgt:
02672     ID = Intrinsic::hexagon_A4_cmpbgt; break;
02673 
02674   case Hexagon::BI__builtin_HEXAGON_A4_cmpbgti:
02675     ID = Intrinsic::hexagon_A4_cmpbgti; break;
02676 
02677   case Hexagon::BI__builtin_HEXAGON_A2_vcmpheq:
02678     ID = Intrinsic::hexagon_A2_vcmpheq; break;
02679 
02680   case Hexagon::BI__builtin_HEXAGON_A2_vcmphgt:
02681     ID = Intrinsic::hexagon_A2_vcmphgt; break;
02682 
02683   case Hexagon::BI__builtin_HEXAGON_A2_vcmphgtu:
02684     ID = Intrinsic::hexagon_A2_vcmphgtu; break;
02685 
02686   case Hexagon::BI__builtin_HEXAGON_A4_vcmpheqi:
02687     ID = Intrinsic::hexagon_A4_vcmpheqi; break;
02688 
02689   case Hexagon::BI__builtin_HEXAGON_A4_vcmphgti:
02690     ID = Intrinsic::hexagon_A4_vcmphgti; break;
02691 
02692   case Hexagon::BI__builtin_HEXAGON_A4_vcmphgtui:
02693     ID = Intrinsic::hexagon_A4_vcmphgtui; break;
02694 
02695   case Hexagon::BI__builtin_HEXAGON_A4_cmpheq:
02696     ID = Intrinsic::hexagon_A4_cmpheq; break;
02697 
02698   case Hexagon::BI__builtin_HEXAGON_A4_cmphgt:
02699     ID = Intrinsic::hexagon_A4_cmphgt; break;
02700 
02701   case Hexagon::BI__builtin_HEXAGON_A4_cmphgtu:
02702     ID = Intrinsic::hexagon_A4_cmphgtu; break;
02703 
02704   case Hexagon::BI__builtin_HEXAGON_A4_cmpheqi:
02705     ID = Intrinsic::hexagon_A4_cmpheqi; break;
02706 
02707   case Hexagon::BI__builtin_HEXAGON_A4_cmphgti:
02708     ID = Intrinsic::hexagon_A4_cmphgti; break;
02709 
02710   case Hexagon::BI__builtin_HEXAGON_A4_cmphgtui:
02711     ID = Intrinsic::hexagon_A4_cmphgtui; break;
02712 
02713   case Hexagon::BI__builtin_HEXAGON_A2_vcmpweq:
02714     ID = Intrinsic::hexagon_A2_vcmpweq; break;
02715 
02716   case Hexagon::BI__builtin_HEXAGON_A2_vcmpwgt:
02717     ID = Intrinsic::hexagon_A2_vcmpwgt; break;
02718 
02719   case Hexagon::BI__builtin_HEXAGON_A2_vcmpwgtu:
02720     ID = Intrinsic::hexagon_A2_vcmpwgtu; break;
02721 
02722   case Hexagon::BI__builtin_HEXAGON_A4_vcmpweqi:
02723     ID = Intrinsic::hexagon_A4_vcmpweqi; break;
02724 
02725   case Hexagon::BI__builtin_HEXAGON_A4_vcmpwgti:
02726     ID = Intrinsic::hexagon_A4_vcmpwgti; break;
02727 
02728   case Hexagon::BI__builtin_HEXAGON_A4_vcmpwgtui:
02729     ID = Intrinsic::hexagon_A4_vcmpwgtui; break;
02730 
02731   case Hexagon::BI__builtin_HEXAGON_A4_boundscheck:
02732     ID = Intrinsic::hexagon_A4_boundscheck; break;
02733 
02734   case Hexagon::BI__builtin_HEXAGON_A4_tlbmatch:
02735     ID = Intrinsic::hexagon_A4_tlbmatch; break;
02736 
02737   case Hexagon::BI__builtin_HEXAGON_C2_tfrpr:
02738     ID = Intrinsic::hexagon_C2_tfrpr; break;
02739 
02740   case Hexagon::BI__builtin_HEXAGON_C2_tfrrp:
02741     ID = Intrinsic::hexagon_C2_tfrrp; break;
02742 
02743   case Hexagon::BI__builtin_HEXAGON_C4_fastcorner9:
02744     ID = Intrinsic::hexagon_C4_fastcorner9; break;
02745 
02746   case Hexagon::BI__builtin_HEXAGON_C4_fastcorner9_not:
02747     ID = Intrinsic::hexagon_C4_fastcorner9_not; break;
02748 
02749   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_hh_s0:
02750     ID = Intrinsic::hexagon_M2_mpy_acc_hh_s0; break;
02751 
02752   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_hh_s1:
02753     ID = Intrinsic::hexagon_M2_mpy_acc_hh_s1; break;
02754 
02755   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_hl_s0:
02756     ID = Intrinsic::hexagon_M2_mpy_acc_hl_s0; break;
02757 
02758   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_hl_s1:
02759     ID = Intrinsic::hexagon_M2_mpy_acc_hl_s1; break;
02760 
02761   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_lh_s0:
02762     ID = Intrinsic::hexagon_M2_mpy_acc_lh_s0; break;
02763 
02764   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_lh_s1:
02765     ID = Intrinsic::hexagon_M2_mpy_acc_lh_s1; break;
02766 
02767   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_ll_s0:
02768     ID = Intrinsic::hexagon_M2_mpy_acc_ll_s0; break;
02769 
02770   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_ll_s1:
02771     ID = Intrinsic::hexagon_M2_mpy_acc_ll_s1; break;
02772 
02773   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_hh_s0:
02774     ID = Intrinsic::hexagon_M2_mpy_nac_hh_s0; break;
02775 
02776   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_hh_s1:
02777     ID = Intrinsic::hexagon_M2_mpy_nac_hh_s1; break;
02778 
02779   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_hl_s0:
02780     ID = Intrinsic::hexagon_M2_mpy_nac_hl_s0; break;
02781 
02782   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_hl_s1:
02783     ID = Intrinsic::hexagon_M2_mpy_nac_hl_s1; break;
02784 
02785   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_lh_s0:
02786     ID = Intrinsic::hexagon_M2_mpy_nac_lh_s0; break;
02787 
02788   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_lh_s1:
02789     ID = Intrinsic::hexagon_M2_mpy_nac_lh_s1; break;
02790 
02791   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_ll_s0:
02792     ID = Intrinsic::hexagon_M2_mpy_nac_ll_s0; break;
02793 
02794   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_ll_s1:
02795     ID = Intrinsic::hexagon_M2_mpy_nac_ll_s1; break;
02796 
02797   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_sat_hh_s0:
02798     ID = Intrinsic::hexagon_M2_mpy_acc_sat_hh_s0; break;
02799 
02800   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_sat_hh_s1:
02801     ID = Intrinsic::hexagon_M2_mpy_acc_sat_hh_s1; break;
02802 
02803   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_sat_hl_s0:
02804     ID = Intrinsic::hexagon_M2_mpy_acc_sat_hl_s0; break;
02805 
02806   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_sat_hl_s1:
02807     ID = Intrinsic::hexagon_M2_mpy_acc_sat_hl_s1; break;
02808 
02809   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_sat_lh_s0:
02810     ID = Intrinsic::hexagon_M2_mpy_acc_sat_lh_s0; break;
02811 
02812   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_sat_lh_s1:
02813     ID = Intrinsic::hexagon_M2_mpy_acc_sat_lh_s1; break;
02814 
02815   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_sat_ll_s0:
02816     ID = Intrinsic::hexagon_M2_mpy_acc_sat_ll_s0; break;
02817 
02818   case Hexagon::BI__builtin_HEXAGON_M2_mpy_acc_sat_ll_s1:
02819     ID = Intrinsic::hexagon_M2_mpy_acc_sat_ll_s1; break;
02820 
02821   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_sat_hh_s0:
02822     ID = Intrinsic::hexagon_M2_mpy_nac_sat_hh_s0; break;
02823 
02824   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_sat_hh_s1:
02825     ID = Intrinsic::hexagon_M2_mpy_nac_sat_hh_s1; break;
02826 
02827   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_sat_hl_s0:
02828     ID = Intrinsic::hexagon_M2_mpy_nac_sat_hl_s0; break;
02829 
02830   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_sat_hl_s1:
02831     ID = Intrinsic::hexagon_M2_mpy_nac_sat_hl_s1; break;
02832 
02833   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_sat_lh_s0:
02834     ID = Intrinsic::hexagon_M2_mpy_nac_sat_lh_s0; break;
02835 
02836   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_sat_lh_s1:
02837     ID = Intrinsic::hexagon_M2_mpy_nac_sat_lh_s1; break;
02838 
02839   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_sat_ll_s0:
02840     ID = Intrinsic::hexagon_M2_mpy_nac_sat_ll_s0; break;
02841 
02842   case Hexagon::BI__builtin_HEXAGON_M2_mpy_nac_sat_ll_s1:
02843     ID = Intrinsic::hexagon_M2_mpy_nac_sat_ll_s1; break;
02844 
02845   case Hexagon::BI__builtin_HEXAGON_M2_mpy_hh_s0:
02846     ID = Intrinsic::hexagon_M2_mpy_hh_s0; break;
02847 
02848   case Hexagon::BI__builtin_HEXAGON_M2_mpy_hh_s1:
02849     ID = Intrinsic::hexagon_M2_mpy_hh_s1; break;
02850 
02851   case Hexagon::BI__builtin_HEXAGON_M2_mpy_hl_s0:
02852     ID = Intrinsic::hexagon_M2_mpy_hl_s0; break;
02853 
02854   case Hexagon::BI__builtin_HEXAGON_M2_mpy_hl_s1:
02855     ID = Intrinsic::hexagon_M2_mpy_hl_s1; break;
02856 
02857   case Hexagon::BI__builtin_HEXAGON_M2_mpy_lh_s0:
02858     ID = Intrinsic::hexagon_M2_mpy_lh_s0; break;
02859 
02860   case Hexagon::BI__builtin_HEXAGON_M2_mpy_lh_s1:
02861     ID = Intrinsic::hexagon_M2_mpy_lh_s1; break;
02862 
02863   case Hexagon::BI__builtin_HEXAGON_M2_mpy_ll_s0:
02864     ID = Intrinsic::hexagon_M2_mpy_ll_s0; break;
02865 
02866   case Hexagon::BI__builtin_HEXAGON_M2_mpy_ll_s1:
02867     ID = Intrinsic::hexagon_M2_mpy_ll_s1; break;
02868 
02869   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_hh_s0:
02870     ID = Intrinsic::hexagon_M2_mpy_sat_hh_s0; break;
02871 
02872   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_hh_s1:
02873     ID = Intrinsic::hexagon_M2_mpy_sat_hh_s1; break;
02874 
02875   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_hl_s0:
02876     ID = Intrinsic::hexagon_M2_mpy_sat_hl_s0; break;
02877 
02878   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_hl_s1:
02879     ID = Intrinsic::hexagon_M2_mpy_sat_hl_s1; break;
02880 
02881   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_lh_s0:
02882     ID = Intrinsic::hexagon_M2_mpy_sat_lh_s0; break;
02883 
02884   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_lh_s1:
02885     ID = Intrinsic::hexagon_M2_mpy_sat_lh_s1; break;
02886 
02887   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_ll_s0:
02888     ID = Intrinsic::hexagon_M2_mpy_sat_ll_s0; break;
02889 
02890   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_ll_s1:
02891     ID = Intrinsic::hexagon_M2_mpy_sat_ll_s1; break;
02892 
02893   case Hexagon::BI__builtin_HEXAGON_M2_mpy_rnd_hh_s0:
02894     ID = Intrinsic::hexagon_M2_mpy_rnd_hh_s0; break;
02895 
02896   case Hexagon::BI__builtin_HEXAGON_M2_mpy_rnd_hh_s1:
02897     ID = Intrinsic::hexagon_M2_mpy_rnd_hh_s1; break;
02898 
02899   case Hexagon::BI__builtin_HEXAGON_M2_mpy_rnd_hl_s0:
02900     ID = Intrinsic::hexagon_M2_mpy_rnd_hl_s0; break;
02901 
02902   case Hexagon::BI__builtin_HEXAGON_M2_mpy_rnd_hl_s1:
02903     ID = Intrinsic::hexagon_M2_mpy_rnd_hl_s1; break;
02904 
02905   case Hexagon::BI__builtin_HEXAGON_M2_mpy_rnd_lh_s0:
02906     ID = Intrinsic::hexagon_M2_mpy_rnd_lh_s0; break;
02907 
02908   case Hexagon::BI__builtin_HEXAGON_M2_mpy_rnd_lh_s1:
02909     ID = Intrinsic::hexagon_M2_mpy_rnd_lh_s1; break;
02910 
02911   case Hexagon::BI__builtin_HEXAGON_M2_mpy_rnd_ll_s0:
02912     ID = Intrinsic::hexagon_M2_mpy_rnd_ll_s0; break;
02913 
02914   case Hexagon::BI__builtin_HEXAGON_M2_mpy_rnd_ll_s1:
02915     ID = Intrinsic::hexagon_M2_mpy_rnd_ll_s1; break;
02916 
02917   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_rnd_hh_s0:
02918     ID = Intrinsic::hexagon_M2_mpy_sat_rnd_hh_s0; break;
02919 
02920   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_rnd_hh_s1:
02921     ID = Intrinsic::hexagon_M2_mpy_sat_rnd_hh_s1; break;
02922 
02923   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_rnd_hl_s0:
02924     ID = Intrinsic::hexagon_M2_mpy_sat_rnd_hl_s0; break;
02925 
02926   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_rnd_hl_s1:
02927     ID = Intrinsic::hexagon_M2_mpy_sat_rnd_hl_s1; break;
02928 
02929   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_rnd_lh_s0:
02930     ID = Intrinsic::hexagon_M2_mpy_sat_rnd_lh_s0; break;
02931 
02932   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_rnd_lh_s1:
02933     ID = Intrinsic::hexagon_M2_mpy_sat_rnd_lh_s1; break;
02934 
02935   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_rnd_ll_s0:
02936     ID = Intrinsic::hexagon_M2_mpy_sat_rnd_ll_s0; break;
02937 
02938   case Hexagon::BI__builtin_HEXAGON_M2_mpy_sat_rnd_ll_s1:
02939     ID = Intrinsic::hexagon_M2_mpy_sat_rnd_ll_s1; break;
02940 
02941   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_acc_hh_s0:
02942     ID = Intrinsic::hexagon_M2_mpyd_acc_hh_s0; break;
02943 
02944   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_acc_hh_s1:
02945     ID = Intrinsic::hexagon_M2_mpyd_acc_hh_s1; break;
02946 
02947   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_acc_hl_s0:
02948     ID = Intrinsic::hexagon_M2_mpyd_acc_hl_s0; break;
02949 
02950   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_acc_hl_s1:
02951     ID = Intrinsic::hexagon_M2_mpyd_acc_hl_s1; break;
02952 
02953   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_acc_lh_s0:
02954     ID = Intrinsic::hexagon_M2_mpyd_acc_lh_s0; break;
02955 
02956   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_acc_lh_s1:
02957     ID = Intrinsic::hexagon_M2_mpyd_acc_lh_s1; break;
02958 
02959   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_acc_ll_s0:
02960     ID = Intrinsic::hexagon_M2_mpyd_acc_ll_s0; break;
02961 
02962   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_acc_ll_s1:
02963     ID = Intrinsic::hexagon_M2_mpyd_acc_ll_s1; break;
02964 
02965   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_nac_hh_s0:
02966     ID = Intrinsic::hexagon_M2_mpyd_nac_hh_s0; break;
02967 
02968   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_nac_hh_s1:
02969     ID = Intrinsic::hexagon_M2_mpyd_nac_hh_s1; break;
02970 
02971   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_nac_hl_s0:
02972     ID = Intrinsic::hexagon_M2_mpyd_nac_hl_s0; break;
02973 
02974   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_nac_hl_s1:
02975     ID = Intrinsic::hexagon_M2_mpyd_nac_hl_s1; break;
02976 
02977   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_nac_lh_s0:
02978     ID = Intrinsic::hexagon_M2_mpyd_nac_lh_s0; break;
02979 
02980   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_nac_lh_s1:
02981     ID = Intrinsic::hexagon_M2_mpyd_nac_lh_s1; break;
02982 
02983   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_nac_ll_s0:
02984     ID = Intrinsic::hexagon_M2_mpyd_nac_ll_s0; break;
02985 
02986   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_nac_ll_s1:
02987     ID = Intrinsic::hexagon_M2_mpyd_nac_ll_s1; break;
02988 
02989   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_hh_s0:
02990     ID = Intrinsic::hexagon_M2_mpyd_hh_s0; break;
02991 
02992   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_hh_s1:
02993     ID = Intrinsic::hexagon_M2_mpyd_hh_s1; break;
02994 
02995   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_hl_s0:
02996     ID = Intrinsic::hexagon_M2_mpyd_hl_s0; break;
02997 
02998   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_hl_s1:
02999     ID = Intrinsic::hexagon_M2_mpyd_hl_s1; break;
03000 
03001   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_lh_s0:
03002     ID = Intrinsic::hexagon_M2_mpyd_lh_s0; break;
03003 
03004   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_lh_s1:
03005     ID = Intrinsic::hexagon_M2_mpyd_lh_s1; break;
03006 
03007   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_ll_s0:
03008     ID = Intrinsic::hexagon_M2_mpyd_ll_s0; break;
03009 
03010   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_ll_s1:
03011     ID = Intrinsic::hexagon_M2_mpyd_ll_s1; break;
03012 
03013   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_rnd_hh_s0:
03014     ID = Intrinsic::hexagon_M2_mpyd_rnd_hh_s0; break;
03015 
03016   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_rnd_hh_s1:
03017     ID = Intrinsic::hexagon_M2_mpyd_rnd_hh_s1; break;
03018 
03019   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_rnd_hl_s0:
03020     ID = Intrinsic::hexagon_M2_mpyd_rnd_hl_s0; break;
03021 
03022   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_rnd_hl_s1:
03023     ID = Intrinsic::hexagon_M2_mpyd_rnd_hl_s1; break;
03024 
03025   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_rnd_lh_s0:
03026     ID = Intrinsic::hexagon_M2_mpyd_rnd_lh_s0; break;
03027 
03028   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_rnd_lh_s1:
03029     ID = Intrinsic::hexagon_M2_mpyd_rnd_lh_s1; break;
03030 
03031   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_rnd_ll_s0:
03032     ID = Intrinsic::hexagon_M2_mpyd_rnd_ll_s0; break;
03033 
03034   case Hexagon::BI__builtin_HEXAGON_M2_mpyd_rnd_ll_s1:
03035     ID = Intrinsic::hexagon_M2_mpyd_rnd_ll_s1; break;
03036 
03037   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_acc_hh_s0:
03038     ID = Intrinsic::hexagon_M2_mpyu_acc_hh_s0; break;
03039 
03040   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_acc_hh_s1:
03041     ID = Intrinsic::hexagon_M2_mpyu_acc_hh_s1; break;
03042 
03043   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_acc_hl_s0:
03044     ID = Intrinsic::hexagon_M2_mpyu_acc_hl_s0; break;
03045 
03046   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_acc_hl_s1:
03047     ID = Intrinsic::hexagon_M2_mpyu_acc_hl_s1; break;
03048 
03049   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_acc_lh_s0:
03050     ID = Intrinsic::hexagon_M2_mpyu_acc_lh_s0; break;
03051 
03052   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_acc_lh_s1:
03053     ID = Intrinsic::hexagon_M2_mpyu_acc_lh_s1; break;
03054 
03055   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_acc_ll_s0:
03056     ID = Intrinsic::hexagon_M2_mpyu_acc_ll_s0; break;
03057 
03058   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_acc_ll_s1:
03059     ID = Intrinsic::hexagon_M2_mpyu_acc_ll_s1; break;
03060 
03061   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_nac_hh_s0:
03062     ID = Intrinsic::hexagon_M2_mpyu_nac_hh_s0; break;
03063 
03064   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_nac_hh_s1:
03065     ID = Intrinsic::hexagon_M2_mpyu_nac_hh_s1; break;
03066 
03067   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_nac_hl_s0:
03068     ID = Intrinsic::hexagon_M2_mpyu_nac_hl_s0; break;
03069 
03070   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_nac_hl_s1:
03071     ID = Intrinsic::hexagon_M2_mpyu_nac_hl_s1; break;
03072 
03073   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_nac_lh_s0:
03074     ID = Intrinsic::hexagon_M2_mpyu_nac_lh_s0; break;
03075 
03076   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_nac_lh_s1:
03077     ID = Intrinsic::hexagon_M2_mpyu_nac_lh_s1; break;
03078 
03079   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_nac_ll_s0:
03080     ID = Intrinsic::hexagon_M2_mpyu_nac_ll_s0; break;
03081 
03082   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_nac_ll_s1:
03083     ID = Intrinsic::hexagon_M2_mpyu_nac_ll_s1; break;
03084 
03085   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_hh_s0:
03086     ID = Intrinsic::hexagon_M2_mpyu_hh_s0; break;
03087 
03088   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_hh_s1:
03089     ID = Intrinsic::hexagon_M2_mpyu_hh_s1; break;
03090 
03091   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_hl_s0:
03092     ID = Intrinsic::hexagon_M2_mpyu_hl_s0; break;
03093 
03094   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_hl_s1:
03095     ID = Intrinsic::hexagon_M2_mpyu_hl_s1; break;
03096 
03097   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_lh_s0:
03098     ID = Intrinsic::hexagon_M2_mpyu_lh_s0; break;
03099 
03100   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_lh_s1:
03101     ID = Intrinsic::hexagon_M2_mpyu_lh_s1; break;
03102 
03103   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_ll_s0:
03104     ID = Intrinsic::hexagon_M2_mpyu_ll_s0; break;
03105 
03106   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_ll_s1:
03107     ID = Intrinsic::hexagon_M2_mpyu_ll_s1; break;
03108 
03109   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_acc_hh_s0:
03110     ID = Intrinsic::hexagon_M2_mpyud_acc_hh_s0; break;
03111 
03112   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_acc_hh_s1:
03113     ID = Intrinsic::hexagon_M2_mpyud_acc_hh_s1; break;
03114 
03115   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_acc_hl_s0:
03116     ID = Intrinsic::hexagon_M2_mpyud_acc_hl_s0; break;
03117 
03118   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_acc_hl_s1:
03119     ID = Intrinsic::hexagon_M2_mpyud_acc_hl_s1; break;
03120 
03121   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_acc_lh_s0:
03122     ID = Intrinsic::hexagon_M2_mpyud_acc_lh_s0; break;
03123 
03124   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_acc_lh_s1:
03125     ID = Intrinsic::hexagon_M2_mpyud_acc_lh_s1; break;
03126 
03127   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_acc_ll_s0:
03128     ID = Intrinsic::hexagon_M2_mpyud_acc_ll_s0; break;
03129 
03130   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_acc_ll_s1:
03131     ID = Intrinsic::hexagon_M2_mpyud_acc_ll_s1; break;
03132 
03133   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_nac_hh_s0:
03134     ID = Intrinsic::hexagon_M2_mpyud_nac_hh_s0; break;
03135 
03136   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_nac_hh_s1:
03137     ID = Intrinsic::hexagon_M2_mpyud_nac_hh_s1; break;
03138 
03139   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_nac_hl_s0:
03140     ID = Intrinsic::hexagon_M2_mpyud_nac_hl_s0; break;
03141 
03142   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_nac_hl_s1:
03143     ID = Intrinsic::hexagon_M2_mpyud_nac_hl_s1; break;
03144 
03145   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_nac_lh_s0:
03146     ID = Intrinsic::hexagon_M2_mpyud_nac_lh_s0; break;
03147 
03148   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_nac_lh_s1:
03149     ID = Intrinsic::hexagon_M2_mpyud_nac_lh_s1; break;
03150 
03151   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_nac_ll_s0:
03152     ID = Intrinsic::hexagon_M2_mpyud_nac_ll_s0; break;
03153 
03154   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_nac_ll_s1:
03155     ID = Intrinsic::hexagon_M2_mpyud_nac_ll_s1; break;
03156 
03157   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_hh_s0:
03158     ID = Intrinsic::hexagon_M2_mpyud_hh_s0; break;
03159 
03160   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_hh_s1:
03161     ID = Intrinsic::hexagon_M2_mpyud_hh_s1; break;
03162 
03163   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_hl_s0:
03164     ID = Intrinsic::hexagon_M2_mpyud_hl_s0; break;
03165 
03166   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_hl_s1:
03167     ID = Intrinsic::hexagon_M2_mpyud_hl_s1; break;
03168 
03169   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_lh_s0:
03170     ID = Intrinsic::hexagon_M2_mpyud_lh_s0; break;
03171 
03172   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_lh_s1:
03173     ID = Intrinsic::hexagon_M2_mpyud_lh_s1; break;
03174 
03175   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_ll_s0:
03176     ID = Intrinsic::hexagon_M2_mpyud_ll_s0; break;
03177 
03178   case Hexagon::BI__builtin_HEXAGON_M2_mpyud_ll_s1:
03179     ID = Intrinsic::hexagon_M2_mpyud_ll_s1; break;
03180 
03181   case Hexagon::BI__builtin_HEXAGON_M2_mpysmi:
03182     ID = Intrinsic::hexagon_M2_mpysmi; break;
03183 
03184   case Hexagon::BI__builtin_HEXAGON_M2_macsip:
03185     ID = Intrinsic::hexagon_M2_macsip; break;
03186 
03187   case Hexagon::BI__builtin_HEXAGON_M2_macsin:
03188     ID = Intrinsic::hexagon_M2_macsin; break;
03189 
03190   case Hexagon::BI__builtin_HEXAGON_M2_dpmpyss_s0:
03191     ID = Intrinsic::hexagon_M2_dpmpyss_s0; break;
03192 
03193   case Hexagon::BI__builtin_HEXAGON_M2_dpmpyss_acc_s0:
03194     ID = Intrinsic::hexagon_M2_dpmpyss_acc_s0; break;
03195 
03196   case Hexagon::BI__builtin_HEXAGON_M2_dpmpyss_nac_s0:
03197     ID = Intrinsic::hexagon_M2_dpmpyss_nac_s0; break;
03198 
03199   case Hexagon::BI__builtin_HEXAGON_M2_dpmpyuu_s0:
03200     ID = Intrinsic::hexagon_M2_dpmpyuu_s0; break;
03201 
03202   case Hexagon::BI__builtin_HEXAGON_M2_dpmpyuu_acc_s0:
03203     ID = Intrinsic::hexagon_M2_dpmpyuu_acc_s0; break;
03204 
03205   case Hexagon::BI__builtin_HEXAGON_M2_dpmpyuu_nac_s0:
03206     ID = Intrinsic::hexagon_M2_dpmpyuu_nac_s0; break;
03207 
03208   case Hexagon::BI__builtin_HEXAGON_M2_mpy_up:
03209     ID = Intrinsic::hexagon_M2_mpy_up; break;
03210 
03211   case Hexagon::BI__builtin_HEXAGON_M2_mpy_up_s1:
03212     ID = Intrinsic::hexagon_M2_mpy_up_s1; break;
03213 
03214   case Hexagon::BI__builtin_HEXAGON_M2_mpy_up_s1_sat:
03215     ID = Intrinsic::hexagon_M2_mpy_up_s1_sat; break;
03216 
03217   case Hexagon::BI__builtin_HEXAGON_M2_mpyu_up:
03218     ID = Intrinsic::hexagon_M2_mpyu_up; break;
03219 
03220   case Hexagon::BI__builtin_HEXAGON_M2_mpysu_up:
03221     ID = Intrinsic::hexagon_M2_mpysu_up; break;
03222 
03223   case Hexagon::BI__builtin_HEXAGON_M2_dpmpyss_rnd_s0:
03224     ID = Intrinsic::hexagon_M2_dpmpyss_rnd_s0; break;
03225 
03226   case Hexagon::BI__builtin_HEXAGON_M4_mac_up_s1_sat:
03227     ID = Intrinsic::hexagon_M4_mac_up_s1_sat; break;
03228 
03229   case Hexagon::BI__builtin_HEXAGON_M4_nac_up_s1_sat:
03230     ID = Intrinsic::hexagon_M4_nac_up_s1_sat; break;
03231 
03232   case Hexagon::BI__builtin_HEXAGON_M2_mpyi:
03233     ID = Intrinsic::hexagon_M2_mpyi; break;
03234 
03235   case Hexagon::BI__builtin_HEXAGON_M2_mpyui:
03236     ID = Intrinsic::hexagon_M2_mpyui; break;
03237 
03238   case Hexagon::BI__builtin_HEXAGON_M2_maci:
03239     ID = Intrinsic::hexagon_M2_maci; break;
03240 
03241   case Hexagon::BI__builtin_HEXAGON_M2_acci:
03242     ID = Intrinsic::hexagon_M2_acci; break;
03243 
03244   case Hexagon::BI__builtin_HEXAGON_M2_accii:
03245     ID = Intrinsic::hexagon_M2_accii; break;
03246 
03247   case Hexagon::BI__builtin_HEXAGON_M2_nacci:
03248     ID = Intrinsic::hexagon_M2_nacci; break;
03249 
03250   case Hexagon::BI__builtin_HEXAGON_M2_naccii:
03251     ID = Intrinsic::hexagon_M2_naccii; break;
03252 
03253   case Hexagon::BI__builtin_HEXAGON_M2_subacc:
03254     ID = Intrinsic::hexagon_M2_subacc; break;
03255 
03256   case Hexagon::BI__builtin_HEXAGON_M4_mpyrr_addr:
03257     ID = Intrinsic::hexagon_M4_mpyrr_addr; break;
03258 
03259   case Hexagon::BI__builtin_HEXAGON_M4_mpyri_addr_u2:
03260     ID = Intrinsic::hexagon_M4_mpyri_addr_u2; break;
03261 
03262   case Hexagon::BI__builtin_HEXAGON_M4_mpyri_addr:
03263     ID = Intrinsic::hexagon_M4_mpyri_addr; break;
03264 
03265   case Hexagon::BI__builtin_HEXAGON_M4_mpyri_addi:
03266     ID = Intrinsic::hexagon_M4_mpyri_addi; break;
03267 
03268   case Hexagon::BI__builtin_HEXAGON_M4_mpyrr_addi:
03269     ID = Intrinsic::hexagon_M4_mpyrr_addi; break;
03270 
03271   case Hexagon::BI__builtin_HEXAGON_M2_vmpy2s_s0:
03272     ID = Intrinsic::hexagon_M2_vmpy2s_s0; break;
03273 
03274   case Hexagon::BI__builtin_HEXAGON_M2_vmpy2s_s1:
03275     ID = Intrinsic::hexagon_M2_vmpy2s_s1; break;
03276 
03277   case Hexagon::BI__builtin_HEXAGON_M2_vmac2s_s0:
03278     ID = Intrinsic::hexagon_M2_vmac2s_s0; break;
03279 
03280   case Hexagon::BI__builtin_HEXAGON_M2_vmac2s_s1:
03281     ID = Intrinsic::hexagon_M2_vmac2s_s1; break;
03282 
03283   case Hexagon::BI__builtin_HEXAGON_M2_vmpy2su_s0:
03284     ID = Intrinsic::hexagon_M2_vmpy2su_s0; break;
03285 
03286   case Hexagon::BI__builtin_HEXAGON_M2_vmpy2su_s1:
03287     ID = Intrinsic::hexagon_M2_vmpy2su_s1; break;
03288 
03289   case Hexagon::BI__builtin_HEXAGON_M2_vmac2su_s0:
03290     ID = Intrinsic::hexagon_M2_vmac2su_s0; break;
03291 
03292   case Hexagon::BI__builtin_HEXAGON_M2_vmac2su_s1:
03293     ID = Intrinsic::hexagon_M2_vmac2su_s1; break;
03294 
03295   case Hexagon::BI__builtin_HEXAGON_M2_vmpy2s_s0pack:
03296     ID = Intrinsic::hexagon_M2_vmpy2s_s0pack; break;
03297 
03298   case Hexagon::BI__builtin_HEXAGON_M2_vmpy2s_s1pack:
03299     ID = Intrinsic::hexagon_M2_vmpy2s_s1pack; break;
03300 
03301   case Hexagon::BI__builtin_HEXAGON_M2_vmac2:
03302     ID = Intrinsic::hexagon_M2_vmac2; break;
03303 
03304   case Hexagon::BI__builtin_HEXAGON_M2_vmpy2es_s0:
03305     ID = Intrinsic::hexagon_M2_vmpy2es_s0; break;
03306 
03307   case Hexagon::BI__builtin_HEXAGON_M2_vmpy2es_s1:
03308     ID = Intrinsic::hexagon_M2_vmpy2es_s1; break;
03309 
03310   case Hexagon::BI__builtin_HEXAGON_M2_vmac2es_s0:
03311     ID = Intrinsic::hexagon_M2_vmac2es_s0; break;
03312 
03313   case Hexagon::BI__builtin_HEXAGON_M2_vmac2es_s1:
03314     ID = Intrinsic::hexagon_M2_vmac2es_s1; break;
03315 
03316   case Hexagon::BI__builtin_HEXAGON_M2_vmac2es:
03317     ID = Intrinsic::hexagon_M2_vmac2es; break;
03318 
03319   case Hexagon::BI__builtin_HEXAGON_M2_vrmac_s0:
03320     ID = Intrinsic::hexagon_M2_vrmac_s0; break;
03321 
03322   case Hexagon::BI__builtin_HEXAGON_M2_vrmpy_s0:
03323     ID = Intrinsic::hexagon_M2_vrmpy_s0; break;
03324 
03325   case Hexagon::BI__builtin_HEXAGON_M2_vdmpyrs_s0:
03326     ID = Intrinsic::hexagon_M2_vdmpyrs_s0; break;
03327 
03328   case Hexagon::BI__builtin_HEXAGON_M2_vdmpyrs_s1:
03329     ID = Intrinsic::hexagon_M2_vdmpyrs_s1; break;
03330 
03331   case Hexagon::BI__builtin_HEXAGON_M5_vrmpybuu:
03332     ID = Intrinsic::hexagon_M5_vrmpybuu; break;
03333 
03334   case Hexagon::BI__builtin_HEXAGON_M5_vrmacbuu:
03335     ID = Intrinsic::hexagon_M5_vrmacbuu; break;
03336 
03337   case Hexagon::BI__builtin_HEXAGON_M5_vrmpybsu:
03338     ID = Intrinsic::hexagon_M5_vrmpybsu; break;
03339 
03340   case Hexagon::BI__builtin_HEXAGON_M5_vrmacbsu:
03341     ID = Intrinsic::hexagon_M5_vrmacbsu; break;
03342 
03343   case Hexagon::BI__builtin_HEXAGON_M5_vmpybuu:
03344     ID = Intrinsic::hexagon_M5_vmpybuu; break;
03345 
03346   case Hexagon::BI__builtin_HEXAGON_M5_vmpybsu:
03347     ID = Intrinsic::hexagon_M5_vmpybsu; break;
03348 
03349   case Hexagon::BI__builtin_HEXAGON_M5_vmacbuu:
03350     ID = Intrinsic::hexagon_M5_vmacbuu; break;
03351 
03352   case Hexagon::BI__builtin_HEXAGON_M5_vmacbsu:
03353     ID = Intrinsic::hexagon_M5_vmacbsu; break;
03354 
03355   case Hexagon::BI__builtin_HEXAGON_M5_vdmpybsu:
03356     ID = Intrinsic::hexagon_M5_vdmpybsu; break;
03357 
03358   case Hexagon::BI__builtin_HEXAGON_M5_vdmacbsu:
03359     ID = Intrinsic::hexagon_M5_vdmacbsu; break;
03360 
03361   case Hexagon::BI__builtin_HEXAGON_M2_vdmacs_s0:
03362     ID = Intrinsic::hexagon_M2_vdmacs_s0; break;
03363 
03364   case Hexagon::BI__builtin_HEXAGON_M2_vdmacs_s1:
03365     ID = Intrinsic::hexagon_M2_vdmacs_s1; break;
03366 
03367   case Hexagon::BI__builtin_HEXAGON_M2_vdmpys_s0:
03368     ID = Intrinsic::hexagon_M2_vdmpys_s0; break;
03369 
03370   case Hexagon::BI__builtin_HEXAGON_M2_vdmpys_s1:
03371     ID = Intrinsic::hexagon_M2_vdmpys_s1; break;
03372 
03373   case Hexagon::BI__builtin_HEXAGON_M2_cmpyrs_s0:
03374     ID = Intrinsic::hexagon_M2_cmpyrs_s0; break;
03375 
03376   case Hexagon::BI__builtin_HEXAGON_M2_cmpyrs_s1:
03377     ID = Intrinsic::hexagon_M2_cmpyrs_s1; break;
03378 
03379   case Hexagon::BI__builtin_HEXAGON_M2_cmpyrsc_s0:
03380     ID = Intrinsic::hexagon_M2_cmpyrsc_s0; break;
03381 
03382   case Hexagon::BI__builtin_HEXAGON_M2_cmpyrsc_s1:
03383     ID = Intrinsic::hexagon_M2_cmpyrsc_s1; break;
03384 
03385   case Hexagon::BI__builtin_HEXAGON_M2_cmacs_s0:
03386     ID = Intrinsic::hexagon_M2_cmacs_s0; break;
03387 
03388   case Hexagon::BI__builtin_HEXAGON_M2_cmacs_s1:
03389     ID = Intrinsic::hexagon_M2_cmacs_s1; break;
03390 
03391   case Hexagon::BI__builtin_HEXAGON_M2_cmacsc_s0:
03392     ID = Intrinsic::hexagon_M2_cmacsc_s0; break;
03393 
03394   case Hexagon::BI__builtin_HEXAGON_M2_cmacsc_s1:
03395     ID = Intrinsic::hexagon_M2_cmacsc_s1; break;
03396 
03397   case Hexagon::BI__builtin_HEXAGON_M2_cmpys_s0:
03398     ID = Intrinsic::hexagon_M2_cmpys_s0; break;
03399 
03400   case Hexagon::BI__builtin_HEXAGON_M2_cmpys_s1:
03401     ID = Intrinsic::hexagon_M2_cmpys_s1; break;
03402 
03403   case Hexagon::BI__builtin_HEXAGON_M2_cmpysc_s0:
03404     ID = Intrinsic::hexagon_M2_cmpysc_s0; break;
03405 
03406   case Hexagon::BI__builtin_HEXAGON_M2_cmpysc_s1:
03407     ID = Intrinsic::hexagon_M2_cmpysc_s1; break;
03408 
03409   case Hexagon::BI__builtin_HEXAGON_M2_cnacs_s0:
03410     ID = Intrinsic::hexagon_M2_cnacs_s0; break;
03411 
03412   case Hexagon::BI__builtin_HEXAGON_M2_cnacs_s1:
03413     ID = Intrinsic::hexagon_M2_cnacs_s1; break;
03414 
03415   case Hexagon::BI__builtin_HEXAGON_M2_cnacsc_s0:
03416     ID = Intrinsic::hexagon_M2_cnacsc_s0; break;
03417 
03418   case Hexagon::BI__builtin_HEXAGON_M2_cnacsc_s1:
03419     ID = Intrinsic::hexagon_M2_cnacsc_s1; break;
03420 
03421   case Hexagon::BI__builtin_HEXAGON_M2_vrcmpys_s1:
03422     ID = Intrinsic::hexagon_M2_vrcmpys_s1; break;
03423 
03424   case Hexagon::BI__builtin_HEXAGON_M2_vrcmpys_acc_s1:
03425     ID = Intrinsic::hexagon_M2_vrcmpys_acc_s1; break;
03426 
03427   case Hexagon::BI__builtin_HEXAGON_M2_vrcmpys_s1rp:
03428     ID = Intrinsic::hexagon_M2_vrcmpys_s1rp; break;
03429 
03430   case Hexagon::BI__builtin_HEXAGON_M2_mmacls_s0:
03431     ID = Intrinsic::hexagon_M2_mmacls_s0; break;
03432 
03433   case Hexagon::BI__builtin_HEXAGON_M2_mmacls_s1:
03434     ID = Intrinsic::hexagon_M2_mmacls_s1; break;
03435 
03436   case Hexagon::BI__builtin_HEXAGON_M2_mmachs_s0:
03437     ID = Intrinsic::hexagon_M2_mmachs_s0; break;
03438 
03439   case Hexagon::BI__builtin_HEXAGON_M2_mmachs_s1:
03440     ID = Intrinsic::hexagon_M2_mmachs_s1; break;
03441 
03442   case Hexagon::BI__builtin_HEXAGON_M2_mmpyl_s0:
03443     ID = Intrinsic::hexagon_M2_mmpyl_s0; break;
03444 
03445   case Hexagon::BI__builtin_HEXAGON_M2_mmpyl_s1:
03446     ID = Intrinsic::hexagon_M2_mmpyl_s1; break;
03447 
03448   case Hexagon::BI__builtin_HEXAGON_M2_mmpyh_s0:
03449     ID = Intrinsic::hexagon_M2_mmpyh_s0; break;
03450 
03451   case Hexagon::BI__builtin_HEXAGON_M2_mmpyh_s1:
03452     ID = Intrinsic::hexagon_M2_mmpyh_s1; break;
03453 
03454   case Hexagon::BI__builtin_HEXAGON_M2_mmacls_rs0:
03455     ID = Intrinsic::hexagon_M2_mmacls_rs0; break;
03456 
03457   case Hexagon::BI__builtin_HEXAGON_M2_mmacls_rs1:
03458     ID = Intrinsic::hexagon_M2_mmacls_rs1; break;
03459 
03460   case Hexagon::BI__builtin_HEXAGON_M2_mmachs_rs0:
03461     ID = Intrinsic::hexagon_M2_mmachs_rs0; break;
03462 
03463   case Hexagon::BI__builtin_HEXAGON_M2_mmachs_rs1:
03464     ID = Intrinsic::hexagon_M2_mmachs_rs1; break;
03465 
03466   case Hexagon::BI__builtin_HEXAGON_M2_mmpyl_rs0:
03467     ID = Intrinsic::hexagon_M2_mmpyl_rs0; break;
03468 
03469   case Hexagon::BI__builtin_HEXAGON_M2_mmpyl_rs1:
03470     ID = Intrinsic::hexagon_M2_mmpyl_rs1; break;
03471 
03472   case Hexagon::BI__builtin_HEXAGON_M2_mmpyh_rs0:
03473     ID = Intrinsic::hexagon_M2_mmpyh_rs0; break;
03474 
03475   case Hexagon::BI__builtin_HEXAGON_M2_mmpyh_rs1:
03476     ID = Intrinsic::hexagon_M2_mmpyh_rs1; break;
03477 
03478   case Hexagon::BI__builtin_HEXAGON_M4_vrmpyeh_s0:
03479     ID = Intrinsic::hexagon_M4_vrmpyeh_s0; break;
03480 
03481   case Hexagon::BI__builtin_HEXAGON_M4_vrmpyeh_s1:
03482     ID = Intrinsic::hexagon_M4_vrmpyeh_s1; break;
03483 
03484   case Hexagon::BI__builtin_HEXAGON_M4_vrmpyeh_acc_s0:
03485     ID = Intrinsic::hexagon_M4_vrmpyeh_acc_s0; break;
03486 
03487   case Hexagon::BI__builtin_HEXAGON_M4_vrmpyeh_acc_s1:
03488     ID = Intrinsic::hexagon_M4_vrmpyeh_acc_s1; break;
03489 
03490   case Hexagon::BI__builtin_HEXAGON_M4_vrmpyoh_s0:
03491     ID = Intrinsic::hexagon_M4_vrmpyoh_s0; break;
03492 
03493   case Hexagon::BI__builtin_HEXAGON_M4_vrmpyoh_s1:
03494     ID = Intrinsic::hexagon_M4_vrmpyoh_s1; break;
03495 
03496   case Hexagon::BI__builtin_HEXAGON_M4_vrmpyoh_acc_s0:
03497     ID = Intrinsic::hexagon_M4_vrmpyoh_acc_s0; break;
03498 
03499   case Hexagon::BI__builtin_HEXAGON_M4_vrmpyoh_acc_s1:
03500     ID = Intrinsic::hexagon_M4_vrmpyoh_acc_s1; break;
03501 
03502   case Hexagon::BI__builtin_HEXAGON_M2_hmmpyl_rs1:
03503     ID = Intrinsic::hexagon_M2_hmmpyl_rs1; break;
03504 
03505   case Hexagon::BI__builtin_HEXAGON_M2_hmmpyh_rs1:
03506     ID = Intrinsic::hexagon_M2_hmmpyh_rs1; break;
03507 
03508   case Hexagon::BI__builtin_HEXAGON_M2_hmmpyl_s1:
03509     ID = Intrinsic::hexagon_M2_hmmpyl_s1; break;
03510 
03511   case Hexagon::BI__builtin_HEXAGON_M2_hmmpyh_s1:
03512     ID = Intrinsic::hexagon_M2_hmmpyh_s1; break;
03513 
03514   case Hexagon::BI__builtin_HEXAGON_M2_mmaculs_s0:
03515     ID = Intrinsic::hexagon_M2_mmaculs_s0; break;
03516 
03517   case Hexagon::BI__builtin_HEXAGON_M2_mmaculs_s1:
03518     ID = Intrinsic::hexagon_M2_mmaculs_s1; break;
03519 
03520   case Hexagon::BI__builtin_HEXAGON_M2_mmacuhs_s0:
03521     ID = Intrinsic::hexagon_M2_mmacuhs_s0; break;
03522 
03523   case Hexagon::BI__builtin_HEXAGON_M2_mmacuhs_s1:
03524     ID = Intrinsic::hexagon_M2_mmacuhs_s1; break;
03525 
03526   case Hexagon::BI__builtin_HEXAGON_M2_mmpyul_s0:
03527     ID = Intrinsic::hexagon_M2_mmpyul_s0; break;
03528 
03529   case Hexagon::BI__builtin_HEXAGON_M2_mmpyul_s1:
03530     ID = Intrinsic::hexagon_M2_mmpyul_s1; break;
03531 
03532   case Hexagon::BI__builtin_HEXAGON_M2_mmpyuh_s0:
03533     ID = Intrinsic::hexagon_M2_mmpyuh_s0; break;
03534 
03535   case Hexagon::BI__builtin_HEXAGON_M2_mmpyuh_s1:
03536     ID = Intrinsic::hexagon_M2_mmpyuh_s1; break;
03537 
03538   case Hexagon::BI__builtin_HEXAGON_M2_mmaculs_rs0:
03539     ID = Intrinsic::hexagon_M2_mmaculs_rs0; break;
03540 
03541   case Hexagon::BI__builtin_HEXAGON_M2_mmaculs_rs1:
03542     ID = Intrinsic::hexagon_M2_mmaculs_rs1; break;
03543 
03544   case Hexagon::BI__builtin_HEXAGON_M2_mmacuhs_rs0:
03545     ID = Intrinsic::hexagon_M2_mmacuhs_rs0; break;
03546 
03547   case Hexagon::BI__builtin_HEXAGON_M2_mmacuhs_rs1:
03548     ID = Intrinsic::hexagon_M2_mmacuhs_rs1; break;
03549 
03550   case Hexagon::BI__builtin_HEXAGON_M2_mmpyul_rs0:
03551     ID = Intrinsic::hexagon_M2_mmpyul_rs0; break;
03552 
03553   case Hexagon::BI__builtin_HEXAGON_M2_mmpyul_rs1:
03554     ID = Intrinsic::hexagon_M2_mmpyul_rs1; break;
03555 
03556   case Hexagon::BI__builtin_HEXAGON_M2_mmpyuh_rs0:
03557     ID = Intrinsic::hexagon_M2_mmpyuh_rs0; break;
03558 
03559   case Hexagon::BI__builtin_HEXAGON_M2_mmpyuh_rs1:
03560     ID = Intrinsic::hexagon_M2_mmpyuh_rs1; break;
03561 
03562   case Hexagon::BI__builtin_HEXAGON_M2_vrcmaci_s0:
03563     ID = Intrinsic::hexagon_M2_vrcmaci_s0; break;
03564 
03565   case Hexagon::BI__builtin_HEXAGON_M2_vrcmacr_s0:
03566     ID = Intrinsic::hexagon_M2_vrcmacr_s0; break;
03567 
03568   case Hexagon::BI__builtin_HEXAGON_M2_vrcmaci_s0c:
03569     ID = Intrinsic::hexagon_M2_vrcmaci_s0c; break;
03570 
03571   case Hexagon::BI__builtin_HEXAGON_M2_vrcmacr_s0c:
03572     ID = Intrinsic::hexagon_M2_vrcmacr_s0c; break;
03573 
03574   case Hexagon::BI__builtin_HEXAGON_M2_cmaci_s0:
03575     ID = Intrinsic::hexagon_M2_cmaci_s0; break;
03576 
03577   case Hexagon::BI__builtin_HEXAGON_M2_cmacr_s0:
03578     ID = Intrinsic::hexagon_M2_cmacr_s0; break;
03579 
03580   case Hexagon::BI__builtin_HEXAGON_M2_vrcmpyi_s0:
03581     ID = Intrinsic::hexagon_M2_vrcmpyi_s0; break;
03582 
03583   case Hexagon::BI__builtin_HEXAGON_M2_vrcmpyr_s0:
03584     ID = Intrinsic::hexagon_M2_vrcmpyr_s0; break;
03585 
03586   case Hexagon::BI__builtin_HEXAGON_M2_vrcmpyi_s0c:
03587     ID = Intrinsic::hexagon_M2_vrcmpyi_s0c; break;
03588 
03589   case Hexagon::BI__builtin_HEXAGON_M2_vrcmpyr_s0c:
03590     ID = Intrinsic::hexagon_M2_vrcmpyr_s0c; break;
03591 
03592   case Hexagon::BI__builtin_HEXAGON_M2_cmpyi_s0:
03593     ID = Intrinsic::hexagon_M2_cmpyi_s0; break;
03594 
03595   case Hexagon::BI__builtin_HEXAGON_M2_cmpyr_s0:
03596     ID = Intrinsic::hexagon_M2_cmpyr_s0; break;
03597 
03598   case Hexagon::BI__builtin_HEXAGON_M4_cmpyi_wh:
03599     ID = Intrinsic::hexagon_M4_cmpyi_wh; break;
03600 
03601   case Hexagon::BI__builtin_HEXAGON_M4_cmpyr_wh:
03602     ID = Intrinsic::hexagon_M4_cmpyr_wh; break;
03603 
03604   case Hexagon::BI__builtin_HEXAGON_M4_cmpyi_whc:
03605     ID = Intrinsic::hexagon_M4_cmpyi_whc; break;
03606 
03607   case Hexagon::BI__builtin_HEXAGON_M4_cmpyr_whc:
03608     ID = Intrinsic::hexagon_M4_cmpyr_whc; break;
03609 
03610   case Hexagon::BI__builtin_HEXAGON_M2_vcmpy_s0_sat_i:
03611     ID = Intrinsic::hexagon_M2_vcmpy_s0_sat_i; break;
03612 
03613   case Hexagon::BI__builtin_HEXAGON_M2_vcmpy_s0_sat_r:
03614     ID = Intrinsic::hexagon_M2_vcmpy_s0_sat_r; break;
03615 
03616   case Hexagon::BI__builtin_HEXAGON_M2_vcmpy_s1_sat_i:
03617     ID = Intrinsic::hexagon_M2_vcmpy_s1_sat_i; break;
03618 
03619   case Hexagon::BI__builtin_HEXAGON_M2_vcmpy_s1_sat_r:
03620     ID = Intrinsic::hexagon_M2_vcmpy_s1_sat_r; break;
03621 
03622   case Hexagon::BI__builtin_HEXAGON_M2_vcmac_s0_sat_i:
03623     ID = Intrinsic::hexagon_M2_vcmac_s0_sat_i; break;
03624 
03625   case Hexagon::BI__builtin_HEXAGON_M2_vcmac_s0_sat_r:
03626     ID = Intrinsic::hexagon_M2_vcmac_s0_sat_r; break;
03627 
03628   case Hexagon::BI__builtin_HEXAGON_S2_vcrotate:
03629     ID = Intrinsic::hexagon_S2_vcrotate; break;
03630 
03631   case Hexagon::BI__builtin_HEXAGON_S4_vrcrotate_acc:
03632     ID = Intrinsic::hexagon_S4_vrcrotate_acc; break;
03633 
03634   case Hexagon::BI__builtin_HEXAGON_S4_vrcrotate:
03635     ID = Intrinsic::hexagon_S4_vrcrotate; break;
03636 
03637   case Hexagon::BI__builtin_HEXAGON_S2_vcnegh:
03638     ID = Intrinsic::hexagon_S2_vcnegh; break;
03639 
03640   case Hexagon::BI__builtin_HEXAGON_S2_vrcnegh:
03641     ID = Intrinsic::hexagon_S2_vrcnegh; break;
03642 
03643   case Hexagon::BI__builtin_HEXAGON_M4_pmpyw:
03644     ID = Intrinsic::hexagon_M4_pmpyw; break;
03645 
03646   case Hexagon::BI__builtin_HEXAGON_M4_vpmpyh:
03647     ID = Intrinsic::hexagon_M4_vpmpyh; break;
03648 
03649   case Hexagon::BI__builtin_HEXAGON_M4_pmpyw_acc:
03650     ID = Intrinsic::hexagon_M4_pmpyw_acc; break;
03651 
03652   case Hexagon::BI__builtin_HEXAGON_M4_vpmpyh_acc:
03653     ID = Intrinsic::hexagon_M4_vpmpyh_acc; break;
03654 
03655   case Hexagon::BI__builtin_HEXAGON_A2_add:
03656     ID = Intrinsic::hexagon_A2_add; break;
03657 
03658   case Hexagon::BI__builtin_HEXAGON_A2_sub:
03659     ID = Intrinsic::hexagon_A2_sub; break;
03660 
03661   case Hexagon::BI__builtin_HEXAGON_A2_addsat:
03662     ID = Intrinsic::hexagon_A2_addsat; break;
03663 
03664   case Hexagon::BI__builtin_HEXAGON_A2_subsat:
03665     ID = Intrinsic::hexagon_A2_subsat; break;
03666 
03667   case Hexagon::BI__builtin_HEXAGON_A2_addi:
03668     ID = Intrinsic::hexagon_A2_addi; break;
03669 
03670   case Hexagon::BI__builtin_HEXAGON_A2_addh_l16_ll:
03671     ID = Intrinsic::hexagon_A2_addh_l16_ll; break;
03672 
03673   case Hexagon::BI__builtin_HEXAGON_A2_addh_l16_hl:
03674     ID = Intrinsic::hexagon_A2_addh_l16_hl; break;
03675 
03676   case Hexagon::BI__builtin_HEXAGON_A2_addh_l16_sat_ll:
03677     ID = Intrinsic::hexagon_A2_addh_l16_sat_ll; break;
03678 
03679   case Hexagon::BI__builtin_HEXAGON_A2_addh_l16_sat_hl:
03680     ID = Intrinsic::hexagon_A2_addh_l16_sat_hl; break;
03681 
03682   case Hexagon::BI__builtin_HEXAGON_A2_subh_l16_ll:
03683     ID = Intrinsic::hexagon_A2_subh_l16_ll; break;
03684 
03685   case Hexagon::BI__builtin_HEXAGON_A2_subh_l16_hl:
03686     ID = Intrinsic::hexagon_A2_subh_l16_hl; break;
03687 
03688   case Hexagon::BI__builtin_HEXAGON_A2_subh_l16_sat_ll:
03689     ID = Intrinsic::hexagon_A2_subh_l16_sat_ll; break;
03690 
03691   case Hexagon::BI__builtin_HEXAGON_A2_subh_l16_sat_hl:
03692     ID = Intrinsic::hexagon_A2_subh_l16_sat_hl; break;
03693 
03694   case Hexagon::BI__builtin_HEXAGON_A2_addh_h16_ll:
03695     ID = Intrinsic::hexagon_A2_addh_h16_ll; break;
03696 
03697   case Hexagon::BI__builtin_HEXAGON_A2_addh_h16_lh:
03698     ID = Intrinsic::hexagon_A2_addh_h16_lh; break;
03699 
03700   case Hexagon::BI__builtin_HEXAGON_A2_addh_h16_hl:
03701     ID = Intrinsic::hexagon_A2_addh_h16_hl; break;
03702 
03703   case Hexagon::BI__builtin_HEXAGON_A2_addh_h16_hh:
03704     ID = Intrinsic::hexagon_A2_addh_h16_hh; break;
03705 
03706   case Hexagon::BI__builtin_HEXAGON_A2_addh_h16_sat_ll:
03707     ID = Intrinsic::hexagon_A2_addh_h16_sat_ll; break;
03708 
03709   case Hexagon::BI__builtin_HEXAGON_A2_addh_h16_sat_lh:
03710     ID = Intrinsic::hexagon_A2_addh_h16_sat_lh; break;
03711 
03712   case Hexagon::BI__builtin_HEXAGON_A2_addh_h16_sat_hl:
03713     ID = Intrinsic::hexagon_A2_addh_h16_sat_hl; break;
03714 
03715   case Hexagon::BI__builtin_HEXAGON_A2_addh_h16_sat_hh:
03716     ID = Intrinsic::hexagon_A2_addh_h16_sat_hh; break;
03717 
03718   case Hexagon::BI__builtin_HEXAGON_A2_subh_h16_ll:
03719     ID = Intrinsic::hexagon_A2_subh_h16_ll; break;
03720 
03721   case Hexagon::BI__builtin_HEXAGON_A2_subh_h16_lh:
03722     ID = Intrinsic::hexagon_A2_subh_h16_lh; break;
03723 
03724   case Hexagon::BI__builtin_HEXAGON_A2_subh_h16_hl:
03725     ID = Intrinsic::hexagon_A2_subh_h16_hl; break;
03726 
03727   case Hexagon::BI__builtin_HEXAGON_A2_subh_h16_hh:
03728     ID = Intrinsic::hexagon_A2_subh_h16_hh; break;
03729 
03730   case Hexagon::BI__builtin_HEXAGON_A2_subh_h16_sat_ll:
03731     ID = Intrinsic::hexagon_A2_subh_h16_sat_ll; break;
03732 
03733   case Hexagon::BI__builtin_HEXAGON_A2_subh_h16_sat_lh:
03734     ID = Intrinsic::hexagon_A2_subh_h16_sat_lh; break;
03735 
03736   case Hexagon::BI__builtin_HEXAGON_A2_subh_h16_sat_hl:
03737     ID = Intrinsic::hexagon_A2_subh_h16_sat_hl; break;
03738 
03739   case Hexagon::BI__builtin_HEXAGON_A2_subh_h16_sat_hh:
03740     ID = Intrinsic::hexagon_A2_subh_h16_sat_hh; break;
03741 
03742   case Hexagon::BI__builtin_HEXAGON_A2_aslh:
03743     ID = Intrinsic::hexagon_A2_aslh; break;
03744 
03745   case Hexagon::BI__builtin_HEXAGON_A2_asrh:
03746     ID = Intrinsic::hexagon_A2_asrh; break;
03747 
03748   case Hexagon::BI__builtin_HEXAGON_A2_addp:
03749     ID = Intrinsic::hexagon_A2_addp; break;
03750 
03751   case Hexagon::BI__builtin_HEXAGON_A2_addpsat:
03752     ID = Intrinsic::hexagon_A2_addpsat; break;
03753 
03754   case Hexagon::BI__builtin_HEXAGON_A2_addsp:
03755     ID = Intrinsic::hexagon_A2_addsp; break;
03756 
03757   case Hexagon::BI__builtin_HEXAGON_A2_subp:
03758     ID = Intrinsic::hexagon_A2_subp; break;
03759 
03760   case Hexagon::BI__builtin_HEXAGON_A2_neg:
03761     ID = Intrinsic::hexagon_A2_neg; break;
03762 
03763   case Hexagon::BI__builtin_HEXAGON_A2_negsat:
03764     ID = Intrinsic::hexagon_A2_negsat; break;
03765 
03766   case Hexagon::BI__builtin_HEXAGON_A2_abs:
03767     ID = Intrinsic::hexagon_A2_abs; break;
03768 
03769   case Hexagon::BI__builtin_HEXAGON_A2_abssat:
03770     ID = Intrinsic::hexagon_A2_abssat; break;
03771 
03772   case Hexagon::BI__builtin_HEXAGON_A2_vconj:
03773     ID = Intrinsic::hexagon_A2_vconj; break;
03774 
03775   case Hexagon::BI__builtin_HEXAGON_A2_negp:
03776     ID = Intrinsic::hexagon_A2_negp; break;
03777 
03778   case Hexagon::BI__builtin_HEXAGON_A2_absp:
03779     ID = Intrinsic::hexagon_A2_absp; break;
03780 
03781   case Hexagon::BI__builtin_HEXAGON_A2_max:
03782     ID = Intrinsic::hexagon_A2_max; break;
03783 
03784   case Hexagon::BI__builtin_HEXAGON_A2_maxu:
03785     ID = Intrinsic::hexagon_A2_maxu; break;
03786 
03787   case Hexagon::BI__builtin_HEXAGON_A2_min:
03788     ID = Intrinsic::hexagon_A2_min; break;
03789 
03790   case Hexagon::BI__builtin_HEXAGON_A2_minu:
03791     ID = Intrinsic::hexagon_A2_minu; break;
03792 
03793   case Hexagon::BI__builtin_HEXAGON_A2_maxp:
03794     ID = Intrinsic::hexagon_A2_maxp; break;
03795 
03796   case Hexagon::BI__builtin_HEXAGON_A2_maxup:
03797     ID = Intrinsic::hexagon_A2_maxup; break;
03798 
03799   case Hexagon::BI__builtin_HEXAGON_A2_minp:
03800     ID = Intrinsic::hexagon_A2_minp; break;
03801 
03802   case Hexagon::BI__builtin_HEXAGON_A2_minup:
03803     ID = Intrinsic::hexagon_A2_minup; break;
03804 
03805   case Hexagon::BI__builtin_HEXAGON_A2_tfr:
03806     ID = Intrinsic::hexagon_A2_tfr; break;
03807 
03808   case Hexagon::BI__builtin_HEXAGON_A2_tfrsi:
03809     ID = Intrinsic::hexagon_A2_tfrsi; break;
03810 
03811   case Hexagon::BI__builtin_HEXAGON_A2_tfrp:
03812     ID = Intrinsic::hexagon_A2_tfrp; break;
03813 
03814   case Hexagon::BI__builtin_HEXAGON_A2_tfrpi:
03815     ID = Intrinsic::hexagon_A2_tfrpi; break;
03816 
03817   case Hexagon::BI__builtin_HEXAGON_A2_zxtb:
03818     ID = Intrinsic::hexagon_A2_zxtb; break;
03819 
03820   case Hexagon::BI__builtin_HEXAGON_A2_sxtb:
03821     ID = Intrinsic::hexagon_A2_sxtb; break;
03822 
03823   case Hexagon::BI__builtin_HEXAGON_A2_zxth:
03824     ID = Intrinsic::hexagon_A2_zxth; break;
03825 
03826   case Hexagon::BI__builtin_HEXAGON_A2_sxth:
03827     ID = Intrinsic::hexagon_A2_sxth; break;
03828 
03829   case Hexagon::BI__builtin_HEXAGON_A2_combinew:
03830     ID = Intrinsic::hexagon_A2_combinew; break;
03831 
03832   case Hexagon::BI__builtin_HEXAGON_A4_combineri:
03833     ID = Intrinsic::hexagon_A4_combineri; break;
03834 
03835   case Hexagon::BI__builtin_HEXAGON_A4_combineir:
03836     ID = Intrinsic::hexagon_A4_combineir; break;
03837 
03838   case Hexagon::BI__builtin_HEXAGON_A2_combineii:
03839     ID = Intrinsic::hexagon_A2_combineii; break;
03840 
03841   case Hexagon::BI__builtin_HEXAGON_A2_combine_hh:
03842     ID = Intrinsic::hexagon_A2_combine_hh; break;
03843 
03844   case Hexagon::BI__builtin_HEXAGON_A2_combine_hl:
03845     ID = Intrinsic::hexagon_A2_combine_hl; break;
03846 
03847   case Hexagon::BI__builtin_HEXAGON_A2_combine_lh:
03848     ID = Intrinsic::hexagon_A2_combine_lh; break;
03849 
03850   case Hexagon::BI__builtin_HEXAGON_A2_combine_ll:
03851     ID = Intrinsic::hexagon_A2_combine_ll; break;
03852 
03853   case Hexagon::BI__builtin_HEXAGON_A2_tfril:
03854     ID = Intrinsic::hexagon_A2_tfril; break;
03855 
03856   case Hexagon::BI__builtin_HEXAGON_A2_tfrih:
03857     ID = Intrinsic::hexagon_A2_tfrih; break;
03858 
03859   case Hexagon::BI__builtin_HEXAGON_A2_and:
03860     ID = Intrinsic::hexagon_A2_and; break;
03861 
03862   case Hexagon::BI__builtin_HEXAGON_A2_or:
03863     ID = Intrinsic::hexagon_A2_or; break;
03864 
03865   case Hexagon::BI__builtin_HEXAGON_A2_xor:
03866     ID = Intrinsic::hexagon_A2_xor; break;
03867 
03868   case Hexagon::BI__builtin_HEXAGON_A2_not:
03869     ID = Intrinsic::hexagon_A2_not; break;
03870 
03871   case Hexagon::BI__builtin_HEXAGON_M2_xor_xacc:
03872     ID = Intrinsic::hexagon_M2_xor_xacc; break;
03873 
03874   case Hexagon::BI__builtin_HEXAGON_M4_xor_xacc:
03875     ID = Intrinsic::hexagon_M4_xor_xacc; break;
03876 
03877   case Hexagon::BI__builtin_HEXAGON_A4_andn:
03878     ID = Intrinsic::hexagon_A4_andn; break;
03879 
03880   case Hexagon::BI__builtin_HEXAGON_A4_orn:
03881     ID = Intrinsic::hexagon_A4_orn; break;
03882 
03883   case Hexagon::BI__builtin_HEXAGON_A4_andnp:
03884     ID = Intrinsic::hexagon_A4_andnp; break;
03885 
03886   case Hexagon::BI__builtin_HEXAGON_A4_ornp:
03887     ID = Intrinsic::hexagon_A4_ornp; break;
03888 
03889   case Hexagon::BI__builtin_HEXAGON_S4_addaddi:
03890     ID = Intrinsic::hexagon_S4_addaddi; break;
03891 
03892   case Hexagon::BI__builtin_HEXAGON_S4_subaddi:
03893     ID = Intrinsic::hexagon_S4_subaddi; break;
03894 
03895   case Hexagon::BI__builtin_HEXAGON_M4_and_and:
03896     ID = Intrinsic::hexagon_M4_and_and; break;
03897 
03898   case Hexagon::BI__builtin_HEXAGON_M4_and_andn:
03899     ID = Intrinsic::hexagon_M4_and_andn; break;
03900 
03901   case Hexagon::BI__builtin_HEXAGON_M4_and_or:
03902     ID = Intrinsic::hexagon_M4_and_or; break;
03903 
03904   case Hexagon::BI__builtin_HEXAGON_M4_and_xor:
03905     ID = Intrinsic::hexagon_M4_and_xor; break;
03906 
03907   case Hexagon::BI__builtin_HEXAGON_M4_or_and:
03908     ID = Intrinsic::hexagon_M4_or_and; break;
03909 
03910   case Hexagon::BI__builtin_HEXAGON_M4_or_andn:
03911     ID = Intrinsic::hexagon_M4_or_andn; break;
03912 
03913   case Hexagon::BI__builtin_HEXAGON_M4_or_or:
03914     ID = Intrinsic::hexagon_M4_or_or; break;
03915 
03916   case Hexagon::BI__builtin_HEXAGON_M4_or_xor:
03917     ID = Intrinsic::hexagon_M4_or_xor; break;
03918 
03919   case Hexagon::BI__builtin_HEXAGON_S4_or_andix:
03920     ID = Intrinsic::hexagon_S4_or_andix; break;
03921 
03922   case Hexagon::BI__builtin_HEXAGON_S4_or_andi:
03923     ID = Intrinsic::hexagon_S4_or_andi; break;
03924 
03925   case Hexagon::BI__builtin_HEXAGON_S4_or_ori:
03926     ID = Intrinsic::hexagon_S4_or_ori; break;
03927 
03928   case Hexagon::BI__builtin_HEXAGON_M4_xor_and:
03929     ID = Intrinsic::hexagon_M4_xor_and; break;
03930 
03931   case Hexagon::BI__builtin_HEXAGON_M4_xor_or:
03932     ID = Intrinsic::hexagon_M4_xor_or; break;
03933 
03934   case Hexagon::BI__builtin_HEXAGON_M4_xor_andn:
03935     ID = Intrinsic::hexagon_M4_xor_andn; break;
03936 
03937   case Hexagon::BI__builtin_HEXAGON_A2_subri:
03938     ID = Intrinsic::hexagon_A2_subri; break;
03939 
03940   case Hexagon::BI__builtin_HEXAGON_A2_andir:
03941     ID = Intrinsic::hexagon_A2_andir; break;
03942 
03943   case Hexagon::BI__builtin_HEXAGON_A2_orir:
03944     ID = Intrinsic::hexagon_A2_orir; break;
03945 
03946   case Hexagon::BI__builtin_HEXAGON_A2_andp:
03947     ID = Intrinsic::hexagon_A2_andp; break;
03948 
03949   case Hexagon::BI__builtin_HEXAGON_A2_orp:
03950     ID = Intrinsic::hexagon_A2_orp; break;
03951 
03952   case Hexagon::BI__builtin_HEXAGON_A2_xorp:
03953     ID = Intrinsic::hexagon_A2_xorp; break;
03954 
03955   case Hexagon::BI__builtin_HEXAGON_A2_notp:
03956     ID = Intrinsic::hexagon_A2_notp; break;
03957 
03958   case Hexagon::BI__builtin_HEXAGON_A2_sxtw:
03959     ID = Intrinsic::hexagon_A2_sxtw; break;
03960 
03961   case Hexagon::BI__builtin_HEXAGON_A2_sat:
03962     ID = Intrinsic::hexagon_A2_sat; break;
03963 
03964   case Hexagon::BI__builtin_HEXAGON_A2_roundsat:
03965     ID = Intrinsic::hexagon_A2_roundsat; break;
03966 
03967   case Hexagon::BI__builtin_HEXAGON_A2_sath:
03968     ID = Intrinsic::hexagon_A2_sath; break;
03969 
03970   case Hexagon::BI__builtin_HEXAGON_A2_satuh:
03971     ID = Intrinsic::hexagon_A2_satuh; break;
03972 
03973   case Hexagon::BI__builtin_HEXAGON_A2_satub:
03974     ID = Intrinsic::hexagon_A2_satub; break;
03975 
03976   case Hexagon::BI__builtin_HEXAGON_A2_satb:
03977     ID = Intrinsic::hexagon_A2_satb; break;
03978 
03979   case Hexagon::BI__builtin_HEXAGON_A2_vaddub:
03980     ID = Intrinsic::hexagon_A2_vaddub; break;
03981 
03982   case Hexagon::BI__builtin_HEXAGON_A2_vaddb_map:
03983     ID = Intrinsic::hexagon_A2_vaddb_map; break;
03984 
03985   case Hexagon::BI__builtin_HEXAGON_A2_vaddubs:
03986     ID = Intrinsic::hexagon_A2_vaddubs; break;
03987 
03988   case Hexagon::BI__builtin_HEXAGON_A2_vaddh:
03989     ID = Intrinsic::hexagon_A2_vaddh; break;
03990 
03991   case Hexagon::BI__builtin_HEXAGON_A2_vaddhs:
03992     ID = Intrinsic::hexagon_A2_vaddhs; break;
03993 
03994   case Hexagon::BI__builtin_HEXAGON_A2_vadduhs:
03995     ID = Intrinsic::hexagon_A2_vadduhs; break;
03996 
03997   case Hexagon::BI__builtin_HEXAGON_A5_vaddhubs:
03998     ID = Intrinsic::hexagon_A5_vaddhubs; break;
03999 
04000   case Hexagon::BI__builtin_HEXAGON_A2_vaddw:
04001     ID = Intrinsic::hexagon_A2_vaddw; break;
04002 
04003   case Hexagon::BI__builtin_HEXAGON_A2_vaddws:
04004     ID = Intrinsic::hexagon_A2_vaddws; break;
04005 
04006   case Hexagon::BI__builtin_HEXAGON_S4_vxaddsubw:
04007     ID = Intrinsic::hexagon_S4_vxaddsubw; break;
04008 
04009   case Hexagon::BI__builtin_HEXAGON_S4_vxsubaddw:
04010     ID = Intrinsic::hexagon_S4_vxsubaddw; break;
04011 
04012   case Hexagon::BI__builtin_HEXAGON_S4_vxaddsubh:
04013     ID = Intrinsic::hexagon_S4_vxaddsubh; break;
04014 
04015   case Hexagon::BI__builtin_HEXAGON_S4_vxsubaddh:
04016     ID = Intrinsic::hexagon_S4_vxsubaddh; break;
04017 
04018   case Hexagon::BI__builtin_HEXAGON_S4_vxaddsubhr:
04019     ID = Intrinsic::hexagon_S4_vxaddsubhr; break;
04020 
04021   case Hexagon::BI__builtin_HEXAGON_S4_vxsubaddhr:
04022     ID = Intrinsic::hexagon_S4_vxsubaddhr; break;
04023 
04024   case Hexagon::BI__builtin_HEXAGON_A2_svavgh:
04025     ID = Intrinsic::hexagon_A2_svavgh; break;
04026 
04027   case Hexagon::BI__builtin_HEXAGON_A2_svavghs:
04028     ID = Intrinsic::hexagon_A2_svavghs; break;
04029 
04030   case Hexagon::BI__builtin_HEXAGON_A2_svnavgh:
04031     ID = Intrinsic::hexagon_A2_svnavgh; break;
04032 
04033   case Hexagon::BI__builtin_HEXAGON_A2_svaddh:
04034     ID = Intrinsic::hexagon_A2_svaddh; break;
04035 
04036   case Hexagon::BI__builtin_HEXAGON_A2_svaddhs:
04037     ID = Intrinsic::hexagon_A2_svaddhs; break;
04038 
04039   case Hexagon::BI__builtin_HEXAGON_A2_svadduhs:
04040     ID = Intrinsic::hexagon_A2_svadduhs; break;
04041 
04042   case Hexagon::BI__builtin_HEXAGON_A2_svsubh:
04043     ID = Intrinsic::hexagon_A2_svsubh; break;
04044 
04045   case Hexagon::BI__builtin_HEXAGON_A2_svsubhs:
04046     ID = Intrinsic::hexagon_A2_svsubhs; break;
04047 
04048   case Hexagon::BI__builtin_HEXAGON_A2_svsubuhs:
04049     ID = Intrinsic::hexagon_A2_svsubuhs; break;
04050 
04051   case Hexagon::BI__builtin_HEXAGON_A2_vraddub:
04052     ID = Intrinsic::hexagon_A2_vraddub; break;
04053 
04054   case Hexagon::BI__builtin_HEXAGON_A2_vraddub_acc:
04055     ID = Intrinsic::hexagon_A2_vraddub_acc; break;
04056 
04057   case Hexagon::BI__builtin_HEXAGON_M2_vraddh:
04058     ID = Intrinsic::hexagon_M2_vraddh; break;
04059 
04060   case Hexagon::BI__builtin_HEXAGON_M2_vradduh:
04061     ID = Intrinsic::hexagon_M2_vradduh; break;
04062 
04063   case Hexagon::BI__builtin_HEXAGON_A2_vsubub:
04064     ID = Intrinsic::hexagon_A2_vsubub; break;
04065 
04066   case Hexagon::BI__builtin_HEXAGON_A2_vsubb_map:
04067     ID = Intrinsic::hexagon_A2_vsubb_map; break;
04068 
04069   case Hexagon::BI__builtin_HEXAGON_A2_vsububs:
04070     ID = Intrinsic::hexagon_A2_vsububs; break;
04071 
04072   case Hexagon::BI__builtin_HEXAGON_A2_vsubh:
04073     ID = Intrinsic::hexagon_A2_vsubh; break;
04074 
04075   case Hexagon::BI__builtin_HEXAGON_A2_vsubhs:
04076     ID = Intrinsic::hexagon_A2_vsubhs; break;
04077 
04078   case Hexagon::BI__builtin_HEXAGON_A2_vsubuhs:
04079     ID = Intrinsic::hexagon_A2_vsubuhs; break;
04080 
04081   case Hexagon::BI__builtin_HEXAGON_A2_vsubw:
04082     ID = Intrinsic::hexagon_A2_vsubw; break;
04083 
04084   case Hexagon::BI__builtin_HEXAGON_A2_vsubws:
04085     ID = Intrinsic::hexagon_A2_vsubws; break;
04086 
04087   case Hexagon::BI__builtin_HEXAGON_A2_vabsh:
04088     ID = Intrinsic::hexagon_A2_vabsh; break;
04089 
04090   case Hexagon::BI__builtin_HEXAGON_A2_vabshsat:
04091     ID = Intrinsic::hexagon_A2_vabshsat; break;
04092 
04093   case Hexagon::BI__builtin_HEXAGON_A2_vabsw:
04094     ID = Intrinsic::hexagon_A2_vabsw; break;
04095 
04096   case Hexagon::BI__builtin_HEXAGON_A2_vabswsat:
04097     ID = Intrinsic::hexagon_A2_vabswsat; break;
04098 
04099   case Hexagon::BI__builtin_HEXAGON_M2_vabsdiffw:
04100     ID = Intrinsic::hexagon_M2_vabsdiffw; break;
04101 
04102   case Hexagon::BI__builtin_HEXAGON_M2_vabsdiffh:
04103     ID = Intrinsic::hexagon_M2_vabsdiffh; break;
04104 
04105   case Hexagon::BI__builtin_HEXAGON_A2_vrsadub:
04106     ID = Intrinsic::hexagon_A2_vrsadub; break;
04107 
04108   case Hexagon::BI__builtin_HEXAGON_A2_vrsadub_acc:
04109     ID = Intrinsic::hexagon_A2_vrsadub_acc; break;
04110 
04111   case Hexagon::BI__builtin_HEXAGON_A2_vavgub:
04112     ID = Intrinsic::hexagon_A2_vavgub; break;
04113 
04114   case Hexagon::BI__builtin_HEXAGON_A2_vavguh:
04115     ID = Intrinsic::hexagon_A2_vavguh; break;
04116 
04117   case Hexagon::BI__builtin_HEXAGON_A2_vavgh:
04118     ID = Intrinsic::hexagon_A2_vavgh; break;
04119 
04120   case Hexagon::BI__builtin_HEXAGON_A2_vnavgh:
04121     ID = Intrinsic::hexagon_A2_vnavgh; break;
04122 
04123   case Hexagon::BI__builtin_HEXAGON_A2_vavgw:
04124     ID = Intrinsic::hexagon_A2_vavgw; break;
04125 
04126   case Hexagon::BI__builtin_HEXAGON_A2_vnavgw:
04127     ID = Intrinsic::hexagon_A2_vnavgw; break;
04128 
04129   case Hexagon::BI__builtin_HEXAGON_A2_vavgwr:
04130     ID = Intrinsic::hexagon_A2_vavgwr; break;
04131 
04132   case Hexagon::BI__builtin_HEXAGON_A2_vnavgwr:
04133     ID = Intrinsic::hexagon_A2_vnavgwr; break;
04134 
04135   case Hexagon::BI__builtin_HEXAGON_A2_vavgwcr:
04136     ID = Intrinsic::hexagon_A2_vavgwcr; break;
04137 
04138   case Hexagon::BI__builtin_HEXAGON_A2_vnavgwcr:
04139     ID = Intrinsic::hexagon_A2_vnavgwcr; break;
04140 
04141   case Hexagon::BI__builtin_HEXAGON_A2_vavghcr:
04142     ID = Intrinsic::hexagon_A2_vavghcr; break;
04143 
04144   case Hexagon::BI__builtin_HEXAGON_A2_vnavghcr:
04145     ID = Intrinsic::hexagon_A2_vnavghcr; break;
04146 
04147   case Hexagon::BI__builtin_HEXAGON_A2_vavguw:
04148     ID = Intrinsic::hexagon_A2_vavguw; break;
04149 
04150   case Hexagon::BI__builtin_HEXAGON_A2_vavguwr:
04151     ID = Intrinsic::hexagon_A2_vavguwr; break;
04152 
04153   case Hexagon::BI__builtin_HEXAGON_A2_vavgubr:
04154     ID = Intrinsic::hexagon_A2_vavgubr; break;
04155 
04156   case Hexagon::BI__builtin_HEXAGON_A2_vavguhr:
04157     ID = Intrinsic::hexagon_A2_vavguhr; break;
04158 
04159   case Hexagon::BI__builtin_HEXAGON_A2_vavghr:
04160     ID = Intrinsic::hexagon_A2_vavghr; break;
04161 
04162   case Hexagon::BI__builtin_HEXAGON_A2_vnavghr:
04163     ID = Intrinsic::hexagon_A2_vnavghr; break;
04164 
04165   case Hexagon::BI__builtin_HEXAGON_A4_round_ri:
04166     ID = Intrinsic::hexagon_A4_round_ri; break;
04167 
04168   case Hexagon::BI__builtin_HEXAGON_A4_round_rr:
04169     ID = Intrinsic::hexagon_A4_round_rr; break;
04170 
04171   case Hexagon::BI__builtin_HEXAGON_A4_round_ri_sat:
04172     ID = Intrinsic::hexagon_A4_round_ri_sat; break;
04173 
04174   case Hexagon::BI__builtin_HEXAGON_A4_round_rr_sat:
04175     ID = Intrinsic::hexagon_A4_round_rr_sat; break;
04176 
04177   case Hexagon::BI__builtin_HEXAGON_A4_cround_ri:
04178     ID = Intrinsic::hexagon_A4_cround_ri; break;
04179 
04180   case Hexagon::BI__builtin_HEXAGON_A4_cround_rr:
04181     ID = Intrinsic::hexagon_A4_cround_rr; break;
04182 
04183   case Hexagon::BI__builtin_HEXAGON_A4_vrminh:
04184     ID = Intrinsic::hexagon_A4_vrminh; break;
04185 
04186   case Hexagon::BI__builtin_HEXAGON_A4_vrmaxh:
04187     ID = Intrinsic::hexagon_A4_vrmaxh; break;
04188 
04189   case Hexagon::BI__builtin_HEXAGON_A4_vrminuh:
04190     ID = Intrinsic::hexagon_A4_vrminuh; break;
04191 
04192   case Hexagon::BI__builtin_HEXAGON_A4_vrmaxuh:
04193     ID = Intrinsic::hexagon_A4_vrmaxuh; break;
04194 
04195   case Hexagon::BI__builtin_HEXAGON_A4_vrminw:
04196     ID = Intrinsic::hexagon_A4_vrminw; break;
04197 
04198   case Hexagon::BI__builtin_HEXAGON_A4_vrmaxw:
04199     ID = Intrinsic::hexagon_A4_vrmaxw; break;
04200 
04201   case Hexagon::BI__builtin_HEXAGON_A4_vrminuw:
04202     ID = Intrinsic::hexagon_A4_vrminuw; break;
04203 
04204   case Hexagon::BI__builtin_HEXAGON_A4_vrmaxuw:
04205     ID = Intrinsic::hexagon_A4_vrmaxuw; break;
04206 
04207   case Hexagon::BI__builtin_HEXAGON_A2_vminb:
04208     ID = Intrinsic::hexagon_A2_vminb; break;
04209 
04210   case Hexagon::BI__builtin_HEXAGON_A2_vmaxb:
04211     ID = Intrinsic::hexagon_A2_vmaxb; break;
04212 
04213   case Hexagon::BI__builtin_HEXAGON_A2_vminub:
04214     ID = Intrinsic::hexagon_A2_vminub; break;
04215 
04216   case Hexagon::BI__builtin_HEXAGON_A2_vmaxub:
04217     ID = Intrinsic::hexagon_A2_vmaxub; break;
04218 
04219   case Hexagon::BI__builtin_HEXAGON_A2_vminh:
04220     ID = Intrinsic::hexagon_A2_vminh; break;
04221 
04222   case Hexagon::BI__builtin_HEXAGON_A2_vmaxh:
04223     ID = Intrinsic::hexagon_A2_vmaxh; break;
04224 
04225   case Hexagon::BI__builtin_HEXAGON_A2_vminuh:
04226     ID = Intrinsic::hexagon_A2_vminuh; break;
04227 
04228   case Hexagon::BI__builtin_HEXAGON_A2_vmaxuh:
04229     ID = Intrinsic::hexagon_A2_vmaxuh; break;
04230 
04231   case Hexagon::BI__builtin_HEXAGON_A2_vminw:
04232     ID = Intrinsic::hexagon_A2_vminw; break;
04233 
04234   case Hexagon::BI__builtin_HEXAGON_A2_vmaxw:
04235     ID = Intrinsic::hexagon_A2_vmaxw; break;
04236 
04237   case Hexagon::BI__builtin_HEXAGON_A2_vminuw:
04238     ID = Intrinsic::hexagon_A2_vminuw; break;
04239 
04240   case Hexagon::BI__builtin_HEXAGON_A2_vmaxuw:
04241     ID = Intrinsic::hexagon_A2_vmaxuw; break;
04242 
04243   case Hexagon::BI__builtin_HEXAGON_A4_modwrapu:
04244     ID = Intrinsic::hexagon_A4_modwrapu; break;
04245 
04246   case Hexagon::BI__builtin_HEXAGON_F2_sfadd:
04247     ID = Intrinsic::hexagon_F2_sfadd; break;
04248 
04249   case Hexagon::BI__builtin_HEXAGON_F2_sfsub:
04250     ID = Intrinsic::hexagon_F2_sfsub; break;
04251 
04252   case Hexagon::BI__builtin_HEXAGON_F2_sfmpy:
04253     ID = Intrinsic::hexagon_F2_sfmpy; break;
04254 
04255   case Hexagon::BI__builtin_HEXAGON_F2_sffma:
04256     ID = Intrinsic::hexagon_F2_sffma; break;
04257 
04258   case Hexagon::BI__builtin_HEXAGON_F2_sffma_sc:
04259     ID = Intrinsic::hexagon_F2_sffma_sc; break;
04260 
04261   case Hexagon::BI__builtin_HEXAGON_F2_sffms:
04262     ID = Intrinsic::hexagon_F2_sffms; break;
04263 
04264   case Hexagon::BI__builtin_HEXAGON_F2_sffma_lib:
04265     ID = Intrinsic::hexagon_F2_sffma_lib; break;
04266 
04267   case Hexagon::BI__builtin_HEXAGON_F2_sffms_lib:
04268     ID = Intrinsic::hexagon_F2_sffms_lib; break;
04269 
04270   case Hexagon::BI__builtin_HEXAGON_F2_sfcmpeq:
04271     ID = Intrinsic::hexagon_F2_sfcmpeq; break;
04272 
04273   case Hexagon::BI__builtin_HEXAGON_F2_sfcmpgt:
04274     ID = Intrinsic::hexagon_F2_sfcmpgt; break;
04275 
04276   case Hexagon::BI__builtin_HEXAGON_F2_sfcmpge:
04277     ID = Intrinsic::hexagon_F2_sfcmpge; break;
04278 
04279   case Hexagon::BI__builtin_HEXAGON_F2_sfcmpuo:
04280     ID = Intrinsic::hexagon_F2_sfcmpuo; break;
04281 
04282   case Hexagon::BI__builtin_HEXAGON_F2_sfmax:
04283     ID = Intrinsic::hexagon_F2_sfmax; break;
04284 
04285   case Hexagon::BI__builtin_HEXAGON_F2_sfmin:
04286     ID = Intrinsic::hexagon_F2_sfmin; break;
04287 
04288   case Hexagon::BI__builtin_HEXAGON_F2_sfclass:
04289     ID = Intrinsic::hexagon_F2_sfclass; break;
04290 
04291   case Hexagon::BI__builtin_HEXAGON_F2_sfimm_p:
04292     ID = Intrinsic::hexagon_F2_sfimm_p; break;
04293 
04294   case Hexagon::BI__builtin_HEXAGON_F2_sfimm_n:
04295     ID = Intrinsic::hexagon_F2_sfimm_n; break;
04296 
04297   case Hexagon::BI__builtin_HEXAGON_F2_sffixupn:
04298     ID = Intrinsic::hexagon_F2_sffixupn; break;
04299 
04300   case Hexagon::BI__builtin_HEXAGON_F2_sffixupd:
04301     ID = Intrinsic::hexagon_F2_sffixupd; break;
04302 
04303   case Hexagon::BI__builtin_HEXAGON_F2_sffixupr:
04304     ID = Intrinsic::hexagon_F2_sffixupr; break;
04305 
04306   case Hexagon::BI__builtin_HEXAGON_F2_dfadd:
04307     ID = Intrinsic::hexagon_F2_dfadd; break;
04308 
04309   case Hexagon::BI__builtin_HEXAGON_F2_dfsub:
04310     ID = Intrinsic::hexagon_F2_dfsub; break;
04311 
04312   case Hexagon::BI__builtin_HEXAGON_F2_dfmpy:
04313     ID = Intrinsic::hexagon_F2_dfmpy; break;
04314 
04315   case Hexagon::BI__builtin_HEXAGON_F2_dffma:
04316     ID = Intrinsic::hexagon_F2_dffma; break;
04317 
04318   case Hexagon::BI__builtin_HEXAGON_F2_dffms:
04319     ID = Intrinsic::hexagon_F2_dffms; break;
04320 
04321   case Hexagon::BI__builtin_HEXAGON_F2_dffma_lib:
04322     ID = Intrinsic::hexagon_F2_dffma_lib; break;
04323 
04324   case Hexagon::BI__builtin_HEXAGON_F2_dffms_lib:
04325     ID = Intrinsic::hexagon_F2_dffms_lib; break;
04326 
04327   case Hexagon::BI__builtin_HEXAGON_F2_dffma_sc:
04328     ID = Intrinsic::hexagon_F2_dffma_sc; break;
04329 
04330   case Hexagon::BI__builtin_HEXAGON_F2_dfmax:
04331     ID = Intrinsic::hexagon_F2_dfmax; break;
04332 
04333   case Hexagon::BI__builtin_HEXAGON_F2_dfmin:
04334     ID = Intrinsic::hexagon_F2_dfmin; break;
04335 
04336   case Hexagon::BI__builtin_HEXAGON_F2_dfcmpeq:
04337     ID = Intrinsic::hexagon_F2_dfcmpeq; break;
04338 
04339   case Hexagon::BI__builtin_HEXAGON_F2_dfcmpgt:
04340     ID = Intrinsic::hexagon_F2_dfcmpgt; break;
04341 
04342   case Hexagon::BI__builtin_HEXAGON_F2_dfcmpge:
04343     ID = Intrinsic::hexagon_F2_dfcmpge; break;
04344 
04345   case Hexagon::BI__builtin_HEXAGON_F2_dfcmpuo:
04346     ID = Intrinsic::hexagon_F2_dfcmpuo; break;
04347 
04348   case Hexagon::BI__builtin_HEXAGON_F2_dfclass:
04349     ID = Intrinsic::hexagon_F2_dfclass; break;
04350 
04351   case Hexagon::BI__builtin_HEXAGON_F2_dfimm_p:
04352     ID = Intrinsic::hexagon_F2_dfimm_p; break;
04353 
04354   case Hexagon::BI__builtin_HEXAGON_F2_dfimm_n:
04355     ID = Intrinsic::hexagon_F2_dfimm_n; break;
04356 
04357   case Hexagon::BI__builtin_HEXAGON_F2_dffixupn:
04358     ID = Intrinsic::hexagon_F2_dffixupn; break;
04359 
04360   case Hexagon::BI__builtin_HEXAGON_F2_dffixupd:
04361     ID = Intrinsic::hexagon_F2_dffixupd; break;
04362 
04363   case Hexagon::BI__builtin_HEXAGON_F2_dffixupr:
04364     ID = Intrinsic::hexagon_F2_dffixupr; break;
04365 
04366   case Hexagon::BI__builtin_HEXAGON_F2_conv_sf2df:
04367     ID = Intrinsic::hexagon_F2_conv_sf2df; break;
04368 
04369   case Hexagon::BI__builtin_HEXAGON_F2_conv_df2sf:
04370     ID = Intrinsic::hexagon_F2_conv_df2sf; break;
04371 
04372   case Hexagon::BI__builtin_HEXAGON_F2_conv_uw2sf:
04373     ID = Intrinsic::hexagon_F2_conv_uw2sf; break;
04374 
04375   case Hexagon::BI__builtin_HEXAGON_F2_conv_uw2df:
04376     ID = Intrinsic::hexagon_F2_conv_uw2df; break;
04377 
04378   case Hexagon::BI__builtin_HEXAGON_F2_conv_w2sf:
04379     ID = Intrinsic::hexagon_F2_conv_w2sf; break;
04380 
04381   case Hexagon::BI__builtin_HEXAGON_F2_conv_w2df:
04382     ID = Intrinsic::hexagon_F2_conv_w2df; break;
04383 
04384   case Hexagon::BI__builtin_HEXAGON_F2_conv_ud2sf:
04385     ID = Intrinsic::hexagon_F2_conv_ud2sf; break;
04386 
04387   case Hexagon::BI__builtin_HEXAGON_F2_conv_ud2df:
04388     ID = Intrinsic::hexagon_F2_conv_ud2df; break;
04389 
04390   case Hexagon::BI__builtin_HEXAGON_F2_conv_d2sf:
04391     ID = Intrinsic::hexagon_F2_conv_d2sf; break;
04392 
04393   case Hexagon::BI__builtin_HEXAGON_F2_conv_d2df:
04394     ID = Intrinsic::hexagon_F2_conv_d2df; break;
04395 
04396   case Hexagon::BI__builtin_HEXAGON_F2_conv_sf2uw:
04397     ID = Intrinsic::hexagon_F2_conv_sf2uw; break;
04398 
04399   case Hexagon::BI__builtin_HEXAGON_F2_conv_sf2w:
04400     ID = Intrinsic::hexagon_F2_conv_sf2w; break;
04401 
04402   case Hexagon::BI__builtin_HEXAGON_F2_conv_sf2ud:
04403     ID = Intrinsic::hexagon_F2_conv_sf2ud; break;
04404 
04405   case Hexagon::BI__builtin_HEXAGON_F2_conv_sf2d:
04406     ID = Intrinsic::hexagon_F2_conv_sf2d; break;
04407 
04408   case Hexagon::BI__builtin_HEXAGON_F2_conv_df2uw:
04409     ID = Intrinsic::hexagon_F2_conv_df2uw; break;
04410 
04411   case Hexagon::BI__builtin_HEXAGON_F2_conv_df2w:
04412     ID = Intrinsic::hexagon_F2_conv_df2w; break;
04413 
04414   case Hexagon::BI__builtin_HEXAGON_F2_conv_df2ud:
04415     ID = Intrinsic::hexagon_F2_conv_df2ud; break;
04416 
04417   case Hexagon::BI__builtin_HEXAGON_F2_conv_df2d:
04418     ID = Intrinsic::hexagon_F2_conv_df2d; break;
04419 
04420   case Hexagon::BI__builtin_HEXAGON_F2_conv_sf2uw_chop:
04421     ID = Intrinsic::hexagon_F2_conv_sf2uw_chop; break;
04422 
04423   case Hexagon::BI__builtin_HEXAGON_F2_conv_sf2w_chop:
04424     ID = Intrinsic::hexagon_F2_conv_sf2w_chop; break;
04425 
04426   case Hexagon::BI__builtin_HEXAGON_F2_conv_sf2ud_chop:
04427     ID = Intrinsic::hexagon_F2_conv_sf2ud_chop; break;
04428 
04429   case Hexagon::BI__builtin_HEXAGON_F2_conv_sf2d_chop:
04430     ID = Intrinsic::hexagon_F2_conv_sf2d_chop; break;
04431 
04432   case Hexagon::BI__builtin_HEXAGON_F2_conv_df2uw_chop:
04433     ID = Intrinsic::hexagon_F2_conv_df2uw_chop; break;
04434 
04435   case Hexagon::BI__builtin_HEXAGON_F2_conv_df2w_chop:
04436     ID = Intrinsic::hexagon_F2_conv_df2w_chop; break;
04437 
04438   case Hexagon::BI__builtin_HEXAGON_F2_conv_df2ud_chop:
04439     ID = Intrinsic::hexagon_F2_conv_df2ud_chop; break;
04440 
04441   case Hexagon::BI__builtin_HEXAGON_F2_conv_df2d_chop:
04442     ID = Intrinsic::hexagon_F2_conv_df2d_chop; break;
04443 
04444   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_r:
04445     ID = Intrinsic::hexagon_S2_asr_r_r; break;
04446 
04447   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_r:
04448     ID = Intrinsic::hexagon_S2_asl_r_r; break;
04449 
04450   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_r:
04451     ID = Intrinsic::hexagon_S2_lsr_r_r; break;
04452 
04453   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_r:
04454     ID = Intrinsic::hexagon_S2_lsl_r_r; break;
04455 
04456   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_p:
04457     ID = Intrinsic::hexagon_S2_asr_r_p; break;
04458 
04459   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_p:
04460     ID = Intrinsic::hexagon_S2_asl_r_p; break;
04461 
04462   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_p:
04463     ID = Intrinsic::hexagon_S2_lsr_r_p; break;
04464 
04465   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_p:
04466     ID = Intrinsic::hexagon_S2_lsl_r_p; break;
04467 
04468   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_r_acc:
04469     ID = Intrinsic::hexagon_S2_asr_r_r_acc; break;
04470 
04471   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_r_acc:
04472     ID = Intrinsic::hexagon_S2_asl_r_r_acc; break;
04473 
04474   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_r_acc:
04475     ID = Intrinsic::hexagon_S2_lsr_r_r_acc; break;
04476 
04477   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_r_acc:
04478     ID = Intrinsic::hexagon_S2_lsl_r_r_acc; break;
04479 
04480   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_p_acc:
04481     ID = Intrinsic::hexagon_S2_asr_r_p_acc; break;
04482 
04483   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_p_acc:
04484     ID = Intrinsic::hexagon_S2_asl_r_p_acc; break;
04485 
04486   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_p_acc:
04487     ID = Intrinsic::hexagon_S2_lsr_r_p_acc; break;
04488 
04489   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_p_acc:
04490     ID = Intrinsic::hexagon_S2_lsl_r_p_acc; break;
04491 
04492   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_r_nac:
04493     ID = Intrinsic::hexagon_S2_asr_r_r_nac; break;
04494 
04495   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_r_nac:
04496     ID = Intrinsic::hexagon_S2_asl_r_r_nac; break;
04497 
04498   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_r_nac:
04499     ID = Intrinsic::hexagon_S2_lsr_r_r_nac; break;
04500 
04501   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_r_nac:
04502     ID = Intrinsic::hexagon_S2_lsl_r_r_nac; break;
04503 
04504   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_p_nac:
04505     ID = Intrinsic::hexagon_S2_asr_r_p_nac; break;
04506 
04507   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_p_nac:
04508     ID = Intrinsic::hexagon_S2_asl_r_p_nac; break;
04509 
04510   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_p_nac:
04511     ID = Intrinsic::hexagon_S2_lsr_r_p_nac; break;
04512 
04513   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_p_nac:
04514     ID = Intrinsic::hexagon_S2_lsl_r_p_nac; break;
04515 
04516   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_r_and:
04517     ID = Intrinsic::hexagon_S2_asr_r_r_and; break;
04518 
04519   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_r_and:
04520     ID = Intrinsic::hexagon_S2_asl_r_r_and; break;
04521 
04522   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_r_and:
04523     ID = Intrinsic::hexagon_S2_lsr_r_r_and; break;
04524 
04525   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_r_and:
04526     ID = Intrinsic::hexagon_S2_lsl_r_r_and; break;
04527 
04528   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_r_or:
04529     ID = Intrinsic::hexagon_S2_asr_r_r_or; break;
04530 
04531   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_r_or:
04532     ID = Intrinsic::hexagon_S2_asl_r_r_or; break;
04533 
04534   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_r_or:
04535     ID = Intrinsic::hexagon_S2_lsr_r_r_or; break;
04536 
04537   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_r_or:
04538     ID = Intrinsic::hexagon_S2_lsl_r_r_or; break;
04539 
04540   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_p_and:
04541     ID = Intrinsic::hexagon_S2_asr_r_p_and; break;
04542 
04543   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_p_and:
04544     ID = Intrinsic::hexagon_S2_asl_r_p_and; break;
04545 
04546   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_p_and:
04547     ID = Intrinsic::hexagon_S2_lsr_r_p_and; break;
04548 
04549   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_p_and:
04550     ID = Intrinsic::hexagon_S2_lsl_r_p_and; break;
04551 
04552   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_p_or:
04553     ID = Intrinsic::hexagon_S2_asr_r_p_or; break;
04554 
04555   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_p_or:
04556     ID = Intrinsic::hexagon_S2_asl_r_p_or; break;
04557 
04558   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_p_or:
04559     ID = Intrinsic::hexagon_S2_lsr_r_p_or; break;
04560 
04561   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_p_or:
04562     ID = Intrinsic::hexagon_S2_lsl_r_p_or; break;
04563 
04564   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_p_xor:
04565     ID = Intrinsic::hexagon_S2_asr_r_p_xor; break;
04566 
04567   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_p_xor:
04568     ID = Intrinsic::hexagon_S2_asl_r_p_xor; break;
04569 
04570   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_p_xor:
04571     ID = Intrinsic::hexagon_S2_lsr_r_p_xor; break;
04572 
04573   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_p_xor:
04574     ID = Intrinsic::hexagon_S2_lsl_r_p_xor; break;
04575 
04576   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_r_sat:
04577     ID = Intrinsic::hexagon_S2_asr_r_r_sat; break;
04578 
04579   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_r_sat:
04580     ID = Intrinsic::hexagon_S2_asl_r_r_sat; break;
04581 
04582   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_r:
04583     ID = Intrinsic::hexagon_S2_asr_i_r; break;
04584 
04585   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r:
04586     ID = Intrinsic::hexagon_S2_lsr_i_r; break;
04587 
04588   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_r:
04589     ID = Intrinsic::hexagon_S2_asl_i_r; break;
04590 
04591   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_p:
04592     ID = Intrinsic::hexagon_S2_asr_i_p; break;
04593 
04594   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p:
04595     ID = Intrinsic::hexagon_S2_lsr_i_p; break;
04596 
04597   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_p:
04598     ID = Intrinsic::hexagon_S2_asl_i_p; break;
04599 
04600   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_acc:
04601     ID = Intrinsic::hexagon_S2_asr_i_r_acc; break;
04602 
04603   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_acc:
04604     ID = Intrinsic::hexagon_S2_lsr_i_r_acc; break;
04605 
04606   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_acc:
04607     ID = Intrinsic::hexagon_S2_asl_i_r_acc; break;
04608 
04609   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_acc:
04610     ID = Intrinsic::hexagon_S2_asr_i_p_acc; break;
04611 
04612   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_acc:
04613     ID = Intrinsic::hexagon_S2_lsr_i_p_acc; break;
04614 
04615   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_acc:
04616     ID = Intrinsic::hexagon_S2_asl_i_p_acc; break;
04617 
04618   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_nac:
04619     ID = Intrinsic::hexagon_S2_asr_i_r_nac; break;
04620 
04621   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_nac:
04622     ID = Intrinsic::hexagon_S2_lsr_i_r_nac; break;
04623 
04624   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_nac:
04625     ID = Intrinsic::hexagon_S2_asl_i_r_nac; break;
04626 
04627   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_nac:
04628     ID = Intrinsic::hexagon_S2_asr_i_p_nac; break;
04629 
04630   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_nac:
04631     ID = Intrinsic::hexagon_S2_lsr_i_p_nac; break;
04632 
04633   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_nac:
04634     ID = Intrinsic::hexagon_S2_asl_i_p_nac; break;
04635 
04636   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_xacc:
04637     ID = Intrinsic::hexagon_S2_lsr_i_r_xacc; break;
04638 
04639   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_xacc:
04640     ID = Intrinsic::hexagon_S2_asl_i_r_xacc; break;
04641 
04642   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_xacc:
04643     ID = Intrinsic::hexagon_S2_lsr_i_p_xacc; break;
04644 
04645   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_xacc:
04646     ID = Intrinsic::hexagon_S2_asl_i_p_xacc; break;
04647 
04648   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_and:
04649     ID = Intrinsic::hexagon_S2_asr_i_r_and; break;
04650 
04651   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_and:
04652     ID = Intrinsic::hexagon_S2_lsr_i_r_and; break;
04653 
04654   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_and:
04655     ID = Intrinsic::hexagon_S2_asl_i_r_and; break;
04656 
04657   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_or:
04658     ID = Intrinsic::hexagon_S2_asr_i_r_or; break;
04659 
04660   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_or:
04661     ID = Intrinsic::hexagon_S2_lsr_i_r_or; break;
04662 
04663   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_or:
04664     ID = Intrinsic::hexagon_S2_asl_i_r_or; break;
04665 
04666   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_and:
04667     ID = Intrinsic::hexagon_S2_asr_i_p_and; break;
04668 
04669   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_and:
04670     ID = Intrinsic::hexagon_S2_lsr_i_p_and; break;
04671 
04672   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_and:
04673     ID = Intrinsic::hexagon_S2_asl_i_p_and; break;
04674 
04675   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_or:
04676     ID = Intrinsic::hexagon_S2_asr_i_p_or; break;
04677 
04678   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_or:
04679     ID = Intrinsic::hexagon_S2_lsr_i_p_or; break;
04680 
04681   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_or:
04682     ID = Intrinsic::hexagon_S2_asl_i_p_or; break;
04683 
04684   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_sat:
04685     ID = Intrinsic::hexagon_S2_asl_i_r_sat; break;
04686 
04687   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_rnd:
04688     ID = Intrinsic::hexagon_S2_asr_i_r_rnd; break;
04689 
04690   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_rnd_goodsyntax:
04691     ID = Intrinsic::hexagon_S2_asr_i_r_rnd_goodsyntax; break;
04692 
04693   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_rnd:
04694     ID = Intrinsic::hexagon_S2_asr_i_p_rnd; break;
04695 
04696   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_rnd_goodsyntax:
04697     ID = Intrinsic::hexagon_S2_asr_i_p_rnd_goodsyntax; break;
04698 
04699   case Hexagon::BI__builtin_HEXAGON_S4_lsli:
04700     ID = Intrinsic::hexagon_S4_lsli; break;
04701 
04702   case Hexagon::BI__builtin_HEXAGON_S2_addasl_rrri:
04703     ID = Intrinsic::hexagon_S2_addasl_rrri; break;
04704 
04705   case Hexagon::BI__builtin_HEXAGON_S4_andi_asl_ri:
04706     ID = Intrinsic::hexagon_S4_andi_asl_ri; break;
04707 
04708   case Hexagon::BI__builtin_HEXAGON_S4_ori_asl_ri:
04709     ID = Intrinsic::hexagon_S4_ori_asl_ri; break;
04710 
04711   case Hexagon::BI__builtin_HEXAGON_S4_addi_asl_ri:
04712     ID = Intrinsic::hexagon_S4_addi_asl_ri; break;
04713 
04714   case Hexagon::BI__builtin_HEXAGON_S4_subi_asl_ri:
04715     ID = Intrinsic::hexagon_S4_subi_asl_ri; break;
04716 
04717   case Hexagon::BI__builtin_HEXAGON_S4_andi_lsr_ri:
04718     ID = Intrinsic::hexagon_S4_andi_lsr_ri; break;
04719 
04720   case Hexagon::BI__builtin_HEXAGON_S4_ori_lsr_ri:
04721     ID = Intrinsic::hexagon_S4_ori_lsr_ri; break;
04722 
04723   case Hexagon::BI__builtin_HEXAGON_S4_addi_lsr_ri:
04724     ID = Intrinsic::hexagon_S4_addi_lsr_ri; break;
04725 
04726   case Hexagon::BI__builtin_HEXAGON_S4_subi_lsr_ri:
04727     ID = Intrinsic::hexagon_S4_subi_lsr_ri; break;
04728 
04729   case Hexagon::BI__builtin_HEXAGON_S2_valignib:
04730     ID = Intrinsic::hexagon_S2_valignib; break;
04731 
04732   case Hexagon::BI__builtin_HEXAGON_S2_valignrb:
04733     ID = Intrinsic::hexagon_S2_valignrb; break;
04734 
04735   case Hexagon::BI__builtin_HEXAGON_S2_vspliceib:
04736     ID = Intrinsic::hexagon_S2_vspliceib; break;
04737 
04738   case Hexagon::BI__builtin_HEXAGON_S2_vsplicerb:
04739     ID = Intrinsic::hexagon_S2_vsplicerb; break;
04740 
04741   case Hexagon::BI__builtin_HEXAGON_S2_vsplatrh:
04742     ID = Intrinsic::hexagon_S2_vsplatrh; break;
04743 
04744   case Hexagon::BI__builtin_HEXAGON_S2_vsplatrb:
04745     ID = Intrinsic::hexagon_S2_vsplatrb; break;
04746 
04747   case Hexagon::BI__builtin_HEXAGON_S2_insert:
04748     ID = Intrinsic::hexagon_S2_insert; break;
04749 
04750   case Hexagon::BI__builtin_HEXAGON_S2_tableidxb_goodsyntax:
04751     ID = Intrinsic::hexagon_S2_tableidxb_goodsyntax; break;
04752 
04753   case Hexagon::BI__builtin_HEXAGON_S2_tableidxh_goodsyntax:
04754     ID = Intrinsic::hexagon_S2_tableidxh_goodsyntax; break;
04755 
04756   case Hexagon::BI__builtin_HEXAGON_S2_tableidxw_goodsyntax:
04757     ID = Intrinsic::hexagon_S2_tableidxw_goodsyntax; break;
04758 
04759   case Hexagon::BI__builtin_HEXAGON_S2_tableidxd_goodsyntax:
04760     ID = Intrinsic::hexagon_S2_tableidxd_goodsyntax; break;
04761 
04762   case Hexagon::BI__builtin_HEXAGON_A4_bitspliti:
04763     ID = Intrinsic::hexagon_A4_bitspliti; break;
04764 
04765   case Hexagon::BI__builtin_HEXAGON_A4_bitsplit:
04766     ID = Intrinsic::hexagon_A4_bitsplit; break;
04767 
04768   case Hexagon::BI__builtin_HEXAGON_S4_extract:
04769     ID = Intrinsic::hexagon_S4_extract; break;
04770 
04771   case Hexagon::BI__builtin_HEXAGON_S2_extractu:
04772     ID = Intrinsic::hexagon_S2_extractu; break;
04773 
04774   case Hexagon::BI__builtin_HEXAGON_S2_insertp:
04775     ID = Intrinsic::hexagon_S2_insertp; break;
04776 
04777   case Hexagon::BI__builtin_HEXAGON_S4_extractp:
04778     ID = Intrinsic::hexagon_S4_extractp; break;
04779 
04780   case Hexagon::BI__builtin_HEXAGON_S2_extractup:
04781     ID = Intrinsic::hexagon_S2_extractup; break;
04782 
04783   case Hexagon::BI__builtin_HEXAGON_S2_insert_rp:
04784     ID = Intrinsic::hexagon_S2_insert_rp; break;
04785 
04786   case Hexagon::BI__builtin_HEXAGON_S4_extract_rp:
04787     ID = Intrinsic::hexagon_S4_extract_rp; break;
04788 
04789   case Hexagon::BI__builtin_HEXAGON_S2_extractu_rp:
04790     ID = Intrinsic::hexagon_S2_extractu_rp; break;
04791 
04792   case Hexagon::BI__builtin_HEXAGON_S2_insertp_rp:
04793     ID = Intrinsic::hexagon_S2_insertp_rp; break;
04794 
04795   case Hexagon::BI__builtin_HEXAGON_S4_extractp_rp:
04796     ID = Intrinsic::hexagon_S4_extractp_rp; break;
04797 
04798   case Hexagon::BI__builtin_HEXAGON_S2_extractup_rp:
04799     ID = Intrinsic::hexagon_S2_extractup_rp; break;
04800 
04801   case Hexagon::BI__builtin_HEXAGON_S2_tstbit_i:
04802     ID = Intrinsic::hexagon_S2_tstbit_i; break;
04803 
04804   case Hexagon::BI__builtin_HEXAGON_S4_ntstbit_i:
04805     ID = Intrinsic::hexagon_S4_ntstbit_i; break;
04806 
04807   case Hexagon::BI__builtin_HEXAGON_S2_setbit_i:
04808     ID = Intrinsic::hexagon_S2_setbit_i; break;
04809 
04810   case Hexagon::BI__builtin_HEXAGON_S2_togglebit_i:
04811     ID = Intrinsic::hexagon_S2_togglebit_i; break;
04812 
04813   case Hexagon::BI__builtin_HEXAGON_S2_clrbit_i:
04814     ID = Intrinsic::hexagon_S2_clrbit_i; break;
04815 
04816   case Hexagon::BI__builtin_HEXAGON_S2_tstbit_r:
04817     ID = Intrinsic::hexagon_S2_tstbit_r; break;
04818 
04819   case Hexagon::BI__builtin_HEXAGON_S4_ntstbit_r:
04820     ID = Intrinsic::hexagon_S4_ntstbit_r; break;
04821 
04822   case Hexagon::BI__builtin_HEXAGON_S2_setbit_r:
04823     ID = Intrinsic::hexagon_S2_setbit_r; break;
04824 
04825   case Hexagon::BI__builtin_HEXAGON_S2_togglebit_r:
04826     ID = Intrinsic::hexagon_S2_togglebit_r; break;
04827 
04828   case Hexagon::BI__builtin_HEXAGON_S2_clrbit_r:
04829     ID = Intrinsic::hexagon_S2_clrbit_r; break;
04830 
04831   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_vh:
04832     ID = Intrinsic::hexagon_S2_asr_i_vh; break;
04833 
04834   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_vh:
04835     ID = Intrinsic::hexagon_S2_lsr_i_vh; break;
04836 
04837   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_vh:
04838     ID = Intrinsic::hexagon_S2_asl_i_vh; break;
04839 
04840   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_vh:
04841     ID = Intrinsic::hexagon_S2_asr_r_vh; break;
04842 
04843   case Hexagon::BI__builtin_HEXAGON_S5_asrhub_rnd_sat_goodsyntax:
04844     ID = Intrinsic::hexagon_S5_asrhub_rnd_sat_goodsyntax; break;
04845 
04846   case Hexagon::BI__builtin_HEXAGON_S5_asrhub_sat:
04847     ID = Intrinsic::hexagon_S5_asrhub_sat; break;
04848 
04849   case Hexagon::BI__builtin_HEXAGON_S5_vasrhrnd_goodsyntax:
04850     ID = Intrinsic::hexagon_S5_vasrhrnd_goodsyntax; break;
04851 
04852   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_vh:
04853     ID = Intrinsic::hexagon_S2_asl_r_vh; break;
04854 
04855   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_vh:
04856     ID = Intrinsic::hexagon_S2_lsr_r_vh; break;
04857 
04858   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_vh:
04859     ID = Intrinsic::hexagon_S2_lsl_r_vh; break;
04860 
04861   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_vw:
04862     ID = Intrinsic::hexagon_S2_asr_i_vw; break;
04863 
04864   case Hexagon::BI__builtin_HEXAGON_S2_asr_i_svw_trun:
04865     ID = Intrinsic::hexagon_S2_asr_i_svw_trun; break;
04866 
04867   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_svw_trun:
04868     ID = Intrinsic::hexagon_S2_asr_r_svw_trun; break;
04869 
04870   case Hexagon::BI__builtin_HEXAGON_S2_lsr_i_vw:
04871     ID = Intrinsic::hexagon_S2_lsr_i_vw; break;
04872 
04873   case Hexagon::BI__builtin_HEXAGON_S2_asl_i_vw:
04874     ID = Intrinsic::hexagon_S2_asl_i_vw; break;
04875 
04876   case Hexagon::BI__builtin_HEXAGON_S2_asr_r_vw:
04877     ID = Intrinsic::hexagon_S2_asr_r_vw; break;
04878 
04879   case Hexagon::BI__builtin_HEXAGON_S2_asl_r_vw:
04880     ID = Intrinsic::hexagon_S2_asl_r_vw; break;
04881 
04882   case Hexagon::BI__builtin_HEXAGON_S2_lsr_r_vw:
04883     ID = Intrinsic::hexagon_S2_lsr_r_vw; break;
04884 
04885   case Hexagon::BI__builtin_HEXAGON_S2_lsl_r_vw:
04886     ID = Intrinsic::hexagon_S2_lsl_r_vw; break;
04887 
04888   case Hexagon::BI__builtin_HEXAGON_S2_vrndpackwh:
04889     ID = Intrinsic::hexagon_S2_vrndpackwh; break;
04890 
04891   case Hexagon::BI__builtin_HEXAGON_S2_vrndpackwhs:
04892     ID = Intrinsic::hexagon_S2_vrndpackwhs; break;
04893 
04894   case Hexagon::BI__builtin_HEXAGON_S2_vsxtbh:
04895     ID = Intrinsic::hexagon_S2_vsxtbh; break;
04896 
04897   case Hexagon::BI__builtin_HEXAGON_S2_vzxtbh:
04898     ID = Intrinsic::hexagon_S2_vzxtbh; break;
04899 
04900   case Hexagon::BI__builtin_HEXAGON_S2_vsathub:
04901     ID = Intrinsic::hexagon_S2_vsathub; break;
04902 
04903   case Hexagon::BI__builtin_HEXAGON_S2_svsathub:
04904     ID = Intrinsic::hexagon_S2_svsathub; break;
04905 
04906   case Hexagon::BI__builtin_HEXAGON_S2_svsathb:
04907     ID = Intrinsic::hexagon_S2_svsathb; break;
04908 
04909   case Hexagon::BI__builtin_HEXAGON_S2_vsathb:
04910     ID = Intrinsic::hexagon_S2_vsathb; break;
04911 
04912   case Hexagon::BI__builtin_HEXAGON_S2_vtrunohb:
04913     ID = Intrinsic::hexagon_S2_vtrunohb; break;
04914 
04915   case Hexagon::BI__builtin_HEXAGON_S2_vtrunewh:
04916     ID = Intrinsic::hexagon_S2_vtrunewh; break;
04917 
04918   case Hexagon::BI__builtin_HEXAGON_S2_vtrunowh:
04919     ID = Intrinsic::hexagon_S2_vtrunowh; break;
04920 
04921   case Hexagon::BI__builtin_HEXAGON_S2_vtrunehb:
04922     ID = Intrinsic::hexagon_S2_vtrunehb; break;
04923 
04924   case Hexagon::BI__builtin_HEXAGON_S2_vsxthw:
04925     ID = Intrinsic::hexagon_S2_vsxthw; break;
04926 
04927   case Hexagon::BI__builtin_HEXAGON_S2_vzxthw:
04928     ID = Intrinsic::hexagon_S2_vzxthw; break;
04929 
04930   case Hexagon::BI__builtin_HEXAGON_S2_vsatwh:
04931     ID = Intrinsic::hexagon_S2_vsatwh; break;
04932 
04933   case Hexagon::BI__builtin_HEXAGON_S2_vsatwuh:
04934     ID = Intrinsic::hexagon_S2_vsatwuh; break;
04935 
04936   case Hexagon::BI__builtin_HEXAGON_S2_packhl:
04937     ID = Intrinsic::hexagon_S2_packhl; break;
04938 
04939   case Hexagon::BI__builtin_HEXAGON_A2_swiz:
04940     ID = Intrinsic::hexagon_A2_swiz; break;
04941 
04942   case Hexagon::BI__builtin_HEXAGON_S2_vsathub_nopack:
04943     ID = Intrinsic::hexagon_S2_vsathub_nopack; break;
04944 
04945   case Hexagon::BI__builtin_HEXAGON_S2_vsathb_nopack:
04946     ID = Intrinsic::hexagon_S2_vsathb_nopack; break;
04947 
04948   case Hexagon::BI__builtin_HEXAGON_S2_vsatwh_nopack:
04949     ID = Intrinsic::hexagon_S2_vsatwh_nopack; break;
04950 
04951   case Hexagon::BI__builtin_HEXAGON_S2_vsatwuh_nopack:
04952     ID = Intrinsic::hexagon_S2_vsatwuh_nopack; break;
04953 
04954   case Hexagon::BI__builtin_HEXAGON_S2_shuffob:
04955     ID = Intrinsic::hexagon_S2_shuffob; break;
04956 
04957   case Hexagon::BI__builtin_HEXAGON_S2_shuffeb:
04958     ID = Intrinsic::hexagon_S2_shuffeb; break;
04959 
04960   case Hexagon::BI__builtin_HEXAGON_S2_shuffoh:
04961     ID = Intrinsic::hexagon_S2_shuffoh; break;
04962 
04963   case Hexagon::BI__builtin_HEXAGON_S2_shuffeh:
04964     ID = Intrinsic::hexagon_S2_shuffeh; break;
04965 
04966   case Hexagon::BI__builtin_HEXAGON_S5_popcountp:
04967     ID = Intrinsic::hexagon_S5_popcountp; break;
04968 
04969   case Hexagon::BI__builtin_HEXAGON_S4_parity:
04970     ID = Intrinsic::hexagon_S4_parity; break;
04971 
04972   case Hexagon::BI__builtin_HEXAGON_S2_parityp:
04973     ID = Intrinsic::hexagon_S2_parityp; break;
04974 
04975   case Hexagon::BI__builtin_HEXAGON_S2_lfsp:
04976     ID = Intrinsic::hexagon_S2_lfsp; break;
04977 
04978   case Hexagon::BI__builtin_HEXAGON_S2_clbnorm:
04979     ID = Intrinsic::hexagon_S2_clbnorm; break;
04980 
04981   case Hexagon::BI__builtin_HEXAGON_S4_clbaddi:
04982     ID = Intrinsic::hexagon_S4_clbaddi; break;
04983 
04984   case Hexagon::BI__builtin_HEXAGON_S4_clbpnorm:
04985     ID = Intrinsic::hexagon_S4_clbpnorm; break;
04986 
04987   case Hexagon::BI__builtin_HEXAGON_S4_clbpaddi:
04988     ID = Intrinsic::hexagon_S4_clbpaddi; break;
04989 
04990   case Hexagon::BI__builtin_HEXAGON_S2_clb:
04991     ID = Intrinsic::hexagon_S2_clb; break;
04992 
04993   case Hexagon::BI__builtin_HEXAGON_S2_cl0:
04994     ID = Intrinsic::hexagon_S2_cl0; break;
04995 
04996   case Hexagon::BI__builtin_HEXAGON_S2_cl1:
04997     ID = Intrinsic::hexagon_S2_cl1; break;
04998 
04999   case Hexagon::BI__builtin_HEXAGON_S2_clbp:
05000     ID = Intrinsic::hexagon_S2_clbp; break;
05001 
05002   case Hexagon::BI__builtin_HEXAGON_S2_cl0p:
05003     ID = Intrinsic::hexagon_S2_cl0p; break;
05004 
05005   case Hexagon::BI__builtin_HEXAGON_S2_cl1p:
05006     ID = Intrinsic::hexagon_S2_cl1p; break;
05007 
05008   case Hexagon::BI__builtin_HEXAGON_S2_brev:
05009     ID = Intrinsic::hexagon_S2_brev; break;
05010 
05011   case Hexagon::BI__builtin_HEXAGON_S2_brevp:
05012     ID = Intrinsic::hexagon_S2_brevp; break;
05013 
05014   case Hexagon::BI__builtin_HEXAGON_S2_ct0:
05015     ID = Intrinsic::hexagon_S2_ct0; break;
05016 
05017   case Hexagon::BI__builtin_HEXAGON_S2_ct1:
05018     ID = Intrinsic::hexagon_S2_ct1; break;
05019 
05020   case Hexagon::BI__builtin_HEXAGON_S2_ct0p:
05021     ID = Intrinsic::hexagon_S2_ct0p; break;
05022 
05023   case Hexagon::BI__builtin_HEXAGON_S2_ct1p:
05024     ID = Intrinsic::hexagon_S2_ct1p; break;
05025 
05026   case Hexagon::BI__builtin_HEXAGON_S2_interleave:
05027     ID = Intrinsic::hexagon_S2_interleave; break;
05028 
05029   case Hexagon::BI__builtin_HEXAGON_S2_deinterleave:
05030     ID = Intrinsic::hexagon_S2_deinterleave; break;
05031   }
05032 
05033   llvm::Function *F = CGM.getIntrinsic(ID);
05034   return Builder.CreateCall(F, Ops, "");
05035 }
05036 
05037 Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
05038                                            const CallExpr *E) {
05039   SmallVector<Value*, 4> Ops;
05040 
05041   for (unsigned i = 0, e = E->getNumArgs(); i != e; i++)
05042     Ops.push_back(EmitScalarExpr(E->getArg(i)));
05043 
05044   Intrinsic::ID ID = Intrinsic::not_intrinsic;
05045 
05046   switch (BuiltinID) {
05047   default: return 0;
05048 
05049   // vec_ld, vec_lvsl, vec_lvsr
05050   case PPC::BI__builtin_altivec_lvx:
05051   case PPC::BI__builtin_altivec_lvxl:
05052   case PPC::BI__builtin_altivec_lvebx:
05053   case PPC::BI__builtin_altivec_lvehx:
05054   case PPC::BI__builtin_altivec_lvewx:
05055   case PPC::BI__builtin_altivec_lvsl:
05056   case PPC::BI__builtin_altivec_lvsr:
05057   {
05058     Ops[1] = Builder.CreateBitCast(Ops[1], Int8PtrTy);
05059 
05060     Ops[0] = Builder.CreateGEP(Ops[1], Ops[0]);
05061     Ops.pop_back();
05062 
05063     switch (BuiltinID) {
05064     default: llvm_unreachable("Unsupported ld/lvsl/lvsr intrinsic!");
05065     case PPC::BI__builtin_altivec_lvx:
05066       ID = Intrinsic::ppc_altivec_lvx;
05067       break;
05068     case PPC::BI__builtin_altivec_lvxl:
05069       ID = Intrinsic::ppc_altivec_lvxl;
05070       break;
05071     case PPC::BI__builtin_altivec_lvebx:
05072       ID = Intrinsic::ppc_altivec_lvebx;
05073       break;
05074     case PPC::BI__builtin_altivec_lvehx:
05075       ID = Intrinsic::ppc_altivec_lvehx;
05076       break;
05077     case PPC::BI__builtin_altivec_lvewx:
05078       ID = Intrinsic::ppc_altivec_lvewx;
05079       break;
05080     case PPC::BI__builtin_altivec_lvsl:
05081       ID = Intrinsic::ppc_altivec_lvsl;
05082       break;
05083     case PPC::BI__builtin_altivec_lvsr:
05084       ID = Intrinsic::ppc_altivec_lvsr;
05085       break;
05086     }
05087     llvm::Function *F = CGM.getIntrinsic(ID);
05088     return Builder.CreateCall(F, Ops, "");
05089   }
05090 
05091   // vec_st
05092   case PPC::BI__builtin_altivec_stvx:
05093   case PPC::BI__builtin_altivec_stvxl:
05094   case PPC::BI__builtin_altivec_stvebx:
05095   case PPC::BI__builtin_altivec_stvehx:
05096   case PPC::BI__builtin_altivec_stvewx:
05097   {
05098     Ops[2] = Builder.CreateBitCast(Ops[2], Int8PtrTy);
05099     Ops[1] = Builder.CreateGEP(Ops[2], Ops[1]);
05100     Ops.pop_back();
05101 
05102     switch (BuiltinID) {
05103     default: llvm_unreachable("Unsupported st intrinsic!");
05104     case PPC::BI__builtin_altivec_stvx:
05105       ID = Intrinsic::ppc_altivec_stvx;
05106       break;
05107     case PPC::BI__builtin_altivec_stvxl:
05108       ID = Intrinsic::ppc_altivec_stvxl;
05109       break;
05110     case PPC::BI__builtin_altivec_stvebx:
05111       ID = Intrinsic::ppc_altivec_stvebx;
05112       break;
05113     case PPC::BI__builtin_altivec_stvehx:
05114       ID = Intrinsic::ppc_altivec_stvehx;
05115       break;
05116     case PPC::BI__builtin_altivec_stvewx:
05117       ID = Intrinsic::ppc_altivec_stvewx;
05118       break;
05119     }
05120     llvm::Function *F = CGM.getIntrinsic(ID);
05121     return Builder.CreateCall(F, Ops, "");
05122   }
05123   }
05124 }