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