s/intra_decision()/loss_distortion()/
[opus.git] / libcelt / ecintrin.h
index 0f64e31..5012917 100644 (file)
@@ -1,5 +1,5 @@
-/* (C) 2003-2008 Timothy B. Terriberry
-   (C) 2008 Jean-Marc Valin */
+/* Copyright (c) 2003-2008 Timothy B. Terriberry
+   Copyright (c) 2008 Xiph.Org Foundation */
 /*
    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.
 
-   - Neither the name of the Xiph.org Foundation nor the names of its
-   contributors may be used to endorse or promote products derived from
-   this software without specific prior written permission.
-
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -30,6 +26,7 @@
 */
 
 /*Some common macros for potential platform-specific optimization.*/
+#include "celt_types.h"
 #include <math.h>
 #include <limits.h>
 #if !defined(_ecintrin_H)
 /*Count leading zeros.
   This macro should only be used for implementing ec_ilog(), if it is defined.
   All other code should use EC_ILOG() instead.*/
-#ifdef __GNUC_PREREQ
-#if __GNUC_PREREQ(3,4)
-# if INT_MAX>=2147483647
-#  define EC_CLZ0 sizeof(unsigned)*CHAR_BIT
-#  define EC_CLZ(_x) (__builtin_clz(_x))
-# elif LONG_MAX>=2147483647L
-#  define EC_CLZ0 sizeof(unsigned long)*CHAR_BIT
-#  define EC_CLZ(_x) (__builtin_clzl(_x))
+#if defined(_MSC_VER)
+# include <intrin.h>
+/*In _DEBUG mode this is not an intrinsic by default.*/
+# pragma intrinsic(_BitScanReverse)
+
+static __inline int ec_bsr(unsigned long _x){
+  unsigned long ret;
+  _BitScanReverse(&ret,_x);
+  return (int)ret;
+}
+# define EC_CLZ0    (1)
+# define EC_CLZ(_x) (-ec_bsr(_x))
+#elif defined(ENABLE_TI_DSPLIB)
+# include "dsplib.h"
+# define EC_CLZ0    (31)
+# define EC_CLZ(_x) (_lnorm(_x))
+#elif defined(__GNUC_PREREQ)
+# if __GNUC_PREREQ(3,4)
+#  if INT_MAX>=2147483647
+#   define EC_CLZ0    ((int)sizeof(unsigned)*CHAR_BIT)
+#   define EC_CLZ(_x) (__builtin_clz(_x))
+#  elif LONG_MAX>=2147483647L
+#   define EC_CLZ0    ((int)sizeof(unsigned long)*CHAR_BIT)
+#   define EC_CLZ(_x) (__builtin_clzl(_x))
+#  endif
 # endif
 #endif
-#endif
 
 #if defined(EC_CLZ)
 /*Note that __builtin_clz is not defined when _x==0, according to the gcc
   The majority of the time we can never pass it zero.
   When we need to, it can be special cased.*/
 # define EC_ILOG(_x) (EC_CLZ0-EC_CLZ(_x))
-#elif defined(ENABLE_TI_DSPLIB)
-#include "dsplib.h"
-#define EC_ILOG(x) (31 - _lnorm(x))
 #else
-# define EC_ILOG(_x) (ec_ilog(_x))
-#endif
+int ec_ilog(celt_uint32 _v);
 
-#ifdef __GNUC_PREREQ
-#if __GNUC_PREREQ(3,4)
-# if INT_MAX>=9223372036854775807
-#  define EC_CLZ64_0 sizeof(unsigned)*CHAR_BIT
-#  define EC_CLZ64(_x) (__builtin_clz(_x))
-# elif LONG_MAX>=9223372036854775807L
-#  define EC_CLZ64_0 sizeof(unsigned long)*CHAR_BIT
-#  define EC_CLZ64(_x) (__builtin_clzl(_x))
-# elif LLONG_MAX>=9223372036854775807LL
-#  define EC_CLZ64_0 sizeof(unsigned long long)*CHAR_BIT
-#  define EC_CLZ64(_x) (__builtin_clzll(_x))
-# endif
-#endif
-#endif
-
-#if defined(EC_CLZ64)
-/*Note that __builtin_clz is not defined when _x==0, according to the gcc
-   documentation (and that of the BSR instruction that implements it on x86).
-  The majority of the time we can never pass it zero.
-  When we need to, it can be special cased.*/
-# define EC_ILOG64(_x) (EC_CLZ64_0-EC_CLZ64(_x))
-#else
-# define EC_ILOG64(_x) (ec_ilog64(_x))
+# define EC_ILOG(_x) (ec_ilog(_x))
 #endif
 
 #endif