aboutsummaryrefslogtreecommitdiffstats
path: root/trunk/codecs/log2comp.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/codecs/log2comp.h')
-rw-r--r--trunk/codecs/log2comp.h74
1 files changed, 74 insertions, 0 deletions
diff --git a/trunk/codecs/log2comp.h b/trunk/codecs/log2comp.h
new file mode 100644
index 000000000..56f2d8305
--- /dev/null
+++ b/trunk/codecs/log2comp.h
@@ -0,0 +1,74 @@
+/*! \file
+ * \brief log2comp.h - various base 2 log computation versions
+ *
+ * Asterisk -- A telephony toolkit for Linux.
+ *
+ * \author Alex Volkov <codepro@usa.net>
+ *
+ * Copyright (c) 2004 - 2005, Digium Inc.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License
+ *
+ * Define WANT_ASM before including this file to use assembly
+ * whenever possible
+ */
+
+#if defined(_MSC_VER)
+# define inline __inline
+#elif defined(__GNUC__)
+# define inline __inline__
+#else
+# define inline
+#endif
+
+#if defined(WANT_ASM) && defined(_MSC_VER) && defined(_M_IX86)
+/* MS C Inline Asm */
+# pragma warning( disable : 4035 )
+static inline int ilog2(int val) { __asm
+{
+ xor eax, eax
+ dec eax
+ bsr eax, val
+}}
+# pragma warning( default : 4035 )
+#elif defined(WANT_ASM) && defined(__GNUC__) && (defined(__i386__) || defined(i386))
+/* GNU Inline Asm */
+static inline int ilog2(int val)
+{
+ int a;
+ __asm__
+ ("\
+ xorl %0, %0 ;\
+ decl %0 ;\
+ bsrl %1, %0 ;\
+ "
+ : "=r" (a)
+ : "mr" (val)
+ : "cc"
+ );
+ return a;
+}
+#elif defined(WANT_ASM) && defined(__GNUC__) && defined(__powerpc__)
+static inline int ilog2(int val)
+{
+ int a;
+ __asm__ ("cntlzw %0,%1"
+ : "=r" (a)
+ : "r" (val)
+ );
+ return 31-a;
+}
+#else
+/* no ASM for this compiler and/or platform */
+/* rather slow base 2 log computation
+ * Using looped shift.
+ */
+static inline int ilog2(int val)
+{
+ int i;
+ for (i = -1; val; ++i, val >>= 1)
+ ;
+ return (i);
+}
+#endif