CGBuiltin.cpp revision 6ee7aa154e8bbb21a21254293410b944f78b0bfe
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"
171f32999ec79a980576e100d64d5f3267eb19ea49Chris Lattner#include "clang/AST/APValue.h"
18bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner#include "clang/AST/ASTContext.h"
19c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/AST/Decl.h"
20564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson#include "clang/AST/TargetBuiltins.h"
21793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson#include "llvm/Intrinsics.h"
22022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlssonusing namespace clang;
23022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlssonusing namespace CodeGen;
24ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlssonusing namespace llvm;
25ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson
261ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang/// Utility to insert an atomic instruction based Instrinsic::ID and
271ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang// the expression node
281ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wangstatic RValue EmitBinaryAtomic(CodeGenFunction& CFG,
291ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang                               Intrinsic::ID Id, const CallExpr *E) {
30c5004516489c931cf839bdbdde5a76e4074cc888Mon P Wang  const llvm::Type *ResType[2];
31c5004516489c931cf839bdbdde5a76e4074cc888Mon P Wang  ResType[0] = CFG.ConvertType(E->getType());
32c5004516489c931cf839bdbdde5a76e4074cc888Mon P Wang  ResType[1] = CFG.ConvertType(E->getArg(0)->getType());
33c5004516489c931cf839bdbdde5a76e4074cc888Mon P Wang  Value *AtomF = CFG.CGM.getIntrinsic(Id, ResType, 2);
341ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  return RValue::get(CFG.Builder.CreateCall2(AtomF,
351ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang                                             CFG.EmitScalarExpr(E->getArg(0)),
361ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang                                             CFG.EmitScalarExpr(E->getArg(1))));
371ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang}
381ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang
396de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris LattnerRValue CodeGenFunction::EmitBuiltinExpr(unsigned BuiltinID, const CallExpr *E) {
40564ea2a99b3afeac9ded332730a56db1f6358a58Chris Lattner  // See if we can constant fold this builtin.  If so, don't emit it at all.
41564ea2a99b3afeac9ded332730a56db1f6358a58Chris Lattner  APValue Result;
426ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner  if (E->Evaluate(Result, CGM.getContext())) {
431f32999ec79a980576e100d64d5f3267eb19ea49Chris Lattner    if (Result.isInt())
441f32999ec79a980576e100d64d5f3267eb19ea49Chris Lattner      return RValue::get(llvm::ConstantInt::get(Result.getInt()));
451f32999ec79a980576e100d64d5f3267eb19ea49Chris Lattner    assert(Result.isFloat() && "Unsupported constant type");
461f32999ec79a980576e100d64d5f3267eb19ea49Chris Lattner    return RValue::get(llvm::ConstantFP::get(Result.getFloat()));
471f32999ec79a980576e100d64d5f3267eb19ea49Chris Lattner  }
481f32999ec79a980576e100d64d5f3267eb19ea49Chris Lattner
49564ea2a99b3afeac9ded332730a56db1f6358a58Chris Lattner  switch (BuiltinID) {
50564ea2a99b3afeac9ded332730a56db1f6358a58Chris Lattner  default: break;  // Handle intrinsics and libm functions below.
51506ff88f44562df267b6a06608ab841b76df2a2bChris Lattner  case Builtin::BI__builtin___CFStringMakeConstantString:
52506ff88f44562df267b6a06608ab841b76df2a2bChris Lattner    return RValue::get(CGM.EmitConstantExpr(E, 0));
536a705f0443f8398ece14d80e71d8e8c9e71aa84aChris Lattner  case Builtin::BI__builtin_stdarg_start:
54793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson  case Builtin::BI__builtin_va_start:
55793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson  case Builtin::BI__builtin_va_end: {
566a0b9846e60e321b1e295072e3d2d01d8411cc60Eli Friedman    Value *ArgValue = EmitLValue(E->getArg(0)).getAddress();
57ddc23f3e6fdc4f83dd46ef7e20394cfbd6063ff9Christopher Lamb    const llvm::Type *DestType =
58ddc23f3e6fdc4f83dd46ef7e20394cfbd6063ff9Christopher Lamb      llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
59793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson    if (ArgValue->getType() != DestType)
60793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson      ArgValue = Builder.CreateBitCast(ArgValue, DestType,
61793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson                                       ArgValue->getNameStart());
62793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson
636a705f0443f8398ece14d80e71d8e8c9e71aa84aChris Lattner    Intrinsic::ID inst = (BuiltinID == Builtin::BI__builtin_va_end) ?
646a705f0443f8398ece14d80e71d8e8c9e71aa84aChris Lattner      Intrinsic::vaend : Intrinsic::vastart;
657acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return RValue::get(Builder.CreateCall(CGM.getIntrinsic(inst), ArgValue));
66793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson  }
67a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson  case Builtin::BI__builtin_va_copy: {
68a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    // FIXME: This does not yet handle architectures where va_list is a struct.
69d9641f8dad2eb11ad5f035a41f88c4259b80cd90Anders Carlsson    Value *DstPtr = EmitLValue(E->getArg(0)).getAddress();
70a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    Value *SrcValue = EmitScalarExpr(E->getArg(1));
71a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson
72a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    Value *SrcPtr = CreateTempAlloca(SrcValue->getType(), "dst_ptr");
73a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson
74a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    Builder.CreateStore(SrcValue, SrcPtr, false);
75a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson
76a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    const llvm::Type *Type =
77a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson      llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
78a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson
79a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    DstPtr = Builder.CreateBitCast(DstPtr, Type);
80a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    SrcPtr = Builder.CreateBitCast(SrcPtr, Type);
813eae03e7d165f20a863a9a4d7122ba2a691ab16dChris Lattner    return RValue::get(Builder.CreateCall2(CGM.getIntrinsic(Intrinsic::vacopy),
823eae03e7d165f20a863a9a4d7122ba2a691ab16dChris Lattner                                           DstPtr, SrcPtr));
83a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson  }
84c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson  case Builtin::BI__builtin_abs: {
851feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    Value *ArgValue = EmitScalarExpr(E->getArg(0));
86c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson
879a847f598c4907a72b8593b364b9e6b94b086e75Chris Lattner    Value *NegOp = Builder.CreateNeg(ArgValue, "neg");
881feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    Value *CmpResult =
899a847f598c4907a72b8593b364b9e6b94b086e75Chris Lattner    Builder.CreateICmpSGE(ArgValue, Constant::getNullValue(ArgValue->getType()),
909a847f598c4907a72b8593b364b9e6b94b086e75Chris Lattner                                                            "abscond");
911feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    Value *Result =
92c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson      Builder.CreateSelect(CmpResult, ArgValue, NegOp, "abs");
93c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson
94c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson    return RValue::get(Result);
95c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson  }
963a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson  case Builtin::BI__builtin_ctz:
973a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson  case Builtin::BI__builtin_ctzl:
983a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson  case Builtin::BI__builtin_ctzll: {
993a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    Value *ArgValue = EmitScalarExpr(E->getArg(0));
1003a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson
1013a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    const llvm::Type *ArgType = ArgValue->getType();
1023a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    Value *F = CGM.getIntrinsic(Intrinsic::cttz, &ArgType, 1);
1033a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson
1043a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    const llvm::Type *ResultType = ConvertType(E->getType());
1053a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    Value *Result = Builder.CreateCall(F, ArgValue, "tmp");
1063a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    if (Result->getType() != ResultType)
1073a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson      Result = Builder.CreateIntCast(Result, ResultType, "cast");
1083a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    return RValue::get(Result);
1093a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson  }
110f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman  case Builtin::BI__builtin_clz:
111f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman  case Builtin::BI__builtin_clzl:
112f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman  case Builtin::BI__builtin_clzll: {
113f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman    Value *ArgValue = EmitScalarExpr(E->getArg(0));
114f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman
115f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman    const llvm::Type *ArgType = ArgValue->getType();
116f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman    Value *F = CGM.getIntrinsic(Intrinsic::ctlz, &ArgType, 1);
117f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman
118f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman    const llvm::Type *ResultType = ConvertType(E->getType());
119f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman    Value *Result = Builder.CreateCall(F, ArgValue, "tmp");
120f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman    if (Result->getType() != ResultType)
121f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman      Result = Builder.CreateIntCast(Result, ResultType, "cast");
122f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman    return RValue::get(Result);
123f4e853340590d5c32e58379e8c379ea1777d3101Eli Friedman  }
12404b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_ffs:
12504b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_ffsl:
12604b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_ffsll: {
12704b290030eee33295600728450f348989d1a627eDaniel Dunbar    // ffs(x) -> x ? cttz(x) + 1 : 0
12804b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *ArgValue = EmitScalarExpr(E->getArg(0));
12904b290030eee33295600728450f348989d1a627eDaniel Dunbar
13004b290030eee33295600728450f348989d1a627eDaniel Dunbar    const llvm::Type *ArgType = ArgValue->getType();
13104b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *F = CGM.getIntrinsic(Intrinsic::cttz, &ArgType, 1);
13204b290030eee33295600728450f348989d1a627eDaniel Dunbar
13304b290030eee33295600728450f348989d1a627eDaniel Dunbar    const llvm::Type *ResultType = ConvertType(E->getType());
13404b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *Tmp = Builder.CreateAdd(Builder.CreateCall(F, ArgValue, "tmp"),
13504b290030eee33295600728450f348989d1a627eDaniel Dunbar                                   ConstantInt::get(ArgType, 1), "tmp");
13604b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *Zero = llvm::Constant::getNullValue(ArgType);
13704b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *IsZero = Builder.CreateICmpEQ(ArgValue, Zero, "iszero");
13804b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *Result = Builder.CreateSelect(IsZero, Zero, Tmp, "ffs");
13904b290030eee33295600728450f348989d1a627eDaniel Dunbar    if (Result->getType() != ResultType)
14004b290030eee33295600728450f348989d1a627eDaniel Dunbar      Result = Builder.CreateIntCast(Result, ResultType, "cast");
14104b290030eee33295600728450f348989d1a627eDaniel Dunbar    return RValue::get(Result);
14204b290030eee33295600728450f348989d1a627eDaniel Dunbar  }
14304b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_parity:
14404b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_parityl:
14504b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_parityll: {
14604b290030eee33295600728450f348989d1a627eDaniel Dunbar    // parity(x) -> ctpop(x) & 1
14704b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *ArgValue = EmitScalarExpr(E->getArg(0));
14804b290030eee33295600728450f348989d1a627eDaniel Dunbar
14904b290030eee33295600728450f348989d1a627eDaniel Dunbar    const llvm::Type *ArgType = ArgValue->getType();
15004b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *F = CGM.getIntrinsic(Intrinsic::ctpop, &ArgType, 1);
15104b290030eee33295600728450f348989d1a627eDaniel Dunbar
15204b290030eee33295600728450f348989d1a627eDaniel Dunbar    const llvm::Type *ResultType = ConvertType(E->getType());
15304b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *Tmp = Builder.CreateCall(F, ArgValue, "tmp");
15404b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *Result = Builder.CreateAnd(Tmp, ConstantInt::get(ArgType, 1),
15504b290030eee33295600728450f348989d1a627eDaniel Dunbar                                      "tmp");
15604b290030eee33295600728450f348989d1a627eDaniel Dunbar    if (Result->getType() != ResultType)
15704b290030eee33295600728450f348989d1a627eDaniel Dunbar      Result = Builder.CreateIntCast(Result, ResultType, "cast");
15804b290030eee33295600728450f348989d1a627eDaniel Dunbar    return RValue::get(Result);
15904b290030eee33295600728450f348989d1a627eDaniel Dunbar  }
16004b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_popcount:
16104b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_popcountl:
16204b290030eee33295600728450f348989d1a627eDaniel Dunbar  case Builtin::BI__builtin_popcountll: {
16304b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *ArgValue = EmitScalarExpr(E->getArg(0));
16404b290030eee33295600728450f348989d1a627eDaniel Dunbar
16504b290030eee33295600728450f348989d1a627eDaniel Dunbar    const llvm::Type *ArgType = ArgValue->getType();
16604b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *F = CGM.getIntrinsic(Intrinsic::ctpop, &ArgType, 1);
16704b290030eee33295600728450f348989d1a627eDaniel Dunbar
16804b290030eee33295600728450f348989d1a627eDaniel Dunbar    const llvm::Type *ResultType = ConvertType(E->getType());
16904b290030eee33295600728450f348989d1a627eDaniel Dunbar    Value *Result = Builder.CreateCall(F, ArgValue, "tmp");
17004b290030eee33295600728450f348989d1a627eDaniel Dunbar    if (Result->getType() != ResultType)
17104b290030eee33295600728450f348989d1a627eDaniel Dunbar      Result = Builder.CreateIntCast(Result, ResultType, "cast");
17204b290030eee33295600728450f348989d1a627eDaniel Dunbar    return RValue::get(Result);
17304b290030eee33295600728450f348989d1a627eDaniel Dunbar  }
1741feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner  case Builtin::BI__builtin_expect:
175a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar    // FIXME: pass expect through to LLVM
1761feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    return RValue::get(EmitScalarExpr(E->getArg(0)));
177df4852ac816e6050d53b808b86d7c1c9738eb99eAnders Carlsson  case Builtin::BI__builtin_bswap32:
178df4852ac816e6050d53b808b86d7c1c9738eb99eAnders Carlsson  case Builtin::BI__builtin_bswap64: {
1791feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    Value *ArgValue = EmitScalarExpr(E->getArg(0));
180df4852ac816e6050d53b808b86d7c1c9738eb99eAnders Carlsson    const llvm::Type *ArgType = ArgValue->getType();
1817acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    Value *F = CGM.getIntrinsic(Intrinsic::bswap, &ArgType, 1);
1821feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    return RValue::get(Builder.CreateCall(F, ArgValue, "tmp"));
1834493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar  }
184d5f8a4fd4d6dfb0415b93bb7ab721bba5cab1332Daniel Dunbar  case Builtin::BI__builtin_object_size: {
185d5f8a4fd4d6dfb0415b93bb7ab721bba5cab1332Daniel Dunbar    // FIXME: Implement. For now we just always fail and pretend we
186d5f8a4fd4d6dfb0415b93bb7ab721bba5cab1332Daniel Dunbar    // don't know the object size.
187d5f8a4fd4d6dfb0415b93bb7ab721bba5cab1332Daniel Dunbar    llvm::APSInt TypeArg =
188d5f8a4fd4d6dfb0415b93bb7ab721bba5cab1332Daniel Dunbar      E->getArg(1)->getIntegerConstantExprValue(CGM.getContext());
189d5f8a4fd4d6dfb0415b93bb7ab721bba5cab1332Daniel Dunbar    const llvm::Type *ResType = ConvertType(E->getType());
190d5f8a4fd4d6dfb0415b93bb7ab721bba5cab1332Daniel Dunbar    //    bool UseSubObject = TypeArg.getZExtValue() & 1;
191d5f8a4fd4d6dfb0415b93bb7ab721bba5cab1332Daniel Dunbar    bool UseMinimum = TypeArg.getZExtValue() & 2;
192d5f8a4fd4d6dfb0415b93bb7ab721bba5cab1332Daniel Dunbar    return RValue::get(ConstantInt::get(ResType, UseMinimum ? 0 : -1LL));
193d5f8a4fd4d6dfb0415b93bb7ab721bba5cab1332Daniel Dunbar  }
1944493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar  case Builtin::BI__builtin_prefetch: {
1954493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar    Value *Locality, *RW, *Address = EmitScalarExpr(E->getArg(0));
1964493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar    // FIXME: Technically these constants should of type 'int', yes?
1974493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar    RW = (E->getNumArgs() > 1) ? EmitScalarExpr(E->getArg(1)) :
1984493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar      ConstantInt::get(llvm::Type::Int32Ty, 0);
1994493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar    Locality = (E->getNumArgs() > 2) ? EmitScalarExpr(E->getArg(2)) :
2004493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar      ConstantInt::get(llvm::Type::Int32Ty, 3);
2014493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar    Value *F = CGM.getIntrinsic(Intrinsic::prefetch, 0, 0);
2024493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar    return RValue::get(Builder.CreateCall3(F, Address, RW, Locality));
2034493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar  }
2044493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar  case Builtin::BI__builtin_trap: {
2054493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar    Value *F = CGM.getIntrinsic(Intrinsic::trap, 0, 0);
2064493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar    return RValue::get(Builder.CreateCall(F));
207df4852ac816e6050d53b808b86d7c1c9738eb99eAnders Carlsson  }
2084493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar
209a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar  case Builtin::BI__builtin_powi:
210a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar  case Builtin::BI__builtin_powif:
211a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar  case Builtin::BI__builtin_powil: {
212a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar    Value *Base = EmitScalarExpr(E->getArg(0));
213a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar    Value *Exponent = EmitScalarExpr(E->getArg(1));
214a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar    const llvm::Type *ArgType = Base->getType();
215a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar    Value *F = CGM.getIntrinsic(Intrinsic::powi, &ArgType, 1);
216a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar    return RValue::get(Builder.CreateCall2(F, Base, Exponent, "tmp"));
217a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar  }
218a933c3c052bbd87b01cc6fc7a7745e1c4b1757fbDaniel Dunbar
219fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  case Builtin::BI__builtin_isgreater:
220fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  case Builtin::BI__builtin_isgreaterequal:
221fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  case Builtin::BI__builtin_isless:
222fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  case Builtin::BI__builtin_islessequal:
223fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  case Builtin::BI__builtin_islessgreater:
224fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  case Builtin::BI__builtin_isunordered: {
225fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    // Ordered comparisons: we know the arguments to these are matching scalar
226fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    // floating point values.
227fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    Value *LHS = EmitScalarExpr(E->getArg(0));
228fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    Value *RHS = EmitScalarExpr(E->getArg(1));
229fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner
230fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    switch (BuiltinID) {
231fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    default: assert(0 && "Unknown ordered comparison");
232fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    case Builtin::BI__builtin_isgreater:
233fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      LHS = Builder.CreateFCmpOGT(LHS, RHS, "cmp");
234fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      break;
235fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    case Builtin::BI__builtin_isgreaterequal:
236fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      LHS = Builder.CreateFCmpOGE(LHS, RHS, "cmp");
237fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      break;
238fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    case Builtin::BI__builtin_isless:
239fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      LHS = Builder.CreateFCmpOLT(LHS, RHS, "cmp");
240fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      break;
241fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    case Builtin::BI__builtin_islessequal:
242fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      LHS = Builder.CreateFCmpOLE(LHS, RHS, "cmp");
243fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      break;
244fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    case Builtin::BI__builtin_islessgreater:
245fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      LHS = Builder.CreateFCmpONE(LHS, RHS, "cmp");
246fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      break;
247fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    case Builtin::BI__builtin_isunordered:
248fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      LHS = Builder.CreateFCmpUNO(LHS, RHS, "cmp");
249fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      break;
250fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    }
251fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    // ZExt bool to int type.
252fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    return RValue::get(Builder.CreateZExt(LHS, ConvertType(E->getType()),
253fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner                                          "tmp"));
254fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  }
2559e800e3dd80d77f6c47054738177bf824089f55aChris Lattner  case Builtin::BI__builtin_alloca: {
2569e800e3dd80d77f6c47054738177bf824089f55aChris Lattner    // FIXME: LLVM IR Should allow alloca with an i64 size!
2579e800e3dd80d77f6c47054738177bf824089f55aChris Lattner    Value *Size = EmitScalarExpr(E->getArg(0));
2589e800e3dd80d77f6c47054738177bf824089f55aChris Lattner    Size = Builder.CreateIntCast(Size, llvm::Type::Int32Ty, false, "tmp");
2591caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    return RValue::get(Builder.CreateAlloca(llvm::Type::Int8Ty, Size, "tmp"));
2601caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar  }
2611caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar  case Builtin::BI__builtin_bzero: {
2621caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    Value *Address = EmitScalarExpr(E->getArg(0));
2631caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    Builder.CreateCall4(CGM.getMemSetFn(), Address,
2641caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        llvm::ConstantInt::get(llvm::Type::Int8Ty, 0),
2651caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        EmitScalarExpr(E->getArg(1)),
2661caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        llvm::ConstantInt::get(llvm::Type::Int32Ty, 1));
2671caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    return RValue::get(Address);
2689e800e3dd80d77f6c47054738177bf824089f55aChris Lattner  }
269d4b32e46517358f34e8cfbea35010adfcc3786e0Eli Friedman  case Builtin::BI__builtin_memcpy: {
2701caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    Value *Address = EmitScalarExpr(E->getArg(0));
2711caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    Builder.CreateCall4(CGM.getMemCpyFn(), Address,
2721caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        EmitScalarExpr(E->getArg(1)),
2731caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        EmitScalarExpr(E->getArg(2)),
2741caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        llvm::ConstantInt::get(llvm::Type::Int32Ty, 1));
2751caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    return RValue::get(Address);
2761caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar  }
2771caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar  case Builtin::BI__builtin_memmove: {
2781caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    Value *Address = EmitScalarExpr(E->getArg(0));
2791caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    Builder.CreateCall4(CGM.getMemMoveFn(), Address,
2801caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        EmitScalarExpr(E->getArg(1)),
2811caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        EmitScalarExpr(E->getArg(2)),
2821caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        llvm::ConstantInt::get(llvm::Type::Int32Ty, 1));
2831caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    return RValue::get(Address);
2841caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar  }
2851caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar  case Builtin::BI__builtin_memset: {
2861caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    Value *Address = EmitScalarExpr(E->getArg(0));
2871caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    Builder.CreateCall4(CGM.getMemSetFn(), Address,
2881caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        EmitScalarExpr(E->getArg(1)),
2891caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        EmitScalarExpr(E->getArg(2)),
2901caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar                        llvm::ConstantInt::get(llvm::Type::Int32Ty, 1));
2911caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar    return RValue::get(Address);
292d4b32e46517358f34e8cfbea35010adfcc3786e0Eli Friedman  }
293256f77e431bc6b920ec94cf0bb4ad339ca21b8c9Eli Friedman  case Builtin::BI__builtin_return_address: {
294256f77e431bc6b920ec94cf0bb4ad339ca21b8c9Eli Friedman    Value *F = CGM.getIntrinsic(Intrinsic::returnaddress, 0, 0);
295256f77e431bc6b920ec94cf0bb4ad339ca21b8c9Eli Friedman    return RValue::get(Builder.CreateCall(F, EmitScalarExpr(E->getArg(0))));
296256f77e431bc6b920ec94cf0bb4ad339ca21b8c9Eli Friedman  }
297256f77e431bc6b920ec94cf0bb4ad339ca21b8c9Eli Friedman  case Builtin::BI__builtin_frame_address: {
298256f77e431bc6b920ec94cf0bb4ad339ca21b8c9Eli Friedman    Value *F = CGM.getIntrinsic(Intrinsic::frameaddress, 0, 0);
299256f77e431bc6b920ec94cf0bb4ad339ca21b8c9Eli Friedman    return RValue::get(Builder.CreateCall(F, EmitScalarExpr(E->getArg(0))));
300256f77e431bc6b920ec94cf0bb4ad339ca21b8c9Eli Friedman  }
3011ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_fetch_and_add:
30209b6bf5bfa2ba9cbbd353cbd7846af8f49b020e7Mon P Wang    return EmitBinaryAtomic(*this, Intrinsic::atomic_load_add, E);
3031ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_fetch_and_sub:
30409b6bf5bfa2ba9cbbd353cbd7846af8f49b020e7Mon P Wang    return EmitBinaryAtomic(*this, Intrinsic::atomic_load_sub, E);
3051ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_fetch_and_min:
3061ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang    return EmitBinaryAtomic(*this, Intrinsic::atomic_load_min, E);
3071ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_fetch_and_max:
3081ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang    return EmitBinaryAtomic(*this, Intrinsic::atomic_load_max, E);
3091ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_fetch_and_umin:
3101ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang    return EmitBinaryAtomic(*this, Intrinsic::atomic_load_umin, E);
3111ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_fetch_and_umax:
3121ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang    return EmitBinaryAtomic(*this, Intrinsic::atomic_load_umax, E);
3131ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_fetch_and_and:
3141ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang    return EmitBinaryAtomic(*this, Intrinsic::atomic_load_and, E);
3151ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_fetch_and_or:
3161ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang    return EmitBinaryAtomic(*this, Intrinsic::atomic_load_or, E);
3171ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_fetch_and_xor:
3181ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang    return EmitBinaryAtomic(*this, Intrinsic::atomic_load_xor, E);
3191ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_val_compare_and_swap: {
320c5004516489c931cf839bdbdde5a76e4074cc888Mon P Wang    const llvm::Type *ResType[2];
321c5004516489c931cf839bdbdde5a76e4074cc888Mon P Wang    ResType[0]= ConvertType(E->getType());
322c5004516489c931cf839bdbdde5a76e4074cc888Mon P Wang    ResType[1] = ConvertType(E->getArg(0)->getType());
323c5004516489c931cf839bdbdde5a76e4074cc888Mon P Wang    Value *AtomF = CGM.getIntrinsic(Intrinsic::atomic_cmp_swap, ResType, 2);
324958444659c5287a81a43188bfaa2a4902752b947Anders Carlsson    return RValue::get(Builder.CreateCall3(AtomF,
325958444659c5287a81a43188bfaa2a4902752b947Anders Carlsson                                           EmitScalarExpr(E->getArg(0)),
326958444659c5287a81a43188bfaa2a4902752b947Anders Carlsson                                           EmitScalarExpr(E->getArg(1)),
327958444659c5287a81a43188bfaa2a4902752b947Anders Carlsson                                           EmitScalarExpr(E->getArg(2))));
328022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson  }
3291ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  case Builtin::BI__sync_lock_test_and_set:
3307ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman    return EmitBinaryAtomic(*this, Intrinsic::atomic_swap, E);
3317ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman  }
332b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
333b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  // If this is an alias for a libm function (e.g. __builtin_sin) turn it into
334b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  // that function.
335b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  if (getContext().BuiltinInfo.isLibFunction(BuiltinID))
336b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    return EmitCallExpr(CGM.getBuiltinLibFunction(BuiltinID),
337b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner                        E->getCallee()->getType(), E->arg_begin(),
338b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner                        E->arg_end());
339b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
340b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  // See if we have a target specific intrinsic.
341b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  Intrinsic::ID IntrinsicID;
342b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  const char *TargetPrefix = Target.getTargetPrefix();
343b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  const char *BuiltinName = getContext().BuiltinInfo.GetName(BuiltinID);
344b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner#define GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN
345b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner#include "llvm/Intrinsics.gen"
346b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner#undef GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN
347b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
348b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  if (IntrinsicID != Intrinsic::not_intrinsic) {
349b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    SmallVector<Value*, 16> Args;
350b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
351b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    Function *F = CGM.getIntrinsic(IntrinsicID);
352b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    const llvm::FunctionType *FTy = F->getFunctionType();
353b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
354b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) {
355b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      Value *ArgValue = EmitScalarExpr(E->getArg(i));
356b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
357b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      // If the intrinsic arg type is different from the builtin arg type
358b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      // we need to do a bit cast.
359b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      const llvm::Type *PTy = FTy->getParamType(i);
360b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      if (PTy != ArgValue->getType()) {
361b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner        assert(PTy->canLosslesslyBitCastTo(FTy->getParamType(i)) &&
362b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner               "Must be able to losslessly bit cast to param");
363b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner        ArgValue = Builder.CreateBitCast(ArgValue, PTy);
364b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      }
365b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
366b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      Args.push_back(ArgValue);
367b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    }
368b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
369b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    Value *V = Builder.CreateCall(F, &Args[0], &Args[0] + Args.size());
370b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    QualType BuiltinRetType = E->getType();
371b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
372b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    const llvm::Type *RetTy = llvm::Type::VoidTy;
373b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    if (!BuiltinRetType->isVoidType()) RetTy = ConvertType(BuiltinRetType);
374b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
375b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    if (RetTy != V->getType()) {
376b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      assert(V->getType()->canLosslesslyBitCastTo(RetTy) &&
377b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner             "Must be able to losslessly bit cast result type");
378b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner      V = Builder.CreateBitCast(V, RetTy);
379b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    }
380b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
381b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    return RValue::get(V);
382b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  }
383b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
384b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  // See if we have a target specific builtin that needs to be lowered.
385f02e9ddf5efc75917af712b3c7f909581205f0a5Daniel Dunbar  if (Value *V = EmitTargetBuiltinExpr(BuiltinID, E))
386b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    return RValue::get(V);
387b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
388488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar  ErrorUnsupported(E, "builtin function");
389b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
390b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  // Unknown builtin, for now just dump it out and return undef.
391b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  if (hasAggregateLLVMType(E->getType()))
392b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    return RValue::getAggregate(CreateTempAlloca(ConvertType(E->getType())));
393b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  return RValue::get(UndefValue::get(ConvertType(E->getType())));
394b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner}
395564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson
396f02e9ddf5efc75917af712b3c7f909581205f0a5Daniel DunbarValue *CodeGenFunction::EmitTargetBuiltinExpr(unsigned BuiltinID,
397f02e9ddf5efc75917af712b3c7f909581205f0a5Daniel Dunbar                                              const CallExpr *E) {
398f02e9ddf5efc75917af712b3c7f909581205f0a5Daniel Dunbar  const char *TargetPrefix = Target.getTargetPrefix();
399f02e9ddf5efc75917af712b3c7f909581205f0a5Daniel Dunbar  if (strcmp(TargetPrefix, "x86") == 0)
400f02e9ddf5efc75917af712b3c7f909581205f0a5Daniel Dunbar    return EmitX86BuiltinExpr(BuiltinID, E);
401f02e9ddf5efc75917af712b3c7f909581205f0a5Daniel Dunbar  else if (strcmp(TargetPrefix, "ppc") == 0)
402f02e9ddf5efc75917af712b3c7f909581205f0a5Daniel Dunbar    return EmitPPCBuiltinExpr(BuiltinID, E);
403f02e9ddf5efc75917af712b3c7f909581205f0a5Daniel Dunbar  return 0;
404f02e9ddf5efc75917af712b3c7f909581205f0a5Daniel Dunbar}
405f02e9ddf5efc75917af712b3c7f909581205f0a5Daniel Dunbar
4061feedd84221e8dbcc3faf3de27cc42b559db845dChris LattnerValue *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
4071feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner                                           const CallExpr *E) {
4082929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson
4092929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  llvm::SmallVector<Value*, 4> Ops;
4102929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson
4112929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  for (unsigned i = 0, e = E->getNumArgs(); i != e; i++)
4122929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    Ops.push_back(EmitScalarExpr(E->getArg(i)));
4132929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson
414564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson  switch (BuiltinID) {
41546a26b0b0e2ec1557bad9b70e8e20836524ebdfcAnders Carlsson  default: return 0;
41646a26b0b0e2ec1557bad9b70e8e20836524ebdfcAnders Carlsson  case X86::BI__builtin_ia32_mulps:
4172929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    return Builder.CreateMul(Ops[0], Ops[1], "mulps");
418e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_mulpd:
419e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateMul(Ops[0], Ops[1], "mulpd");
4204e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_pand:
421e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_pand128:
4222929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    return Builder.CreateAnd(Ops[0], Ops[1], "pand");
4234e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_por:
424e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_por128:
425e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateOr(Ops[0], Ops[1], "por");
4264e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_pxor:
427e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_pxor128:
428e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateXor(Ops[0], Ops[1], "pxor");
429e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_pandn:
430e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_pandn128:
4312929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    Ops[0] = Builder.CreateNot(Ops[0], "tmp");
4322929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    return Builder.CreateAnd(Ops[0], Ops[1], "pandn");
4334e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_paddb:
434e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_paddb128:
4354e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_paddd:
436e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_paddd128:
4374e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_paddq:
438e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_paddq128:
4394e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_paddw:
440e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_paddw128:
441cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_addps:
442e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_addpd:
443cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return Builder.CreateAdd(Ops[0], Ops[1], "add");
4444e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_psubb:
445e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psubb128:
4464e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_psubd:
447e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psubd128:
4484e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_psubq:
449e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psubq128:
4504e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_psubw:
451e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psubw128:
452cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_subps:
453e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_subpd:
454cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return Builder.CreateSub(Ops[0], Ops[1], "sub");
455cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_divps:
456cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return Builder.CreateFDiv(Ops[0], Ops[1], "divps");
457e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_divpd:
458e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateFDiv(Ops[0], Ops[1], "divpd");
459db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_pmullw:
460e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_pmullw128:
4612929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    return Builder.CreateMul(Ops[0], Ops[1], "pmul");
462db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_punpckhbw:
4637acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return EmitShuffleVector(Ops[0], Ops[1], 4, 12, 5, 13, 6, 14, 7, 15,
464db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson                             "punpckhbw");
465e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_punpckhbw128:
466e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1],  8, 24,  9, 25, 10, 26, 11, 27,
467e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman                                             12, 28, 13, 29, 14, 30, 15, 31,
468e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman                             "punpckhbw");
469db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_punpckhwd:
4707acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return EmitShuffleVector(Ops[0], Ops[1], 2, 6, 3, 7, "punpckhwd");
471e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_punpckhwd128:
472e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 4, 12, 5, 13, 6, 14, 7, 15,
473e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman                             "punpckhwd");
474db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_punpckhdq:
4757acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return EmitShuffleVector(Ops[0], Ops[1], 1, 3, "punpckhdq");
476e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_punpckhdq128:
477e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 2, 6, 3, 7, "punpckhdq");
478abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman  case X86::BI__builtin_ia32_punpckhqdq128:
479abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 1, 3, "punpckhqdq");
480db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_punpcklbw:
4817acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return EmitShuffleVector(Ops[0], Ops[1], 0, 8, 1, 9, 2, 10, 3, 11,
482db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson                             "punpcklbw");
483db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_punpcklwd:
4847acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return EmitShuffleVector(Ops[0], Ops[1], 0, 4, 1, 5, "punpcklwd");
485db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_punpckldq:
4867acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return EmitShuffleVector(Ops[0], Ops[1], 0, 2, "punpckldq");
487e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_punpckldq128:
488e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 0, 4, 1, 5, "punpckldq");
489abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman  case X86::BI__builtin_ia32_punpcklqdq128:
490abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 0, 2, "punpcklqdq");
491e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_pslldi128:
492e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psllqi128:
493e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psllwi128:
494e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psradi128:
495e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psrawi128:
496e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psrldi128:
497e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psrlqi128:
498e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psrlwi128: {
499e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateZExt(Ops[1], llvm::Type::Int64Ty, "zext");
500e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *Ty = llvm::VectorType::get(llvm::Type::Int64Ty, 2);
501e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Value *Zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0);
502e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateInsertElement(llvm::UndefValue::get(Ty),
503e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman                                         Ops[1], Zero, "insert");
504e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateBitCast(Ops[1], Ops[0]->getType(), "bitcast");
505e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const char *name = 0;
506e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Intrinsic::ID ID = Intrinsic::not_intrinsic;
507e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
508e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    switch (BuiltinID) {
509e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    default: assert(0 && "Unsupported shift intrinsic!");
510e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_pslldi128:
511e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "pslldi";
512e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psll_d;
513e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
514e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psllqi128:
515e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psllqi";
516e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psll_q;
517e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
518e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psllwi128:
519e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psllwi";
520e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psll_w;
521e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
522e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psradi128:
523e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psradi";
524e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psra_d;
525e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
526e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psrawi128:
527e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psrawi";
528e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psra_w;
529e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
530e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psrldi128:
531e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psrldi";
532e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psrl_d;
533e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
534e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psrlqi128:
535e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psrlqi";
536e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psrl_q;
537e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
538e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psrlwi128:
539e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psrlwi";
540e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psrl_w;
541e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
542e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    }
543e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Function *F = CGM.getIntrinsic(ID);
544e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name);
545e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
5462929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_pslldi:
5472929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psllqi:
5482929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psllwi:
5492929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psradi:
5502929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psrawi:
5512929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psrldi:
5522929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psrlqi:
5532929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psrlwi: {
5542929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    Ops[1] = Builder.CreateZExt(Ops[1], llvm::Type::Int64Ty, "zext");
5552929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    const llvm::Type *Ty = llvm::VectorType::get(llvm::Type::Int64Ty, 1);
5562929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    Ops[1] = Builder.CreateBitCast(Ops[1], Ty, "bitcast");
5572929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    const char *name = 0;
5582929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    Intrinsic::ID ID = Intrinsic::not_intrinsic;
5594e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson
5602929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    switch (BuiltinID) {
5612929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    default: assert(0 && "Unsupported shift intrinsic!");
5622929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_pslldi:
5632929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "pslldi";
5642929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psll_d;
5652929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
5662929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psllqi:
5672929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psllqi";
5682929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psll_q;
5692929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
5702929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psllwi:
5712929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psllwi";
5722929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psll_w;
5732929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
5742929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psradi:
5752929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psradi";
5762929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psra_d;
5772929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
5782929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psrawi:
5792929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psrawi";
5802929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psra_w;
5812929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
5822929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psrldi:
5832929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psrldi";
5842929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psrl_d;
5852929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
5862929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psrlqi:
5872929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psrlqi";
5882929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psrl_q;
5892929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
5902929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psrlwi:
5912929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psrlwi";
5922929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psrl_w;
5932929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
5942929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    }
5957acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    llvm::Function *F = CGM.getIntrinsic(ID);
5962929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name);
5972929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  }
5987ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman  case X86::BI__builtin_ia32_pshuflw: {
5997ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman    unsigned i = cast<ConstantInt>(Ops[1])->getZExtValue();
6007ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman    return EmitShuffleVector(Ops[0], Ops[0],
6017ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman                             i & 0x3, (i & 0xc) >> 2,
6027ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman                             (i & 0x30) >> 4, (i & 0xc0) >> 6, 4, 5, 6, 7,
6037ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman                             "pshuflw");
6047ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman  }
6057ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman  case X86::BI__builtin_ia32_pshufhw: {
6067ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman    unsigned i = cast<ConstantInt>(Ops[1])->getZExtValue();
6077ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman    return EmitShuffleVector(Ops[0], Ops[0], 0, 1, 2, 3,
6087ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman                             4 + (i & 0x3), 4 + ((i & 0xc) >> 2),
6097ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman                             4 + ((i & 0x30) >> 4), 4 + ((i & 0xc0) >> 6),
6107ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman                             "pshufhw");
6117ea2e3f6aae9b7511686d3d26dee690fee81c3aaNate Begeman  }
6122929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_pshufd: {
6137acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    unsigned i = cast<ConstantInt>(Ops[1])->getZExtValue();
6142929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    return EmitShuffleVector(Ops[0], Ops[0],
6154e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson                             i & 0x3, (i & 0xc) >> 2,
6164e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson                             (i & 0x30) >> 4, (i & 0xc0) >> 6,
6174e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson                             "pshufd");
6184e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  }
6196086bbd1799e22e75561c3d31dc9b923f0508fa5Anders Carlsson  case X86::BI__builtin_ia32_vec_init_v4hi:
6206086bbd1799e22e75561c3d31dc9b923f0508fa5Anders Carlsson  case X86::BI__builtin_ia32_vec_init_v8qi:
6216086bbd1799e22e75561c3d31dc9b923f0508fa5Anders Carlsson  case X86::BI__builtin_ia32_vec_init_v2si:
6226086bbd1799e22e75561c3d31dc9b923f0508fa5Anders Carlsson    return EmitVector(&Ops[0], Ops.size());
6236086bbd1799e22e75561c3d31dc9b923f0508fa5Anders Carlsson  case X86::BI__builtin_ia32_vec_ext_v2si:
624e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_vec_ext_v2di:
625e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_vec_ext_v4sf:
626e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_vec_ext_v4si:
627e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_vec_ext_v2df:
6286086bbd1799e22e75561c3d31dc9b923f0508fa5Anders Carlsson    return Builder.CreateExtractElement(Ops[0], Ops[1], "result");
629cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpordss:
630e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpordsd:
631cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpunordss:
632e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpunordsd:
633e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpeqss:
634e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpeqsd:
635e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpltss:
636e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpltsd:
637cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpless:
638e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmplesd:
639cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpneqss:
640e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpneqsd:
641e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnltss:
642e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnltsd:
643e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnless:
644e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnlesd: {
6457acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    unsigned i = 0;
646cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    const char *name = 0;
647cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    switch (BuiltinID) {
648cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    default: assert(0 && "Unknown compare builtin!");
649cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpeqss:
650e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpeqsd:
651cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 0;
652e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpeq";
653cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
654cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpltss:
655e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpltsd:
656cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 1;
657e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmplt";
658cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
659cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpless:
660e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmplesd:
661cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 2;
662e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmple";
663cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
664cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpunordss:
665e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpunordsd:
666cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 3;
667e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpunord";
668cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
669cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpneqss:
670e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpneqsd:
671cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 4;
672e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpneq";
673cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
674cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpnltss:
675e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpnltsd:
676cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 5;
677e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpntl";
678cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
679cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpnless:
680e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpnlesd:
681cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 6;
682e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpnle";
683cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
684cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpordss:
685e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpordsd:
686cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 7;
687e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpord";
688cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
689cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    }
690cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson
691e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Function *F;
692e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    if (cast<llvm::VectorType>(Ops[0]->getType())->getElementType() ==
693e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman        llvm::Type::FloatTy)
694e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      F = CGM.getIntrinsic(Intrinsic::x86_sse_cmp_ss);
695e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    else
696e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      F = CGM.getIntrinsic(Intrinsic::x86_sse2_cmp_sd);
697e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
698cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    Ops.push_back(llvm::ConstantInt::get(llvm::Type::Int8Ty, i));
699cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name);
700cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  }
701e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_ldmxcsr: {
702e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *PtrTy = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
703e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Value *One = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1);
704e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Value *Tmp = Builder.CreateAlloca(llvm::Type::Int32Ty, One, "tmp");
705e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Builder.CreateStore(Ops[0], Tmp);
706e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_ldmxcsr),
7073eae03e7d165f20a863a9a4d7122ba2a691ab16dChris Lattner                              Builder.CreateBitCast(Tmp, PtrTy));
708e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
709e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_stmxcsr: {
710e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *PtrTy = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
711e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Value *One = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1);
712e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Value *Tmp = Builder.CreateAlloca(llvm::Type::Int32Ty, One, "tmp");
713e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    One = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_stmxcsr),
7143eae03e7d165f20a863a9a4d7122ba2a691ab16dChris Lattner                             Builder.CreateBitCast(Tmp, PtrTy));
715e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateLoad(Tmp, "stmxcsr");
716e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
717cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpordps:
718e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpordpd:
719cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpunordps:
720e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpunordpd:
721cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpeqps:
722e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpeqpd:
723cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpltps:
724e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpltpd:
725cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpleps:
726e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmplepd:
727cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpneqps:
728e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpneqpd:
729cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpngtps:
730e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpngtpd:
731cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpnltps:
732e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnltpd:
733cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpgtps:
734e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpgtpd:
735cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpgeps:
736e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpgepd:
737cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpngeps:
738e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpngepd:
739e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnleps:
740e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnlepd: {
7417acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    unsigned i = 0;
742cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    const char *name = 0;
743cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    bool ShouldSwap = false;
744cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    switch (BuiltinID) {
745cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    default: assert(0 && "Unknown compare builtin!");
746e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpeqps:
747e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpeqpd:    i = 0; name = "cmpeq"; break;
748e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpltps:
749e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpltpd:    i = 1; name = "cmplt"; break;
750e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpleps:
751e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmplepd:    i = 2; name = "cmple"; break;
752e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpunordps:
753e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpunordpd: i = 3; name = "cmpunord"; break;
754e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpneqps:
755e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpneqpd:   i = 4; name = "cmpneq"; break;
756e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpnltps:
757e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpnltpd:   i = 5; name = "cmpntl"; break;
758e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpnleps:
759e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpnlepd:   i = 6; name = "cmpnle"; break;
760e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpordps:
761e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpordpd:   i = 7; name = "cmpord"; break;
762cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpgtps:
763e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpgtpd:
7647acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner      ShouldSwap = true;
765cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 1;
766e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpgt";
767cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
768cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpgeps:
769e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpgepd:
770cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 2;
771e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpge";
772cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      ShouldSwap = true;
773cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
774cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpngtps:
775e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpngtpd:
776cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 5;
777e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpngt";
778cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      ShouldSwap = true;
779cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
780cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpngeps:
781e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpngepd:
782cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 6;
783e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpnge";
784cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      ShouldSwap = true;
785cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
786cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    }
787cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson
788cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    if (ShouldSwap)
789cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      std::swap(Ops[0], Ops[1]);
790e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
791e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Function *F;
792e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    if (cast<llvm::VectorType>(Ops[0]->getType())->getElementType() ==
793e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman        llvm::Type::FloatTy)
794e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      F = CGM.getIntrinsic(Intrinsic::x86_sse_cmp_ps);
795e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    else
796e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      F = CGM.getIntrinsic(Intrinsic::x86_sse2_cmp_pd);
797cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson
798cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    Ops.push_back(llvm::ConstantInt::get(llvm::Type::Int8Ty, i));
799cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name);
800cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  }
801cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_movss:
802cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return EmitShuffleVector(Ops[0], Ops[1], 4, 1, 2, 3, "movss");
803730f2c13e8ff0a2a3cc54fce9913add68107cb51Torok Edwin  case X86::BI__builtin_ia32_shufps: {
8047acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    unsigned i = cast<ConstantInt>(Ops[2])->getZExtValue();
805cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return EmitShuffleVector(Ops[0], Ops[1],
806cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson                             i & 0x3, (i & 0xc) >> 2,
807cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson                             ((i & 0x30) >> 4) + 4,
80809b6bf5bfa2ba9cbbd353cbd7846af8f49b020e7Mon P Wang                             ((i & 0xc0) >> 6) + 4, "shufps");
809730f2c13e8ff0a2a3cc54fce9913add68107cb51Torok Edwin  }
8106c5df7f54f40090df6032a74e650b8e4d1c96207Mon P Wang  case X86::BI__builtin_ia32_shufpd: {
8116c5df7f54f40090df6032a74e650b8e4d1c96207Mon P Wang    unsigned i = cast<ConstantInt>(Ops[2])->getZExtValue();
8126c5df7f54f40090df6032a74e650b8e4d1c96207Mon P Wang    return EmitShuffleVector(Ops[0], Ops[1], i & 1, (i & 2) + 2, "shufpd");
8136c5df7f54f40090df6032a74e650b8e4d1c96207Mon P Wang  }
814dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman  case X86::BI__builtin_ia32_punpcklbw128:
815dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 0, 16, 1, 17, 2, 18, 3, 19,
816dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman                                             4, 20, 5, 21, 6, 22, 7, 23,
817dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman                                             "punpcklbw");
818dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman  case X86::BI__builtin_ia32_punpcklwd128:
819dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 0, 8, 1, 9, 2, 10, 3, 11,
820dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman                             "punpcklwd");
821e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_movlhps:
822e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 0, 1, 4, 5, "movlhps");
823e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_movhlps:
824e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 6, 7, 2, 3, "movhlps");
825e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_unpckhps:
826e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 2, 6, 3, 7, "unpckhps");
827e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_unpcklps:
828e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 0, 4, 1, 5, "unpcklps");
829abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman  case X86::BI__builtin_ia32_unpckhpd:
830abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 1, 3, "unpckhpd");
831abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman  case X86::BI__builtin_ia32_unpcklpd:
832abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 0, 2, "unpcklpd");
833abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman  case X86::BI__builtin_ia32_movsd:
834abfaf9984eee3d076ded8770bf9fce156f10c185Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 2, 1, "movsd");
835e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_movqv4si: {
836e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *Ty = llvm::VectorType::get(llvm::Type::Int64Ty, 2);
837e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateBitCast(Ops[0], Ty);
838e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
839e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_loadlps:
840e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_loadhps: {
841e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // FIXME: This should probably be represented as
842e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // shuffle (dst, (v4f32 (insert undef, (load i64), 0)), shuf mask hi/lo)
843e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *EltTy = llvm::Type::DoubleTy;
844e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *VecTy = llvm::VectorType::get(EltTy, 2);
845e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *OrigTy = Ops[0]->getType();
846e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    unsigned Index = BuiltinID == X86::BI__builtin_ia32_loadlps ? 0 : 1;
847e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Value *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, Index);
848e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateBitCast(Ops[1], llvm::PointerType::getUnqual(EltTy));
849e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateLoad(Ops[1], "tmp");
850e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast");
851e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateInsertElement(Ops[0], Ops[1], Idx, "loadps");
852e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateBitCast(Ops[0], OrigTy, "loadps");
853e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
8547f57b000f232bc596dca627c976ace250c8171e3Mon P Wang  case X86::BI__builtin_ia32_loadlpd:
8557f57b000f232bc596dca627c976ace250c8171e3Mon P Wang  case X86::BI__builtin_ia32_loadhpd: {
8567f57b000f232bc596dca627c976ace250c8171e3Mon P Wang    Ops[1] = Builder.CreateLoad(Ops[1], "tmp");
8577f57b000f232bc596dca627c976ace250c8171e3Mon P Wang    unsigned Index = BuiltinID == X86::BI__builtin_ia32_loadlpd ? 0 : 1;
8587f57b000f232bc596dca627c976ace250c8171e3Mon P Wang    llvm::Value *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, Index);
8597f57b000f232bc596dca627c976ace250c8171e3Mon P Wang    return Builder.CreateInsertElement(Ops[0], Ops[1], Idx, "loadpd");
8607f57b000f232bc596dca627c976ace250c8171e3Mon P Wang  }
861e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_storehps:
862e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_storelps: {
863e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *EltTy = llvm::Type::Int64Ty;
864e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *PtrTy = llvm::PointerType::getUnqual(EltTy);
865e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *VecTy = llvm::VectorType::get(EltTy, 2);
866e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
867e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // cast val v2i64
868e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateBitCast(Ops[1], VecTy, "cast");
869e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
870e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // extract (0, 1)
871e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    unsigned Index = BuiltinID == X86::BI__builtin_ia32_storelps ? 0 : 1;
872e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Value *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, Index);
873e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateExtractElement(Ops[1], Idx, "extract");
874e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
875e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // cast pointer to i64 & store
876e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateBitCast(Ops[0], PtrTy);
877e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateStore(Ops[1], Ops[0]);
878e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
879e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_loadlv4si: {
880e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // load i64
881e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *EltTy = llvm::Type::Int64Ty;
882e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *PtrTy = llvm::PointerType::getUnqual(EltTy);
883e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateBitCast(Ops[0], PtrTy);
884e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateLoad(Ops[0], "load");
885e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
886e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // scalar to vector: insert i64 into 2 x i64 undef
887e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *VecTy = llvm::VectorType::get(EltTy, 2);
888e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Value *Zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0);
889e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateInsertElement(llvm::UndefValue::get(VecTy),
890e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman                                         Ops[0], Zero, "s2v");
891e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
892e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // shuffle into zero vector.
893e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    std::vector<llvm::Constant *>Elts;
894e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Elts.resize(2, llvm::ConstantInt::get(EltTy, 0));
895e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Value *ZV = ConstantVector::get(Elts);
896e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = EmitShuffleVector(ZV, Ops[0], 2, 1, "loadl");
897e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
898e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // bitcast to result.
899e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateBitCast(Ops[0],
900e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman                                 llvm::VectorType::get(llvm::Type::Int32Ty, 4));
901e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
90224512501319aa6d7f70b1bd79470df0197b832c8Nate Begeman  case X86::BI__builtin_ia32_vec_set_v4hi:
90324512501319aa6d7f70b1bd79470df0197b832c8Nate Begeman  case X86::BI__builtin_ia32_vec_set_v8hi:
90424512501319aa6d7f70b1bd79470df0197b832c8Nate Begeman    return Builder.CreateInsertElement(Ops[0], Ops[1], Ops[2], "pinsrw");
905bc4f4030e245e36642f894d848f6a8bf94426cc2Mon P Wang  case X86::BI__builtin_ia32_vec_set_v4si:
906bc4f4030e245e36642f894d848f6a8bf94426cc2Mon P Wang    return Builder.CreateInsertElement(Ops[0], Ops[1], Ops[2], "pinsrd");
907bc4f4030e245e36642f894d848f6a8bf94426cc2Mon P Wang  case X86::BI__builtin_ia32_vec_set_v2di:
908bc4f4030e245e36642f894d848f6a8bf94426cc2Mon P Wang    return Builder.CreateInsertElement(Ops[0], Ops[1], Ops[2], "pinsrq");
909e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_andps:
910e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_andpd:
911e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_andnps:
912e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_andnpd:
913e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_orps:
914e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_orpd:
915e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_xorpd:
916e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_xorps: {
917e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *ITy = llvm::VectorType::get(llvm::Type::Int32Ty, 4);
918e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *FTy = Ops[0]->getType();
919e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateBitCast(Ops[0], ITy, "bitcast");
920e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateBitCast(Ops[1], ITy, "bitcast");
921e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    switch (BuiltinID) {
922e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_andps:
923e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateAnd(Ops[0], Ops[1], "andps");
924e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
925e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_andpd:
926e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateAnd(Ops[0], Ops[1], "andpd");
927e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
928e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_andnps:
929e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateNot(Ops[0], "not");
930e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateAnd(Ops[0], Ops[1], "andnps");
931e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
932e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_andnpd:
933e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateNot(Ops[0], "not");
934e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateAnd(Ops[0], Ops[1], "andnpd");
935e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
936e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_orps:
937e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateOr(Ops[0], Ops[1], "orps");
938e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
939e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_orpd:
940e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateOr(Ops[0], Ops[1], "orpd");
941e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
942e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_xorps:
943e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateXor(Ops[0], Ops[1], "xorps");
944e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
945e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_xorpd:
946e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateXor(Ops[0], Ops[1], "xorpd");
947e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
948e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    }
949e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateBitCast(Ops[0], FTy, "bitcast");
950e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
951564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson  }
952564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson}
953564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson
9541feedd84221e8dbcc3faf3de27cc42b559db845dChris LattnerValue *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
9551feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner                                           const CallExpr *E) {
956564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson  switch (BuiltinID) {
95746a26b0b0e2ec1557bad9b70e8e20836524ebdfcAnders Carlsson  default: return 0;
958564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson  }
959564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson}
960