From 9b78337c6e360520a0cfd297e94e8305f2569fc8 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Mon, 15 Nov 2004 04:32:12 +0000 Subject: add missing file (bug #2843) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4254 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- codecs/log2comp.h | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100755 codecs/log2comp.h (limited to 'codecs/log2comp.h') diff --git a/codecs/log2comp.h b/codecs/log2comp.h new file mode 100755 index 000000000..9f3924170 --- /dev/null +++ b/codecs/log2comp.h @@ -0,0 +1,63 @@ +/* log2comp.h - various base 2 log computation versions + * + * Asterisk -- A telephony toolkit for Linux. + * + * Implementation by Alex Volkov + * + * Copyright (c) 2004, Digium + * + * 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 log2(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 log2(int val) +{ + int a; + __asm__ + ("\ + xorl %0, %0 ;\ + decl %0 ;\ + bsrl %1, %0 ;\ + " + : "=r" (a) + : "mr" (val) + : "cc" + ); + return a; +} +#else +/* no ASM for this compiler and/or platform */ +/* rather slow base 2 log computation + * Using looped shift. + */ +static inline int log2(int val) +{ + int i; + for (i = -1; val; ++i, val >>= 1) + ; + return (i); +} +#endif -- cgit v1.2.3