CGBuiltin.cpp revision 6d172e2985346e55095c75f456901ea5d40fddaa
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 "clang/Basic/TargetInfo.h" 18#include "clang/AST/APValue.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" 24using namespace clang; 25using namespace CodeGen; 26using namespace llvm; 27 28static void EmitMemoryBarrier(CodeGenFunction &CGF, 29 bool LoadLoad, bool LoadStore, 30 bool StoreLoad, bool StoreStore, 31 bool Device) { 32 Value *True = llvm::ConstantInt::getTrue(CGF.getLLVMContext()); 33 Value *False = llvm::ConstantInt::getFalse(CGF.getLLVMContext()); 34 Value *C[5] = { LoadLoad ? True : False, 35 LoadStore ? True : False, 36 StoreLoad ? True : False, 37 StoreStore ? True : False, 38 Device ? True : False }; 39 CGF.Builder.CreateCall(CGF.CGM.getIntrinsic(Intrinsic::memory_barrier), 40 C, C + 5); 41} 42 43// The atomic builtins are also full memory barriers. This is a utility for 44// wrapping a call to the builtins with memory barriers. 45static Value *EmitCallWithBarrier(CodeGenFunction &CGF, Value *Fn, 46 Value **ArgBegin, Value **ArgEnd) { 47 // FIXME: We need a target hook for whether this applies to device memory or 48 // not. 49 bool Device = true; 50 51 // Create barriers both before and after the call. 52 EmitMemoryBarrier(CGF, true, true, true, true, Device); 53 Value *Result = CGF.Builder.CreateCall(Fn, ArgBegin, ArgEnd); 54 EmitMemoryBarrier(CGF, true, true, true, true, Device); 55 return Result; 56} 57 58/// Utility to insert an atomic instruction based on Instrinsic::ID 59/// and the expression node. 60static RValue EmitBinaryAtomic(CodeGenFunction &CGF, 61 Intrinsic::ID Id, const CallExpr *E) { 62 Value *Args[2] = { CGF.EmitScalarExpr(E->getArg(0)), 63 CGF.EmitScalarExpr(E->getArg(1)) }; 64 const llvm::Type *ResType[2]; 65 ResType[0] = CGF.ConvertType(E->getType()); 66 ResType[1] = CGF.ConvertType(E->getArg(0)->getType()); 67 Value *AtomF = CGF.CGM.getIntrinsic(Id, ResType, 2); 68 return RValue::get(EmitCallWithBarrier(CGF, AtomF, Args, Args + 2)); 69} 70 71/// Utility to insert an atomic instruction based Instrinsic::ID and 72// the expression node, where the return value is the result of the 73// operation. 74static RValue EmitBinaryAtomicPost(CodeGenFunction &CGF, 75 Intrinsic::ID Id, const CallExpr *E, 76 Instruction::BinaryOps Op) { 77 const llvm::Type *ResType[2]; 78 ResType[0] = CGF.ConvertType(E->getType()); 79 ResType[1] = CGF.ConvertType(E->getArg(0)->getType()); 80 Value *AtomF = CGF.CGM.getIntrinsic(Id, ResType, 2); 81 Value *Args[2] = { CGF.EmitScalarExpr(E->getArg(0)), 82 CGF.EmitScalarExpr(E->getArg(1)) }; 83 Value *Result = EmitCallWithBarrier(CGF, AtomF, Args, Args + 2); 84 return RValue::get(CGF.Builder.CreateBinOp(Op, Result, Args[1])); 85} 86 87static llvm::ConstantInt *getInt32(llvm::LLVMContext &Context, int32_t Value) { 88 return llvm::ConstantInt::get(llvm::Type::getInt32Ty(Context), Value); 89} 90 91 92/// EmitFAbs - Emit a call to fabs/fabsf/fabsl, depending on the type of ValTy, 93/// which must be a scalar floating point type. 94static Value *EmitFAbs(CodeGenFunction &CGF, Value *V, QualType ValTy) { 95 const BuiltinType *ValTyP = ValTy->getAs<BuiltinType>(); 96 assert(ValTyP && "isn't scalar fp type!"); 97 98 StringRef FnName; 99 switch (ValTyP->getKind()) { 100 default: assert(0 && "Isn't a scalar fp type!"); 101 case BuiltinType::Float: FnName = "fabsf"; break; 102 case BuiltinType::Double: FnName = "fabs"; break; 103 case BuiltinType::LongDouble: FnName = "fabsl"; break; 104 } 105 106 // The prototype is something that takes and returns whatever V's type is. 107 std::vector<const llvm::Type*> Args; 108 Args.push_back(V->getType()); 109 llvm::FunctionType *FT = llvm::FunctionType::get(V->getType(), Args, false); 110 llvm::Value *Fn = CGF.CGM.CreateRuntimeFunction(FT, FnName); 111 112 return CGF.Builder.CreateCall(Fn, V, "abs"); 113} 114 115RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, 116 unsigned BuiltinID, const CallExpr *E) { 117 // See if we can constant fold this builtin. If so, don't emit it at all. 118 Expr::EvalResult Result; 119 if (E->Evaluate(Result, CGM.getContext())) { 120 if (Result.Val.isInt()) 121 return RValue::get(llvm::ConstantInt::get(VMContext, 122 Result.Val.getInt())); 123 else if (Result.Val.isFloat()) 124 return RValue::get(ConstantFP::get(VMContext, Result.Val.getFloat())); 125 } 126 127 switch (BuiltinID) { 128 default: break; // Handle intrinsics and libm functions below. 129 case Builtin::BI__builtin___CFStringMakeConstantString: 130 case Builtin::BI__builtin___NSStringMakeConstantString: 131 return RValue::get(CGM.EmitConstantExpr(E, E->getType(), 0)); 132 case Builtin::BI__builtin_stdarg_start: 133 case Builtin::BI__builtin_va_start: 134 case Builtin::BI__builtin_va_end: { 135 Value *ArgValue = EmitVAListRef(E->getArg(0)); 136 const llvm::Type *DestType = llvm::Type::getInt8PtrTy(VMContext); 137 if (ArgValue->getType() != DestType) 138 ArgValue = Builder.CreateBitCast(ArgValue, DestType, 139 ArgValue->getName().data()); 140 141 Intrinsic::ID inst = (BuiltinID == Builtin::BI__builtin_va_end) ? 142 Intrinsic::vaend : Intrinsic::vastart; 143 return RValue::get(Builder.CreateCall(CGM.getIntrinsic(inst), ArgValue)); 144 } 145 case Builtin::BI__builtin_va_copy: { 146 Value *DstPtr = EmitVAListRef(E->getArg(0)); 147 Value *SrcPtr = EmitVAListRef(E->getArg(1)); 148 149 const llvm::Type *Type = llvm::Type::getInt8PtrTy(VMContext); 150 151 DstPtr = Builder.CreateBitCast(DstPtr, Type); 152 SrcPtr = Builder.CreateBitCast(SrcPtr, Type); 153 return RValue::get(Builder.CreateCall2(CGM.getIntrinsic(Intrinsic::vacopy), 154 DstPtr, SrcPtr)); 155 } 156 case Builtin::BI__builtin_abs: { 157 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 158 159 Value *NegOp = Builder.CreateNeg(ArgValue, "neg"); 160 Value *CmpResult = 161 Builder.CreateICmpSGE(ArgValue, 162 llvm::Constant::getNullValue(ArgValue->getType()), 163 "abscond"); 164 Value *Result = 165 Builder.CreateSelect(CmpResult, ArgValue, NegOp, "abs"); 166 167 return RValue::get(Result); 168 } 169 case Builtin::BI__builtin_ctz: 170 case Builtin::BI__builtin_ctzl: 171 case Builtin::BI__builtin_ctzll: { 172 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 173 174 const llvm::Type *ArgType = ArgValue->getType(); 175 Value *F = CGM.getIntrinsic(Intrinsic::cttz, &ArgType, 1); 176 177 const llvm::Type *ResultType = ConvertType(E->getType()); 178 Value *Result = Builder.CreateCall(F, ArgValue, "tmp"); 179 if (Result->getType() != ResultType) 180 Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true, 181 "cast"); 182 return RValue::get(Result); 183 } 184 case Builtin::BI__builtin_clz: 185 case Builtin::BI__builtin_clzl: 186 case Builtin::BI__builtin_clzll: { 187 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 188 189 const llvm::Type *ArgType = ArgValue->getType(); 190 Value *F = CGM.getIntrinsic(Intrinsic::ctlz, &ArgType, 1); 191 192 const llvm::Type *ResultType = ConvertType(E->getType()); 193 Value *Result = Builder.CreateCall(F, ArgValue, "tmp"); 194 if (Result->getType() != ResultType) 195 Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true, 196 "cast"); 197 return RValue::get(Result); 198 } 199 case Builtin::BI__builtin_ffs: 200 case Builtin::BI__builtin_ffsl: 201 case Builtin::BI__builtin_ffsll: { 202 // ffs(x) -> x ? cttz(x) + 1 : 0 203 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 204 205 const llvm::Type *ArgType = ArgValue->getType(); 206 Value *F = CGM.getIntrinsic(Intrinsic::cttz, &ArgType, 1); 207 208 const llvm::Type *ResultType = ConvertType(E->getType()); 209 Value *Tmp = Builder.CreateAdd(Builder.CreateCall(F, ArgValue, "tmp"), 210 llvm::ConstantInt::get(ArgType, 1), "tmp"); 211 Value *Zero = llvm::Constant::getNullValue(ArgType); 212 Value *IsZero = Builder.CreateICmpEQ(ArgValue, Zero, "iszero"); 213 Value *Result = Builder.CreateSelect(IsZero, Zero, Tmp, "ffs"); 214 if (Result->getType() != ResultType) 215 Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true, 216 "cast"); 217 return RValue::get(Result); 218 } 219 case Builtin::BI__builtin_parity: 220 case Builtin::BI__builtin_parityl: 221 case Builtin::BI__builtin_parityll: { 222 // parity(x) -> ctpop(x) & 1 223 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 224 225 const llvm::Type *ArgType = ArgValue->getType(); 226 Value *F = CGM.getIntrinsic(Intrinsic::ctpop, &ArgType, 1); 227 228 const llvm::Type *ResultType = ConvertType(E->getType()); 229 Value *Tmp = Builder.CreateCall(F, ArgValue, "tmp"); 230 Value *Result = Builder.CreateAnd(Tmp, llvm::ConstantInt::get(ArgType, 1), 231 "tmp"); 232 if (Result->getType() != ResultType) 233 Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true, 234 "cast"); 235 return RValue::get(Result); 236 } 237 case Builtin::BI__builtin_popcount: 238 case Builtin::BI__builtin_popcountl: 239 case Builtin::BI__builtin_popcountll: { 240 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 241 242 const llvm::Type *ArgType = ArgValue->getType(); 243 Value *F = CGM.getIntrinsic(Intrinsic::ctpop, &ArgType, 1); 244 245 const llvm::Type *ResultType = ConvertType(E->getType()); 246 Value *Result = Builder.CreateCall(F, ArgValue, "tmp"); 247 if (Result->getType() != ResultType) 248 Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true, 249 "cast"); 250 return RValue::get(Result); 251 } 252 case Builtin::BI__builtin_expect: 253 // FIXME: pass expect through to LLVM 254 return RValue::get(EmitScalarExpr(E->getArg(0))); 255 case Builtin::BI__builtin_bswap32: 256 case Builtin::BI__builtin_bswap64: { 257 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 258 const llvm::Type *ArgType = ArgValue->getType(); 259 Value *F = CGM.getIntrinsic(Intrinsic::bswap, &ArgType, 1); 260 return RValue::get(Builder.CreateCall(F, ArgValue, "tmp")); 261 } 262 case Builtin::BI__builtin_object_size: { 263 // We pass this builtin onto the optimizer so that it can 264 // figure out the object size in more complex cases. 265 const llvm::Type *ResType[] = { 266 ConvertType(E->getType()) 267 }; 268 269 // LLVM only supports 0 and 2, make sure that we pass along that 270 // as a boolean. 271 Value *Ty = EmitScalarExpr(E->getArg(1)); 272 ConstantInt *CI = dyn_cast<ConstantInt>(Ty); 273 assert(CI); 274 uint64_t val = CI->getZExtValue(); 275 CI = ConstantInt::get(llvm::Type::getInt1Ty(VMContext), (val & 0x2) >> 1); 276 277 Value *F = CGM.getIntrinsic(Intrinsic::objectsize, ResType, 1); 278 return RValue::get(Builder.CreateCall2(F, 279 EmitScalarExpr(E->getArg(0)), 280 CI)); 281 } 282 case Builtin::BI__builtin_prefetch: { 283 Value *Locality, *RW, *Address = EmitScalarExpr(E->getArg(0)); 284 // FIXME: Technically these constants should of type 'int', yes? 285 RW = (E->getNumArgs() > 1) ? EmitScalarExpr(E->getArg(1)) : 286 llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), 0); 287 Locality = (E->getNumArgs() > 2) ? EmitScalarExpr(E->getArg(2)) : 288 llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), 3); 289 Value *F = CGM.getIntrinsic(Intrinsic::prefetch, 0, 0); 290 return RValue::get(Builder.CreateCall3(F, Address, RW, Locality)); 291 } 292 case Builtin::BI__builtin_trap: { 293 Value *F = CGM.getIntrinsic(Intrinsic::trap, 0, 0); 294 return RValue::get(Builder.CreateCall(F)); 295 } 296 case Builtin::BI__builtin_unreachable: { 297 if (CatchUndefined && HaveInsertPoint()) 298 EmitBranch(getTrapBB()); 299 Value *V = Builder.CreateUnreachable(); 300 Builder.ClearInsertionPoint(); 301 return RValue::get(V); 302 } 303 304 case Builtin::BI__builtin_powi: 305 case Builtin::BI__builtin_powif: 306 case Builtin::BI__builtin_powil: { 307 Value *Base = EmitScalarExpr(E->getArg(0)); 308 Value *Exponent = EmitScalarExpr(E->getArg(1)); 309 const llvm::Type *ArgType = Base->getType(); 310 Value *F = CGM.getIntrinsic(Intrinsic::powi, &ArgType, 1); 311 return RValue::get(Builder.CreateCall2(F, Base, Exponent, "tmp")); 312 } 313 314 case Builtin::BI__builtin_isgreater: 315 case Builtin::BI__builtin_isgreaterequal: 316 case Builtin::BI__builtin_isless: 317 case Builtin::BI__builtin_islessequal: 318 case Builtin::BI__builtin_islessgreater: 319 case Builtin::BI__builtin_isunordered: { 320 // Ordered comparisons: we know the arguments to these are matching scalar 321 // floating point values. 322 Value *LHS = EmitScalarExpr(E->getArg(0)); 323 Value *RHS = EmitScalarExpr(E->getArg(1)); 324 325 switch (BuiltinID) { 326 default: assert(0 && "Unknown ordered comparison"); 327 case Builtin::BI__builtin_isgreater: 328 LHS = Builder.CreateFCmpOGT(LHS, RHS, "cmp"); 329 break; 330 case Builtin::BI__builtin_isgreaterequal: 331 LHS = Builder.CreateFCmpOGE(LHS, RHS, "cmp"); 332 break; 333 case Builtin::BI__builtin_isless: 334 LHS = Builder.CreateFCmpOLT(LHS, RHS, "cmp"); 335 break; 336 case Builtin::BI__builtin_islessequal: 337 LHS = Builder.CreateFCmpOLE(LHS, RHS, "cmp"); 338 break; 339 case Builtin::BI__builtin_islessgreater: 340 LHS = Builder.CreateFCmpONE(LHS, RHS, "cmp"); 341 break; 342 case Builtin::BI__builtin_isunordered: 343 LHS = Builder.CreateFCmpUNO(LHS, RHS, "cmp"); 344 break; 345 } 346 // ZExt bool to int type. 347 return RValue::get(Builder.CreateZExt(LHS, ConvertType(E->getType()), 348 "tmp")); 349 } 350 case Builtin::BI__builtin_isnan: { 351 Value *V = EmitScalarExpr(E->getArg(0)); 352 V = Builder.CreateFCmpUNO(V, V, "cmp"); 353 return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType()), "tmp")); 354 } 355 356 case Builtin::BI__builtin_isinf: { 357 // isinf(x) --> fabs(x) == infinity 358 Value *V = EmitScalarExpr(E->getArg(0)); 359 V = EmitFAbs(*this, V, E->getArg(0)->getType()); 360 361 V = Builder.CreateFCmpOEQ(V, ConstantFP::getInfinity(V->getType()),"isinf"); 362 return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType()), "tmp")); 363 } 364 365 // TODO: BI__builtin_isinf_sign 366 // isinf_sign(x) -> isinf(x) ? (signbit(x) ? -1 : 1) : 0 367 368 case Builtin::BI__builtin_isnormal: { 369 // isnormal(x) --> x == x && fabsf(x) < infinity && fabsf(x) >= float_min 370 Value *V = EmitScalarExpr(E->getArg(0)); 371 Value *Eq = Builder.CreateFCmpOEQ(V, V, "iseq"); 372 373 Value *Abs = EmitFAbs(*this, V, E->getArg(0)->getType()); 374 Value *IsLessThanInf = 375 Builder.CreateFCmpULT(Abs, ConstantFP::getInfinity(V->getType()),"isinf"); 376 APFloat Smallest = APFloat::getSmallestNormalized( 377 getContext().getFloatTypeSemantics(E->getArg(0)->getType())); 378 Value *IsNormal = 379 Builder.CreateFCmpUGE(Abs, ConstantFP::get(V->getContext(), Smallest), 380 "isnormal"); 381 V = Builder.CreateAnd(Eq, IsLessThanInf, "and"); 382 V = Builder.CreateAnd(V, IsNormal, "and"); 383 return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType()))); 384 } 385 386 case Builtin::BI__builtin_isfinite: { 387 // isfinite(x) --> x == x && fabs(x) != infinity; } 388 Value *V = EmitScalarExpr(E->getArg(0)); 389 Value *Eq = Builder.CreateFCmpOEQ(V, V, "iseq"); 390 391 Value *Abs = EmitFAbs(*this, V, E->getArg(0)->getType()); 392 Value *IsNotInf = 393 Builder.CreateFCmpUNE(Abs, ConstantFP::getInfinity(V->getType()),"isinf"); 394 395 V = Builder.CreateAnd(Eq, IsNotInf, "and"); 396 return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType()))); 397 } 398 399 case Builtin::BIalloca: 400 case Builtin::BI__builtin_alloca: { 401 // FIXME: LLVM IR Should allow alloca with an i64 size! 402 Value *Size = EmitScalarExpr(E->getArg(0)); 403 Size = Builder.CreateIntCast(Size, llvm::Type::getInt32Ty(VMContext), false, "tmp"); 404 return RValue::get(Builder.CreateAlloca(llvm::Type::getInt8Ty(VMContext), Size, "tmp")); 405 } 406 case Builtin::BIbzero: 407 case Builtin::BI__builtin_bzero: { 408 Value *Address = EmitScalarExpr(E->getArg(0)); 409 Value *SizeVal = EmitScalarExpr(E->getArg(1)); 410 Builder.CreateCall5(CGM.getMemSetFn(Address->getType(), SizeVal->getType()), 411 Address, 412 llvm::ConstantInt::get(llvm::Type::getInt8Ty(VMContext), 0), 413 SizeVal, 414 llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), 1), 415 llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext), 0)); 416 return RValue::get(Address); 417 } 418 case Builtin::BImemcpy: 419 case Builtin::BI__builtin_memcpy: { 420 Value *Address = EmitScalarExpr(E->getArg(0)); 421 Value *SrcAddr = EmitScalarExpr(E->getArg(1)); 422 Value *SizeVal = EmitScalarExpr(E->getArg(2)); 423 Builder.CreateCall5(CGM.getMemCpyFn(Address->getType(), SrcAddr->getType(), 424 SizeVal->getType()), 425 Address, SrcAddr, SizeVal, 426 llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), 1), 427 llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext), 0)); 428 return RValue::get(Address); 429 } 430 case Builtin::BImemmove: 431 case Builtin::BI__builtin_memmove: { 432 Value *Address = EmitScalarExpr(E->getArg(0)); 433 Value *SrcAddr = EmitScalarExpr(E->getArg(1)); 434 Value *SizeVal = EmitScalarExpr(E->getArg(2)); 435 Builder.CreateCall5(CGM.getMemMoveFn(Address->getType(), SrcAddr->getType(), 436 SizeVal->getType()), 437 Address, SrcAddr, SizeVal, 438 llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), 1), 439 llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext), 0)); 440 return RValue::get(Address); 441 } 442 case Builtin::BImemset: 443 case Builtin::BI__builtin_memset: { 444 Value *Address = EmitScalarExpr(E->getArg(0)); 445 Value *SizeVal = EmitScalarExpr(E->getArg(2)); 446 Builder.CreateCall5(CGM.getMemSetFn(Address->getType(), SizeVal->getType()), 447 Address, 448 Builder.CreateTrunc(EmitScalarExpr(E->getArg(1)), 449 llvm::Type::getInt8Ty(VMContext)), 450 SizeVal, 451 llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), 1), 452 llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext), 0)); 453 return RValue::get(Address); 454 } 455 case Builtin::BI__builtin_dwarf_cfa: { 456 // The offset in bytes from the first argument to the CFA. 457 // 458 // Why on earth is this in the frontend? Is there any reason at 459 // all that the backend can't reasonably determine this while 460 // lowering llvm.eh.dwarf.cfa()? 461 // 462 // TODO: If there's a satisfactory reason, add a target hook for 463 // this instead of hard-coding 0, which is correct for most targets. 464 int32_t Offset = 0; 465 466 Value *F = CGM.getIntrinsic(Intrinsic::eh_dwarf_cfa, 0, 0); 467 return RValue::get(Builder.CreateCall(F, getInt32(VMContext, Offset))); 468 } 469 case Builtin::BI__builtin_return_address: { 470 Value *Depth = EmitScalarExpr(E->getArg(0)); 471 Depth = Builder.CreateIntCast(Depth, 472 llvm::Type::getInt32Ty(VMContext), 473 false, "tmp"); 474 Value *F = CGM.getIntrinsic(Intrinsic::returnaddress, 0, 0); 475 return RValue::get(Builder.CreateCall(F, Depth)); 476 } 477 case Builtin::BI__builtin_frame_address: { 478 Value *Depth = EmitScalarExpr(E->getArg(0)); 479 Depth = Builder.CreateIntCast(Depth, 480 llvm::Type::getInt32Ty(VMContext), 481 false, "tmp"); 482 Value *F = CGM.getIntrinsic(Intrinsic::frameaddress, 0, 0); 483 return RValue::get(Builder.CreateCall(F, Depth)); 484 } 485 case Builtin::BI__builtin_extract_return_addr: { 486 Value *Address = EmitScalarExpr(E->getArg(0)); 487 Value *Result = getTargetHooks().decodeReturnAddress(*this, Address); 488 return RValue::get(Result); 489 } 490 case Builtin::BI__builtin_frob_return_addr: { 491 Value *Address = EmitScalarExpr(E->getArg(0)); 492 Value *Result = getTargetHooks().encodeReturnAddress(*this, Address); 493 return RValue::get(Result); 494 } 495 case Builtin::BI__builtin_dwarf_sp_column: { 496 const llvm::IntegerType *Ty 497 = cast<llvm::IntegerType>(ConvertType(E->getType())); 498 int Column = getTargetHooks().getDwarfEHStackPointer(CGM); 499 if (Column == -1) { 500 CGM.ErrorUnsupported(E, "__builtin_dwarf_sp_column"); 501 return RValue::get(llvm::UndefValue::get(Ty)); 502 } 503 return RValue::get(llvm::ConstantInt::get(Ty, Column, true)); 504 } 505 case Builtin::BI__builtin_init_dwarf_reg_size_table: { 506 Value *Address = EmitScalarExpr(E->getArg(0)); 507 if (getTargetHooks().initDwarfEHRegSizeTable(*this, Address)) 508 CGM.ErrorUnsupported(E, "__builtin_init_dwarf_reg_size_table"); 509 return RValue::get(llvm::UndefValue::get(ConvertType(E->getType()))); 510 } 511 case Builtin::BI__builtin_eh_return: { 512 Value *Int = EmitScalarExpr(E->getArg(0)); 513 Value *Ptr = EmitScalarExpr(E->getArg(1)); 514 515 const llvm::IntegerType *IntTy = cast<llvm::IntegerType>(Int->getType()); 516 assert((IntTy->getBitWidth() == 32 || IntTy->getBitWidth() == 64) && 517 "LLVM's __builtin_eh_return only supports 32- and 64-bit variants"); 518 Value *F = CGM.getIntrinsic(IntTy->getBitWidth() == 32 519 ? Intrinsic::eh_return_i32 520 : Intrinsic::eh_return_i64, 521 0, 0); 522 Builder.CreateCall2(F, Int, Ptr); 523 Value *V = Builder.CreateUnreachable(); 524 Builder.ClearInsertionPoint(); 525 return RValue::get(V); 526 } 527 case Builtin::BI__builtin_unwind_init: { 528 Value *F = CGM.getIntrinsic(Intrinsic::eh_unwind_init, 0, 0); 529 return RValue::get(Builder.CreateCall(F)); 530 } 531 case Builtin::BI__builtin_extend_pointer: { 532 // Extends a pointer to the size of an _Unwind_Word, which is 533 // uint64_t on all platforms. Generally this gets poked into a 534 // register and eventually used as an address, so if the 535 // addressing registers are wider than pointers and the platform 536 // doesn't implicitly ignore high-order bits when doing 537 // addressing, we need to make sure we zext / sext based on 538 // the platform's expectations. 539 // 540 // See: http://gcc.gnu.org/ml/gcc-bugs/2002-02/msg00237.html 541 542 LLVMContext &C = CGM.getLLVMContext(); 543 544 // Cast the pointer to intptr_t. 545 Value *Ptr = EmitScalarExpr(E->getArg(0)); 546 const llvm::IntegerType *IntPtrTy = CGM.getTargetData().getIntPtrType(C); 547 Value *Result = Builder.CreatePtrToInt(Ptr, IntPtrTy, "extend.cast"); 548 549 // If that's 64 bits, we're done. 550 if (IntPtrTy->getBitWidth() == 64) 551 return RValue::get(Result); 552 553 // Otherwise, ask the codegen data what to do. 554 const llvm::IntegerType *Int64Ty = llvm::IntegerType::get(C, 64); 555 if (getTargetHooks().extendPointerWithSExt()) 556 return RValue::get(Builder.CreateSExt(Result, Int64Ty, "extend.sext")); 557 else 558 return RValue::get(Builder.CreateZExt(Result, Int64Ty, "extend.zext")); 559 } 560 case Builtin::BI__builtin_setjmp: { 561 // Buffer is a void**. 562 Value *Buf = EmitScalarExpr(E->getArg(0)); 563 564 // Store the frame pointer to the setjmp buffer. 565 Value *FrameAddr = 566 Builder.CreateCall(CGM.getIntrinsic(Intrinsic::frameaddress), 567 ConstantInt::get(llvm::Type::getInt32Ty(VMContext), 0)); 568 Builder.CreateStore(FrameAddr, Buf); 569 570 // Store the stack pointer to the setjmp buffer. 571 Value *StackAddr = 572 Builder.CreateCall(CGM.getIntrinsic(Intrinsic::stacksave)); 573 Value *StackSaveSlot = 574 Builder.CreateGEP(Buf, ConstantInt::get(llvm::Type::getInt32Ty(VMContext), 575 2)); 576 Builder.CreateStore(StackAddr, StackSaveSlot); 577 578 // Call LLVM's EH setjmp, which is lightweight. 579 Value *F = CGM.getIntrinsic(Intrinsic::eh_sjlj_setjmp); 580 Buf = Builder.CreateBitCast(Buf, llvm::Type::getInt8PtrTy(VMContext)); 581 return RValue::get(Builder.CreateCall(F, Buf)); 582 } 583 case Builtin::BI__builtin_longjmp: { 584 Value *Buf = EmitScalarExpr(E->getArg(0)); 585 Buf = Builder.CreateBitCast(Buf, llvm::Type::getInt8PtrTy(VMContext)); 586 587 // Call LLVM's EH longjmp, which is lightweight. 588 Builder.CreateCall(CGM.getIntrinsic(Intrinsic::eh_sjlj_longjmp), Buf); 589 590 // longjmp doesn't return; mark this as unreachable 591 Value *V = Builder.CreateUnreachable(); 592 Builder.ClearInsertionPoint(); 593 return RValue::get(V); 594 } 595 case Builtin::BI__sync_fetch_and_add: 596 case Builtin::BI__sync_fetch_and_sub: 597 case Builtin::BI__sync_fetch_and_or: 598 case Builtin::BI__sync_fetch_and_and: 599 case Builtin::BI__sync_fetch_and_xor: 600 case Builtin::BI__sync_add_and_fetch: 601 case Builtin::BI__sync_sub_and_fetch: 602 case Builtin::BI__sync_and_and_fetch: 603 case Builtin::BI__sync_or_and_fetch: 604 case Builtin::BI__sync_xor_and_fetch: 605 case Builtin::BI__sync_val_compare_and_swap: 606 case Builtin::BI__sync_bool_compare_and_swap: 607 case Builtin::BI__sync_lock_test_and_set: 608 case Builtin::BI__sync_lock_release: 609 assert(0 && "Shouldn't make it through sema"); 610 case Builtin::BI__sync_fetch_and_add_1: 611 case Builtin::BI__sync_fetch_and_add_2: 612 case Builtin::BI__sync_fetch_and_add_4: 613 case Builtin::BI__sync_fetch_and_add_8: 614 case Builtin::BI__sync_fetch_and_add_16: 615 return EmitBinaryAtomic(*this, Intrinsic::atomic_load_add, E); 616 case Builtin::BI__sync_fetch_and_sub_1: 617 case Builtin::BI__sync_fetch_and_sub_2: 618 case Builtin::BI__sync_fetch_and_sub_4: 619 case Builtin::BI__sync_fetch_and_sub_8: 620 case Builtin::BI__sync_fetch_and_sub_16: 621 return EmitBinaryAtomic(*this, Intrinsic::atomic_load_sub, E); 622 case Builtin::BI__sync_fetch_and_or_1: 623 case Builtin::BI__sync_fetch_and_or_2: 624 case Builtin::BI__sync_fetch_and_or_4: 625 case Builtin::BI__sync_fetch_and_or_8: 626 case Builtin::BI__sync_fetch_and_or_16: 627 return EmitBinaryAtomic(*this, Intrinsic::atomic_load_or, E); 628 case Builtin::BI__sync_fetch_and_and_1: 629 case Builtin::BI__sync_fetch_and_and_2: 630 case Builtin::BI__sync_fetch_and_and_4: 631 case Builtin::BI__sync_fetch_and_and_8: 632 case Builtin::BI__sync_fetch_and_and_16: 633 return EmitBinaryAtomic(*this, Intrinsic::atomic_load_and, E); 634 case Builtin::BI__sync_fetch_and_xor_1: 635 case Builtin::BI__sync_fetch_and_xor_2: 636 case Builtin::BI__sync_fetch_and_xor_4: 637 case Builtin::BI__sync_fetch_and_xor_8: 638 case Builtin::BI__sync_fetch_and_xor_16: 639 return EmitBinaryAtomic(*this, Intrinsic::atomic_load_xor, E); 640 641 // Clang extensions: not overloaded yet. 642 case Builtin::BI__sync_fetch_and_min: 643 return EmitBinaryAtomic(*this, Intrinsic::atomic_load_min, E); 644 case Builtin::BI__sync_fetch_and_max: 645 return EmitBinaryAtomic(*this, Intrinsic::atomic_load_max, E); 646 case Builtin::BI__sync_fetch_and_umin: 647 return EmitBinaryAtomic(*this, Intrinsic::atomic_load_umin, E); 648 case Builtin::BI__sync_fetch_and_umax: 649 return EmitBinaryAtomic(*this, Intrinsic::atomic_load_umax, E); 650 651 case Builtin::BI__sync_add_and_fetch_1: 652 case Builtin::BI__sync_add_and_fetch_2: 653 case Builtin::BI__sync_add_and_fetch_4: 654 case Builtin::BI__sync_add_and_fetch_8: 655 case Builtin::BI__sync_add_and_fetch_16: 656 return EmitBinaryAtomicPost(*this, Intrinsic::atomic_load_add, E, 657 llvm::Instruction::Add); 658 case Builtin::BI__sync_sub_and_fetch_1: 659 case Builtin::BI__sync_sub_and_fetch_2: 660 case Builtin::BI__sync_sub_and_fetch_4: 661 case Builtin::BI__sync_sub_and_fetch_8: 662 case Builtin::BI__sync_sub_and_fetch_16: 663 return EmitBinaryAtomicPost(*this, Intrinsic::atomic_load_sub, E, 664 llvm::Instruction::Sub); 665 case Builtin::BI__sync_and_and_fetch_1: 666 case Builtin::BI__sync_and_and_fetch_2: 667 case Builtin::BI__sync_and_and_fetch_4: 668 case Builtin::BI__sync_and_and_fetch_8: 669 case Builtin::BI__sync_and_and_fetch_16: 670 return EmitBinaryAtomicPost(*this, Intrinsic::atomic_load_and, E, 671 llvm::Instruction::And); 672 case Builtin::BI__sync_or_and_fetch_1: 673 case Builtin::BI__sync_or_and_fetch_2: 674 case Builtin::BI__sync_or_and_fetch_4: 675 case Builtin::BI__sync_or_and_fetch_8: 676 case Builtin::BI__sync_or_and_fetch_16: 677 return EmitBinaryAtomicPost(*this, Intrinsic::atomic_load_or, E, 678 llvm::Instruction::Or); 679 case Builtin::BI__sync_xor_and_fetch_1: 680 case Builtin::BI__sync_xor_and_fetch_2: 681 case Builtin::BI__sync_xor_and_fetch_4: 682 case Builtin::BI__sync_xor_and_fetch_8: 683 case Builtin::BI__sync_xor_and_fetch_16: 684 return EmitBinaryAtomicPost(*this, Intrinsic::atomic_load_xor, E, 685 llvm::Instruction::Xor); 686 687 case Builtin::BI__sync_val_compare_and_swap_1: 688 case Builtin::BI__sync_val_compare_and_swap_2: 689 case Builtin::BI__sync_val_compare_and_swap_4: 690 case Builtin::BI__sync_val_compare_and_swap_8: 691 case Builtin::BI__sync_val_compare_and_swap_16: { 692 const llvm::Type *ResType[2]; 693 ResType[0]= ConvertType(E->getType()); 694 ResType[1] = ConvertType(E->getArg(0)->getType()); 695 Value *AtomF = CGM.getIntrinsic(Intrinsic::atomic_cmp_swap, ResType, 2); 696 Value *Args[3] = { EmitScalarExpr(E->getArg(0)), 697 EmitScalarExpr(E->getArg(1)), 698 EmitScalarExpr(E->getArg(2)) }; 699 return RValue::get(EmitCallWithBarrier(*this, AtomF, Args, Args + 3)); 700 } 701 702 case Builtin::BI__sync_bool_compare_and_swap_1: 703 case Builtin::BI__sync_bool_compare_and_swap_2: 704 case Builtin::BI__sync_bool_compare_and_swap_4: 705 case Builtin::BI__sync_bool_compare_and_swap_8: 706 case Builtin::BI__sync_bool_compare_and_swap_16: { 707 const llvm::Type *ResType[2]; 708 ResType[0]= ConvertType(E->getArg(1)->getType()); 709 ResType[1] = llvm::PointerType::getUnqual(ResType[0]); 710 Value *AtomF = CGM.getIntrinsic(Intrinsic::atomic_cmp_swap, ResType, 2); 711 Value *OldVal = EmitScalarExpr(E->getArg(1)); 712 Value *Args[3] = { EmitScalarExpr(E->getArg(0)), 713 OldVal, 714 EmitScalarExpr(E->getArg(2)) }; 715 Value *PrevVal = EmitCallWithBarrier(*this, AtomF, Args, Args + 3); 716 Value *Result = Builder.CreateICmpEQ(PrevVal, OldVal); 717 // zext bool to int. 718 return RValue::get(Builder.CreateZExt(Result, ConvertType(E->getType()))); 719 } 720 721 case Builtin::BI__sync_lock_test_and_set_1: 722 case Builtin::BI__sync_lock_test_and_set_2: 723 case Builtin::BI__sync_lock_test_and_set_4: 724 case Builtin::BI__sync_lock_test_and_set_8: 725 case Builtin::BI__sync_lock_test_and_set_16: 726 return EmitBinaryAtomic(*this, Intrinsic::atomic_swap, E); 727 728 case Builtin::BI__sync_lock_release_1: 729 case Builtin::BI__sync_lock_release_2: 730 case Builtin::BI__sync_lock_release_4: 731 case Builtin::BI__sync_lock_release_8: 732 case Builtin::BI__sync_lock_release_16: { 733 Value *Ptr = EmitScalarExpr(E->getArg(0)); 734 const llvm::Type *ElTy = 735 cast<llvm::PointerType>(Ptr->getType())->getElementType(); 736 llvm::StoreInst *Store = 737 Builder.CreateStore(llvm::Constant::getNullValue(ElTy), Ptr); 738 Store->setVolatile(true); 739 return RValue::get(0); 740 } 741 742 case Builtin::BI__sync_synchronize: { 743 // We assume like gcc appears to, that this only applies to cached memory. 744 EmitMemoryBarrier(*this, true, true, true, true, false); 745 return RValue::get(0); 746 } 747 748 case Builtin::BI__builtin_llvm_memory_barrier: { 749 Value *C[5] = { 750 EmitScalarExpr(E->getArg(0)), 751 EmitScalarExpr(E->getArg(1)), 752 EmitScalarExpr(E->getArg(2)), 753 EmitScalarExpr(E->getArg(3)), 754 EmitScalarExpr(E->getArg(4)) 755 }; 756 Builder.CreateCall(CGM.getIntrinsic(Intrinsic::memory_barrier), C, C + 5); 757 return RValue::get(0); 758 } 759 760 // Library functions with special handling. 761 case Builtin::BIsqrt: 762 case Builtin::BIsqrtf: 763 case Builtin::BIsqrtl: { 764 // TODO: there is currently no set of optimizer flags 765 // sufficient for us to rewrite sqrt to @llvm.sqrt. 766 // -fmath-errno=0 is not good enough; we need finiteness. 767 // We could probably precondition the call with an ult 768 // against 0, but is that worth the complexity? 769 break; 770 } 771 772 case Builtin::BIpow: 773 case Builtin::BIpowf: 774 case Builtin::BIpowl: { 775 // Rewrite sqrt to intrinsic if allowed. 776 if (!FD->hasAttr<ConstAttr>()) 777 break; 778 Value *Base = EmitScalarExpr(E->getArg(0)); 779 Value *Exponent = EmitScalarExpr(E->getArg(1)); 780 const llvm::Type *ArgType = Base->getType(); 781 Value *F = CGM.getIntrinsic(Intrinsic::pow, &ArgType, 1); 782 return RValue::get(Builder.CreateCall2(F, Base, Exponent, "tmp")); 783 } 784 785 case Builtin::BI__builtin_signbit: 786 case Builtin::BI__builtin_signbitf: 787 case Builtin::BI__builtin_signbitl: { 788 LLVMContext &C = CGM.getLLVMContext(); 789 790 Value *Arg = EmitScalarExpr(E->getArg(0)); 791 const llvm::Type *ArgTy = Arg->getType(); 792 if (ArgTy->isPPC_FP128Ty()) 793 break; // FIXME: I'm not sure what the right implementation is here. 794 int ArgWidth = ArgTy->getPrimitiveSizeInBits(); 795 const llvm::Type *ArgIntTy = llvm::IntegerType::get(C, ArgWidth); 796 Value *BCArg = Builder.CreateBitCast(Arg, ArgIntTy); 797 Value *ZeroCmp = llvm::Constant::getNullValue(ArgIntTy); 798 Value *Result = Builder.CreateICmpSLT(BCArg, ZeroCmp); 799 return RValue::get(Builder.CreateZExt(Result, ConvertType(E->getType()))); 800 } 801 } 802 803 // If this is an alias for a libm function (e.g. __builtin_sin) turn it into 804 // that function. 805 if (getContext().BuiltinInfo.isLibFunction(BuiltinID) || 806 getContext().BuiltinInfo.isPredefinedLibFunction(BuiltinID)) 807 return EmitCall(E->getCallee()->getType(), 808 CGM.getBuiltinLibFunction(FD, BuiltinID), 809 ReturnValueSlot(), 810 E->arg_begin(), E->arg_end()); 811 812 // See if we have a target specific intrinsic. 813 const char *Name = getContext().BuiltinInfo.GetName(BuiltinID); 814 Intrinsic::ID IntrinsicID = Intrinsic::not_intrinsic; 815 if (const char *Prefix = 816 llvm::Triple::getArchTypePrefix(Target.getTriple().getArch())) 817 IntrinsicID = Intrinsic::getIntrinsicForGCCBuiltin(Prefix, Name); 818 819 if (IntrinsicID != Intrinsic::not_intrinsic) { 820 SmallVector<Value*, 16> Args; 821 822 Function *F = CGM.getIntrinsic(IntrinsicID); 823 const llvm::FunctionType *FTy = F->getFunctionType(); 824 825 for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) { 826 Value *ArgValue = EmitScalarExpr(E->getArg(i)); 827 828 // If the intrinsic arg type is different from the builtin arg type 829 // we need to do a bit cast. 830 const llvm::Type *PTy = FTy->getParamType(i); 831 if (PTy != ArgValue->getType()) { 832 assert(PTy->canLosslesslyBitCastTo(FTy->getParamType(i)) && 833 "Must be able to losslessly bit cast to param"); 834 ArgValue = Builder.CreateBitCast(ArgValue, PTy); 835 } 836 837 Args.push_back(ArgValue); 838 } 839 840 Value *V = Builder.CreateCall(F, Args.data(), Args.data() + Args.size()); 841 QualType BuiltinRetType = E->getType(); 842 843 const llvm::Type *RetTy = llvm::Type::getVoidTy(VMContext); 844 if (!BuiltinRetType->isVoidType()) RetTy = ConvertType(BuiltinRetType); 845 846 if (RetTy != V->getType()) { 847 assert(V->getType()->canLosslesslyBitCastTo(RetTy) && 848 "Must be able to losslessly bit cast result type"); 849 V = Builder.CreateBitCast(V, RetTy); 850 } 851 852 return RValue::get(V); 853 } 854 855 // See if we have a target specific builtin that needs to be lowered. 856 if (Value *V = EmitTargetBuiltinExpr(BuiltinID, E)) 857 return RValue::get(V); 858 859 ErrorUnsupported(E, "builtin function"); 860 861 // Unknown builtin, for now just dump it out and return undef. 862 if (hasAggregateLLVMType(E->getType())) 863 return RValue::getAggregate(CreateMemTemp(E->getType())); 864 return RValue::get(llvm::UndefValue::get(ConvertType(E->getType()))); 865} 866 867Value *CodeGenFunction::EmitTargetBuiltinExpr(unsigned BuiltinID, 868 const CallExpr *E) { 869 switch (Target.getTriple().getArch()) { 870 case llvm::Triple::arm: 871 case llvm::Triple::thumb: 872 return EmitARMBuiltinExpr(BuiltinID, E); 873 case llvm::Triple::x86: 874 case llvm::Triple::x86_64: 875 return EmitX86BuiltinExpr(BuiltinID, E); 876 case llvm::Triple::ppc: 877 case llvm::Triple::ppc64: 878 return EmitPPCBuiltinExpr(BuiltinID, E); 879 default: 880 return 0; 881 } 882} 883 884Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, 885 const CallExpr *E) { 886 switch (BuiltinID) { 887 default: return 0; 888 889 case ARM::BI__builtin_thread_pointer: { 890 Value *AtomF = CGM.getIntrinsic(Intrinsic::arm_thread_pointer, 0, 0); 891 return Builder.CreateCall(AtomF); 892 } 893 } 894} 895 896Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, 897 const CallExpr *E) { 898 899 llvm::SmallVector<Value*, 4> Ops; 900 901 for (unsigned i = 0, e = E->getNumArgs(); i != e; i++) 902 Ops.push_back(EmitScalarExpr(E->getArg(i))); 903 904 switch (BuiltinID) { 905 default: return 0; 906 case X86::BI__builtin_ia32_pslldi128: 907 case X86::BI__builtin_ia32_psllqi128: 908 case X86::BI__builtin_ia32_psllwi128: 909 case X86::BI__builtin_ia32_psradi128: 910 case X86::BI__builtin_ia32_psrawi128: 911 case X86::BI__builtin_ia32_psrldi128: 912 case X86::BI__builtin_ia32_psrlqi128: 913 case X86::BI__builtin_ia32_psrlwi128: { 914 Ops[1] = Builder.CreateZExt(Ops[1], llvm::Type::getInt64Ty(VMContext), "zext"); 915 const llvm::Type *Ty = llvm::VectorType::get(llvm::Type::getInt64Ty(VMContext), 2); 916 llvm::Value *Zero = llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), 0); 917 Ops[1] = Builder.CreateInsertElement(llvm::UndefValue::get(Ty), 918 Ops[1], Zero, "insert"); 919 Ops[1] = Builder.CreateBitCast(Ops[1], Ops[0]->getType(), "bitcast"); 920 const char *name = 0; 921 Intrinsic::ID ID = Intrinsic::not_intrinsic; 922 923 switch (BuiltinID) { 924 default: assert(0 && "Unsupported shift intrinsic!"); 925 case X86::BI__builtin_ia32_pslldi128: 926 name = "pslldi"; 927 ID = Intrinsic::x86_sse2_psll_d; 928 break; 929 case X86::BI__builtin_ia32_psllqi128: 930 name = "psllqi"; 931 ID = Intrinsic::x86_sse2_psll_q; 932 break; 933 case X86::BI__builtin_ia32_psllwi128: 934 name = "psllwi"; 935 ID = Intrinsic::x86_sse2_psll_w; 936 break; 937 case X86::BI__builtin_ia32_psradi128: 938 name = "psradi"; 939 ID = Intrinsic::x86_sse2_psra_d; 940 break; 941 case X86::BI__builtin_ia32_psrawi128: 942 name = "psrawi"; 943 ID = Intrinsic::x86_sse2_psra_w; 944 break; 945 case X86::BI__builtin_ia32_psrldi128: 946 name = "psrldi"; 947 ID = Intrinsic::x86_sse2_psrl_d; 948 break; 949 case X86::BI__builtin_ia32_psrlqi128: 950 name = "psrlqi"; 951 ID = Intrinsic::x86_sse2_psrl_q; 952 break; 953 case X86::BI__builtin_ia32_psrlwi128: 954 name = "psrlwi"; 955 ID = Intrinsic::x86_sse2_psrl_w; 956 break; 957 } 958 llvm::Function *F = CGM.getIntrinsic(ID); 959 return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name); 960 } 961 case X86::BI__builtin_ia32_pslldi: 962 case X86::BI__builtin_ia32_psllqi: 963 case X86::BI__builtin_ia32_psllwi: 964 case X86::BI__builtin_ia32_psradi: 965 case X86::BI__builtin_ia32_psrawi: 966 case X86::BI__builtin_ia32_psrldi: 967 case X86::BI__builtin_ia32_psrlqi: 968 case X86::BI__builtin_ia32_psrlwi: { 969 Ops[1] = Builder.CreateZExt(Ops[1], llvm::Type::getInt64Ty(VMContext), "zext"); 970 const llvm::Type *Ty = llvm::VectorType::get(llvm::Type::getInt64Ty(VMContext), 1); 971 Ops[1] = Builder.CreateBitCast(Ops[1], Ty, "bitcast"); 972 const char *name = 0; 973 Intrinsic::ID ID = Intrinsic::not_intrinsic; 974 975 switch (BuiltinID) { 976 default: assert(0 && "Unsupported shift intrinsic!"); 977 case X86::BI__builtin_ia32_pslldi: 978 name = "pslldi"; 979 ID = Intrinsic::x86_mmx_psll_d; 980 break; 981 case X86::BI__builtin_ia32_psllqi: 982 name = "psllqi"; 983 ID = Intrinsic::x86_mmx_psll_q; 984 break; 985 case X86::BI__builtin_ia32_psllwi: 986 name = "psllwi"; 987 ID = Intrinsic::x86_mmx_psll_w; 988 break; 989 case X86::BI__builtin_ia32_psradi: 990 name = "psradi"; 991 ID = Intrinsic::x86_mmx_psra_d; 992 break; 993 case X86::BI__builtin_ia32_psrawi: 994 name = "psrawi"; 995 ID = Intrinsic::x86_mmx_psra_w; 996 break; 997 case X86::BI__builtin_ia32_psrldi: 998 name = "psrldi"; 999 ID = Intrinsic::x86_mmx_psrl_d; 1000 break; 1001 case X86::BI__builtin_ia32_psrlqi: 1002 name = "psrlqi"; 1003 ID = Intrinsic::x86_mmx_psrl_q; 1004 break; 1005 case X86::BI__builtin_ia32_psrlwi: 1006 name = "psrlwi"; 1007 ID = Intrinsic::x86_mmx_psrl_w; 1008 break; 1009 } 1010 llvm::Function *F = CGM.getIntrinsic(ID); 1011 return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name); 1012 } 1013 case X86::BI__builtin_ia32_cmpps: { 1014 llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse_cmp_ps); 1015 return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), "cmpps"); 1016 } 1017 case X86::BI__builtin_ia32_cmpss: { 1018 llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse_cmp_ss); 1019 return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), "cmpss"); 1020 } 1021 case X86::BI__builtin_ia32_ldmxcsr: { 1022 const llvm::Type *PtrTy = llvm::Type::getInt8PtrTy(VMContext); 1023 Value *One = llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), 1); 1024 Value *Tmp = Builder.CreateAlloca(llvm::Type::getInt32Ty(VMContext), One, "tmp"); 1025 Builder.CreateStore(Ops[0], Tmp); 1026 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_ldmxcsr), 1027 Builder.CreateBitCast(Tmp, PtrTy)); 1028 } 1029 case X86::BI__builtin_ia32_stmxcsr: { 1030 const llvm::Type *PtrTy = llvm::Type::getInt8PtrTy(VMContext); 1031 Value *One = llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), 1); 1032 Value *Tmp = Builder.CreateAlloca(llvm::Type::getInt32Ty(VMContext), One, "tmp"); 1033 One = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_stmxcsr), 1034 Builder.CreateBitCast(Tmp, PtrTy)); 1035 return Builder.CreateLoad(Tmp, "stmxcsr"); 1036 } 1037 case X86::BI__builtin_ia32_cmppd: { 1038 llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse2_cmp_pd); 1039 return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), "cmppd"); 1040 } 1041 case X86::BI__builtin_ia32_cmpsd: { 1042 llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse2_cmp_sd); 1043 return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), "cmpsd"); 1044 } 1045 case X86::BI__builtin_ia32_storehps: 1046 case X86::BI__builtin_ia32_storelps: { 1047 const llvm::Type *EltTy = llvm::Type::getInt64Ty(VMContext); 1048 llvm::Type *PtrTy = llvm::PointerType::getUnqual(EltTy); 1049 llvm::Type *VecTy = llvm::VectorType::get(EltTy, 2); 1050 1051 // cast val v2i64 1052 Ops[1] = Builder.CreateBitCast(Ops[1], VecTy, "cast"); 1053 1054 // extract (0, 1) 1055 unsigned Index = BuiltinID == X86::BI__builtin_ia32_storelps ? 0 : 1; 1056 llvm::Value *Idx = llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), Index); 1057 Ops[1] = Builder.CreateExtractElement(Ops[1], Idx, "extract"); 1058 1059 // cast pointer to i64 & store 1060 Ops[0] = Builder.CreateBitCast(Ops[0], PtrTy); 1061 return Builder.CreateStore(Ops[1], Ops[0]); 1062 } 1063 case X86::BI__builtin_ia32_palignr: { 1064 unsigned shiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue(); 1065 1066 // If palignr is shifting the pair of input vectors less than 9 bytes, 1067 // emit a shuffle instruction. 1068 if (shiftVal <= 8) { 1069 const llvm::Type *IntTy = llvm::Type::getInt32Ty(VMContext); 1070 1071 llvm::SmallVector<llvm::Constant*, 8> Indices; 1072 for (unsigned i = 0; i != 8; ++i) 1073 Indices.push_back(llvm::ConstantInt::get(IntTy, shiftVal + i)); 1074 1075 Value* SV = llvm::ConstantVector::get(Indices.begin(), Indices.size()); 1076 return Builder.CreateShuffleVector(Ops[1], Ops[0], SV, "palignr"); 1077 } 1078 1079 // If palignr is shifting the pair of input vectors more than 8 but less 1080 // than 16 bytes, emit a logical right shift of the destination. 1081 if (shiftVal < 16) { 1082 // MMX has these as 1 x i64 vectors for some odd optimization reasons. 1083 const llvm::Type *EltTy = llvm::Type::getInt64Ty(VMContext); 1084 const llvm::Type *VecTy = llvm::VectorType::get(EltTy, 1); 1085 1086 Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast"); 1087 Ops[1] = llvm::ConstantInt::get(VecTy, (shiftVal-8) * 8); 1088 1089 // create i32 constant 1090 llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_mmx_psrl_q); 1091 return Builder.CreateCall(F, &Ops[0], &Ops[0] + 2, "palignr"); 1092 } 1093 1094 // If palignr is shifting the pair of vectors more than 32 bytes, emit zero. 1095 return llvm::Constant::getNullValue(ConvertType(E->getType())); 1096 } 1097 case X86::BI__builtin_ia32_palignr128: { 1098 unsigned shiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue(); 1099 1100 // If palignr is shifting the pair of input vectors less than 17 bytes, 1101 // emit a shuffle instruction. 1102 if (shiftVal <= 16) { 1103 const llvm::Type *IntTy = llvm::Type::getInt32Ty(VMContext); 1104 1105 llvm::SmallVector<llvm::Constant*, 16> Indices; 1106 for (unsigned i = 0; i != 16; ++i) 1107 Indices.push_back(llvm::ConstantInt::get(IntTy, shiftVal + i)); 1108 1109 Value* SV = llvm::ConstantVector::get(Indices.begin(), Indices.size()); 1110 return Builder.CreateShuffleVector(Ops[1], Ops[0], SV, "palignr"); 1111 } 1112 1113 // If palignr is shifting the pair of input vectors more than 16 but less 1114 // than 32 bytes, emit a logical right shift of the destination. 1115 if (shiftVal < 32) { 1116 const llvm::Type *EltTy = llvm::Type::getInt64Ty(VMContext); 1117 const llvm::Type *VecTy = llvm::VectorType::get(EltTy, 2); 1118 const llvm::Type *IntTy = llvm::Type::getInt32Ty(VMContext); 1119 1120 Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast"); 1121 Ops[1] = llvm::ConstantInt::get(IntTy, (shiftVal-16) * 8); 1122 1123 // create i32 constant 1124 llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse2_psrl_dq); 1125 return Builder.CreateCall(F, &Ops[0], &Ops[0] + 2, "palignr"); 1126 } 1127 1128 // If palignr is shifting the pair of vectors more than 32 bytes, emit zero. 1129 return llvm::Constant::getNullValue(ConvertType(E->getType())); 1130 } 1131 } 1132} 1133 1134Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID, 1135 const CallExpr *E) { 1136 llvm::SmallVector<Value*, 4> Ops; 1137 1138 for (unsigned i = 0, e = E->getNumArgs(); i != e; i++) 1139 Ops.push_back(EmitScalarExpr(E->getArg(i))); 1140 1141 Intrinsic::ID ID = Intrinsic::not_intrinsic; 1142 1143 switch (BuiltinID) { 1144 default: return 0; 1145 1146 // vec_st 1147 case PPC::BI__builtin_altivec_stvx: 1148 case PPC::BI__builtin_altivec_stvxl: 1149 case PPC::BI__builtin_altivec_stvebx: 1150 case PPC::BI__builtin_altivec_stvehx: 1151 case PPC::BI__builtin_altivec_stvewx: 1152 { 1153 Ops[2] = Builder.CreateBitCast(Ops[2], llvm::Type::getInt8PtrTy(VMContext)); 1154 Ops[1] = !isa<Constant>(Ops[1]) || !cast<Constant>(Ops[1])->isNullValue() 1155 ? Builder.CreateGEP(Ops[2], Ops[1], "tmp") : Ops[2]; 1156 Ops.pop_back(); 1157 1158 switch (BuiltinID) { 1159 default: assert(0 && "Unsupported vavg intrinsic!"); 1160 case PPC::BI__builtin_altivec_stvx: 1161 ID = Intrinsic::ppc_altivec_stvx; 1162 break; 1163 case PPC::BI__builtin_altivec_stvxl: 1164 ID = Intrinsic::ppc_altivec_stvxl; 1165 break; 1166 case PPC::BI__builtin_altivec_stvebx: 1167 ID = Intrinsic::ppc_altivec_stvebx; 1168 break; 1169 case PPC::BI__builtin_altivec_stvehx: 1170 ID = Intrinsic::ppc_altivec_stvehx; 1171 break; 1172 case PPC::BI__builtin_altivec_stvewx: 1173 ID = Intrinsic::ppc_altivec_stvewx; 1174 break; 1175 } 1176 llvm::Function *F = CGM.getIntrinsic(ID); 1177 return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), ""); 1178 } 1179 } 1180 return 0; 1181} 1182