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