[llvm-commits] [dragonegg] r85719 - in /dragonegg/trunk: llvm-convert.cpp llvm-internal.h x86/llvm-target.cpp x86/llvm-target.h

Duncan Sands baldrick at free.fr
Sun Nov 1 09:28:27 PST 2009


Author: baldrick
Date: Sun Nov  1 11:28:26 2009
New Revision: 85719

URL: http://llvm.org/viewvc/llvm-project?rev=85719&view=rev
Log:
X86 target intrinsics were not working properly.  That's because the
ix86_builtins enum we use is supposed to be a copy of the private enum
defined in i386.c.  But, needless to say, the llvm enum, which is based
on gcc-4.2, is completely out of sync with the gcc-4.5 enum, leading to
the wrong lowering being used for many intrinsics.  Exactly the same
problem occured when porting llvm-gcc-4.0 to gcc-4.2.  Avoid it forever
more by eliminating the copy of the enum, and basing everything on names,
with caching based on the function code so only the first lookup is costly.

Modified:
    dragonegg/trunk/llvm-convert.cpp
    dragonegg/trunk/llvm-internal.h
    dragonegg/trunk/x86/llvm-target.cpp
    dragonegg/trunk/x86/llvm-target.h

Modified: dragonegg/trunk/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-convert.cpp?rev=85719&r1=85718&r2=85719&view=diff

==============================================================================
--- dragonegg/trunk/llvm-convert.cpp (original)
+++ dragonegg/trunk/llvm-convert.cpp Sun Nov  1 11:28:26 2009
@@ -4247,8 +4247,7 @@
     }
   }
 
-  unsigned FnCode = DECL_FUNCTION_CODE(fndecl);
-  return LLVM_TARGET_INTRINSIC_LOWER(stmt, FnCode, DestLoc, Result, ResultType,
+  return LLVM_TARGET_INTRINSIC_LOWER(stmt, fndecl, DestLoc, Result, ResultType,
                                      Operands);
 #endif
   return false;
@@ -4258,10 +4257,6 @@
 /// builtin number.
 static std::vector<Constant*> TargetBuiltinCache;
 
-void clearTargetBuiltinCache() {
-  TargetBuiltinCache.clear();
-}
-
 void TreeToLLVM::EmitMemoryBarrier(bool ll, bool ls, bool sl, bool ss) {
   Value* C[5];
   C[0] = ConstantInt::get(Type::getInt1Ty(Context), ll);

Modified: dragonegg/trunk/llvm-internal.h
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-internal.h?rev=85719&r1=85718&r2=85719&view=diff

==============================================================================
--- dragonegg/trunk/llvm-internal.h (original)
+++ dragonegg/trunk/llvm-internal.h Sun Nov  1 11:28:26 2009
@@ -703,7 +703,7 @@
 
   // Optional target defined builtin intrinsic expanding function.
   bool TargetIntrinsicLower(gimple stmt,
-                            unsigned FnCode,
+                            tree_node *fndecl,
                             const MemRef *DestLoc,
                             Value *&Result,
                             const Type *ResultType,

Modified: dragonegg/trunk/x86/llvm-target.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/x86/llvm-target.cpp?rev=85719&r1=85718&r2=85719&view=diff

==============================================================================
--- dragonegg/trunk/x86/llvm-target.cpp (original)
+++ dragonegg/trunk/x86/llvm-target.cpp Sun Nov  1 11:28:26 2009
@@ -53,109 +53,330 @@
 
 static LLVMContext &Context = getGlobalContext();
 
+/// BitCastToIntVector - Bitcast the vector operand to a vector of integers of
+//  the same length.
+static Value *BitCastToIntVector(Value *Op, LLVMBuilder &Builder) {
+  const VectorType *VecTy = cast<VectorType>(Op->getType());
+  const Type *EltTy = VecTy->getElementType();
+  const Type *IntTy = IntegerType::get(Context,EltTy->getPrimitiveSizeInBits());
+  return Builder.CreateBitCast(Op, VectorType::get(IntTy,
+                                                   VecTy->getNumElements()));
+}
+
+struct HandlerEntry {
+  const char *Name; void *Handler;
+};
+
+static bool LT(const HandlerEntry &E, const HandlerEntry &F) {
+  return strcmp(E.Name, F.Name) < 0;
+}
+
 /* TargetIntrinsicLower - For builtins that we want to expand to normal LLVM
  * code, emit the code now.  If we can handle the code, this macro should emit
  * the code, return true.
  */
 bool TreeToLLVM::TargetIntrinsicLower(gimple stmt,
-                                      unsigned FnCode,
+                                      tree fndecl,
                                       const MemRef *DestLoc,
                                       Value *&Result,
                                       const Type *ResultType,
                                       std::vector<Value*> &Ops) {
-  switch (FnCode) {
-  default: break;
-  case IX86_BUILTIN_ADDPS:
-  case IX86_BUILTIN_ADDPD:
-  case IX86_BUILTIN_PADDB:
-  case IX86_BUILTIN_PADDW:
-  case IX86_BUILTIN_PADDD:
-  case IX86_BUILTIN_PADDQ:
-  case IX86_BUILTIN_PADDB128:
-  case IX86_BUILTIN_PADDW128:
-  case IX86_BUILTIN_PADDD128:
-  case IX86_BUILTIN_PADDQ128:
+  const HandlerEntry Handlers[] = {
+    {"__builtin_ia32_addpd", &&IX86_BUILTIN_ADDPD},
+    {"__builtin_ia32_addpd256", &&IX86_BUILTIN_ADDPD},
+    {"__builtin_ia32_addps", &&IX86_BUILTIN_ADDPS},
+    {"__builtin_ia32_addps256", &&IX86_BUILTIN_ADDPS},
+    {"__builtin_ia32_andnpd", &&IX86_BUILTIN_ANDNPD},
+    {"__builtin_ia32_andnpd256", &&IX86_BUILTIN_ANDNPD},
+    {"__builtin_ia32_andnps", &&IX86_BUILTIN_ANDNPS},
+    {"__builtin_ia32_andnps256", &&IX86_BUILTIN_ANDNPS},
+    {"__builtin_ia32_andpd", &&IX86_BUILTIN_ANDPD},
+    {"__builtin_ia32_andpd256", &&IX86_BUILTIN_ANDPD},
+    {"__builtin_ia32_andps", &&IX86_BUILTIN_ANDPS},
+    {"__builtin_ia32_andps256", &&IX86_BUILTIN_ANDPS},
+    {"__builtin_ia32_cmpeqpd", &&IX86_BUILTIN_CMPEQPD},
+    {"__builtin_ia32_cmpeqps", &&IX86_BUILTIN_CMPEQPS},
+    {"__builtin_ia32_cmpeqsd", &&IX86_BUILTIN_CMPEQSD},
+    {"__builtin_ia32_cmpeqss", &&IX86_BUILTIN_CMPEQSS},
+    {"__builtin_ia32_cmpgepd", &&IX86_BUILTIN_CMPGEPD},
+    {"__builtin_ia32_cmpgeps", &&IX86_BUILTIN_CMPGEPS},
+    {"__builtin_ia32_cmpgtpd", &&IX86_BUILTIN_CMPGTPD},
+    {"__builtin_ia32_cmpgtps", &&IX86_BUILTIN_CMPGTPS},
+    {"__builtin_ia32_cmplepd", &&IX86_BUILTIN_CMPLEPD},
+    {"__builtin_ia32_cmpleps", &&IX86_BUILTIN_CMPLEPS},
+    {"__builtin_ia32_cmplesd", &&IX86_BUILTIN_CMPLESD},
+    {"__builtin_ia32_cmpless", &&IX86_BUILTIN_CMPLESS},
+    {"__builtin_ia32_cmpltpd", &&IX86_BUILTIN_CMPLTPD},
+    {"__builtin_ia32_cmpltps", &&IX86_BUILTIN_CMPLTPS},
+    {"__builtin_ia32_cmpltsd", &&IX86_BUILTIN_CMPLTSD},
+    {"__builtin_ia32_cmpltss", &&IX86_BUILTIN_CMPLTSS},
+    {"__builtin_ia32_cmpneqpd", &&IX86_BUILTIN_CMPNEQPD},
+    {"__builtin_ia32_cmpneqps", &&IX86_BUILTIN_CMPNEQPS},
+    {"__builtin_ia32_cmpneqsd", &&IX86_BUILTIN_CMPNEQSD},
+    {"__builtin_ia32_cmpneqss", &&IX86_BUILTIN_CMPNEQSS},
+    {"__builtin_ia32_cmpngepd", &&IX86_BUILTIN_CMPNGEPD},
+    {"__builtin_ia32_cmpngeps", &&IX86_BUILTIN_CMPNGEPS},
+    {"__builtin_ia32_cmpngtpd", &&IX86_BUILTIN_CMPNGTPD},
+    {"__builtin_ia32_cmpngtps", &&IX86_BUILTIN_CMPNGTPS},
+    {"__builtin_ia32_cmpnlepd", &&IX86_BUILTIN_CMPNLEPD},
+    {"__builtin_ia32_cmpnleps", &&IX86_BUILTIN_CMPNLEPS},
+    {"__builtin_ia32_cmpnlesd", &&IX86_BUILTIN_CMPNLESD},
+    {"__builtin_ia32_cmpnless", &&IX86_BUILTIN_CMPNLESS},
+    {"__builtin_ia32_cmpnltpd", &&IX86_BUILTIN_CMPNLTPD},
+    {"__builtin_ia32_cmpnltps", &&IX86_BUILTIN_CMPNLTPS},
+    {"__builtin_ia32_cmpnltsd", &&IX86_BUILTIN_CMPNLTSD},
+    {"__builtin_ia32_cmpnltss", &&IX86_BUILTIN_CMPNLTSS},
+    {"__builtin_ia32_cmpordpd", &&IX86_BUILTIN_CMPORDPD},
+    {"__builtin_ia32_cmpordps", &&IX86_BUILTIN_CMPORDPS},
+    {"__builtin_ia32_cmpordsd", &&IX86_BUILTIN_CMPORDSD},
+    {"__builtin_ia32_cmpordss", &&IX86_BUILTIN_CMPORDSS},
+    {"__builtin_ia32_cmpunordpd", &&IX86_BUILTIN_CMPUNORDPD},
+    {"__builtin_ia32_cmpunordps", &&IX86_BUILTIN_CMPUNORDPS},
+    {"__builtin_ia32_cmpunordsd", &&IX86_BUILTIN_CMPUNORDSD},
+    {"__builtin_ia32_cmpunordss", &&IX86_BUILTIN_CMPUNORDSS},
+    {"__builtin_ia32_divpd", &&IX86_BUILTIN_DIVPD},
+    {"__builtin_ia32_divpd256", &&IX86_BUILTIN_DIVPD},
+    {"__builtin_ia32_divps", &&IX86_BUILTIN_DIVPS},
+    {"__builtin_ia32_divps256", &&IX86_BUILTIN_DIVPS},
+    {"__builtin_ia32_ldmxcsr", &&IX86_BUILTIN_LDMXCSR},
+    {"__builtin_ia32_loaddqu", &&IX86_BUILTIN_LOADDQU},
+    {"__builtin_ia32_loaddqu256", &&IX86_BUILTIN_LOADDQU},
+    {"__builtin_ia32_loadhpd", &&IX86_BUILTIN_LOADHPD},
+    {"__builtin_ia32_loadhps", &&IX86_BUILTIN_LOADHPS},
+    {"__builtin_ia32_loadlpd", &&IX86_BUILTIN_LOADLPD},
+    {"__builtin_ia32_loadlps", &&IX86_BUILTIN_LOADLPS},
+    {"__builtin_ia32_loadlv4si", &&IX86_BUILTIN_LOADQ},
+    {"__builtin_ia32_loadupd", &&IX86_BUILTIN_LOADUPD},
+    {"__builtin_ia32_loadupd256", &&IX86_BUILTIN_LOADUPD},
+    {"__builtin_ia32_loadups", &&IX86_BUILTIN_LOADUPS},
+    {"__builtin_ia32_loadups256", &&IX86_BUILTIN_LOADUPS},
+    {"__builtin_ia32_movhlps", &&IX86_BUILTIN_MOVHLPS},
+    {"__builtin_ia32_movlhps", &&IX86_BUILTIN_MOVLHPS},
+    {"__builtin_ia32_movq128", &&IX86_BUILTIN_MOVQ},
+    {"__builtin_ia32_movsd", &&IX86_BUILTIN_MOVSD},
+    {"__builtin_ia32_movshdup", &&IX86_BUILTIN_MOVSHDUP},
+    {"__builtin_ia32_movshdup256", &&IX86_BUILTIN_MOVSHDUP},
+    {"__builtin_ia32_movsldup", &&IX86_BUILTIN_MOVSLDUP},
+    {"__builtin_ia32_movsldup256", &&IX86_BUILTIN_MOVSLDUP},
+    {"__builtin_ia32_movss", &&IX86_BUILTIN_MOVSS},
+    {"__builtin_ia32_mulpd", &&IX86_BUILTIN_MULPD},
+    {"__builtin_ia32_mulpd256", &&IX86_BUILTIN_MULPD},
+    {"__builtin_ia32_mulps", &&IX86_BUILTIN_MULPS},
+    {"__builtin_ia32_mulps256", &&IX86_BUILTIN_MULPS},
+    {"__builtin_ia32_orpd", &&IX86_BUILTIN_ORPD},
+    {"__builtin_ia32_orpd256", &&IX86_BUILTIN_ORPD},
+    {"__builtin_ia32_orps", &&IX86_BUILTIN_ORPS},
+    {"__builtin_ia32_orps256", &&IX86_BUILTIN_ORPS},
+    {"__builtin_ia32_paddb", &&IX86_BUILTIN_PADDB},
+    {"__builtin_ia32_paddb128", &&IX86_BUILTIN_PADDB},
+    {"__builtin_ia32_paddb128", &&IX86_BUILTIN_PADDB128},
+    {"__builtin_ia32_paddd", &&IX86_BUILTIN_PADDD},
+    {"__builtin_ia32_paddd128", &&IX86_BUILTIN_PADDD},
+    {"__builtin_ia32_paddd128", &&IX86_BUILTIN_PADDD128},
+    {"__builtin_ia32_paddq128", &&IX86_BUILTIN_PADDQ},
+    {"__builtin_ia32_paddq", &&IX86_BUILTIN_PADDQ},
+    {"__builtin_ia32_paddq128", &&IX86_BUILTIN_PADDQ128},
+    {"__builtin_ia32_paddw", &&IX86_BUILTIN_PADDW},
+    {"__builtin_ia32_paddw128", &&IX86_BUILTIN_PADDW},
+    {"__builtin_ia32_paddw128", &&IX86_BUILTIN_PADDW128},
+    {"__builtin_ia32_pand", &&IX86_BUILTIN_PAND},
+    {"__builtin_ia32_pandn", &&IX86_BUILTIN_PAND},
+    {"__builtin_ia32_pand128", &&IX86_BUILTIN_PAND},
+    {"__builtin_ia32_pandn128", &&IX86_BUILTIN_PAND},
+    {"__builtin_ia32_pand128", &&IX86_BUILTIN_PAND128},
+    {"__builtin_ia32_pandn", &&IX86_BUILTIN_PANDN},
+    {"__builtin_ia32_pandn128", &&IX86_BUILTIN_PANDN},
+    {"__builtin_ia32_pandn128", &&IX86_BUILTIN_PANDN128},
+    {"__builtin_ia32_pmullw", &&IX86_BUILTIN_PMULLW},
+    {"__builtin_ia32_pmullw128", &&IX86_BUILTIN_PMULLW},
+    {"__builtin_ia32_pmullw128", &&IX86_BUILTIN_PMULLW128},
+    {"__builtin_ia32_por", &&IX86_BUILTIN_POR},
+    {"__builtin_ia32_por128", &&IX86_BUILTIN_POR},
+    {"__builtin_ia32_por128", &&IX86_BUILTIN_POR128},
+    {"__builtin_ia32_pshufd", &&IX86_BUILTIN_PSHUFD},
+    {"__builtin_ia32_pshufhw", &&IX86_BUILTIN_PSHUFHW},
+    {"__builtin_ia32_pshuflw", &&IX86_BUILTIN_PSHUFLW},
+    {"__builtin_ia32_pshufw", &&IX86_BUILTIN_PSHUFW},
+    {"__builtin_ia32_psubb", &&IX86_BUILTIN_PSUBB},
+    {"__builtin_ia32_psubb128", &&IX86_BUILTIN_PSUBB},
+    {"__builtin_ia32_psubb128", &&IX86_BUILTIN_PSUBB128},
+    {"__builtin_ia32_psubd", &&IX86_BUILTIN_PSUBD},
+    {"__builtin_ia32_psubd128", &&IX86_BUILTIN_PSUBD},
+    {"__builtin_ia32_psubd128", &&IX86_BUILTIN_PSUBD128},
+    {"__builtin_ia32_psubq128", &&IX86_BUILTIN_PSUBQ},
+    {"__builtin_ia32_psubq", &&IX86_BUILTIN_PSUBQ},
+    {"__builtin_ia32_psubq128", &&IX86_BUILTIN_PSUBQ128},
+    {"__builtin_ia32_psubw", &&IX86_BUILTIN_PSUBW},
+    {"__builtin_ia32_psubw128", &&IX86_BUILTIN_PSUBW},
+    {"__builtin_ia32_psubw128", &&IX86_BUILTIN_PSUBW128},
+    {"__builtin_ia32_punpckhbw", &&IX86_BUILTIN_PUNPCKHBW},
+    {"__builtin_ia32_punpckhbw128", &&IX86_BUILTIN_PUNPCKHBW},
+    {"__builtin_ia32_punpckhbw128", &&IX86_BUILTIN_PUNPCKHBW128},
+    {"__builtin_ia32_punpckhdq", &&IX86_BUILTIN_PUNPCKHDQ},
+    {"__builtin_ia32_punpckhdq128", &&IX86_BUILTIN_PUNPCKHDQ},
+    {"__builtin_ia32_punpckhdq128", &&IX86_BUILTIN_PUNPCKHDQ128},
+    {"__builtin_ia32_punpckhqdq128", &&IX86_BUILTIN_PUNPCKHQDQ128},
+    {"__builtin_ia32_punpckhwd", &&IX86_BUILTIN_PUNPCKHWD},
+    {"__builtin_ia32_punpckhwd128", &&IX86_BUILTIN_PUNPCKHWD},
+    {"__builtin_ia32_punpckhwd128", &&IX86_BUILTIN_PUNPCKHWD128},
+    {"__builtin_ia32_punpcklbw", &&IX86_BUILTIN_PUNPCKLBW},
+    {"__builtin_ia32_punpcklbw128", &&IX86_BUILTIN_PUNPCKLBW},
+    {"__builtin_ia32_punpcklbw128", &&IX86_BUILTIN_PUNPCKLBW128},
+    {"__builtin_ia32_punpckldq", &&IX86_BUILTIN_PUNPCKLDQ},
+    {"__builtin_ia32_punpckldq128", &&IX86_BUILTIN_PUNPCKLDQ},
+    {"__builtin_ia32_punpckldq128", &&IX86_BUILTIN_PUNPCKLDQ128},
+    {"__builtin_ia32_punpcklqdq128", &&IX86_BUILTIN_PUNPCKLQDQ128},
+    {"__builtin_ia32_punpcklwd", &&IX86_BUILTIN_PUNPCKLWD},
+    {"__builtin_ia32_punpcklwd128", &&IX86_BUILTIN_PUNPCKLWD},
+    {"__builtin_ia32_punpcklwd128", &&IX86_BUILTIN_PUNPCKLWD128},
+    {"__builtin_ia32_pxor", &&IX86_BUILTIN_PXOR},
+    {"__builtin_ia32_pxor128", &&IX86_BUILTIN_PXOR},
+    {"__builtin_ia32_pxor128", &&IX86_BUILTIN_PXOR128},
+    {"__builtin_ia32_shufpd", &&IX86_BUILTIN_SHUFPD},
+    {"__builtin_ia32_shufpd256", &&IX86_BUILTIN_SHUFPD},
+    {"__builtin_ia32_shufps", &&IX86_BUILTIN_SHUFPS},
+    {"__builtin_ia32_shufps256", &&IX86_BUILTIN_SHUFPS},
+    {"__builtin_ia32_stmxcsr", &&IX86_BUILTIN_STMXCSR},
+    {"__builtin_ia32_storedqu", &&IX86_BUILTIN_STOREDQU},
+    {"__builtin_ia32_storedqu256", &&IX86_BUILTIN_STOREDQU},
+    {"__builtin_ia32_storehps", &&IX86_BUILTIN_STOREHPS},
+    {"__builtin_ia32_storelps", &&IX86_BUILTIN_STORELPS},
+    {"__builtin_ia32_storeupd", &&IX86_BUILTIN_STOREUPD},
+    {"__builtin_ia32_storeupd256", &&IX86_BUILTIN_STOREUPD},
+    {"__builtin_ia32_storeups", &&IX86_BUILTIN_STOREUPS},
+    {"__builtin_ia32_storeups256", &&IX86_BUILTIN_STOREUPS},
+    {"__builtin_ia32_subpd", &&IX86_BUILTIN_SUBPD},
+    {"__builtin_ia32_subpd256", &&IX86_BUILTIN_SUBPD},
+    {"__builtin_ia32_subps", &&IX86_BUILTIN_SUBPS},
+    {"__builtin_ia32_subps256", &&IX86_BUILTIN_SUBPS},
+    {"__builtin_ia32_unpckhpd", &&IX86_BUILTIN_UNPCKHPD},
+    {"__builtin_ia32_unpckhpd256", &&IX86_BUILTIN_UNPCKHPD},
+    {"__builtin_ia32_unpckhps", &&IX86_BUILTIN_UNPCKHPS},
+    {"__builtin_ia32_unpckhps256", &&IX86_BUILTIN_UNPCKHPS},
+    {"__builtin_ia32_unpcklpd", &&IX86_BUILTIN_UNPCKLPD},
+    {"__builtin_ia32_unpcklpd256", &&IX86_BUILTIN_UNPCKLPD},
+    {"__builtin_ia32_unpcklps", &&IX86_BUILTIN_UNPCKLPS},
+    {"__builtin_ia32_unpcklps256", &&IX86_BUILTIN_UNPCKLPS},
+    {"__builtin_ia32_vec_ext_v16qi", &&IX86_BUILTIN_VEC_EXT_V16QI},
+    {"__builtin_ia32_vec_ext_v2df", &&IX86_BUILTIN_VEC_EXT_V2DF},
+    {"__builtin_ia32_vec_ext_v2di", &&IX86_BUILTIN_VEC_EXT_V2DI},
+    {"__builtin_ia32_vec_ext_v2si", &&IX86_BUILTIN_VEC_EXT_V2SI},
+    {"__builtin_ia32_vec_ext_v4hi", &&IX86_BUILTIN_VEC_EXT_V4HI},
+    {"__builtin_ia32_vec_ext_v4sf", &&IX86_BUILTIN_VEC_EXT_V4SF},
+    {"__builtin_ia32_vec_ext_v4si", &&IX86_BUILTIN_VEC_EXT_V4SI},
+    {"__builtin_ia32_vec_ext_v8hi", &&IX86_BUILTIN_VEC_EXT_V8HI},
+    {"__builtin_ia32_vec_init_v2si", &&IX86_BUILTIN_VEC_INIT_V2SI},
+    {"__builtin_ia32_vec_init_v4hi", &&IX86_BUILTIN_VEC_INIT_V4HI},
+    {"__builtin_ia32_vec_init_v8qi", &&IX86_BUILTIN_VEC_INIT_V8QI},
+    {"__builtin_ia32_vec_set_v16qi", &&IX86_BUILTIN_VEC_SET_V16QI},
+    {"__builtin_ia32_vec_set_v2di", &&IX86_BUILTIN_VEC_SET_V2DI},
+    {"__builtin_ia32_vec_set_v4hi", &&IX86_BUILTIN_VEC_SET_V4HI},
+    {"__builtin_ia32_vec_set_v4si", &&IX86_BUILTIN_VEC_SET_V4SI},
+    {"__builtin_ia32_vec_set_v8hi", &&IX86_BUILTIN_VEC_SET_V8HI},
+    {"__builtin_ia32_xorpd", &&IX86_BUILTIN_XORPD},
+    {"__builtin_ia32_xorpd256", &&IX86_BUILTIN_XORPD},
+    {"__builtin_ia32_xorps", &&IX86_BUILTIN_XORPS},
+    {"__builtin_ia32_xorps256", &&IX86_BUILTIN_XORPS}
+  };
+
+  static std::vector<void*> FunctionCodeCache;
+  if (FunctionCodeCache.size() <= DECL_FUNCTION_CODE(fndecl))
+      FunctionCodeCache.resize(DECL_FUNCTION_CODE(fndecl) + 1);
+  void *&Handler = FunctionCodeCache[DECL_FUNCTION_CODE(fndecl)];
+  if (!Handler) {
+    // Find the handler for this intrinsic.
+    HandlerEntry ToFind = {IDENTIFIER_POINTER(DECL_NAME(fndecl)), NULL};
+    size_t N = sizeof(Handlers) / sizeof(Handlers[0]);
+    const HandlerEntry *E = std::lower_bound(Handlers, Handlers + N, ToFind, LT);
+    Handler = E == Handlers + N ? &&unknown : E->Handler;
+  }
+
+  bool flip = false;
+  unsigned PredCode;
+  goto *Handler;
+
+  unknown: return false;
+  IX86_BUILTIN_ADDPS:
+  IX86_BUILTIN_ADDPD:
+  IX86_BUILTIN_PADDB:
+  IX86_BUILTIN_PADDW:
+  IX86_BUILTIN_PADDD:
+  IX86_BUILTIN_PADDQ:
+  IX86_BUILTIN_PADDB128:
+  IX86_BUILTIN_PADDW128:
+  IX86_BUILTIN_PADDD128:
+  IX86_BUILTIN_PADDQ128:
     Result = Builder.CreateAdd(Ops[0], Ops[1]);
     return true;
-  case IX86_BUILTIN_SUBPS:
-  case IX86_BUILTIN_SUBPD:
-  case IX86_BUILTIN_PSUBB:
-  case IX86_BUILTIN_PSUBW:
-  case IX86_BUILTIN_PSUBD:
-  case IX86_BUILTIN_PSUBQ:
-  case IX86_BUILTIN_PSUBB128:
-  case IX86_BUILTIN_PSUBW128:
-  case IX86_BUILTIN_PSUBD128:
-  case IX86_BUILTIN_PSUBQ128:
+  IX86_BUILTIN_SUBPS:
+  IX86_BUILTIN_SUBPD:
+  IX86_BUILTIN_PSUBB:
+  IX86_BUILTIN_PSUBW:
+  IX86_BUILTIN_PSUBD:
+  IX86_BUILTIN_PSUBQ:
+  IX86_BUILTIN_PSUBB128:
+  IX86_BUILTIN_PSUBW128:
+  IX86_BUILTIN_PSUBD128:
+  IX86_BUILTIN_PSUBQ128:
     Result = Builder.CreateSub(Ops[0], Ops[1]);
     return true;
-  case IX86_BUILTIN_MULPS:
-  case IX86_BUILTIN_MULPD:
-  case IX86_BUILTIN_PMULLW:
-  case IX86_BUILTIN_PMULLW128:
+  IX86_BUILTIN_MULPS:
+  IX86_BUILTIN_MULPD:
+  IX86_BUILTIN_PMULLW:
+  IX86_BUILTIN_PMULLW128:
     Result = Builder.CreateMul(Ops[0], Ops[1]);
     return true;
-  case IX86_BUILTIN_DIVPS:
-  case IX86_BUILTIN_DIVPD:
+  IX86_BUILTIN_DIVPS:
+  IX86_BUILTIN_DIVPD:
     Result = Builder.CreateFDiv(Ops[0], Ops[1]);
     return true;
-  case IX86_BUILTIN_PAND:
-  case IX86_BUILTIN_PAND128:
+  IX86_BUILTIN_PAND:
+  IX86_BUILTIN_PAND128:
     Result = Builder.CreateAnd(Ops[0], Ops[1]);
     return true;
-  case IX86_BUILTIN_PANDN:
-  case IX86_BUILTIN_PANDN128:
+  IX86_BUILTIN_PANDN:
+  IX86_BUILTIN_PANDN128:
     Ops[0] = Builder.CreateNot(Ops[0]);
     Result = Builder.CreateAnd(Ops[0], Ops[1]);
     return true;
-  case IX86_BUILTIN_POR:
-  case IX86_BUILTIN_POR128:
+  IX86_BUILTIN_POR:
+  IX86_BUILTIN_POR128:
     Result = Builder.CreateOr(Ops[0], Ops[1]);
     return true;
-  case IX86_BUILTIN_PXOR:
-  case IX86_BUILTIN_PXOR128:
+  IX86_BUILTIN_PXOR:
+  IX86_BUILTIN_PXOR128:
     Result = Builder.CreateXor(Ops[0], Ops[1]);
     return true;
-  case IX86_BUILTIN_ANDPS:
-  case IX86_BUILTIN_ORPS:
-  case IX86_BUILTIN_XORPS:
-  case IX86_BUILTIN_ANDNPS:
-  case IX86_BUILTIN_ANDPD:
-  case IX86_BUILTIN_ORPD:
-  case IX86_BUILTIN_XORPD:
-  case IX86_BUILTIN_ANDNPD:
-    if (cast<VectorType>(ResultType)->getNumElements() == 4)  // v4f32
-      Ops[0] = Builder.CreateBitCast(Ops[0], 
-                                  VectorType::get(Type::getInt32Ty(Context), 4),
-                                     "tmp");
-    else                                                      // v2f64
-      Ops[0] = Builder.CreateBitCast(Ops[0], 
-                                 VectorType::get(Type::getInt64Ty(Context), 2),
-                                     "tmp");
-    
+  IX86_BUILTIN_ANDPS:
+  IX86_BUILTIN_ANDPD:
+    Ops[0] = BitCastToIntVector(Ops[0], Builder);
     Ops[1] = Builder.CreateBitCast(Ops[1], Ops[0]->getType());
-    switch (FnCode) {
-      case IX86_BUILTIN_ANDPS:
-      case IX86_BUILTIN_ANDPD:
-        Result = Builder.CreateAnd(Ops[0], Ops[1]);
-        break;
-      case IX86_BUILTIN_ORPS:
-      case IX86_BUILTIN_ORPD:
-        Result = Builder.CreateOr (Ops[0], Ops[1]);
-         break;
-      case IX86_BUILTIN_XORPS:
-      case IX86_BUILTIN_XORPD:
-        Result = Builder.CreateXor(Ops[0], Ops[1]);
-        break;
-      case IX86_BUILTIN_ANDNPS:
-      case IX86_BUILTIN_ANDNPD:
-        Ops[0] = Builder.CreateNot(Ops[0]);
-        Result = Builder.CreateAnd(Ops[0], Ops[1]);
-        break;
-    }
+    Result = Builder.CreateAnd(Ops[0], Ops[1]);
+    Result = Builder.CreateBitCast(Result, ResultType);
+    return true;
+  IX86_BUILTIN_ORPS:
+  IX86_BUILTIN_ORPD:
+    Ops[0] = BitCastToIntVector(Ops[0], Builder);
+    Ops[1] = Builder.CreateBitCast(Ops[1], Ops[0]->getType());
+    Result = Builder.CreateOr(Ops[0], Ops[1]);
+    Result = Builder.CreateBitCast(Result, ResultType);
+    return true;
+  IX86_BUILTIN_XORPS:
+  IX86_BUILTIN_XORPD:
+    Ops[0] = BitCastToIntVector(Ops[0], Builder);
+    Ops[1] = Builder.CreateBitCast(Ops[1], Ops[0]->getType());
+    Result = Builder.CreateXor(Ops[0], Ops[1]);
     Result = Builder.CreateBitCast(Result, ResultType);
     return true;
-  case IX86_BUILTIN_SHUFPS:
+  IX86_BUILTIN_ANDNPS:
+  IX86_BUILTIN_ANDNPD:
+    Ops[0] = BitCastToIntVector(Ops[0], Builder);
+    Ops[1] = Builder.CreateBitCast(Ops[1], Ops[0]->getType());
+    Ops[0] = Builder.CreateNot(Ops[0]);
+    Result = Builder.CreateAnd(Ops[0], Ops[1]);
+    Result = Builder.CreateBitCast(Result, ResultType);
+    return true;
+  IX86_BUILTIN_SHUFPS:
     if (ConstantInt *Elt = dyn_cast<ConstantInt>(Ops[2])) {
       int EV = Elt->getZExtValue();
       Result = BuildVectorShuffle(Ops[0], Ops[1],
@@ -166,7 +387,7 @@
       Result = Ops[0];
     }
     return true;
-  case IX86_BUILTIN_SHUFPD:
+  IX86_BUILTIN_SHUFPD:
     if (ConstantInt *Elt = dyn_cast<ConstantInt>(Ops[2])) {
       int EV = Elt->getZExtValue();
       Result = BuildVectorShuffle(Ops[0], Ops[1],
@@ -176,8 +397,8 @@
       Result = Ops[0];
     }
     return true;
-  case IX86_BUILTIN_PSHUFW:
-  case IX86_BUILTIN_PSHUFD:
+  IX86_BUILTIN_PSHUFW:
+  IX86_BUILTIN_PSHUFD:
     if (ConstantInt *Elt = dyn_cast<ConstantInt>(Ops[1])) {
       int EV = Elt->getZExtValue();
       Result = BuildVectorShuffle(Ops[0], Ops[0],
@@ -188,7 +409,7 @@
       Result = Ops[0];
     }
     return true;
-  case IX86_BUILTIN_PSHUFHW:
+  IX86_BUILTIN_PSHUFHW:
     if (ConstantInt *Elt = dyn_cast<ConstantInt>(Ops[1])) {
       int EV = Elt->getZExtValue();
       Result = BuildVectorShuffle(Ops[0], Ops[0],
@@ -198,7 +419,7 @@
       return true;
     }
     return false;
-  case IX86_BUILTIN_PSHUFLW:
+  IX86_BUILTIN_PSHUFLW:
     if (ConstantInt *Elt = dyn_cast<ConstantInt>(Ops[1])) {
       int EV = Elt->getZExtValue();
       Result = BuildVectorShuffle(Ops[0], Ops[0],
@@ -211,87 +432,87 @@
     }
     
     return true;
-  case IX86_BUILTIN_PUNPCKHBW:
+  IX86_BUILTIN_PUNPCKHBW:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 4, 12, 5, 13,
                                                 6, 14, 7, 15);
     return true;
-  case IX86_BUILTIN_PUNPCKHWD:
+  IX86_BUILTIN_PUNPCKHWD:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 2, 6, 3, 7);
     return true;
-  case IX86_BUILTIN_PUNPCKHDQ:
+  IX86_BUILTIN_PUNPCKHDQ:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 1, 3);
     return true;
-  case IX86_BUILTIN_PUNPCKLBW:
+  IX86_BUILTIN_PUNPCKLBW:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 0,  8, 1,  9,
                                                 2, 10, 3, 11);
     return true;
-  case IX86_BUILTIN_PUNPCKLWD:
+  IX86_BUILTIN_PUNPCKLWD:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 0, 4, 1, 5);
     return true;
-  case IX86_BUILTIN_PUNPCKLDQ:
+  IX86_BUILTIN_PUNPCKLDQ:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 0, 2);
     return true;
-  case IX86_BUILTIN_PUNPCKHBW128:
+  IX86_BUILTIN_PUNPCKHBW128:
     Result = BuildVectorShuffle(Ops[0], Ops[1],  8, 24,  9, 25,
                                                 10, 26, 11, 27,
                                                 12, 28, 13, 29,
                                                 14, 30, 15, 31);
     return true;
-  case IX86_BUILTIN_PUNPCKHWD128:
+  IX86_BUILTIN_PUNPCKHWD128:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 4, 12, 5, 13, 6, 14, 7, 15);
     return true;
-  case IX86_BUILTIN_PUNPCKHDQ128:
+  IX86_BUILTIN_PUNPCKHDQ128:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 2, 6, 3, 7);
     return true;
-  case IX86_BUILTIN_PUNPCKHQDQ128:
+  IX86_BUILTIN_PUNPCKHQDQ128:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 1, 3);
     return true;
-  case IX86_BUILTIN_PUNPCKLBW128:
+  IX86_BUILTIN_PUNPCKLBW128:
     Result = BuildVectorShuffle(Ops[0], Ops[1],  0, 16,  1, 17,
                                                  2, 18,  3, 19,
                                                  4, 20,  5, 21,
                                                  6, 22,  7, 23);
     return true;
-  case IX86_BUILTIN_PUNPCKLWD128:
+  IX86_BUILTIN_PUNPCKLWD128:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 0, 8, 1, 9, 2, 10, 3, 11);
     return true;
-  case IX86_BUILTIN_PUNPCKLDQ128:
+  IX86_BUILTIN_PUNPCKLDQ128:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 0, 4, 1, 5);
     return true;
-  case IX86_BUILTIN_PUNPCKLQDQ128:
+  IX86_BUILTIN_PUNPCKLQDQ128:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 0, 2);
     return true;
-  case IX86_BUILTIN_UNPCKHPS:
+  IX86_BUILTIN_UNPCKHPS:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 2, 6, 3, 7);
     return true;
-  case IX86_BUILTIN_UNPCKHPD:
+  IX86_BUILTIN_UNPCKHPD:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 1, 3);
     return true;
-  case IX86_BUILTIN_UNPCKLPS:
+  IX86_BUILTIN_UNPCKLPS:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 0, 4, 1, 5);
     return true;
-  case IX86_BUILTIN_UNPCKLPD:
+  IX86_BUILTIN_UNPCKLPD:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 0, 2);
     return true;
-  case IX86_BUILTIN_MOVHLPS:
+  IX86_BUILTIN_MOVHLPS:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 6, 7, 2, 3);
     return true;
-  case IX86_BUILTIN_MOVLHPS:
+  IX86_BUILTIN_MOVLHPS:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 0, 1, 4, 5);
     return true;
-  case IX86_BUILTIN_MOVSS:
+  IX86_BUILTIN_MOVSS:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 4, 1, 2, 3);
     return true;
-  case IX86_BUILTIN_MOVSD:
+  IX86_BUILTIN_MOVSD:
     Result = BuildVectorShuffle(Ops[0], Ops[1], 2, 1);
     return true;
-  case IX86_BUILTIN_MOVQ: {
+  IX86_BUILTIN_MOVQ: {
     Value *Zero = ConstantInt::get(Type::getInt32Ty(Context), 0);
     Result = BuildVector(Zero, Zero, Zero, Zero, NULL);
     Result = BuildVectorShuffle(Result, Ops[0], 4, 5, 2, 3);
     return true;
   }
-  case IX86_BUILTIN_LOADQ: {
+  IX86_BUILTIN_LOADQ: {
     const PointerType *i64Ptr = Type::getInt64PtrTy(Context);
     Ops[0] = Builder.CreateBitCast(Ops[0], i64Ptr);
     Ops[0] = Builder.CreateLoad(Ops[0]);
@@ -302,7 +523,7 @@
     Result = Builder.CreateBitCast(Result, ResultType);
     return true;
   }
-  case IX86_BUILTIN_LOADUPS: {
+  IX86_BUILTIN_LOADUPS: {
     VectorType *v4f32 = VectorType::get(Type::getFloatTy(Context), 4);
     const PointerType *v4f32Ptr = v4f32->getPointerTo();
     Value *BC = Builder.CreateBitCast(Ops[0], v4f32Ptr);
@@ -311,7 +532,7 @@
     Result = LI;
     return true;
   }
-  case IX86_BUILTIN_LOADUPD: {
+  IX86_BUILTIN_LOADUPD: {
     VectorType *v2f64 = VectorType::get(Type::getDoubleTy(Context), 2);
     const PointerType *v2f64Ptr = v2f64->getPointerTo();
     Value *BC = Builder.CreateBitCast(Ops[0], v2f64Ptr);
@@ -320,7 +541,7 @@
     Result = LI;
     return true;
   }
-  case IX86_BUILTIN_LOADDQU: {
+  IX86_BUILTIN_LOADDQU: {
     VectorType *v16i8 = VectorType::get(Type::getInt8Ty(Context), 16);
     const PointerType *v16i8Ptr = v16i8->getPointerTo();
     Value *BC = Builder.CreateBitCast(Ops[0], v16i8Ptr);
@@ -329,7 +550,7 @@
     Result = LI;
     return true;
   }
-  case IX86_BUILTIN_STOREUPS: {
+  IX86_BUILTIN_STOREUPS: {
     VectorType *v4f32 = VectorType::get(Type::getFloatTy(Context), 4);
     const PointerType *v4f32Ptr = v4f32->getPointerTo();
     Value *BC = Builder.CreateBitCast(Ops[0], v4f32Ptr);
@@ -338,7 +559,7 @@
     Result = SI;
     return true;
   }
-  case IX86_BUILTIN_STOREUPD: {
+  IX86_BUILTIN_STOREUPD: {
     VectorType *v2f64 = VectorType::get(Type::getDoubleTy(Context), 2);
     const PointerType *v2f64Ptr = v2f64->getPointerTo();
     Value *BC = Builder.CreateBitCast(Ops[0], v2f64Ptr);
@@ -347,7 +568,7 @@
     Result = SI;
     return true;
   }
-  case IX86_BUILTIN_STOREDQU: {
+  IX86_BUILTIN_STOREDQU: {
     VectorType *v16i8 = VectorType::get(Type::getInt8Ty(Context), 16);
     const PointerType *v16i8Ptr = v16i8->getPointerTo();
     Value *BC = Builder.CreateBitCast(Ops[0], v16i8Ptr);
@@ -356,7 +577,7 @@
     Result = SI;
     return true;
   }
-  case IX86_BUILTIN_LOADHPS: {
+  IX86_BUILTIN_LOADHPS: {
     const PointerType *f64Ptr = Type::getDoublePtrTy(Context);
     Ops[1] = Builder.CreateBitCast(Ops[1], f64Ptr);
     Value *Load = Builder.CreateLoad(Ops[1]);
@@ -366,7 +587,7 @@
     Result = Builder.CreateBitCast(Result, ResultType);
     return true;
   }
-  case IX86_BUILTIN_LOADLPS: {
+  IX86_BUILTIN_LOADLPS: {
     const PointerType *f64Ptr = Type::getDoublePtrTy(Context);
     Ops[1] = Builder.CreateBitCast(Ops[1], f64Ptr);
     Value *Load = Builder.CreateLoad(Ops[1]);
@@ -376,7 +597,7 @@
     Result = Builder.CreateBitCast(Result, ResultType);
     return true;
   }
-  case IX86_BUILTIN_LOADHPD: {
+  IX86_BUILTIN_LOADHPD: {
     Value *Load = Builder.CreateLoad(Ops[1]);
     Ops[1] = BuildVector(Load, UndefValue::get(Type::getDoubleTy(Context)), NULL);
     Ops[1] = Builder.CreateBitCast(Ops[1], ResultType);
@@ -384,7 +605,7 @@
     Result = Builder.CreateBitCast(Result, ResultType);
     return true;
   }
-  case IX86_BUILTIN_LOADLPD: {
+  IX86_BUILTIN_LOADLPD: {
     Value *Load = Builder.CreateLoad(Ops[1]);
     Ops[1] = BuildVector(Load, UndefValue::get(Type::getDoubleTy(Context)), NULL);
     Ops[1] = Builder.CreateBitCast(Ops[1], ResultType);
@@ -392,7 +613,7 @@
     Result = Builder.CreateBitCast(Result, ResultType);
     return true;
   }
-  case IX86_BUILTIN_STOREHPS: {
+  IX86_BUILTIN_STOREHPS: {
     VectorType *v2f64 = VectorType::get(Type::getDoubleTy(Context), 2);
     const PointerType *f64Ptr = Type::getDoublePtrTy(Context);
     Ops[0] = Builder.CreateBitCast(Ops[0], f64Ptr);
@@ -402,7 +623,7 @@
     Result = Builder.CreateStore(Ops[1], Ops[0]);
     return true;
   }
-  case IX86_BUILTIN_STORELPS: {
+  IX86_BUILTIN_STORELPS: {
     VectorType *v2f64 = VectorType::get(Type::getDoubleTy(Context), 2);
     const PointerType *f64Ptr = Type::getDoublePtrTy(Context);
     Ops[0] = Builder.CreateBitCast(Ops[0], f64Ptr);
@@ -412,86 +633,71 @@
     Result = Builder.CreateStore(Ops[1], Ops[0]);
     return true;
   }
-  case IX86_BUILTIN_MOVSHDUP:
+  IX86_BUILTIN_MOVSHDUP:
     Result = BuildVectorShuffle(Ops[0], Ops[0], 1, 1, 3, 3);
     return true;
-  case IX86_BUILTIN_MOVSLDUP:
+  IX86_BUILTIN_MOVSLDUP:
     Result = BuildVectorShuffle(Ops[0], Ops[0], 0, 0, 2, 2);
     return true;
-  case IX86_BUILTIN_VEC_INIT_V2SI:
+  IX86_BUILTIN_VEC_INIT_V2SI:
     Result = BuildVector(Ops[0], Ops[1], NULL);
     return true;
-  case IX86_BUILTIN_VEC_INIT_V4HI:
+  IX86_BUILTIN_VEC_INIT_V4HI:
     // Sometimes G++ promotes arguments to int.
     for (unsigned i = 0; i != 4; ++i)
       Ops[i] = Builder.CreateIntCast(Ops[i], Type::getInt16Ty(Context), false);
     Result = BuildVector(Ops[0], Ops[1], Ops[2], Ops[3], NULL);
     return true;
-  case IX86_BUILTIN_VEC_INIT_V8QI:
+  IX86_BUILTIN_VEC_INIT_V8QI:
     // Sometimes G++ promotes arguments to int.
     for (unsigned i = 0; i != 8; ++i)
       Ops[i] = Builder.CreateIntCast(Ops[i], Type::getInt8Ty(Context), false);
     Result = BuildVector(Ops[0], Ops[1], Ops[2], Ops[3],
                          Ops[4], Ops[5], Ops[6], Ops[7], NULL);
     return true;
-  case IX86_BUILTIN_VEC_EXT_V2SI:
-  case IX86_BUILTIN_VEC_EXT_V4HI:
-  case IX86_BUILTIN_VEC_EXT_V2DF:
-  case IX86_BUILTIN_VEC_EXT_V2DI:
-  case IX86_BUILTIN_VEC_EXT_V4SI:
-  case IX86_BUILTIN_VEC_EXT_V4SF:
-  case IX86_BUILTIN_VEC_EXT_V8HI:
-  case IX86_BUILTIN_VEC_EXT_V16QI:
+  IX86_BUILTIN_VEC_EXT_V2SI:
+  IX86_BUILTIN_VEC_EXT_V4HI:
+  IX86_BUILTIN_VEC_EXT_V2DF:
+  IX86_BUILTIN_VEC_EXT_V2DI:
+  IX86_BUILTIN_VEC_EXT_V4SI:
+  IX86_BUILTIN_VEC_EXT_V4SF:
+  IX86_BUILTIN_VEC_EXT_V8HI:
+  IX86_BUILTIN_VEC_EXT_V16QI:
     Result = Builder.CreateExtractElement(Ops[0], Ops[1]);
     return true;
-  case IX86_BUILTIN_VEC_SET_V16QI:
+  IX86_BUILTIN_VEC_SET_V16QI:
     // Sometimes G++ promotes arguments to int.
     Ops[1] = Builder.CreateIntCast(Ops[1], Type::getInt8Ty(Context), false);
     Result = Builder.CreateInsertElement(Ops[0], Ops[1], Ops[2]);
     return true;
-  case IX86_BUILTIN_VEC_SET_V4HI:
-  case IX86_BUILTIN_VEC_SET_V8HI:
+  IX86_BUILTIN_VEC_SET_V4HI:
+  IX86_BUILTIN_VEC_SET_V8HI:
     // GCC sometimes doesn't produce the right element type.
     Ops[1] = Builder.CreateIntCast(Ops[1], Type::getInt16Ty(Context), false);
     Result = Builder.CreateInsertElement(Ops[0], Ops[1], Ops[2]);
     return true;
-  case IX86_BUILTIN_VEC_SET_V4SI:
+  IX86_BUILTIN_VEC_SET_V4SI:
     Result = Builder.CreateInsertElement(Ops[0], Ops[1], Ops[2]);
     return true;
-  case IX86_BUILTIN_VEC_SET_V2DI:
+  IX86_BUILTIN_VEC_SET_V2DI:
     Result = Builder.CreateInsertElement(Ops[0], Ops[1], Ops[2]);
     return true;
-  case IX86_BUILTIN_CMPEQPS:
-  case IX86_BUILTIN_CMPLTPS:
-  case IX86_BUILTIN_CMPLEPS:
-  case IX86_BUILTIN_CMPGTPS:
-  case IX86_BUILTIN_CMPGEPS:
-  case IX86_BUILTIN_CMPNEQPS:
-  case IX86_BUILTIN_CMPNLTPS:
-  case IX86_BUILTIN_CMPNLEPS:
-  case IX86_BUILTIN_CMPNGTPS:
-  case IX86_BUILTIN_CMPNGEPS:
-  case IX86_BUILTIN_CMPORDPS:
-  case IX86_BUILTIN_CMPUNORDPS: {
+
+  IX86_BUILTIN_CMPEQPS: PredCode = 0; goto CMPXXPS;
+  IX86_BUILTIN_CMPLTPS: PredCode = 1; goto CMPXXPS;
+  IX86_BUILTIN_CMPGTPS: PredCode = 1; flip = true; goto CMPXXPS;
+  IX86_BUILTIN_CMPLEPS: PredCode = 2; goto CMPXXPS;
+  IX86_BUILTIN_CMPGEPS: PredCode = 2; flip = true; goto CMPXXPS;
+  IX86_BUILTIN_CMPUNORDPS: PredCode = 3; goto CMPXXPS;
+  IX86_BUILTIN_CMPNEQPS: PredCode = 4; goto CMPXXPS;
+  IX86_BUILTIN_CMPNLTPS: PredCode = 5; goto CMPXXPS;
+  IX86_BUILTIN_CMPNGTPS: PredCode = 5; flip = true; goto CMPXXPS;
+  IX86_BUILTIN_CMPNLEPS: PredCode = 6; goto CMPXXPS;
+  IX86_BUILTIN_CMPNGEPS: PredCode = 6; flip = true; goto CMPXXPS;
+  IX86_BUILTIN_CMPORDPS: PredCode = 7; goto CMPXXPS;
+  CMPXXPS: {
     Function *cmpps =
       Intrinsic::getDeclaration(TheModule, Intrinsic::x86_sse_cmp_ps);
-    bool flip = false;
-    unsigned PredCode;
-    switch (FnCode) {
-    default: assert(0 && "Unknown fncode!");
-    case IX86_BUILTIN_CMPEQPS: PredCode = 0; break;
-    case IX86_BUILTIN_CMPLTPS: PredCode = 1; break;
-    case IX86_BUILTIN_CMPGTPS: PredCode = 1; flip = true; break;
-    case IX86_BUILTIN_CMPLEPS: PredCode = 2; break;
-    case IX86_BUILTIN_CMPGEPS: PredCode = 2; flip = true; break;
-    case IX86_BUILTIN_CMPUNORDPS: PredCode = 3; break;
-    case IX86_BUILTIN_CMPNEQPS: PredCode = 4; break;
-    case IX86_BUILTIN_CMPNLTPS: PredCode = 5; break;
-    case IX86_BUILTIN_CMPNGTPS: PredCode = 5; flip = true; break;
-    case IX86_BUILTIN_CMPNLEPS: PredCode = 6; break;
-    case IX86_BUILTIN_CMPNGEPS: PredCode = 6; flip = true; break;
-    case IX86_BUILTIN_CMPORDPS: PredCode = 7; break;
-    }
     Value *Pred = ConstantInt::get(Type::getInt8Ty(Context), PredCode);
     Value *Arg0 = Ops[0];
     Value *Arg1 = Ops[1];
@@ -501,67 +707,38 @@
     Result = Builder.CreateBitCast(Result, ResultType);
     return true;
   }
-  case IX86_BUILTIN_CMPEQSS:
-  case IX86_BUILTIN_CMPLTSS:
-  case IX86_BUILTIN_CMPLESS:
-  case IX86_BUILTIN_CMPNEQSS:
-  case IX86_BUILTIN_CMPNLTSS:
-  case IX86_BUILTIN_CMPNLESS:
-  case IX86_BUILTIN_CMPNGTSS:
-  case IX86_BUILTIN_CMPNGESS:
-  case IX86_BUILTIN_CMPORDSS:
-  case IX86_BUILTIN_CMPUNORDSS: {
+  IX86_BUILTIN_CMPEQSS:    PredCode = 0; goto CMPXXSS;
+  IX86_BUILTIN_CMPLTSS:    PredCode = 1; goto CMPXXSS;
+  IX86_BUILTIN_CMPLESS:    PredCode = 2; goto CMPXXSS;
+  IX86_BUILTIN_CMPUNORDSS: PredCode = 3; goto CMPXXSS;
+  IX86_BUILTIN_CMPNEQSS:   PredCode = 4; goto CMPXXSS;
+  IX86_BUILTIN_CMPNLTSS:   PredCode = 5; goto CMPXXSS;
+  IX86_BUILTIN_CMPNLESS:   PredCode = 6; goto CMPXXSS;
+  IX86_BUILTIN_CMPORDSS:   PredCode = 7; goto CMPXXSS;
+  CMPXXSS: {
     Function *cmpss =
       Intrinsic::getDeclaration(TheModule, Intrinsic::x86_sse_cmp_ss);
-    unsigned PredCode;
-    switch (FnCode) {
-    default: assert(0 && "Unknown fncode");
-    case IX86_BUILTIN_CMPEQSS:    PredCode = 0; break;
-    case IX86_BUILTIN_CMPLTSS:    PredCode = 1; break;
-    case IX86_BUILTIN_CMPLESS:    PredCode = 2; break;
-    case IX86_BUILTIN_CMPUNORDSS: PredCode = 3; break;
-    case IX86_BUILTIN_CMPNEQSS:   PredCode = 4; break;
-    case IX86_BUILTIN_CMPNLTSS:   PredCode = 5; break;
-    case IX86_BUILTIN_CMPNLESS:   PredCode = 6; break;
-    case IX86_BUILTIN_CMPORDSS:   PredCode = 7; break;
-    }
     Value *Pred = ConstantInt::get(Type::getInt8Ty(Context), PredCode);
     Value *CallOps[3] = { Ops[0], Ops[1], Pred };
     Result = Builder.CreateCall(cmpss, CallOps, CallOps+3);
     Result = Builder.CreateBitCast(Result, ResultType);
     return true;
   }
-  case IX86_BUILTIN_CMPEQPD:
-  case IX86_BUILTIN_CMPLTPD:
-  case IX86_BUILTIN_CMPLEPD:
-  case IX86_BUILTIN_CMPGTPD:
-  case IX86_BUILTIN_CMPGEPD:
-  case IX86_BUILTIN_CMPNEQPD:
-  case IX86_BUILTIN_CMPNLTPD:
-  case IX86_BUILTIN_CMPNLEPD:
-  case IX86_BUILTIN_CMPNGTPD:
-  case IX86_BUILTIN_CMPNGEPD:
-  case IX86_BUILTIN_CMPORDPD:
-  case IX86_BUILTIN_CMPUNORDPD: {
+  IX86_BUILTIN_CMPEQPD:    PredCode = 0; goto CMPXXPD;
+  IX86_BUILTIN_CMPLTPD:    PredCode = 1; goto CMPXXPD;
+  IX86_BUILTIN_CMPGTPD:    PredCode = 1; flip = true; goto CMPXXPD;
+  IX86_BUILTIN_CMPLEPD:    PredCode = 2; goto CMPXXPD;
+  IX86_BUILTIN_CMPGEPD:    PredCode = 2; flip = true; goto CMPXXPD;
+  IX86_BUILTIN_CMPUNORDPD: PredCode = 3; goto CMPXXPD;
+  IX86_BUILTIN_CMPNEQPD:   PredCode = 4; goto CMPXXPD;
+  IX86_BUILTIN_CMPNLTPD:   PredCode = 5; goto CMPXXPD;
+  IX86_BUILTIN_CMPNGTPD:   PredCode = 5; flip = true; goto CMPXXPD;
+  IX86_BUILTIN_CMPNLEPD:   PredCode = 6; goto CMPXXPD;
+  IX86_BUILTIN_CMPNGEPD:   PredCode = 6; flip = true; goto CMPXXPD;
+  IX86_BUILTIN_CMPORDPD:   PredCode = 7; goto CMPXXPD;
+  CMPXXPD: {
     Function *cmppd =
       Intrinsic::getDeclaration(TheModule, Intrinsic::x86_sse2_cmp_pd);
-    bool flip = false;
-    unsigned PredCode;
-    switch (FnCode) {
-    default: assert(0 && "Unknown fncode!");
-    case IX86_BUILTIN_CMPEQPD:    PredCode = 0; break;
-    case IX86_BUILTIN_CMPLTPD:    PredCode = 1; break;
-    case IX86_BUILTIN_CMPGTPD:    PredCode = 1; flip = true; break;
-    case IX86_BUILTIN_CMPLEPD:    PredCode = 2; break;
-    case IX86_BUILTIN_CMPGEPD:    PredCode = 2; flip = true; break;
-    case IX86_BUILTIN_CMPUNORDPD: PredCode = 3; break;
-    case IX86_BUILTIN_CMPNEQPD:   PredCode = 4; break;
-    case IX86_BUILTIN_CMPNLTPD:   PredCode = 5; break;
-    case IX86_BUILTIN_CMPNGTPD:   PredCode = 5; flip = true; break;
-    case IX86_BUILTIN_CMPNLEPD:   PredCode = 6; break;
-    case IX86_BUILTIN_CMPNGEPD:   PredCode = 6; flip = true; break;
-    case IX86_BUILTIN_CMPORDPD:   PredCode = 7; break;
-    }
     Value *Pred = ConstantInt::get(Type::getInt8Ty(Context), PredCode);
     Value *Arg0 = Ops[0];
     Value *Arg1 = Ops[1];
@@ -572,35 +749,24 @@
     Result = Builder.CreateBitCast(Result, ResultType);
     return true;
   }
-  case IX86_BUILTIN_CMPEQSD:
-  case IX86_BUILTIN_CMPLTSD:
-  case IX86_BUILTIN_CMPLESD:
-  case IX86_BUILTIN_CMPNEQSD:
-  case IX86_BUILTIN_CMPNLTSD:
-  case IX86_BUILTIN_CMPNLESD:
-  case IX86_BUILTIN_CMPORDSD:
-  case IX86_BUILTIN_CMPUNORDSD: {
+  IX86_BUILTIN_CMPEQSD:    PredCode = 0; goto CMPXXSD;
+  IX86_BUILTIN_CMPLTSD:    PredCode = 1; goto CMPXXSD;
+  IX86_BUILTIN_CMPLESD:    PredCode = 2; goto CMPXXSD;
+  IX86_BUILTIN_CMPUNORDSD: PredCode = 3; goto CMPXXSD;
+  IX86_BUILTIN_CMPNEQSD:   PredCode = 4; goto CMPXXSD;
+  IX86_BUILTIN_CMPNLTSD:   PredCode = 5; goto CMPXXSD;
+  IX86_BUILTIN_CMPNLESD:   PredCode = 6; goto CMPXXSD;
+  IX86_BUILTIN_CMPORDSD:   PredCode = 7; goto CMPXXSD;
+  CMPXXSD: {
     Function *cmpsd =
       Intrinsic::getDeclaration(TheModule, Intrinsic::x86_sse2_cmp_sd);
-    unsigned PredCode;
-    switch (FnCode) {
-      default: assert(0 && "Unknown fncode");
-    case IX86_BUILTIN_CMPEQSD:    PredCode = 0; break;
-    case IX86_BUILTIN_CMPLTSD:    PredCode = 1; break;
-    case IX86_BUILTIN_CMPLESD:    PredCode = 2; break;
-    case IX86_BUILTIN_CMPUNORDSD: PredCode = 3; break;
-    case IX86_BUILTIN_CMPNEQSD:   PredCode = 4; break;
-    case IX86_BUILTIN_CMPNLTSD:   PredCode = 5; break;
-    case IX86_BUILTIN_CMPNLESD:   PredCode = 6; break;
-    case IX86_BUILTIN_CMPORDSD:   PredCode = 7; break;
-    }
     Value *Pred = ConstantInt::get(Type::getInt8Ty(Context), PredCode);
     Value *CallOps[3] = { Ops[0], Ops[1], Pred };
     Result = Builder.CreateCall(cmpsd, CallOps, CallOps+3);
     Result = Builder.CreateBitCast(Result, ResultType);
     return true;
   }
-  case IX86_BUILTIN_LDMXCSR: {
+  IX86_BUILTIN_LDMXCSR: {
     Function *ldmxcsr =
       Intrinsic::getDeclaration(TheModule, Intrinsic::x86_sse_ldmxcsr);
     Value *Ptr = CreateTemporary(Type::getInt32Ty(Context));
@@ -609,7 +775,7 @@
     Result = Builder.CreateCall(ldmxcsr, Ptr);
     return true;
   }
-  case IX86_BUILTIN_STMXCSR: {
+  IX86_BUILTIN_STMXCSR: {
     Function *stmxcsr =
       Intrinsic::getDeclaration(TheModule, Intrinsic::x86_sse_stmxcsr);
     Value *Ptr  = CreateTemporary(Type::getInt32Ty(Context));
@@ -619,9 +785,6 @@
     Result = Builder.CreateLoad(Ptr);
     return true;
   }
-  }
-
-  return false;
 }
 
 /* These are defined in i386.c */

Modified: dragonegg/trunk/x86/llvm-target.h
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/x86/llvm-target.h?rev=85719&r1=85718&r2=85719&view=diff

==============================================================================
--- dragonegg/trunk/x86/llvm-target.h (original)
+++ dragonegg/trunk/x86/llvm-target.h Sun Nov  1 11:28:26 2009
@@ -250,589 +250,6 @@
     X86_64_MEMORY_CLASS
   };
 
-/* Codes for all the SSE/MMX builtins.  */
-enum ix86_builtins
-{
-  IX86_BUILTIN_ADDPS,
-  IX86_BUILTIN_ADDSS,
-  IX86_BUILTIN_DIVPS,
-  IX86_BUILTIN_DIVSS,
-  IX86_BUILTIN_MULPS,
-  IX86_BUILTIN_MULSS,
-  IX86_BUILTIN_SUBPS,
-  IX86_BUILTIN_SUBSS,
-
-  IX86_BUILTIN_CMPEQPS,
-  IX86_BUILTIN_CMPLTPS,
-  IX86_BUILTIN_CMPLEPS,
-  IX86_BUILTIN_CMPGTPS,
-  IX86_BUILTIN_CMPGEPS,
-  IX86_BUILTIN_CMPNEQPS,
-  IX86_BUILTIN_CMPNLTPS,
-  IX86_BUILTIN_CMPNLEPS,
-  IX86_BUILTIN_CMPNGTPS,
-  IX86_BUILTIN_CMPNGEPS,
-  IX86_BUILTIN_CMPORDPS,
-  IX86_BUILTIN_CMPUNORDPS,
-  IX86_BUILTIN_CMPNEPS,
-  IX86_BUILTIN_CMPEQSS,
-  IX86_BUILTIN_CMPLTSS,
-  IX86_BUILTIN_CMPLESS,
-  IX86_BUILTIN_CMPNEQSS,
-  IX86_BUILTIN_CMPNLTSS,
-  IX86_BUILTIN_CMPNLESS,
-  IX86_BUILTIN_CMPNGTSS,
-  IX86_BUILTIN_CMPNGESS,
-  IX86_BUILTIN_CMPORDSS,
-  IX86_BUILTIN_CMPUNORDSS,
-  IX86_BUILTIN_CMPNESS,
-
-  IX86_BUILTIN_COMIEQSS,
-  IX86_BUILTIN_COMILTSS,
-  IX86_BUILTIN_COMILESS,
-  IX86_BUILTIN_COMIGTSS,
-  IX86_BUILTIN_COMIGESS,
-  IX86_BUILTIN_COMINEQSS,
-  IX86_BUILTIN_UCOMIEQSS,
-  IX86_BUILTIN_UCOMILTSS,
-  IX86_BUILTIN_UCOMILESS,
-  IX86_BUILTIN_UCOMIGTSS,
-  IX86_BUILTIN_UCOMIGESS,
-  IX86_BUILTIN_UCOMINEQSS,
-
-  IX86_BUILTIN_CVTPI2PS,
-  IX86_BUILTIN_CVTPS2PI,
-  IX86_BUILTIN_CVTSI2SS,
-  IX86_BUILTIN_CVTSI642SS,
-  IX86_BUILTIN_CVTSS2SI,
-  IX86_BUILTIN_CVTSS2SI64,
-  IX86_BUILTIN_CVTTPS2PI,
-  IX86_BUILTIN_CVTTSS2SI,
-  IX86_BUILTIN_CVTTSS2SI64,
-
-  IX86_BUILTIN_MAXPS,
-  IX86_BUILTIN_MAXSS,
-  IX86_BUILTIN_MINPS,
-  IX86_BUILTIN_MINSS,
-
-  IX86_BUILTIN_LOADUPS,
-  IX86_BUILTIN_STOREUPS,
-  IX86_BUILTIN_MOVSS,
-
-  IX86_BUILTIN_MOVHLPS,
-  IX86_BUILTIN_MOVLHPS,
-  IX86_BUILTIN_LOADHPS,
-  IX86_BUILTIN_LOADLPS,
-  IX86_BUILTIN_STOREHPS,
-  IX86_BUILTIN_STORELPS,
-
-  IX86_BUILTIN_MASKMOVQ,
-  IX86_BUILTIN_MOVMSKPS,
-  IX86_BUILTIN_PMOVMSKB,
-
-  IX86_BUILTIN_MOVNTPS,
-  IX86_BUILTIN_MOVNTQ,
-
-  IX86_BUILTIN_LOADDQU,
-  IX86_BUILTIN_STOREDQU,
-
-  IX86_BUILTIN_PACKSSWB,
-  IX86_BUILTIN_PACKSSDW,
-  IX86_BUILTIN_PACKUSWB,
-
-  IX86_BUILTIN_PADDB,
-  IX86_BUILTIN_PADDW,
-  IX86_BUILTIN_PADDD,
-  IX86_BUILTIN_PADDQ,
-  IX86_BUILTIN_PADDSB,
-  IX86_BUILTIN_PADDSW,
-  IX86_BUILTIN_PADDUSB,
-  IX86_BUILTIN_PADDUSW,
-  IX86_BUILTIN_PSUBB,
-  IX86_BUILTIN_PSUBW,
-  IX86_BUILTIN_PSUBD,
-  IX86_BUILTIN_PSUBQ,
-  IX86_BUILTIN_PSUBSB,
-  IX86_BUILTIN_PSUBSW,
-  IX86_BUILTIN_PSUBUSB,
-  IX86_BUILTIN_PSUBUSW,
-
-  IX86_BUILTIN_PAND,
-  IX86_BUILTIN_PANDN,
-  IX86_BUILTIN_POR,
-  IX86_BUILTIN_PXOR,
-
-  IX86_BUILTIN_PAVGB,
-  IX86_BUILTIN_PAVGW,
-
-  IX86_BUILTIN_PCMPEQB,
-  IX86_BUILTIN_PCMPEQW,
-  IX86_BUILTIN_PCMPEQD,
-  IX86_BUILTIN_PCMPGTB,
-  IX86_BUILTIN_PCMPGTW,
-  IX86_BUILTIN_PCMPGTD,
-
-  IX86_BUILTIN_PMADDWD,
-
-  IX86_BUILTIN_PMAXSW,
-  IX86_BUILTIN_PMAXUB,
-  IX86_BUILTIN_PMINSW,
-  IX86_BUILTIN_PMINUB,
-
-  IX86_BUILTIN_PMULHUW,
-  IX86_BUILTIN_PMULHW,
-  IX86_BUILTIN_PMULLW,
-
-  IX86_BUILTIN_PSADBW,
-  IX86_BUILTIN_PSHUFW,
-
-  IX86_BUILTIN_PSLLW,
-  IX86_BUILTIN_PSLLD,
-  IX86_BUILTIN_PSLLQ,
-  IX86_BUILTIN_PSRAW,
-  IX86_BUILTIN_PSRAD,
-  IX86_BUILTIN_PSRLW,
-  IX86_BUILTIN_PSRLD,
-  IX86_BUILTIN_PSRLQ,
-  IX86_BUILTIN_PSLLWI,
-  IX86_BUILTIN_PSLLDI,
-  IX86_BUILTIN_PSLLQI,
-  IX86_BUILTIN_PSRAWI,
-  IX86_BUILTIN_PSRADI,
-  IX86_BUILTIN_PSRLWI,
-  IX86_BUILTIN_PSRLDI,
-  IX86_BUILTIN_PSRLQI,
-
-  IX86_BUILTIN_PUNPCKHBW,
-  IX86_BUILTIN_PUNPCKHWD,
-  IX86_BUILTIN_PUNPCKHDQ,
-  IX86_BUILTIN_PUNPCKLBW,
-  IX86_BUILTIN_PUNPCKLWD,
-  IX86_BUILTIN_PUNPCKLDQ,
-
-  IX86_BUILTIN_SHUFPS,
-
-  IX86_BUILTIN_RCPPS,
-  IX86_BUILTIN_RCPSS,
-  IX86_BUILTIN_RSQRTPS,
-  IX86_BUILTIN_RSQRTSS,
-  IX86_BUILTIN_SQRTPS,
-  IX86_BUILTIN_SQRTSS,
-
-  IX86_BUILTIN_UNPCKHPS,
-  IX86_BUILTIN_UNPCKLPS,
-
-  IX86_BUILTIN_ANDPS,
-  IX86_BUILTIN_ANDNPS,
-  IX86_BUILTIN_ORPS,
-  IX86_BUILTIN_XORPS,
-
-  IX86_BUILTIN_EMMS,
-  IX86_BUILTIN_LDMXCSR,
-  IX86_BUILTIN_STMXCSR,
-  IX86_BUILTIN_SFENCE,
-
-  /* 3DNow! Original */
-  IX86_BUILTIN_FEMMS,
-  IX86_BUILTIN_PAVGUSB,
-  IX86_BUILTIN_PF2ID,
-  IX86_BUILTIN_PFACC,
-  IX86_BUILTIN_PFADD,
-  IX86_BUILTIN_PFCMPEQ,
-  IX86_BUILTIN_PFCMPGE,
-  IX86_BUILTIN_PFCMPGT,
-  IX86_BUILTIN_PFMAX,
-  IX86_BUILTIN_PFMIN,
-  IX86_BUILTIN_PFMUL,
-  IX86_BUILTIN_PFRCP,
-  IX86_BUILTIN_PFRCPIT1,
-  IX86_BUILTIN_PFRCPIT2,
-  IX86_BUILTIN_PFRSQIT1,
-  IX86_BUILTIN_PFRSQRT,
-  IX86_BUILTIN_PFSUB,
-  IX86_BUILTIN_PFSUBR,
-  IX86_BUILTIN_PI2FD,
-  IX86_BUILTIN_PMULHRW,
-
-  /* 3DNow! Athlon Extensions */
-  IX86_BUILTIN_PF2IW,
-  IX86_BUILTIN_PFNACC,
-  IX86_BUILTIN_PFPNACC,
-  IX86_BUILTIN_PI2FW,
-  IX86_BUILTIN_PSWAPDSI,
-  IX86_BUILTIN_PSWAPDSF,
-
-  /* SSE2 */
-  IX86_BUILTIN_ADDPD,
-  IX86_BUILTIN_ADDSD,
-  IX86_BUILTIN_DIVPD,
-  IX86_BUILTIN_DIVSD,
-  IX86_BUILTIN_MULPD,
-  IX86_BUILTIN_MULSD,
-  IX86_BUILTIN_SUBPD,
-  IX86_BUILTIN_SUBSD,
-
-  IX86_BUILTIN_CMPEQPD,
-  IX86_BUILTIN_CMPLTPD,
-  IX86_BUILTIN_CMPLEPD,
-  IX86_BUILTIN_CMPGTPD,
-  IX86_BUILTIN_CMPGEPD,
-  IX86_BUILTIN_CMPNEQPD,
-  IX86_BUILTIN_CMPNLTPD,
-  IX86_BUILTIN_CMPNLEPD,
-  IX86_BUILTIN_CMPNGTPD,
-  IX86_BUILTIN_CMPNGEPD,
-  IX86_BUILTIN_CMPORDPD,
-  IX86_BUILTIN_CMPUNORDPD,
-  IX86_BUILTIN_CMPNEPD,
-  IX86_BUILTIN_CMPEQSD,
-  IX86_BUILTIN_CMPLTSD,
-  IX86_BUILTIN_CMPLESD,
-  IX86_BUILTIN_CMPNEQSD,
-  IX86_BUILTIN_CMPNLTSD,
-  IX86_BUILTIN_CMPNLESD,
-  IX86_BUILTIN_CMPORDSD,
-  IX86_BUILTIN_CMPUNORDSD,
-  IX86_BUILTIN_CMPNESD,
-
-  IX86_BUILTIN_COMIEQSD,
-  IX86_BUILTIN_COMILTSD,
-  IX86_BUILTIN_COMILESD,
-  IX86_BUILTIN_COMIGTSD,
-  IX86_BUILTIN_COMIGESD,
-  IX86_BUILTIN_COMINEQSD,
-  IX86_BUILTIN_UCOMIEQSD,
-  IX86_BUILTIN_UCOMILTSD,
-  IX86_BUILTIN_UCOMILESD,
-  IX86_BUILTIN_UCOMIGTSD,
-  IX86_BUILTIN_UCOMIGESD,
-  IX86_BUILTIN_UCOMINEQSD,
-
-  IX86_BUILTIN_MAXPD,
-  IX86_BUILTIN_MAXSD,
-  IX86_BUILTIN_MINPD,
-  IX86_BUILTIN_MINSD,
-
-  IX86_BUILTIN_ANDPD,
-  IX86_BUILTIN_ANDNPD,
-  IX86_BUILTIN_ORPD,
-  IX86_BUILTIN_XORPD,
-
-  IX86_BUILTIN_SQRTPD,
-  IX86_BUILTIN_SQRTSD,
-
-  IX86_BUILTIN_UNPCKHPD,
-  IX86_BUILTIN_UNPCKLPD,
-
-  IX86_BUILTIN_SHUFPD,
-
-  IX86_BUILTIN_LOADUPD,
-  IX86_BUILTIN_STOREUPD,
-  IX86_BUILTIN_MOVSD,
-
-  IX86_BUILTIN_LOADHPD,
-  IX86_BUILTIN_LOADLPD,
-
-  IX86_BUILTIN_CVTDQ2PD,
-  IX86_BUILTIN_CVTDQ2PS,
-
-  IX86_BUILTIN_CVTPD2DQ,
-  IX86_BUILTIN_CVTPD2PI,
-  IX86_BUILTIN_CVTPD2PS,
-  IX86_BUILTIN_CVTTPD2DQ,
-  IX86_BUILTIN_CVTTPD2PI,
-
-  IX86_BUILTIN_CVTPI2PD,
-  IX86_BUILTIN_CVTSI2SD,
-  IX86_BUILTIN_CVTSI642SD,
-
-  IX86_BUILTIN_CVTSD2SI,
-  IX86_BUILTIN_CVTSD2SI64,
-  IX86_BUILTIN_CVTSD2SS,
-  IX86_BUILTIN_CVTSS2SD,
-  IX86_BUILTIN_CVTTSD2SI,
-  IX86_BUILTIN_CVTTSD2SI64,
-
-  IX86_BUILTIN_CVTPS2DQ,
-  IX86_BUILTIN_CVTPS2PD,
-  IX86_BUILTIN_CVTTPS2DQ,
-
-  IX86_BUILTIN_MOVNTI,
-  IX86_BUILTIN_MOVNTPD,
-  IX86_BUILTIN_MOVNTDQ,
-
-  /* SSE2 MMX */
-  IX86_BUILTIN_MASKMOVDQU,
-  IX86_BUILTIN_MOVMSKPD,
-  IX86_BUILTIN_PMOVMSKB128,
-
-  /* APPLE LOCAL begin 4099020 */
-  IX86_BUILTIN_MOVQ,
-  IX86_BUILTIN_LOADQ,
-  IX86_BUILTIN_STOREQ,
-  /* APPLE LOCAL end 4099020 */
-
-  IX86_BUILTIN_PACKSSWB128,
-  IX86_BUILTIN_PACKSSDW128,
-  IX86_BUILTIN_PACKUSWB128,
-
-  IX86_BUILTIN_PADDB128,
-  IX86_BUILTIN_PADDW128,
-  IX86_BUILTIN_PADDD128,
-  IX86_BUILTIN_PADDQ128,
-  IX86_BUILTIN_PADDSB128,
-  IX86_BUILTIN_PADDSW128,
-  IX86_BUILTIN_PADDUSB128,
-  IX86_BUILTIN_PADDUSW128,
-  IX86_BUILTIN_PSUBB128,
-  IX86_BUILTIN_PSUBW128,
-  IX86_BUILTIN_PSUBD128,
-  IX86_BUILTIN_PSUBQ128,
-  IX86_BUILTIN_PSUBSB128,
-  IX86_BUILTIN_PSUBSW128,
-  IX86_BUILTIN_PSUBUSB128,
-  IX86_BUILTIN_PSUBUSW128,
-
-  IX86_BUILTIN_PAND128,
-  IX86_BUILTIN_PANDN128,
-  IX86_BUILTIN_POR128,
-  IX86_BUILTIN_PXOR128,
-
-  IX86_BUILTIN_PAVGB128,
-  IX86_BUILTIN_PAVGW128,
-
-  IX86_BUILTIN_PCMPEQB128,
-  IX86_BUILTIN_PCMPEQW128,
-  IX86_BUILTIN_PCMPEQD128,
-  IX86_BUILTIN_PCMPGTB128,
-  IX86_BUILTIN_PCMPGTW128,
-  IX86_BUILTIN_PCMPGTD128,
-
-  IX86_BUILTIN_PMADDWD128,
-
-  IX86_BUILTIN_PMAXSW128,
-  IX86_BUILTIN_PMAXUB128,
-  IX86_BUILTIN_PMINSW128,
-  IX86_BUILTIN_PMINUB128,
-
-  IX86_BUILTIN_PMULUDQ,
-  IX86_BUILTIN_PMULUDQ128,
-  IX86_BUILTIN_PMULHUW128,
-  IX86_BUILTIN_PMULHW128,
-  IX86_BUILTIN_PMULLW128,
-
-  IX86_BUILTIN_PSADBW128,
-  IX86_BUILTIN_PSHUFHW,
-  IX86_BUILTIN_PSHUFLW,
-  IX86_BUILTIN_PSHUFD,
-
-  IX86_BUILTIN_PSLLW128,
-  IX86_BUILTIN_PSLLD128,
-  IX86_BUILTIN_PSLLQ128,
-  IX86_BUILTIN_PSRAW128,
-  IX86_BUILTIN_PSRAD128,
-  IX86_BUILTIN_PSRLW128,
-  IX86_BUILTIN_PSRLD128,
-  IX86_BUILTIN_PSRLQ128,
-  IX86_BUILTIN_PSLLDQI128,
-  /* APPLE LOCAL 591583 */
-  IX86_BUILTIN_PSLLDQI128_BYTESHIFT,
-  IX86_BUILTIN_PSLLWI128,
-  IX86_BUILTIN_PSLLDI128,
-  IX86_BUILTIN_PSLLQI128,
-  IX86_BUILTIN_PSRAWI128,
-  IX86_BUILTIN_PSRADI128,
-  IX86_BUILTIN_PSRLDQI128,
-  /* APPLE LOCAL 591583 */
-  IX86_BUILTIN_PSRLDQI128_BYTESHIFT,
-  IX86_BUILTIN_PSRLWI128,
-  IX86_BUILTIN_PSRLDI128,
-  IX86_BUILTIN_PSRLQI128,
-
-  IX86_BUILTIN_PUNPCKHBW128,
-  IX86_BUILTIN_PUNPCKHWD128,
-  IX86_BUILTIN_PUNPCKHDQ128,
-  IX86_BUILTIN_PUNPCKHQDQ128,
-  IX86_BUILTIN_PUNPCKLBW128,
-  IX86_BUILTIN_PUNPCKLWD128,
-  IX86_BUILTIN_PUNPCKLDQ128,
-  IX86_BUILTIN_PUNPCKLQDQ128,
-
-  IX86_BUILTIN_CLFLUSH,
-  IX86_BUILTIN_MFENCE,
-  IX86_BUILTIN_LFENCE,
-
-  /* Prescott New Instructions.  */
-  IX86_BUILTIN_ADDSUBPS,
-  IX86_BUILTIN_HADDPS,
-  IX86_BUILTIN_HSUBPS,
-  IX86_BUILTIN_MOVSHDUP,
-  IX86_BUILTIN_MOVSLDUP,
-  IX86_BUILTIN_ADDSUBPD,
-  IX86_BUILTIN_HADDPD,
-  IX86_BUILTIN_HSUBPD,
-  IX86_BUILTIN_LDDQU,
-
-  IX86_BUILTIN_MONITOR,
-  IX86_BUILTIN_MWAIT,
-
-  /* Merom New Instructions.  */
-  IX86_BUILTIN_PHADDW,
-  IX86_BUILTIN_PHADDD,
-  IX86_BUILTIN_PHADDSW,
-  IX86_BUILTIN_PHSUBW,
-  IX86_BUILTIN_PHSUBD,
-  IX86_BUILTIN_PHSUBSW,
-  IX86_BUILTIN_PMADDUBSW,
-  IX86_BUILTIN_PMULHRSW,
-  IX86_BUILTIN_PSHUFB,
-  IX86_BUILTIN_PSIGNB,
-  IX86_BUILTIN_PSIGNW,
-  IX86_BUILTIN_PSIGND,
-  IX86_BUILTIN_PALIGNR,
-  IX86_BUILTIN_PABSB,
-  IX86_BUILTIN_PABSW,
-  IX86_BUILTIN_PABSD,
-
-  IX86_BUILTIN_PHADDW128,
-  IX86_BUILTIN_PHADDD128,
-  IX86_BUILTIN_PHADDSW128,
-  IX86_BUILTIN_PHSUBW128,
-  IX86_BUILTIN_PHSUBD128,
-  IX86_BUILTIN_PHSUBSW128,
-  IX86_BUILTIN_PMADDUBSW128,
-  IX86_BUILTIN_PMULHRSW128,
-  IX86_BUILTIN_PSHUFB128,
-  IX86_BUILTIN_PSIGNB128,
-  IX86_BUILTIN_PSIGNW128,
-  IX86_BUILTIN_PSIGND128,
-  IX86_BUILTIN_PALIGNR128,
-  IX86_BUILTIN_PABSB128,
-  IX86_BUILTIN_PABSW128,
-  IX86_BUILTIN_PABSD128,
-  /* APPLE LOCAL begin 5612787 mainline sse4 */
-  /* AMDFAM10 - SSE4A New Instructions.  */
-  IX86_BUILTIN_MOVNTSD,
-  IX86_BUILTIN_MOVNTSS,
-  IX86_BUILTIN_EXTRQI,
-  IX86_BUILTIN_EXTRQ,
-  IX86_BUILTIN_INSERTQI,
-  IX86_BUILTIN_INSERTQ,
-
-  /* SSE4.1.  */
-  IX86_BUILTIN_BLENDPD,
-  IX86_BUILTIN_BLENDPS,
-  IX86_BUILTIN_BLENDVPD,
-  IX86_BUILTIN_BLENDVPS,
-  IX86_BUILTIN_PBLENDVB128,
-  IX86_BUILTIN_PBLENDW128,
-
-  IX86_BUILTIN_DPPD,
-  IX86_BUILTIN_DPPS,
-
-  IX86_BUILTIN_INSERTPS128,
-
-  IX86_BUILTIN_MOVNTDQA,
-  IX86_BUILTIN_MPSADBW128,
-  IX86_BUILTIN_PACKUSDW128,
-  IX86_BUILTIN_PCMPEQQ,
-  IX86_BUILTIN_PHMINPOSUW128,
-
-  IX86_BUILTIN_PMAXSB128,
-  IX86_BUILTIN_PMAXSD128,
-  IX86_BUILTIN_PMAXUD128,
-  IX86_BUILTIN_PMAXUW128,
-
-  IX86_BUILTIN_PMINSB128,
-  IX86_BUILTIN_PMINSD128,
-  IX86_BUILTIN_PMINUD128,
-  IX86_BUILTIN_PMINUW128,
-
-  IX86_BUILTIN_PMOVSXBW128,
-  IX86_BUILTIN_PMOVSXBD128,
-  IX86_BUILTIN_PMOVSXBQ128,
-  IX86_BUILTIN_PMOVSXWD128,
-  IX86_BUILTIN_PMOVSXWQ128,
-  IX86_BUILTIN_PMOVSXDQ128,
-
-  IX86_BUILTIN_PMOVZXBW128,
-  IX86_BUILTIN_PMOVZXBD128,
-  IX86_BUILTIN_PMOVZXBQ128,
-  IX86_BUILTIN_PMOVZXWD128,
-  IX86_BUILTIN_PMOVZXWQ128,
-  IX86_BUILTIN_PMOVZXDQ128,
-
-  IX86_BUILTIN_PMULDQ128,
-  IX86_BUILTIN_PMULLD128,
-
-  IX86_BUILTIN_ROUNDPD,
-  IX86_BUILTIN_ROUNDPS,
-  IX86_BUILTIN_ROUNDSD,
-  IX86_BUILTIN_ROUNDSS,
-
-  IX86_BUILTIN_PTESTZ,
-  IX86_BUILTIN_PTESTC,
-  IX86_BUILTIN_PTESTNZC,
-  /* APPLE LOCAL end 5612787 mainline sse4 */
-  /* APPLE LOCAL end mainline */
-  IX86_BUILTIN_VEC_INIT_V2SI,
-  IX86_BUILTIN_VEC_INIT_V4HI,
-  IX86_BUILTIN_VEC_INIT_V8QI,
-  IX86_BUILTIN_VEC_EXT_V2DF,
-  IX86_BUILTIN_VEC_EXT_V2DI,
-  IX86_BUILTIN_VEC_EXT_V4SF,
-  IX86_BUILTIN_VEC_EXT_V4SI,
-  IX86_BUILTIN_VEC_EXT_V8HI,
-  /* APPLE LOCAL begin 5612787 mainline sse4 */
-  /* deletion */
-  /* APPLE LOCAL end 5612787 mainline sse4 */
-  IX86_BUILTIN_VEC_EXT_V2SI,
-  IX86_BUILTIN_VEC_EXT_V4HI,
-  /* APPLE LOCAL begin 5612787 mainline sse4 */
-  IX86_BUILTIN_VEC_EXT_V16QI,
-  IX86_BUILTIN_VEC_SET_V2DI,
-  IX86_BUILTIN_VEC_SET_V4SF,
-  IX86_BUILTIN_VEC_SET_V4SI,
-  /* APPLE LOCAL end 5612787 mainline sse4 */
-  IX86_BUILTIN_VEC_SET_V8HI,
-  IX86_BUILTIN_VEC_SET_V4HI,
-  /* APPLE LOCAL begin 5612787 mainline sse4 */
-  IX86_BUILTIN_VEC_SET_V16QI,
-
-  IX86_BUILTIN_VEC_PACK_SFIX,
-
-  /* SSE4.2.  */
-  IX86_BUILTIN_CRC32QI,
-  IX86_BUILTIN_CRC32HI,
-  IX86_BUILTIN_CRC32SI,
-  IX86_BUILTIN_CRC32DI,
-
-  IX86_BUILTIN_PCMPESTRI128,
-  IX86_BUILTIN_PCMPESTRM128,
-  IX86_BUILTIN_PCMPESTRA128,
-  IX86_BUILTIN_PCMPESTRC128,
-  IX86_BUILTIN_PCMPESTRO128,
-  IX86_BUILTIN_PCMPESTRS128,
-  IX86_BUILTIN_PCMPESTRZ128,
-  IX86_BUILTIN_PCMPISTRI128,
-  IX86_BUILTIN_PCMPISTRM128,
-  IX86_BUILTIN_PCMPISTRA128,
-  IX86_BUILTIN_PCMPISTRC128,
-  IX86_BUILTIN_PCMPISTRO128,
-  IX86_BUILTIN_PCMPISTRS128,
-  IX86_BUILTIN_PCMPISTRZ128,
-
-  IX86_BUILTIN_PCMPGTQ,
-
-  /* TFmode support builtins.  */
-  IX86_BUILTIN_INFQ,
-  IX86_BUILTIN_FABSQ,
-  IX86_BUILTIN_COPYSIGNQ,
-  /* APPLE LOCAL end 5612787 mainline sse4 */
-
-  IX86_BUILTIN_MAX
-};
-
 /* LLVM_TARGET_INTRINSIC_PREFIX - Specify what prefix this target uses for its
  * intrinsics.
  */
@@ -936,9 +353,8 @@
  * macro should call the target TreeToLLVM::TargetIntrinsicLower method and
  *  return true.This macro is invoked from a method in the TreeToLLVM class.
  */
-#define LLVM_TARGET_INTRINSIC_LOWER(STMT, BUILTIN_CODE, DESTLOC, RESULT,      \
-                                    DESTTY, OPS)                              \
-        TargetIntrinsicLower(STMT, BUILTIN_CODE, DESTLOC, RESULT, DESTTY, OPS);
+#define LLVM_TARGET_INTRINSIC_LOWER(STMT, FNDECL, DESTLOC, RESULT, DESTTY, OPS)	\
+        TargetIntrinsicLower(STMT, FNDECL, DESTLOC, RESULT, DESTTY, OPS);
 
 /* When extracting a register name for a constraint, use the string extracted
    from the magic symbol built for that register, rather than reg_names.





More information about the llvm-commits mailing list