clang API Documentation
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 }