CGBuiltin.cpp revision 488e993a135ce700b982bf099c3d6b856301d642
1022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson//===---- CGBuiltin.cpp - Emit LLVM Code for builtins ---------------------===//
2022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson//
3022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson//                     The LLVM Compiler Infrastructure
4022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
7022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson//
8022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson//===----------------------------------------------------------------------===//
9022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson//
10022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson// This contains code to emit Builtin calls as LLVM code.
11022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson//
12022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson//===----------------------------------------------------------------------===//
13022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson
14022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson#include "CodeGenFunction.h"
15022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson#include "CodeGenModule.h"
16ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson#include "clang/Basic/TargetInfo.h"
17bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner#include "clang/AST/ASTContext.h"
18c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/AST/Decl.h"
19564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson#include "clang/AST/TargetBuiltins.h"
20793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson#include "llvm/Intrinsics.h"
21022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlssonusing namespace clang;
22022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlssonusing namespace CodeGen;
23ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlssonusing namespace llvm;
24ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson
251ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang/// Utility to insert an atomic instruction based Instrinsic::ID and
261ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang// the expression node
271ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wangstatic RValue EmitBinaryAtomic(CodeGenFunction& CFG,
281ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang                               Intrinsic::ID Id, const CallExpr *E) {
29c5004516489c931cf839bdbdde5a76e4074cc888Mon P Wang  const llvm::Type *ResType[2];
30c5004516489c931cf839bdbdde5a76e4074cc888Mon P Wang  ResType[0] = CFG.ConvertType(E->getType());
31c5004516489c931cf839bdbdde5a76e4074cc888Mon P Wang  ResType[1] = CFG.ConvertType(E->getArg(0)->getType());
32c5004516489c931cf839bdbdde5a76e4074cc888Mon P Wang  Value *AtomF = CFG.CGM.getIntrinsic(Id, ResType, 2);
331ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  return RValue::get(CFG.Builder.CreateCall2(AtomF,
341ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang                                             CFG.EmitScalarExpr(E->getArg(0)),
351ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang                                             CFG.EmitScalarExpr(E->getArg(1))));
361ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang}
371ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang
386de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris LattnerRValue CodeGenFunction::EmitBuiltinExpr(unsigned BuiltinID, const CallExpr *E) {
396de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner  switch (BuiltinID) {
40b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  default: break;  // Handle intrinsics and libm functions below.
41ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson
426de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner  case Builtin::BI__builtin___CFStringMakeConstantString: {
436de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner    const Expr *Arg = E->getArg(0);
446de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner
45d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson    while (1) {
46d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson      if (const ParenExpr *PE = dyn_cast<ParenExpr>(Arg))
47d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson        Arg = PE->getSubExpr();
48d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson      else if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(Arg))
49d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson        Arg = CE->getSubExpr();
50d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson      else
51d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson        break;
52d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson    }
536de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner
546de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner    const StringLiteral *Literal = cast<StringLiteral>(Arg);
556de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner    std::string S(Literal->getStrData(), Literal->getByteLength());
566de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner
576de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner    return RValue::get(CGM.GetAddrOfConstantCFString(S));
58793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson  }
596a705f0443f8398ece14d80e71d8e8c9e71aa84aChris Lattner  case Builtin::BI__builtin_stdarg_start:
60793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson  case Builtin::BI__builtin_va_start:
61793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson  case Builtin::BI__builtin_va_end: {
621feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    Value *ArgValue = EmitScalarExpr(E->getArg(0));
63ddc23f3e6fdc4f83dd46ef7e20394cfbd6063ff9Christopher Lamb    const llvm::Type *DestType =
64ddc23f3e6fdc4f83dd46ef7e20394cfbd6063ff9Christopher Lamb      llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
65793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson    if (ArgValue->getType() != DestType)
66793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson      ArgValue = Builder.CreateBitCast(ArgValue, DestType,
67793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson                                       ArgValue->getNameStart());
68793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson
696a705f0443f8398ece14d80e71d8e8c9e71aa84aChris Lattner    Intrinsic::ID inst = (BuiltinID == Builtin::BI__builtin_va_end) ?
706a705f0443f8398ece14d80e71d8e8c9e71aa84aChris Lattner      Intrinsic::vaend : Intrinsic::vastart;
717acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return RValue::get(Builder.CreateCall(CGM.getIntrinsic(inst), ArgValue));
72793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson  }
73a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson  case Builtin::BI__builtin_va_copy: {
74a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    // FIXME: This does not yet handle architectures where va_list is a struct.
75a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    Value *DstPtr = EmitScalarExpr(E->getArg(0));
76a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    Value *SrcValue = EmitScalarExpr(E->getArg(1));
77a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson
78a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    Value *SrcPtr = CreateTempAlloca(SrcValue->getType(), "dst_ptr");
79a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson
80a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    Builder.CreateStore(SrcValue, SrcPtr, false);
81a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson
82a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    const llvm::Type *Type =
83a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson      llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
84a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson
85a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    DstPtr = Builder.CreateBitCast(DstPtr, Type);
86a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    SrcPtr = Builder.CreateBitCast(SrcPtr, Type);
873eae03e7d165f20a863a9a4d7122ba2a691ab16dChris Lattner    return RValue::get(Builder.CreateCall2(CGM.getIntrinsic(Intrinsic::vacopy),
883eae03e7d165f20a863a9a4d7122ba2a691ab16dChris Lattner                                           DstPtr, SrcPtr));
89a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson  }
9089799cf254c91ca110f113a33eebe8b1b4d1a761Anders Carlsson  case Builtin::BI__builtin_classify_type: {
911feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    APSInt Result(32);
9289799cf254c91ca110f113a33eebe8b1b4d1a761Anders Carlsson    if (!E->isBuiltinClassifyType(Result))
9389799cf254c91ca110f113a33eebe8b1b4d1a761Anders Carlsson      assert(0 && "Expr not __builtin_classify_type!");
941feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    return RValue::get(ConstantInt::get(Result));
9589799cf254c91ca110f113a33eebe8b1b4d1a761Anders Carlsson  }
96d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson  case Builtin::BI__builtin_constant_p: {
971feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    APSInt Result(32);
98d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson    // FIXME: Analyze the parameter and check if it is a constant.
99d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson    Result = 0;
1001feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    return RValue::get(ConstantInt::get(Result));
101d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson  }
102c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson  case Builtin::BI__builtin_abs: {
1031feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    Value *ArgValue = EmitScalarExpr(E->getArg(0));
104c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson
1059a847f598c4907a72b8593b364b9e6b94b086e75Chris Lattner    Value *NegOp = Builder.CreateNeg(ArgValue, "neg");
1061feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    Value *CmpResult =
1079a847f598c4907a72b8593b364b9e6b94b086e75Chris Lattner    Builder.CreateICmpSGE(ArgValue, Constant::getNullValue(ArgValue->getType()),
1089a847f598c4907a72b8593b364b9e6b94b086e75Chris Lattner                                                            "abscond");
1091feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    Value *Result =
110c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson      Builder.CreateSelect(CmpResult, ArgValue, NegOp, "abs");
111c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson
112c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson    return RValue::get(Result);
113c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson  }
1143a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson  case Builtin::BI__builtin_ctz:
1153a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson  case Builtin::BI__builtin_ctzl:
1163a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson  case Builtin::BI__builtin_ctzll: {
1173a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    Value *ArgValue = EmitScalarExpr(E->getArg(0));
1183a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson
1193a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    const llvm::Type *ArgType = ArgValue->getType();
1203a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    Value *F = CGM.getIntrinsic(Intrinsic::cttz, &ArgType, 1);
1213a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson
1223a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    const llvm::Type *ResultType = ConvertType(E->getType());
1233a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    Value *Result = Builder.CreateCall(F, ArgValue, "tmp");
1243a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    if (Result->getType() != ResultType)
1253a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson      Result = Builder.CreateIntCast(Result, ResultType, "cast");
1263a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    return RValue::get(Result);
1273a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson  }
128f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman  case Builtin::BI__builtin_clz:
129f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman  case Builtin::BI__builtin_clzl:
130f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman  case Builtin::BI__builtin_clzll: {
131f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman    Value *ArgValue = EmitScalarExpr(E->getArg(0));
132f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman
133f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman    const llvm::Type *ArgType = ArgValue->getType();
134f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman    Value *F = CGM.getIntrinsic(Intrinsic::ctlz, &ArgType, 1);
135f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman
136f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman    const llvm::Type *ResultType = ConvertType(E->getType());
137f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman    Value *Result = Builder.CreateCall(F, ArgValue, "tmp");
138f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman    if (Result->getType() != ResultType)
139f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman      Result = Builder.CreateIntCast(Result, ResultType, "cast");
140f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman    return RValue::get(Result);
141f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman  }
14204b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_ffs:
14304b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_ffsl:
14404b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_ffsll: {
14504b290030eee33295600728450f348989d1a627eDaniel Dunbar    // ffs(x) -> x ? cttz(x) + 1 : 0
14604b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *ArgValue = EmitScalarExpr(E->getArg(0));
14704b290030eee33295600728450f348989d1a627eDaniel Dunbar
14804b290030eee33295600728450f348989d1a627eDaniel Dunbar    const llvm::Type *ArgType = ArgValue->getType();
14904b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *F = CGM.getIntrinsic(Intrinsic::cttz, &ArgType, 1);
15004b290030eee33295600728450f348989d1a627eDaniel Dunbar
15104b290030eee33295600728450f348989d1a627eDaniel Dunbar    const llvm::Type *ResultType = ConvertType(E->getType());
15204b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *Tmp = Builder.CreateAdd(Builder.CreateCall(F, ArgValue, "tmp"),
15304b290030eee33295600728450f348989d1a627eDaniel Dunbar                                   ConstantInt::get(ArgType, 1), "tmp");
15404b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *Zero = llvm::Constant::getNullValue(ArgType);
15504b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *IsZero = Builder.CreateICmpEQ(ArgValue, Zero, "iszero");
15604b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *Result = Builder.CreateSelect(IsZero, Zero, Tmp, "ffs");
15704b290030eee33295600728450f348989d1a627eDaniel Dunbar    if (Result->getType() != ResultType)
15804b290030eee33295600728450f348989d1a627eDaniel Dunbar      Result = Builder.CreateIntCast(Result, ResultType, "cast");
15904b290030eee33295600728450f348989d1a627eDaniel Dunbar    return RValue::get(Result);
16004b290030eee33295600728450f348989d1a627eDaniel Dunbar  }
16104b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_parity:
16204b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_parityl:
16304b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_parityll: {
16404b290030eee33295600728450f348989d1a627eDaniel Dunbar    // parity(x) -> ctpop(x) & 1
16504b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *ArgValue = EmitScalarExpr(E->getArg(0));
16604b290030eee33295600728450f348989d1a627eDaniel Dunbar
16704b290030eee33295600728450f348989d1a627eDaniel Dunbar    const llvm::Type *ArgType = ArgValue->getType();
16804b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *F = CGM.getIntrinsic(Intrinsic::ctpop, &ArgType, 1);
16904b290030eee33295600728450f348989d1a627eDaniel Dunbar
17004b290030eee33295600728450f348989d1a627eDaniel Dunbar    const llvm::Type *ResultType = ConvertType(E->getType());
17104b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *Tmp = Builder.CreateCall(F, ArgValue, "tmp");
17204b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *Result = Builder.CreateAnd(Tmp, ConstantInt::get(ArgType, 1),
17304b290030eee33295600728450f348989d1a627eDaniel Dunbar                                      "tmp");
17404b290030eee33295600728450f348989d1a627eDaniel Dunbar    if (Result->getType() != ResultType)
17504b290030eee33295600728450f348989d1a627eDaniel Dunbar      Result = Builder.CreateIntCast(Result, ResultType, "cast");
17604b290030eee33295600728450f348989d1a627eDaniel Dunbar    return RValue::get(Result);
17704b290030eee33295600728450f348989d1a627eDaniel Dunbar  }
17804b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_popcount:
17904b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_popcountl:
18004b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_popcountll: {
18104b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *ArgValue = EmitScalarExpr(E->getArg(0));
18204b290030eee33295600728450f348989d1a627eDaniel Dunbar
18304b290030eee33295600728450f348989d1a627eDaniel Dunbar    const llvm::Type *ArgType = ArgValue->getType();
18404b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *F = CGM.getIntrinsic(Intrinsic::ctpop, &ArgType, 1);
18504b290030eee33295600728450f348989d1a627eDaniel Dunbar
18604b290030eee33295600728450f348989d1a627eDaniel Dunbar    const llvm::Type *ResultType = ConvertType(E->getType());
18704b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *Result = Builder.CreateCall(F, ArgValue, "tmp");
18804b290030eee33295600728450f348989d1a627eDaniel Dunbar    if (Result->getType() != ResultType)
18904b290030eee33295600728450f348989d1a627eDaniel Dunbar      Result = Builder.CreateIntCast(Result, ResultType, "cast");
19004b290030eee33295600728450f348989d1a627eDaniel Dunbar    return RValue::get(Result);
19104b290030eee33295600728450f348989d1a627eDaniel Dunbar  }
1921feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner  case Builtin::BI__builtin_expect:
193a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar    // FIXME: pass expect through to LLVM
1941feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    return RValue::get(EmitScalarExpr(E->getArg(0)));
195df4852ac816e6050d53b808b86d7c1c9738eb99eAnders Carlsson  case Builtin::BI__builtin_bswap32:
196df4852ac816e6050d53b808b86d7c1c9738eb99eAnders Carlsson  case Builtin::BI__builtin_bswap64: {
1971feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    Value *ArgValue = EmitScalarExpr(E->getArg(0));
198df4852ac816e6050d53b808b86d7c1c9738eb99eAnders Carlsson    const llvm::Type *ArgType = ArgValue->getType();
1997acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    Value *F = CGM.getIntrinsic(Intrinsic::bswap, &ArgType, 1);
2001feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    return RValue::get(Builder.CreateCall(F, ArgValue, "tmp"));
2014493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar  }
2024493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar  case Builtin::BI__builtin_prefetch: {
2034493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar    Value *Locality, *RW, *Address = EmitScalarExpr(E->getArg(0));
2044493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar    // FIXME: Technically these constants should of type 'int', yes?
2054493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar    RW = (E->getNumArgs() > 1) ? EmitScalarExpr(E->getArg(1)) :
2064493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar      ConstantInt::get(llvm::Type::Int32Ty, 0);
2074493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar    Locality = (E->getNumArgs() > 2) ? EmitScalarExpr(E->getArg(2)) :
2084493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar      ConstantInt::get(llvm::Type::Int32Ty, 3);
2094493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar    Value *F = CGM.getIntrinsic(Intrinsic::prefetch, 0, 0);
2104493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar    return RValue::get(Builder.CreateCall3(F, Address, RW, Locality));
2114493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar  }
2124493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar  case Builtin::BI__builtin_trap: {
2134493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar    Value *F = CGM.getIntrinsic(Intrinsic::trap, 0, 0);
2144493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar    return RValue::get(Builder.CreateCall(F));
215df4852ac816e6050d53b808b86d7c1c9738eb99eAnders Carlsson  }
2164493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar
217478547cd2163d86ed9d691aa8fe45949eebf6cbfAnders Carlsson  case Builtin::BI__builtin_huge_val:
21804b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_huge_valf:
21904b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_huge_vall:
220c8ee7988c4ea9ec784625d2a47a8575feb191421Anders Carlsson  case Builtin::BI__builtin_inf:
22104b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_inff:
222c8ee7988c4ea9ec784625d2a47a8575feb191421Anders Carlsson  case Builtin::BI__builtin_infl: {
223b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    const llvm::fltSemantics &Sem =
224b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      CGM.getContext().getFloatTypeSemantics(E->getType());
225b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    return RValue::get(ConstantFP::get(APFloat::getInf(Sem)));
226b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  }
227b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  case Builtin::BI__builtin_nan:
22804b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_nanf:
229b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  case Builtin::BI__builtin_nanl: {
230b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    // If this is __builtin_nan("") turn this into a simple nan, otherwise just
231b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    // call libm nan.
232b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    if (const StringLiteral *S =
233b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner          dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenCasts())) {
234b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      if (!S->isWide() && S->getByteLength() == 0) { // empty string.
235b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner        const llvm::fltSemantics &Sem =
236b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner          CGM.getContext().getFloatTypeSemantics(E->getType());
237b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner        return RValue::get(ConstantFP::get(APFloat::getNaN(Sem)));
238b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      }
239b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    }
240b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    // Otherwise, call libm 'nan'.
241b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    break;
242c8ee7988c4ea9ec784625d2a47a8575feb191421Anders Carlsson  }
243a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar  case Builtin::BI__builtin_powi:
244a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar  case Builtin::BI__builtin_powif:
245a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar  case Builtin::BI__builtin_powil: {
246a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar    Value *Base = EmitScalarExpr(E->getArg(0));
247a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar    Value *Exponent = EmitScalarExpr(E->getArg(1));
248a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar    const llvm::Type *ArgType = Base->getType();
249a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar    Value *F = CGM.getIntrinsic(Intrinsic::powi, &ArgType, 1);
250a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar    return RValue::get(Builder.CreateCall2(F, Base, Exponent, "tmp"));
251a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar  }
252a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar
253fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  case Builtin::BI__builtin_isgreater:
254fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  case Builtin::BI__builtin_isgreaterequal:
255fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  case Builtin::BI__builtin_isless:
256fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  case Builtin::BI__builtin_islessequal:
257fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  case Builtin::BI__builtin_islessgreater:
258fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  case Builtin::BI__builtin_isunordered: {
259fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    // Ordered comparisons: we know the arguments to these are matching scalar
260fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    // floating point values.
261fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    Value *LHS = EmitScalarExpr(E->getArg(0));
262fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    Value *RHS = EmitScalarExpr(E->getArg(1));
263fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner
264fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    switch (BuiltinID) {
265fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    default: assert(0 && "Unknown ordered comparison");
266fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    case Builtin::BI__builtin_isgreater:
267fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      LHS = Builder.CreateFCmpOGT(LHS, RHS, "cmp");
268fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      break;
269fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    case Builtin::BI__builtin_isgreaterequal:
270fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      LHS = Builder.CreateFCmpOGE(LHS, RHS, "cmp");
271fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      break;
272fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    case Builtin::BI__builtin_isless:
273fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      LHS = Builder.CreateFCmpOLT(LHS, RHS, "cmp");
274fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      break;
275fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    case Builtin::BI__builtin_islessequal:
276fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      LHS = Builder.CreateFCmpOLE(LHS, RHS, "cmp");
277fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      break;
278fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    case Builtin::BI__builtin_islessgreater:
279fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      LHS = Builder.CreateFCmpONE(LHS, RHS, "cmp");
280fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      break;
281fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    case Builtin::BI__builtin_isunordered:
282fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      LHS = Builder.CreateFCmpUNO(LHS, RHS, "cmp");
283fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      break;
284fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    }
285fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    // ZExt bool to int type.
286fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    return RValue::get(Builder.CreateZExt(LHS, ConvertType(E->getType()),
287fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner                                          "tmp"));
288fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  }
2899e800e3dd80d77f6c47054738177bf824089f55aChris Lattner  case Builtin::BI__builtin_alloca: {
2909e800e3dd80d77f6c47054738177bf824089f55aChris Lattner    // FIXME: LLVM IR Should allow alloca with an i64 size!
2919e800e3dd80d77f6c47054738177bf824089f55aChris Lattner    Value *Size = EmitScalarExpr(E->getArg(0));
2929e800e3dd80d77f6c47054738177bf824089f55aChris Lattner    Size = Builder.CreateIntCast(Size, llvm::Type::Int32Ty, false, "tmp");
2931caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    return RValue::get(Builder.CreateAlloca(llvm::Type::Int8Ty, Size, "tmp"));
2941caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar  }
2951caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar  case Builtin::BI__builtin_bzero: {
2961caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    Value *Address = EmitScalarExpr(E->getArg(0));
2971caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    Builder.CreateCall4(CGM.getMemSetFn(), Address,
2981caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        llvm::ConstantInt::get(llvm::Type::Int8Ty, 0),
2991caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        EmitScalarExpr(E->getArg(1)),
3001caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        llvm::ConstantInt::get(llvm::Type::Int32Ty, 1));
3011caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    return RValue::get(Address);
3029e800e3dd80d77f6c47054738177bf824089f55aChris Lattner  }
303d4b32e46517358f34e8cfbea35010adfcc3786e0Eli Friedman  case Builtin::BI__builtin_memcpy: {
3041caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    Value *Address = EmitScalarExpr(E->getArg(0));
3051caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    Builder.CreateCall4(CGM.getMemCpyFn(), Address,
3061caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        EmitScalarExpr(E->getArg(1)),
3071caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        EmitScalarExpr(E->getArg(2)),
3081caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        llvm::ConstantInt::get(llvm::Type::Int32Ty, 1));
3091caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    return RValue::get(Address);
3101caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar  }
3111caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar  case Builtin::BI__builtin_memmove: {
3121caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    Value *Address = EmitScalarExpr(E->getArg(0));
3131caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    Builder.CreateCall4(CGM.getMemMoveFn(), Address,
3141caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        EmitScalarExpr(E->getArg(1)),
3151caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        EmitScalarExpr(E->getArg(2)),
3161caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        llvm::ConstantInt::get(llvm::Type::Int32Ty, 1));
3171caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    return RValue::get(Address);
3181caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar  }
3191caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar  case Builtin::BI__builtin_memset: {
3201caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    Value *Address = EmitScalarExpr(E->getArg(0));
3211caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    Builder.CreateCall4(CGM.getMemSetFn(), Address,
3221caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        EmitScalarExpr(E->getArg(1)),
3231caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        EmitScalarExpr(E->getArg(2)),
3241caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        llvm::ConstantInt::get(llvm::Type::Int32Ty, 1));
3251caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    return RValue::get(Address);
326d4b32e46517358f34e8cfbea35010adfcc3786e0Eli Friedman  }
327256f77e431bc6b920ec94cf0bb4ad339ca21b8c9Eli Friedman  case Builtin::BI__builtin_return_address: {
328256f77e431bc6b920ec94cf0bb4ad339ca21b8c9Eli Friedman    Value *F = CGM.getIntrinsic(Intrinsic::returnaddress, 0, 0);
329256f77e431bc6b920ec94cf0bb4ad339ca21b8c9Eli Friedman    return RValue::get(Builder.CreateCall(F, EmitScalarExpr(E->getArg(0))));
330256f77e431bc6b920ec94cf0bb4ad339ca21b8c9Eli Friedman  }
331256f77e431bc6b920ec94cf0bb4ad339ca21b8c9Eli Friedman  case Builtin::BI__builtin_frame_address: {
332256f77e431bc6b920ec94cf0bb4ad339ca21b8c9Eli Friedman    Value *F = CGM.getIntrinsic(Intrinsic::frameaddress, 0, 0);
333256f77e431bc6b920ec94cf0bb4ad339ca21b8c9Eli Friedman    return RValue::get(Builder.CreateCall(F, EmitScalarExpr(E->getArg(0))));
334256f77e431bc6b920ec94cf0bb4ad339ca21b8c9Eli Friedman  }
3351ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_fetch_and_add:
33609b6bf5bfa2ba9cbbd353cbd7846af8f49b020e7Mon P Wang    return EmitBinaryAtomic(*this, Intrinsic::atomic_load_add, E);
3371ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_fetch_and_sub:
33809b6bf5bfa2ba9cbbd353cbd7846af8f49b020e7Mon P Wang    return EmitBinaryAtomic(*this, Intrinsic::atomic_load_sub, E);
3391ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_fetch_and_min:
3401ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang    return EmitBinaryAtomic(*this, Intrinsic::atomic_load_min, E);
3411ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_fetch_and_max:
3421ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang    return EmitBinaryAtomic(*this, Intrinsic::atomic_load_max, E);
3431ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_fetch_and_umin:
3441ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang    return EmitBinaryAtomic(*this, Intrinsic::atomic_load_umin, E);
3451ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_fetch_and_umax:
3461ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang    return EmitBinaryAtomic(*this, Intrinsic::atomic_load_umax, E);
3471ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_fetch_and_and:
3481ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang    return EmitBinaryAtomic(*this, Intrinsic::atomic_load_and, E);
3491ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_fetch_and_or:
3501ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang    return EmitBinaryAtomic(*this, Intrinsic::atomic_load_or, E);
3511ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_fetch_and_xor:
3521ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang    return EmitBinaryAtomic(*this, Intrinsic::atomic_load_xor, E);
3531ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_val_compare_and_swap: {
3541ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang    Value *Args[3];
3551ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang    Args[0]= EmitScalarExpr(E->getArg(0));
3561ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang    Args[1] = EmitScalarExpr(E->getArg(1));
3571ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang    Args[2] = EmitScalarExpr(E->getArg(2));
358c5004516489c931cf839bdbdde5a76e4074cc888Mon P Wang    const llvm::Type *ResType[2];
359c5004516489c931cf839bdbdde5a76e4074cc888Mon P Wang    ResType[0]= ConvertType(E->getType());
360c5004516489c931cf839bdbdde5a76e4074cc888Mon P Wang    ResType[1] = ConvertType(E->getArg(0)->getType());
361c5004516489c931cf839bdbdde5a76e4074cc888Mon P Wang    Value *AtomF = CGM.getIntrinsic(Intrinsic::atomic_cmp_swap, ResType, 2);
3621ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang    return RValue::get(Builder.CreateCall(AtomF, &Args[0], &Args[1]+2));
363022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson  }
3641ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_lock_test_and_set:
3657ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman    return EmitBinaryAtomic(*this, Intrinsic::atomic_swap, E);
3667ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman  }
367b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
368b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  // If this is an alias for a libm function (e.g. __builtin_sin) turn it into
369b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  // that function.
370b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  if (getContext().BuiltinInfo.isLibFunction(BuiltinID))
371b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    return EmitCallExpr(CGM.getBuiltinLibFunction(BuiltinID),
372b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner                        E->getCallee()->getType(), E->arg_begin(),
373b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner                        E->arg_end());
374b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
375b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  // See if we have a target specific intrinsic.
376b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  Intrinsic::ID IntrinsicID;
377b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  const char *TargetPrefix = Target.getTargetPrefix();
378b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  const char *BuiltinName = getContext().BuiltinInfo.GetName(BuiltinID);
379b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner#define GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN
380b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner#include "llvm/Intrinsics.gen"
381b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner#undef GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN
382b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
383b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  if (IntrinsicID != Intrinsic::not_intrinsic) {
384b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    SmallVector<Value*, 16> Args;
385b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
386b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    Function *F = CGM.getIntrinsic(IntrinsicID);
387b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    const llvm::FunctionType *FTy = F->getFunctionType();
388b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
389b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) {
390b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      Value *ArgValue = EmitScalarExpr(E->getArg(i));
391b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
392b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      // If the intrinsic arg type is different from the builtin arg type
393b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      // we need to do a bit cast.
394b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      const llvm::Type *PTy = FTy->getParamType(i);
395b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      if (PTy != ArgValue->getType()) {
396b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner        assert(PTy->canLosslesslyBitCastTo(FTy->getParamType(i)) &&
397b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner               "Must be able to losslessly bit cast to param");
398b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner        ArgValue = Builder.CreateBitCast(ArgValue, PTy);
399b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      }
400b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
401b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      Args.push_back(ArgValue);
402b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    }
403b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
404b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    Value *V = Builder.CreateCall(F, &Args[0], &Args[0] + Args.size());
405b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    QualType BuiltinRetType = E->getType();
406b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
407b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    const llvm::Type *RetTy = llvm::Type::VoidTy;
408b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    if (!BuiltinRetType->isVoidType()) RetTy = ConvertType(BuiltinRetType);
409b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
410b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    if (RetTy != V->getType()) {
411b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      assert(V->getType()->canLosslesslyBitCastTo(RetTy) &&
412b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner             "Must be able to losslessly bit cast result type");
413b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      V = Builder.CreateBitCast(V, RetTy);
414b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    }
415b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
416b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    return RValue::get(V);
417b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  }
418b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
419b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  // See if we have a target specific builtin that needs to be lowered.
420b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  Value *V = 0;
421b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
422b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  if (strcmp(TargetPrefix, "x86") == 0)
423b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    V = EmitX86BuiltinExpr(BuiltinID, E);
424b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  else if (strcmp(TargetPrefix, "ppc") == 0)
425b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    V = EmitPPCBuiltinExpr(BuiltinID, E);
426b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
427b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  if (V)
428b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    return RValue::get(V);
429b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
430488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar  ErrorUnsupported(E, "builtin function");
431b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
432b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  // Unknown builtin, for now just dump it out and return undef.
433b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  if (hasAggregateLLVMType(E->getType()))
434b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    return RValue::getAggregate(CreateTempAlloca(ConvertType(E->getType())));
435b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  return RValue::get(UndefValue::get(ConvertType(E->getType())));
436b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner}
437564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson
4381feedd84221e8dbcc3faf3de27cc42b559db845dChris LattnerValue *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
4391feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner                                           const CallExpr *E) {
4402929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson
4412929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  llvm::SmallVector<Value*, 4> Ops;
4422929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson
4432929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  for (unsigned i = 0, e = E->getNumArgs(); i != e; i++)
4442929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    Ops.push_back(EmitScalarExpr(E->getArg(i)));
4452929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson
446564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson  switch (BuiltinID) {
44746a26b0b0e2ec1557bad9b70e8e20836524ebdfcAnders Carlsson  default: return 0;
44846a26b0b0e2ec1557bad9b70e8e20836524ebdfcAnders Carlsson  case X86::BI__builtin_ia32_mulps:
4492929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    return Builder.CreateMul(Ops[0], Ops[1], "mulps");
450e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_mulpd:
451e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateMul(Ops[0], Ops[1], "mulpd");
4524e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_pand:
453e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_pand128:
4542929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    return Builder.CreateAnd(Ops[0], Ops[1], "pand");
4554e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_por:
456e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_por128:
457e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateOr(Ops[0], Ops[1], "por");
4584e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_pxor:
459e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_pxor128:
460e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateXor(Ops[0], Ops[1], "pxor");
461e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_pandn:
462e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_pandn128:
4632929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    Ops[0] = Builder.CreateNot(Ops[0], "tmp");
4642929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    return Builder.CreateAnd(Ops[0], Ops[1], "pandn");
4654e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_paddb:
466e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_paddb128:
4674e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_paddd:
468e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_paddd128:
4694e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_paddq:
470e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_paddq128:
4714e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_paddw:
472e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_paddw128:
473cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_addps:
474e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_addpd:
475cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return Builder.CreateAdd(Ops[0], Ops[1], "add");
4764e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_psubb:
477e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psubb128:
4784e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_psubd:
479e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psubd128:
4804e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_psubq:
481e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psubq128:
4824e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_psubw:
483e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psubw128:
484cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_subps:
485e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_subpd:
486cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return Builder.CreateSub(Ops[0], Ops[1], "sub");
487cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_divps:
488cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return Builder.CreateFDiv(Ops[0], Ops[1], "divps");
489e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_divpd:
490e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateFDiv(Ops[0], Ops[1], "divpd");
491db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_pmullw:
492e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_pmullw128:
4932929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    return Builder.CreateMul(Ops[0], Ops[1], "pmul");
494db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_punpckhbw:
4957acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return EmitShuffleVector(Ops[0], Ops[1], 4, 12, 5, 13, 6, 14, 7, 15,
496db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson                             "punpckhbw");
497e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_punpckhbw128:
498e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1],  8, 24,  9, 25, 10, 26, 11, 27,
499e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman                                             12, 28, 13, 29, 14, 30, 15, 31,
500e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman                             "punpckhbw");
501db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_punpckhwd:
5027acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return EmitShuffleVector(Ops[0], Ops[1], 2, 6, 3, 7, "punpckhwd");
503e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_punpckhwd128:
504e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 4, 12, 5, 13, 6, 14, 7, 15,
505e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman                             "punpckhwd");
506db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_punpckhdq:
5077acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return EmitShuffleVector(Ops[0], Ops[1], 1, 3, "punpckhdq");
508e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_punpckhdq128:
509e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 2, 6, 3, 7, "punpckhdq");
510abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman  case X86::BI__builtin_ia32_punpckhqdq128:
511abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 1, 3, "punpckhqdq");
512db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_punpcklbw:
5137acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return EmitShuffleVector(Ops[0], Ops[1], 0, 8, 1, 9, 2, 10, 3, 11,
514db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson                             "punpcklbw");
515db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_punpcklwd:
5167acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return EmitShuffleVector(Ops[0], Ops[1], 0, 4, 1, 5, "punpcklwd");
517db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_punpckldq:
5187acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return EmitShuffleVector(Ops[0], Ops[1], 0, 2, "punpckldq");
519e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_punpckldq128:
520e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 0, 4, 1, 5, "punpckldq");
521abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman  case X86::BI__builtin_ia32_punpcklqdq128:
522abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 0, 2, "punpcklqdq");
523e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_pslldi128:
524e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psllqi128:
525e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psllwi128:
526e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psradi128:
527e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psrawi128:
528e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psrldi128:
529e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psrlqi128:
530e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psrlwi128: {
531e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateZExt(Ops[1], llvm::Type::Int64Ty, "zext");
532e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *Ty = llvm::VectorType::get(llvm::Type::Int64Ty, 2);
533e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Value *Zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0);
534e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateInsertElement(llvm::UndefValue::get(Ty),
535e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman                                         Ops[1], Zero, "insert");
536e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateBitCast(Ops[1], Ops[0]->getType(), "bitcast");
537e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const char *name = 0;
538e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Intrinsic::ID ID = Intrinsic::not_intrinsic;
539e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
540e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    switch (BuiltinID) {
541e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    default: assert(0 && "Unsupported shift intrinsic!");
542e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_pslldi128:
543e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "pslldi";
544e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psll_d;
545e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
546e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psllqi128:
547e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psllqi";
548e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psll_q;
549e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
550e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psllwi128:
551e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psllwi";
552e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psll_w;
553e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
554e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psradi128:
555e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psradi";
556e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psra_d;
557e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
558e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psrawi128:
559e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psrawi";
560e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psra_w;
561e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
562e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psrldi128:
563e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psrldi";
564e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psrl_d;
565e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
566e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psrlqi128:
567e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psrlqi";
568e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psrl_q;
569e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
570e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psrlwi128:
571e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psrlwi";
572e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psrl_w;
573e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
574e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    }
575e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Function *F = CGM.getIntrinsic(ID);
576e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name);
577e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
5782929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_pslldi:
5792929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psllqi:
5802929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psllwi:
5812929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psradi:
5822929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psrawi:
5832929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psrldi:
5842929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psrlqi:
5852929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psrlwi: {
5862929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    Ops[1] = Builder.CreateZExt(Ops[1], llvm::Type::Int64Ty, "zext");
5872929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    const llvm::Type *Ty = llvm::VectorType::get(llvm::Type::Int64Ty, 1);
5882929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    Ops[1] = Builder.CreateBitCast(Ops[1], Ty, "bitcast");
5892929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    const char *name = 0;
5902929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    Intrinsic::ID ID = Intrinsic::not_intrinsic;
5914e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson
5922929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    switch (BuiltinID) {
5932929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    default: assert(0 && "Unsupported shift intrinsic!");
5942929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_pslldi:
5952929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "pslldi";
5962929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psll_d;
5972929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
5982929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psllqi:
5992929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psllqi";
6002929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psll_q;
6012929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
6022929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psllwi:
6032929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psllwi";
6042929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psll_w;
6052929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
6062929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psradi:
6072929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psradi";
6082929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psra_d;
6092929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
6102929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psrawi:
6112929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psrawi";
6122929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psra_w;
6132929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
6142929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psrldi:
6152929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psrldi";
6162929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psrl_d;
6172929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
6182929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psrlqi:
6192929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psrlqi";
6202929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psrl_q;
6212929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
6222929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psrlwi:
6232929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psrlwi";
6242929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psrl_w;
6252929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
6262929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    }
6277acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    llvm::Function *F = CGM.getIntrinsic(ID);
6282929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name);
6292929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  }
6307ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman  case X86::BI__builtin_ia32_pshuflw: {
6317ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman    unsigned i = cast<ConstantInt>(Ops[1])->getZExtValue();
6327ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman    return EmitShuffleVector(Ops[0], Ops[0],
6337ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman                             i & 0x3, (i & 0xc) >> 2,
6347ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman                             (i & 0x30) >> 4, (i & 0xc0) >> 6, 4, 5, 6, 7,
6357ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman                             "pshuflw");
6367ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman  }
6377ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman  case X86::BI__builtin_ia32_pshufhw: {
6387ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman    unsigned i = cast<ConstantInt>(Ops[1])->getZExtValue();
6397ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman    return EmitShuffleVector(Ops[0], Ops[0], 0, 1, 2, 3,
6407ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman                             4 + (i & 0x3), 4 + ((i & 0xc) >> 2),
6417ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman                             4 + ((i & 0x30) >> 4), 4 + ((i & 0xc0) >> 6),
6427ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman                             "pshufhw");
6437ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman  }
6442929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_pshufd: {
6457acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    unsigned i = cast<ConstantInt>(Ops[1])->getZExtValue();
6462929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    return EmitShuffleVector(Ops[0], Ops[0],
6474e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson                             i & 0x3, (i & 0xc) >> 2,
6484e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson                             (i & 0x30) >> 4, (i & 0xc0) >> 6,
6494e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson                             "pshufd");
6504e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  }
6516086bbd1799e22e75561c3d31dc9b923f0508fa5Anders Carlsson  case X86::BI__builtin_ia32_vec_init_v4hi:
6526086bbd1799e22e75561c3d31dc9b923f0508fa5Anders Carlsson  case X86::BI__builtin_ia32_vec_init_v8qi:
6536086bbd1799e22e75561c3d31dc9b923f0508fa5Anders Carlsson  case X86::BI__builtin_ia32_vec_init_v2si:
6546086bbd1799e22e75561c3d31dc9b923f0508fa5Anders Carlsson    return EmitVector(&Ops[0], Ops.size());
6556086bbd1799e22e75561c3d31dc9b923f0508fa5Anders Carlsson  case X86::BI__builtin_ia32_vec_ext_v2si:
656e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_vec_ext_v2di:
657e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_vec_ext_v4sf:
658e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_vec_ext_v4si:
659e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_vec_ext_v2df:
6606086bbd1799e22e75561c3d31dc9b923f0508fa5Anders Carlsson    return Builder.CreateExtractElement(Ops[0], Ops[1], "result");
661cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpordss:
662e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpordsd:
663cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpunordss:
664e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpunordsd:
665e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpeqss:
666e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpeqsd:
667e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpltss:
668e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpltsd:
669cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpless:
670e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmplesd:
671cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpneqss:
672e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpneqsd:
673e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnltss:
674e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnltsd:
675e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnless:
676e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnlesd: {
6777acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    unsigned i = 0;
678cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    const char *name = 0;
679cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    switch (BuiltinID) {
680cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    default: assert(0 && "Unknown compare builtin!");
681cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpeqss:
682e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpeqsd:
683cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 0;
684e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpeq";
685cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
686cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpltss:
687e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpltsd:
688cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 1;
689e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmplt";
690cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
691cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpless:
692e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmplesd:
693cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 2;
694e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmple";
695cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
696cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpunordss:
697e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpunordsd:
698cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 3;
699e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpunord";
700cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
701cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpneqss:
702e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpneqsd:
703cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 4;
704e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpneq";
705cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
706cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpnltss:
707e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpnltsd:
708cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 5;
709e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpntl";
710cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
711cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpnless:
712e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpnlesd:
713cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 6;
714e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpnle";
715cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
716cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpordss:
717e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpordsd:
718cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 7;
719e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpord";
720cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
721cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    }
722cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson
723e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Function *F;
724e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    if (cast<llvm::VectorType>(Ops[0]->getType())->getElementType() ==
725e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman        llvm::Type::FloatTy)
726e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      F = CGM.getIntrinsic(Intrinsic::x86_sse_cmp_ss);
727e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    else
728e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      F = CGM.getIntrinsic(Intrinsic::x86_sse2_cmp_sd);
729e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
730cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    Ops.push_back(llvm::ConstantInt::get(llvm::Type::Int8Ty, i));
731cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name);
732cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  }
733e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_ldmxcsr: {
734e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *PtrTy = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
735e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Value *One = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1);
736e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Value *Tmp = Builder.CreateAlloca(llvm::Type::Int32Ty, One, "tmp");
737e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Builder.CreateStore(Ops[0], Tmp);
738e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_ldmxcsr),
7393eae03e7d165f20a863a9a4d7122ba2a691ab16dChris Lattner                              Builder.CreateBitCast(Tmp, PtrTy));
740e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
741e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_stmxcsr: {
742e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *PtrTy = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
743e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Value *One = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1);
744e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Value *Tmp = Builder.CreateAlloca(llvm::Type::Int32Ty, One, "tmp");
745e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    One = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_stmxcsr),
7463eae03e7d165f20a863a9a4d7122ba2a691ab16dChris Lattner                             Builder.CreateBitCast(Tmp, PtrTy));
747e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateLoad(Tmp, "stmxcsr");
748e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
749cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpordps:
750e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpordpd:
751cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpunordps:
752e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpunordpd:
753cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpeqps:
754e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpeqpd:
755cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpltps:
756e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpltpd:
757cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpleps:
758e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmplepd:
759cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpneqps:
760e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpneqpd:
761cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpngtps:
762e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpngtpd:
763cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpnltps:
764e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnltpd:
765cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpgtps:
766e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpgtpd:
767cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpgeps:
768e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpgepd:
769cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpngeps:
770e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpngepd:
771e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnleps:
772e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnlepd: {
7737acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    unsigned i = 0;
774cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    const char *name = 0;
775cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    bool ShouldSwap = false;
776cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    switch (BuiltinID) {
777cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    default: assert(0 && "Unknown compare builtin!");
778e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpeqps:
779e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpeqpd:    i = 0; name = "cmpeq"; break;
780e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpltps:
781e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpltpd:    i = 1; name = "cmplt"; break;
782e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpleps:
783e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmplepd:    i = 2; name = "cmple"; break;
784e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpunordps:
785e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpunordpd: i = 3; name = "cmpunord"; break;
786e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpneqps:
787e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpneqpd:   i = 4; name = "cmpneq"; break;
788e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpnltps:
789e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpnltpd:   i = 5; name = "cmpntl"; break;
790e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpnleps:
791e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpnlepd:   i = 6; name = "cmpnle"; break;
792e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpordps:
793e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpordpd:   i = 7; name = "cmpord"; break;
794cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpgtps:
795e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpgtpd:
7967acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner      ShouldSwap = true;
797cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 1;
798e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpgt";
799cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
800cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpgeps:
801e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpgepd:
802cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 2;
803e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpge";
804cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      ShouldSwap = true;
805cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
806cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpngtps:
807e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpngtpd:
808cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 5;
809e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpngt";
810cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      ShouldSwap = true;
811cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
812cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpngeps:
813e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpngepd:
814cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 6;
815e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpnge";
816cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      ShouldSwap = true;
817cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
818cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    }
819cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson
820cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    if (ShouldSwap)
821cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      std::swap(Ops[0], Ops[1]);
822e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
823e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Function *F;
824e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    if (cast<llvm::VectorType>(Ops[0]->getType())->getElementType() ==
825e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman        llvm::Type::FloatTy)
826e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      F = CGM.getIntrinsic(Intrinsic::x86_sse_cmp_ps);
827e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    else
828e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      F = CGM.getIntrinsic(Intrinsic::x86_sse2_cmp_pd);
829cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson
830cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    Ops.push_back(llvm::ConstantInt::get(llvm::Type::Int8Ty, i));
831cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name);
832cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  }
833cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_movss:
834cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return EmitShuffleVector(Ops[0], Ops[1], 4, 1, 2, 3, "movss");
835730f2c13e8ff0a2a3cc54fce9913add68107cb51Torok Edwin  case X86::BI__builtin_ia32_shufps: {
8367acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    unsigned i = cast<ConstantInt>(Ops[2])->getZExtValue();
837cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return EmitShuffleVector(Ops[0], Ops[1],
838cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson                             i & 0x3, (i & 0xc) >> 2,
839cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson                             ((i & 0x30) >> 4) + 4,
84009b6bf5bfa2ba9cbbd353cbd7846af8f49b020e7Mon P Wang                             ((i & 0xc0) >> 6) + 4, "shufps");
841730f2c13e8ff0a2a3cc54fce9913add68107cb51Torok Edwin  }
8426c5df7f54f40090df6032a74e650b8e4d1c96207Mon P Wang  case X86::BI__builtin_ia32_shufpd: {
8436c5df7f54f40090df6032a74e650b8e4d1c96207Mon P Wang    unsigned i = cast<ConstantInt>(Ops[2])->getZExtValue();
8446c5df7f54f40090df6032a74e650b8e4d1c96207Mon P Wang    return EmitShuffleVector(Ops[0], Ops[1], i & 1, (i & 2) + 2, "shufpd");
8456c5df7f54f40090df6032a74e650b8e4d1c96207Mon P Wang  }
846dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman  case X86::BI__builtin_ia32_punpcklbw128:
847dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 0, 16, 1, 17, 2, 18, 3, 19,
848dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman                                             4, 20, 5, 21, 6, 22, 7, 23,
849dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman                                             "punpcklbw");
850dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman  case X86::BI__builtin_ia32_punpcklwd128:
851dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 0, 8, 1, 9, 2, 10, 3, 11,
852dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman                             "punpcklwd");
853e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_movlhps:
854e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 0, 1, 4, 5, "movlhps");
855e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_movhlps:
856e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 6, 7, 2, 3, "movhlps");
857e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_unpckhps:
858e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 2, 6, 3, 7, "unpckhps");
859e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_unpcklps:
860e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 0, 4, 1, 5, "unpcklps");
861abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman  case X86::BI__builtin_ia32_unpckhpd:
862abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 1, 3, "unpckhpd");
863abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman  case X86::BI__builtin_ia32_unpcklpd:
864abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 0, 2, "unpcklpd");
865abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman  case X86::BI__builtin_ia32_movsd:
866abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 2, 1, "movsd");
867e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_movqv4si: {
868e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *Ty = llvm::VectorType::get(llvm::Type::Int64Ty, 2);
869e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateBitCast(Ops[0], Ty);
870e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
871e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_loadlps:
872e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_loadhps: {
873e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // FIXME: This should probably be represented as
874e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // shuffle (dst, (v4f32 (insert undef, (load i64), 0)), shuf mask hi/lo)
875e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *EltTy = llvm::Type::DoubleTy;
876e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *VecTy = llvm::VectorType::get(EltTy, 2);
877e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *OrigTy = Ops[0]->getType();
878e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    unsigned Index = BuiltinID == X86::BI__builtin_ia32_loadlps ? 0 : 1;
879e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Value *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, Index);
880e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateBitCast(Ops[1], llvm::PointerType::getUnqual(EltTy));
881e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateLoad(Ops[1], "tmp");
882e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast");
883e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateInsertElement(Ops[0], Ops[1], Idx, "loadps");
884e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateBitCast(Ops[0], OrigTy, "loadps");
885e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
886e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_storehps:
887e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_storelps: {
888e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *EltTy = llvm::Type::Int64Ty;
889e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *PtrTy = llvm::PointerType::getUnqual(EltTy);
890e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *VecTy = llvm::VectorType::get(EltTy, 2);
891e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
892e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // cast val v2i64
893e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateBitCast(Ops[1], VecTy, "cast");
894e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
895e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // extract (0, 1)
896e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    unsigned Index = BuiltinID == X86::BI__builtin_ia32_storelps ? 0 : 1;
897e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Value *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, Index);
898e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateExtractElement(Ops[1], Idx, "extract");
899e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
900e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // cast pointer to i64 & store
901e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateBitCast(Ops[0], PtrTy);
902e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateStore(Ops[1], Ops[0]);
903e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
904e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_loadlv4si: {
905e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // load i64
906e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *EltTy = llvm::Type::Int64Ty;
907e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *PtrTy = llvm::PointerType::getUnqual(EltTy);
908e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateBitCast(Ops[0], PtrTy);
909e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateLoad(Ops[0], "load");
910e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
911e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // scalar to vector: insert i64 into 2 x i64 undef
912e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *VecTy = llvm::VectorType::get(EltTy, 2);
913e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Value *Zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0);
914e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateInsertElement(llvm::UndefValue::get(VecTy),
915e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman                                         Ops[0], Zero, "s2v");
916e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
917e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // shuffle into zero vector.
918e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    std::vector<llvm::Constant *>Elts;
919e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Elts.resize(2, llvm::ConstantInt::get(EltTy, 0));
920e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Value *ZV = ConstantVector::get(Elts);
921e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = EmitShuffleVector(ZV, Ops[0], 2, 1, "loadl");
922e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
923e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // bitcast to result.
924e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateBitCast(Ops[0],
925e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman                                 llvm::VectorType::get(llvm::Type::Int32Ty, 4));
926e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
92724512501319aa6d7f70b1bd79470df0197b832c8Nate Begeman  case X86::BI__builtin_ia32_vec_set_v4hi:
92824512501319aa6d7f70b1bd79470df0197b832c8Nate Begeman  case X86::BI__builtin_ia32_vec_set_v8hi:
92924512501319aa6d7f70b1bd79470df0197b832c8Nate Begeman    return Builder.CreateInsertElement(Ops[0], Ops[1], Ops[2], "pinsrw");
930e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_andps:
931e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_andpd:
932e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_andnps:
933e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_andnpd:
934e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_orps:
935e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_orpd:
936e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_xorpd:
937e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_xorps: {
938e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *ITy = llvm::VectorType::get(llvm::Type::Int32Ty, 4);
939e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *FTy = Ops[0]->getType();
940e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateBitCast(Ops[0], ITy, "bitcast");
941e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateBitCast(Ops[1], ITy, "bitcast");
942e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    switch (BuiltinID) {
943e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_andps:
944e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateAnd(Ops[0], Ops[1], "andps");
945e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
946e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_andpd:
947e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateAnd(Ops[0], Ops[1], "andpd");
948e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
949e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_andnps:
950e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateNot(Ops[0], "not");
951e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateAnd(Ops[0], Ops[1], "andnps");
952e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
953e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_andnpd:
954e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateNot(Ops[0], "not");
955e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateAnd(Ops[0], Ops[1], "andnpd");
956e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
957e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_orps:
958e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateOr(Ops[0], Ops[1], "orps");
959e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
960e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_orpd:
961e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateOr(Ops[0], Ops[1], "orpd");
962e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
963e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_xorps:
964e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateXor(Ops[0], Ops[1], "xorps");
965e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
966e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_xorpd:
967e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateXor(Ops[0], Ops[1], "xorpd");
968e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
969e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    }
970e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateBitCast(Ops[0], FTy, "bitcast");
971e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
972564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson  }
973564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson}
974564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson
9751feedd84221e8dbcc3faf3de27cc42b559db845dChris LattnerValue *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
9761feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner                                           const CallExpr *E) {
977564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson  switch (BuiltinID) {
97846a26b0b0e2ec1557bad9b70e8e20836524ebdfcAnders Carlsson  default: return 0;
979564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson  }
980564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson}
981