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