CGBuiltin.cpp revision 3eae03e7d165f20a863a9a4d7122ba2a691ab16d
1022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson//===---- CGBuiltin.cpp - Emit LLVM Code for builtins ---------------------===//
2022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson//
3022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson//                     The LLVM Compiler Infrastructure
4022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
7022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson//
8022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson//===----------------------------------------------------------------------===//
9022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson//
10022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson// This contains code to emit Builtin calls as LLVM code.
11022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson//
12022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson//===----------------------------------------------------------------------===//
13022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson
14022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson#include "CodeGenFunction.h"
15022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson#include "CodeGenModule.h"
16ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson#include "clang/Basic/TargetInfo.h"
17bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner#include "clang/AST/ASTContext.h"
18022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson#include "clang/AST/Builtins.h"
19022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson#include "clang/AST/Expr.h"
20564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson#include "clang/AST/TargetBuiltins.h"
216de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner#include "llvm/Constants.h"
22c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner#include "llvm/Function.h"
23793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson#include "llvm/Intrinsics.h"
24022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlssonusing namespace clang;
25022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlssonusing namespace CodeGen;
26ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlssonusing namespace llvm;
27ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson
286de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris LattnerRValue CodeGenFunction::EmitBuiltinExpr(unsigned BuiltinID, const CallExpr *E) {
296de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner  switch (BuiltinID) {
30ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson  default: {
31c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner    if (getContext().BuiltinInfo.isLibFunction(BuiltinID))
32eed50586435ce4d2690f44ceabd69ad531d80970Nate Begeman      return EmitCallExpr(CGM.getBuiltinLibFunction(BuiltinID),
335193b8a3e57c4f696161aeddfe8227c294c0a7feEli Friedman                          E->getCallee()->getType(), E->arg_begin(),
345193b8a3e57c4f696161aeddfe8227c294c0a7feEli Friedman                          E->getNumArgs());
35ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson
36ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson    // See if we have a target specific intrinsic.
371feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    Intrinsic::ID IntrinsicID;
38ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson    const char *TargetPrefix = Target.getTargetPrefix();
39ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson    const char *BuiltinName = getContext().BuiltinInfo.GetName(BuiltinID);
40ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson#define GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN
41ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson#include "llvm/Intrinsics.gen"
42ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson#undef GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN
43ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson
44ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson    if (IntrinsicID != Intrinsic::not_intrinsic) {
451feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner      SmallVector<Value*, 16> Args;
46ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson
477acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner      Function *F = CGM.getIntrinsic(IntrinsicID);
48ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson      const llvm::FunctionType *FTy = F->getFunctionType();
49ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson
50ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson      for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) {
511feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner        Value *ArgValue = EmitScalarExpr(E->getArg(i));
52ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson
53ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson        // If the intrinsic arg type is different from the builtin arg type
54ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson        // we need to do a bit cast.
55ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson        const llvm::Type *PTy = FTy->getParamType(i);
56ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson        if (PTy != ArgValue->getType()) {
57ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson          assert(PTy->canLosslesslyBitCastTo(FTy->getParamType(i)) &&
58ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson                 "Must be able to losslessly bit cast to param");
59ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson          ArgValue = Builder.CreateBitCast(ArgValue, PTy);
60ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson        }
61ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson
62ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson        Args.push_back(ArgValue);
63ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson      }
64ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson
651feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner      Value *V = Builder.CreateCall(F, &Args[0], &Args[0] + Args.size());
66ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson      QualType BuiltinRetType = E->getType();
67ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson
681feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner      const llvm::Type *RetTy = llvm::Type::VoidTy;
691feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner      if (!BuiltinRetType->isVoidType()) RetTy = ConvertType(BuiltinRetType);
70ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson
71ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson      if (RetTy != V->getType()) {
72ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson        assert(V->getType()->canLosslesslyBitCastTo(RetTy) &&
73ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson               "Must be able to losslessly bit cast result type");
74ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson        V = Builder.CreateBitCast(V, RetTy);
75ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson      }
76ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson
77ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson      return RValue::get(V);
78ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson    }
79564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson
80564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson    // See if we have a target specific builtin that needs to be lowered.
811feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    Value *V = 0;
82564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson
83564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson    if (strcmp(TargetPrefix, "x86") == 0)
84564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson      V = EmitX86BuiltinExpr(BuiltinID, E);
85564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson    else if (strcmp(TargetPrefix, "ppc") == 0)
86564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson      V = EmitPPCBuiltinExpr(BuiltinID, E);
87564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson
88564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson    if (V)
89564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson      return RValue::get(V);
90c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner
91dc4d280136d3301fcbf3c7b4b2782c8bd804342cChris Lattner    WarnUnsupported(E, "builtin function");
926de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner
936de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner    // Unknown builtin, for now just dump it out and return undef.
946de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner    if (hasAggregateLLVMType(E->getType()))
956de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner      return RValue::getAggregate(CreateTempAlloca(ConvertType(E->getType())));
961feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    return RValue::get(UndefValue::get(ConvertType(E->getType())));
97ca6fcfad547dcec3fdd17790b4fab0918df74b37Anders Carlsson  }
986de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner  case Builtin::BI__builtin___CFStringMakeConstantString: {
996de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner    const Expr *Arg = E->getArg(0);
1006de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner
101d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson    while (1) {
102d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson      if (const ParenExpr *PE = dyn_cast<ParenExpr>(Arg))
103d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson        Arg = PE->getSubExpr();
104d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson      else if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(Arg))
105d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson        Arg = CE->getSubExpr();
106d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson      else
107d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson        break;
108d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson    }
1096de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner
1106de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner    const StringLiteral *Literal = cast<StringLiteral>(Arg);
1116de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner    std::string S(Literal->getStrData(), Literal->getByteLength());
1126de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner
1136de93ff81c5fe89b96a589ef13ea2beb4d7c3775Chris Lattner    return RValue::get(CGM.GetAddrOfConstantCFString(S));
114793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson  }
115793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson  case Builtin::BI__builtin_va_start:
116793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson  case Builtin::BI__builtin_va_end: {
1171feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    Value *ArgValue = EmitScalarExpr(E->getArg(0));
118ddc23f3e6fdc4f83dd46ef7e20394cfbd6063ff9Christopher Lamb    const llvm::Type *DestType =
119ddc23f3e6fdc4f83dd46ef7e20394cfbd6063ff9Christopher Lamb      llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
120793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson    if (ArgValue->getType() != DestType)
121793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson      ArgValue = Builder.CreateBitCast(ArgValue, DestType,
122793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson                                       ArgValue->getNameStart());
123793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson
1241feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    Intrinsic::ID inst = (BuiltinID == Builtin::BI__builtin_va_start) ?
1251feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner      Intrinsic::vastart : Intrinsic::vaend;
1267acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return RValue::get(Builder.CreateCall(CGM.getIntrinsic(inst), ArgValue));
127793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson  }
128a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson  case Builtin::BI__builtin_va_copy: {
129a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    // FIXME: This does not yet handle architectures where va_list is a struct.
130a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    Value *DstPtr = EmitScalarExpr(E->getArg(0));
131a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    Value *SrcValue = EmitScalarExpr(E->getArg(1));
132a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson
133a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    Value *SrcPtr = CreateTempAlloca(SrcValue->getType(), "dst_ptr");
134a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson
135a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    // FIXME: Volatile
136a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    Builder.CreateStore(SrcValue, SrcPtr, false);
137a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson
138a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    const llvm::Type *Type =
139a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson      llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
140a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson
141a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    DstPtr = Builder.CreateBitCast(DstPtr, Type);
142a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson    SrcPtr = Builder.CreateBitCast(SrcPtr, Type);
1433eae03e7d165f20a863a9a4d7122ba2a691ab16dChris Lattner    return RValue::get(Builder.CreateCall2(CGM.getIntrinsic(Intrinsic::vacopy),
1443eae03e7d165f20a863a9a4d7122ba2a691ab16dChris Lattner                                           DstPtr, SrcPtr));
145a28ef8b5c6ea452472d89041128fac8b683fe968Anders Carlsson  }
14689799cf254c91ca110f113a33eebe8b1b4d1a761Anders Carlsson  case Builtin::BI__builtin_classify_type: {
1471feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    APSInt Result(32);
14889799cf254c91ca110f113a33eebe8b1b4d1a761Anders Carlsson    if (!E->isBuiltinClassifyType(Result))
14989799cf254c91ca110f113a33eebe8b1b4d1a761Anders Carlsson      assert(0 && "Expr not __builtin_classify_type!");
1501feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    return RValue::get(ConstantInt::get(Result));
15189799cf254c91ca110f113a33eebe8b1b4d1a761Anders Carlsson  }
152d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson  case Builtin::BI__builtin_constant_p: {
1531feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    APSInt Result(32);
154d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson    // FIXME: Analyze the parameter and check if it is a constant.
155d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson    Result = 0;
1561feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    return RValue::get(ConstantInt::get(Result));
157d6a275f9a27d1c91e4084398d04030719b5b8f18Anders Carlsson  }
158c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson  case Builtin::BI__builtin_abs: {
1591feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    Value *ArgValue = EmitScalarExpr(E->getArg(0));
160c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson
161c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson    llvm::BinaryOperator *NegOp =
162c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson      Builder.CreateNeg(ArgValue, (ArgValue->getName() + "neg").c_str());
1631feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    Value *CmpResult =
164c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson      Builder.CreateICmpSGE(ArgValue, NegOp->getOperand(0), "abscond");
1651feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    Value *Result =
166c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson      Builder.CreateSelect(CmpResult, ArgValue, NegOp, "abs");
167c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson
168c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson    return RValue::get(Result);
169c2251dc59b0edc28f9303637dec970a7520939adAnders Carlsson  }
1703a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson  case Builtin::BI__builtin_ctz:
1713a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson  case Builtin::BI__builtin_ctzl:
1723a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson  case Builtin::BI__builtin_ctzll: {
1733a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    Value *ArgValue = EmitScalarExpr(E->getArg(0));
1743a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson
1753a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    const llvm::Type *ArgType = ArgValue->getType();
1763a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    Value *F = CGM.getIntrinsic(Intrinsic::cttz, &ArgType, 1);
1773a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson
1783a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    const llvm::Type *ResultType = ConvertType(E->getType());
1793a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    Value *Result = Builder.CreateCall(F, ArgValue, "tmp");
1803a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    if (Result->getType() != ResultType)
1813a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson      Result = Builder.CreateIntCast(Result, ResultType, "cast");
1823a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson    return RValue::get(Result);
1833a31d60cffedfb7c9e6d129a5c9ba15fa74f179aAnders Carlsson  }
1841feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner  case Builtin::BI__builtin_expect:
1851feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    return RValue::get(EmitScalarExpr(E->getArg(0)));
186df4852ac816e6050d53b808b86d7c1c9738eb99eAnders Carlsson  case Builtin::BI__builtin_bswap32:
187df4852ac816e6050d53b808b86d7c1c9738eb99eAnders Carlsson  case Builtin::BI__builtin_bswap64: {
1881feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    Value *ArgValue = EmitScalarExpr(E->getArg(0));
189df4852ac816e6050d53b808b86d7c1c9738eb99eAnders Carlsson    const llvm::Type *ArgType = ArgValue->getType();
1907acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    Value *F = CGM.getIntrinsic(Intrinsic::bswap, &ArgType, 1);
1911feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    return RValue::get(Builder.CreateCall(F, ArgValue, "tmp"));
192df4852ac816e6050d53b808b86d7c1c9738eb99eAnders Carlsson  }
193c8ee7988c4ea9ec784625d2a47a8575feb191421Anders Carlsson  case Builtin::BI__builtin_inff: {
1941feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    APFloat f(APFloat::IEEEsingle, APFloat::fcInfinity, false);
1952c62a1aa398d5582db00d2bad6b2d999ee50ec14Chris Lattner    return RValue::get(ConstantFP::get(f));
196c8ee7988c4ea9ec784625d2a47a8575feb191421Anders Carlsson  }
197478547cd2163d86ed9d691aa8fe45949eebf6cbfAnders Carlsson  case Builtin::BI__builtin_huge_val:
198c8ee7988c4ea9ec784625d2a47a8575feb191421Anders Carlsson  case Builtin::BI__builtin_inf:
199c8ee7988c4ea9ec784625d2a47a8575feb191421Anders Carlsson  // FIXME: mapping long double onto double.
200c8ee7988c4ea9ec784625d2a47a8575feb191421Anders Carlsson  case Builtin::BI__builtin_infl: {
2011feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner    APFloat f(APFloat::IEEEdouble, APFloat::fcInfinity, false);
2022c62a1aa398d5582db00d2bad6b2d999ee50ec14Chris Lattner    return RValue::get(ConstantFP::get(f));
203c8ee7988c4ea9ec784625d2a47a8575feb191421Anders Carlsson  }
204fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  case Builtin::BI__builtin_isgreater:
205fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  case Builtin::BI__builtin_isgreaterequal:
206fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  case Builtin::BI__builtin_isless:
207fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  case Builtin::BI__builtin_islessequal:
208fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  case Builtin::BI__builtin_islessgreater:
209fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  case Builtin::BI__builtin_isunordered: {
210fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    // Ordered comparisons: we know the arguments to these are matching scalar
211fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    // floating point values.
212fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    Value *LHS = EmitScalarExpr(E->getArg(0));
213fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    Value *RHS = EmitScalarExpr(E->getArg(1));
214fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner
215fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    switch (BuiltinID) {
216fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    default: assert(0 && "Unknown ordered comparison");
217fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    case Builtin::BI__builtin_isgreater:
218fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      LHS = Builder.CreateFCmpOGT(LHS, RHS, "cmp");
219fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      break;
220fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    case Builtin::BI__builtin_isgreaterequal:
221fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      LHS = Builder.CreateFCmpOGE(LHS, RHS, "cmp");
222fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      break;
223fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    case Builtin::BI__builtin_isless:
224fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      LHS = Builder.CreateFCmpOLT(LHS, RHS, "cmp");
225fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      break;
226fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    case Builtin::BI__builtin_islessequal:
227fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      LHS = Builder.CreateFCmpOLE(LHS, RHS, "cmp");
228fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      break;
229fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    case Builtin::BI__builtin_islessgreater:
230fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      LHS = Builder.CreateFCmpONE(LHS, RHS, "cmp");
231fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      break;
232fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    case Builtin::BI__builtin_isunordered:
233fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      LHS = Builder.CreateFCmpUNO(LHS, RHS, "cmp");
234fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner      break;
235fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    }
236fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    // ZExt bool to int type.
237fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner    return RValue::get(Builder.CreateZExt(LHS, ConvertType(E->getType()),
238fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner                                          "tmp"));
239fe23e217774aaec350086fab839210d7d9e1e3f4Chris Lattner  }
2404efe45919836728a2a38a50b8d79cd36432e1708Nate Begeman  case Builtin::BI__builtin_alloca:
2414efe45919836728a2a38a50b8d79cd36432e1708Nate Begeman    return RValue::get(Builder.CreateAlloca(llvm::Type::Int8Ty,
2424efe45919836728a2a38a50b8d79cd36432e1708Nate Begeman                                            EmitScalarExpr(E->getArg(0)),
2434efe45919836728a2a38a50b8d79cd36432e1708Nate Begeman                                            "tmp"));
244022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson  }
245022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson  return RValue::get(0);
246022012e6e5626c3372e1a5493c0929dfc1fa9e47Anders Carlsson}
247564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson
2481feedd84221e8dbcc3faf3de27cc42b559db845dChris LattnerValue *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
2491feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner                                           const CallExpr *E) {
2502929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson
2512929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  llvm::SmallVector<Value*, 4> Ops;
2522929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson
2532929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  for (unsigned i = 0, e = E->getNumArgs(); i != e; i++)
2542929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    Ops.push_back(EmitScalarExpr(E->getArg(i)));
2552929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson
256564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson  switch (BuiltinID) {
25746a26b0b0e2ec1557bad9b70e8e20836524ebdfcAnders Carlsson  default: return 0;
25846a26b0b0e2ec1557bad9b70e8e20836524ebdfcAnders Carlsson  case X86::BI__builtin_ia32_mulps:
2592929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    return Builder.CreateMul(Ops[0], Ops[1], "mulps");
260e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_mulpd:
261e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateMul(Ops[0], Ops[1], "mulpd");
2624e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_pand:
263e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_pand128:
2642929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    return Builder.CreateAnd(Ops[0], Ops[1], "pand");
2654e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_por:
266e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_por128:
267e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateOr(Ops[0], Ops[1], "por");
2684e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_pxor:
269e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_pxor128:
270e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateXor(Ops[0], Ops[1], "pxor");
271e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_pandn:
272e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_pandn128:
2732929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    Ops[0] = Builder.CreateNot(Ops[0], "tmp");
2742929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    return Builder.CreateAnd(Ops[0], Ops[1], "pandn");
2754e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_paddb:
276e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_paddb128:
2774e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_paddd:
278e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_paddd128:
2794e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_paddq:
280e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_paddq128:
2814e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_paddw:
282e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_paddw128:
283cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_addps:
284e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_addpd:
285cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return Builder.CreateAdd(Ops[0], Ops[1], "add");
2864e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_psubb:
287e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psubb128:
2884e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_psubd:
289e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psubd128:
2904e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_psubq:
291e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psubq128:
2924e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  case X86::BI__builtin_ia32_psubw:
293e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psubw128:
294cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_subps:
295e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_subpd:
296cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return Builder.CreateSub(Ops[0], Ops[1], "sub");
297cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_divps:
298cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return Builder.CreateFDiv(Ops[0], Ops[1], "divps");
299e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_divpd:
300e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateFDiv(Ops[0], Ops[1], "divpd");
301db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_pmullw:
302e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_pmullw128:
3032929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    return Builder.CreateMul(Ops[0], Ops[1], "pmul");
304db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_punpckhbw:
3057acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return EmitShuffleVector(Ops[0], Ops[1], 4, 12, 5, 13, 6, 14, 7, 15,
306db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson                             "punpckhbw");
307e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_punpckhbw128:
308e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1],  8, 24,  9, 25, 10, 26, 11, 27,
309e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman                                             12, 28, 13, 29, 14, 30, 15, 31,
310e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman                             "punpckhbw");
311db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_punpckhwd:
3127acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return EmitShuffleVector(Ops[0], Ops[1], 2, 6, 3, 7, "punpckhwd");
313e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_punpckhwd128:
314e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 4, 12, 5, 13, 6, 14, 7, 15,
315e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman                             "punpckhwd");
316db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_punpckhdq:
3177acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return EmitShuffleVector(Ops[0], Ops[1], 1, 3, "punpckhdq");
318e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_punpckhdq128:
319e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 2, 6, 3, 7, "punpckhdq");
320db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_punpcklbw:
3217acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return EmitShuffleVector(Ops[0], Ops[1], 0, 8, 1, 9, 2, 10, 3, 11,
322db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson                             "punpcklbw");
323db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_punpcklwd:
3247acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return EmitShuffleVector(Ops[0], Ops[1], 0, 4, 1, 5, "punpcklwd");
325db832305d35a7c9ef08bbafcf79d8da162af3374Anders Carlsson  case X86::BI__builtin_ia32_punpckldq:
3267acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    return EmitShuffleVector(Ops[0], Ops[1], 0, 2, "punpckldq");
327e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_punpckldq128:
328e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 0, 4, 1, 5, "punpckldq");
329e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_pslldi128:
330e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psllqi128:
331e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psllwi128:
332e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psradi128:
333e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psrawi128:
334e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psrldi128:
335e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psrlqi128:
336e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_psrlwi128: {
337e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateZExt(Ops[1], llvm::Type::Int64Ty, "zext");
338e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *Ty = llvm::VectorType::get(llvm::Type::Int64Ty, 2);
339e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Value *Zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0);
340e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateInsertElement(llvm::UndefValue::get(Ty),
341e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman                                         Ops[1], Zero, "insert");
342e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateBitCast(Ops[1], Ops[0]->getType(), "bitcast");
343e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const char *name = 0;
344e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Intrinsic::ID ID = Intrinsic::not_intrinsic;
345e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
346e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    switch (BuiltinID) {
347e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    default: assert(0 && "Unsupported shift intrinsic!");
348e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_pslldi128:
349e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "pslldi";
350e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psll_d;
351e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
352e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psllqi128:
353e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psllqi";
354e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psll_q;
355e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
356e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psllwi128:
357e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psllwi";
358e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psll_w;
359e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
360e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psradi128:
361e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psradi";
362e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psra_d;
363e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
364e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psrawi128:
365e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psrawi";
366e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psra_w;
367e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
368e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psrldi128:
369e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psrldi";
370e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psrl_d;
371e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
372e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psrlqi128:
373e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psrlqi";
374e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psrl_q;
375e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
376e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psrlwi128:
377e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psrlwi";
378e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psrl_w;
379e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
380e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    }
381e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Function *F = CGM.getIntrinsic(ID);
382e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name);
383e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
3842929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_pslldi:
3852929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psllqi:
3862929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psllwi:
3872929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psradi:
3882929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psrawi:
3892929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psrldi:
3902929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psrlqi:
3912929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_psrlwi: {
3922929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    Ops[1] = Builder.CreateZExt(Ops[1], llvm::Type::Int64Ty, "zext");
3932929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    const llvm::Type *Ty = llvm::VectorType::get(llvm::Type::Int64Ty, 1);
3942929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    Ops[1] = Builder.CreateBitCast(Ops[1], Ty, "bitcast");
3952929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    const char *name = 0;
3962929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    Intrinsic::ID ID = Intrinsic::not_intrinsic;
3974e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson
3982929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    switch (BuiltinID) {
3992929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    default: assert(0 && "Unsupported shift intrinsic!");
4002929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_pslldi:
4012929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "pslldi";
4022929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psll_d;
4032929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
4042929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psllqi:
4052929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psllqi";
4062929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psll_q;
4072929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
4082929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psllwi:
4092929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psllwi";
4102929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psll_w;
4112929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
4122929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psradi:
4132929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psradi";
4142929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psra_d;
4152929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
4162929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psrawi:
4172929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psrawi";
4182929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psra_w;
4192929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
4202929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psrldi:
4212929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psrldi";
4222929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psrl_d;
4232929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
4242929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psrlqi:
4252929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psrlqi";
4262929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psrl_q;
4272929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
4282929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    case X86::BI__builtin_ia32_psrlwi:
4292929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      name = "psrlwi";
4302929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      ID = Intrinsic::x86_mmx_psrl_w;
4312929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson      break;
432e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_pslldi128:
433e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "pslldi";
434e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psll_d;
435e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
436e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psllqi128:
437e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psllqi";
438e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psll_q;
439e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
440e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psllwi128:
441e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psllwi";
442e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psll_w;
443e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
444e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psradi128:
445e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psradi";
446e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psra_d;
447e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
448e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psrawi128:
449e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psrawi";
450e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psra_w;
451e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
452e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psrldi128:
453e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psrldi";
454e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psrl_d;
455e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
456e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psrlqi128:
457e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psrlqi";
458e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psrl_q;
459e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
460e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_psrlwi128:
461e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "psrlwi";
462e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      ID = Intrinsic::x86_sse2_psrl_w;
463e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
4642929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    }
4657acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    llvm::Function *F = CGM.getIntrinsic(ID);
4662929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name);
4672929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  }
4682929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson  case X86::BI__builtin_ia32_pshufd: {
4697acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    unsigned i = cast<ConstantInt>(Ops[1])->getZExtValue();
4702929cfa9b7df1d5b0571b54161783e4d791a0b77Anders Carlsson    return EmitShuffleVector(Ops[0], Ops[0],
4714e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson                             i & 0x3, (i & 0xc) >> 2,
4724e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson                             (i & 0x30) >> 4, (i & 0xc0) >> 6,
4734e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson                             "pshufd");
4744e4ee211b56e3276df80b350a6194f7cbf04b92cAnders Carlsson  }
4756086bbd1799e22e75561c3d31dc9b923f0508fa5Anders Carlsson  case X86::BI__builtin_ia32_vec_init_v4hi:
4766086bbd1799e22e75561c3d31dc9b923f0508fa5Anders Carlsson  case X86::BI__builtin_ia32_vec_init_v8qi:
4776086bbd1799e22e75561c3d31dc9b923f0508fa5Anders Carlsson  case X86::BI__builtin_ia32_vec_init_v2si:
4786086bbd1799e22e75561c3d31dc9b923f0508fa5Anders Carlsson    return EmitVector(&Ops[0], Ops.size());
4796086bbd1799e22e75561c3d31dc9b923f0508fa5Anders Carlsson  case X86::BI__builtin_ia32_vec_ext_v2si:
480e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_vec_ext_v2di:
481e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_vec_ext_v4sf:
482e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_vec_ext_v4si:
483e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_vec_ext_v2df:
4846086bbd1799e22e75561c3d31dc9b923f0508fa5Anders Carlsson    return Builder.CreateExtractElement(Ops[0], Ops[1], "result");
485cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpordss:
486e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpordsd:
487cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpunordss:
488e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpunordsd:
489e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpeqss:
490e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpeqsd:
491e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpltss:
492e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpltsd:
493cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpless:
494e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmplesd:
495cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpneqss:
496e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpneqsd:
497e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnltss:
498e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnltsd:
499e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnless:
500e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnlesd: {
5017acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    unsigned i = 0;
502cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    const char *name = 0;
503cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    switch (BuiltinID) {
504cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    default: assert(0 && "Unknown compare builtin!");
505cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpeqss:
506e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpeqsd:
507cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 0;
508e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpeq";
509cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
510cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpltss:
511e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpltsd:
512cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 1;
513e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmplt";
514cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
515cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpless:
516e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmplesd:
517cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 2;
518e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmple";
519cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
520cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpunordss:
521e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpunordsd:
522cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 3;
523e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpunord";
524cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
525cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpneqss:
526e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpneqsd:
527cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 4;
528e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpneq";
529cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
530cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpnltss:
531e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpnltsd:
532cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 5;
533e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpntl";
534cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
535cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpnless:
536e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpnlesd:
537cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 6;
538e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpnle";
539cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
540cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpordss:
541e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpordsd:
542cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 7;
543e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpord";
544cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
545cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    }
546cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson
547e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Function *F;
548e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    if (cast<llvm::VectorType>(Ops[0]->getType())->getElementType() ==
549e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman        llvm::Type::FloatTy)
550e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      F = CGM.getIntrinsic(Intrinsic::x86_sse_cmp_ss);
551e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    else
552e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      F = CGM.getIntrinsic(Intrinsic::x86_sse2_cmp_sd);
553e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
554cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    Ops.push_back(llvm::ConstantInt::get(llvm::Type::Int8Ty, i));
555cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name);
556cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  }
557e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_ldmxcsr: {
558e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *PtrTy = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
559e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Value *One = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1);
560e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Value *Tmp = Builder.CreateAlloca(llvm::Type::Int32Ty, One, "tmp");
561e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Builder.CreateStore(Ops[0], Tmp);
562e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_ldmxcsr),
5633eae03e7d165f20a863a9a4d7122ba2a691ab16dChris Lattner                              Builder.CreateBitCast(Tmp, PtrTy));
564e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
565e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_stmxcsr: {
566e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *PtrTy = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
567e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Value *One = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1);
568e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Value *Tmp = Builder.CreateAlloca(llvm::Type::Int32Ty, One, "tmp");
569e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    One = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_stmxcsr),
5703eae03e7d165f20a863a9a4d7122ba2a691ab16dChris Lattner                             Builder.CreateBitCast(Tmp, PtrTy));
571e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateLoad(Tmp, "stmxcsr");
572e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
573cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpordps:
574e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpordpd:
575cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpunordps:
576e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpunordpd:
577cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpeqps:
578e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpeqpd:
579cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpltps:
580e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpltpd:
581cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpleps:
582e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmplepd:
583cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpneqps:
584e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpneqpd:
585cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpngtps:
586e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpngtpd:
587cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpnltps:
588e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnltpd:
589cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpgtps:
590e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpgtpd:
591cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpgeps:
592e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpgepd:
593cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_cmpngeps:
594e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpngepd:
595e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnleps:
596e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_cmpnlepd: {
5977acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    unsigned i = 0;
598cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    const char *name = 0;
599cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    bool ShouldSwap = false;
600cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    switch (BuiltinID) {
601cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    default: assert(0 && "Unknown compare builtin!");
602e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpeqps:
603e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpeqpd:    i = 0; name = "cmpeq"; break;
604e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpltps:
605e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpltpd:    i = 1; name = "cmplt"; break;
606e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpleps:
607e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmplepd:    i = 2; name = "cmple"; break;
608e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpunordps:
609e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpunordpd: i = 3; name = "cmpunord"; break;
610e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpneqps:
611e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpneqpd:   i = 4; name = "cmpneq"; break;
612e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpnltps:
613e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpnltpd:   i = 5; name = "cmpntl"; break;
614e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpnleps:
615e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpnlepd:   i = 6; name = "cmpnle"; break;
616e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpordps:
617e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpordpd:   i = 7; name = "cmpord"; break;
618cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpgtps:
619e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpgtpd:
6207acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner      ShouldSwap = true;
621cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 1;
622e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpgt";
623cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
624cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpgeps:
625e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpgepd:
626cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 2;
627e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpge";
628cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      ShouldSwap = true;
629cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
630cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpngtps:
631e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpngtpd:
632cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 5;
633e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpngt";
634cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      ShouldSwap = true;
635cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
636cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    case X86::BI__builtin_ia32_cmpngeps:
637e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_cmpngepd:
638cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      i = 6;
639e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      name = "cmpnge";
640cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      ShouldSwap = true;
641cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      break;
642cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    }
643cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson
644cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    if (ShouldSwap)
645cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson      std::swap(Ops[0], Ops[1]);
646e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
647e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Function *F;
648e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    if (cast<llvm::VectorType>(Ops[0]->getType())->getElementType() ==
649e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman        llvm::Type::FloatTy)
650e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      F = CGM.getIntrinsic(Intrinsic::x86_sse_cmp_ps);
651e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    else
652e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      F = CGM.getIntrinsic(Intrinsic::x86_sse2_cmp_pd);
653cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson
654cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    Ops.push_back(llvm::ConstantInt::get(llvm::Type::Int8Ty, i));
655cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name);
656cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  }
657cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson  case X86::BI__builtin_ia32_movss:
658cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return EmitShuffleVector(Ops[0], Ops[1], 4, 1, 2, 3, "movss");
659730f2c13e8ff0a2a3cc54fce9913add68107cb51Torok Edwin  case X86::BI__builtin_ia32_shufps: {
6607acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner    unsigned i = cast<ConstantInt>(Ops[2])->getZExtValue();
661cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson    return EmitShuffleVector(Ops[0], Ops[1],
662cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson                             i & 0x3, (i & 0xc) >> 2,
663cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson                             ((i & 0x30) >> 4) + 4,
664cc8b7f911892b3257e381677d0a82d43bf7b067cAnders Carlsson                             ((i & 0x60) >> 6) + 4, "shufps");
665730f2c13e8ff0a2a3cc54fce9913add68107cb51Torok Edwin  }
666dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman  case X86::BI__builtin_ia32_punpcklbw128:
667dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 0, 16, 1, 17, 2, 18, 3, 19,
668dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman                                             4, 20, 5, 21, 6, 22, 7, 23,
669dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman                                             "punpcklbw");
670dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman  case X86::BI__builtin_ia32_punpcklwd128:
671dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 0, 8, 1, 9, 2, 10, 3, 11,
672dbebb73b86d9fe56c2227bf75c13ea3a49248261Nate Begeman                             "punpcklwd");
673e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_movlhps:
674e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 0, 1, 4, 5, "movlhps");
675e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_movhlps:
676e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 6, 7, 2, 3, "movhlps");
677e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_unpckhps:
678e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 2, 6, 3, 7, "unpckhps");
679e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_unpcklps:
680e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return EmitShuffleVector(Ops[0], Ops[1], 0, 4, 1, 5, "unpcklps");
681e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_movqv4si: {
682e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *Ty = llvm::VectorType::get(llvm::Type::Int64Ty, 2);
683e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateBitCast(Ops[0], Ty);
684e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
685e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_loadlps:
686e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_loadhps: {
687e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // FIXME: This should probably be represented as
688e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // shuffle (dst, (v4f32 (insert undef, (load i64), 0)), shuf mask hi/lo)
689e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *EltTy = llvm::Type::DoubleTy;
690e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *VecTy = llvm::VectorType::get(EltTy, 2);
691e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *OrigTy = Ops[0]->getType();
692e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    unsigned Index = BuiltinID == X86::BI__builtin_ia32_loadlps ? 0 : 1;
693e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Value *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, Index);
694e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateBitCast(Ops[1], llvm::PointerType::getUnqual(EltTy));
695e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateLoad(Ops[1], "tmp");
696e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast");
697e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateInsertElement(Ops[0], Ops[1], Idx, "loadps");
698e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateBitCast(Ops[0], OrigTy, "loadps");
699e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
700e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_storehps:
701e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_storelps: {
702e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *EltTy = llvm::Type::Int64Ty;
703e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *PtrTy = llvm::PointerType::getUnqual(EltTy);
704e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *VecTy = llvm::VectorType::get(EltTy, 2);
705e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
706e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // cast val v2i64
707e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateBitCast(Ops[1], VecTy, "cast");
708e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
709e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // extract (0, 1)
710e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    unsigned Index = BuiltinID == X86::BI__builtin_ia32_storelps ? 0 : 1;
711e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Value *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, Index);
712e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateExtractElement(Ops[1], Idx, "extract");
713e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
714e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // cast pointer to i64 & store
715e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateBitCast(Ops[0], PtrTy);
716e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateStore(Ops[1], Ops[0]);
717e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
718e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_loadlv4si: {
719e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // load i64
720e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *EltTy = llvm::Type::Int64Ty;
721e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *PtrTy = llvm::PointerType::getUnqual(EltTy);
722e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateBitCast(Ops[0], PtrTy);
723e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateLoad(Ops[0], "load");
724e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
725e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // scalar to vector: insert i64 into 2 x i64 undef
726e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Type *VecTy = llvm::VectorType::get(EltTy, 2);
727e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Value *Zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0);
728e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateInsertElement(llvm::UndefValue::get(VecTy),
729e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman                                         Ops[0], Zero, "s2v");
730e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
731e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // shuffle into zero vector.
732e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    std::vector<llvm::Constant *>Elts;
733e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Elts.resize(2, llvm::ConstantInt::get(EltTy, 0));
734e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    llvm::Value *ZV = ConstantVector::get(Elts);
735e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = EmitShuffleVector(ZV, Ops[0], 2, 1, "loadl");
736e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman
737e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    // bitcast to result.
738e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateBitCast(Ops[0],
739e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman                                 llvm::VectorType::get(llvm::Type::Int32Ty, 4));
740e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
741e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_andps:
742e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_andpd:
743e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_andnps:
744e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_andnpd:
745e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_orps:
746e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_orpd:
747e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_xorpd:
748e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  case X86::BI__builtin_ia32_xorps: {
749e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *ITy = llvm::VectorType::get(llvm::Type::Int32Ty, 4);
750e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    const llvm::Type *FTy = Ops[0]->getType();
751e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[0] = Builder.CreateBitCast(Ops[0], ITy, "bitcast");
752e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    Ops[1] = Builder.CreateBitCast(Ops[1], ITy, "bitcast");
753e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    switch (BuiltinID) {
754e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_andps:
755e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateAnd(Ops[0], Ops[1], "andps");
756e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
757e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_andpd:
758e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateAnd(Ops[0], Ops[1], "andpd");
759e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
760e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_andnps:
761e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateNot(Ops[0], "not");
762e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateAnd(Ops[0], Ops[1], "andnps");
763e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
764e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_andnpd:
765e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateNot(Ops[0], "not");
766e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateAnd(Ops[0], Ops[1], "andnpd");
767e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
768e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_orps:
769e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateOr(Ops[0], Ops[1], "orps");
770e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
771e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_orpd:
772e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateOr(Ops[0], Ops[1], "orpd");
773e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
774e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_xorps:
775e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateXor(Ops[0], Ops[1], "xorps");
776e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
777e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    case X86::BI__builtin_ia32_xorpd:
778e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      Ops[0] = Builder.CreateXor(Ops[0], Ops[1], "xorpd");
779e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman      break;
780e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    }
781e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman    return Builder.CreateBitCast(Ops[0], FTy, "bitcast");
782e7722103abc4583366c914374d6aa8560e145fa1Nate Begeman  }
783564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson  }
784564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson}
785564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson
7861feedd84221e8dbcc3faf3de27cc42b559db845dChris LattnerValue *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
7871feedd84221e8dbcc3faf3de27cc42b559db845dChris Lattner                                           const CallExpr *E) {
788564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson  switch (BuiltinID) {
78946a26b0b0e2ec1557bad9b70e8e20836524ebdfcAnders Carlsson  default: return 0;
790564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson  }
791564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson}
792