diff options
author | H. Peter Anvin <hpa@linux.intel.com> | 2017-09-27 13:34:42 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2017-09-27 13:34:42 -0700 |
commit | 0a126062fbeb22658ab4f7aace115c6353f33f08 (patch) | |
tree | 3998842cbc5ecdce243ee6f767c2cd95121de936 /nasmlib | |
parent | fbce0bfb4ebab9e790879a8f9c2e90aa21b6108f (diff) | |
download | nasm-0a126062fbeb22658ab4f7aace115c6353f33f08.tar.gz |
ilog2(): inline functions if practical
For many (most?) targets these will be very small functions, so inline
them. However, just in case make these external library functions.
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Diffstat (limited to 'nasmlib')
-rw-r--r-- | nasmlib/ilog2.c | 186 |
1 files changed, 2 insertions, 184 deletions
diff --git a/nasmlib/ilog2.c b/nasmlib/ilog2.c index 7f4624f5..cba22248 100644 --- a/nasmlib/ilog2.c +++ b/nasmlib/ilog2.c @@ -1,184 +1,2 @@ -/* ----------------------------------------------------------------------- * - * - * Copyright 1996-2017 The NASM Authors - All Rights Reserved - * See the file AUTHORS included with the NASM distribution for - * the specific copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following - * conditions are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * 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 A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ----------------------------------------------------------------------- */ - -#include "compiler.h" -#include "nasmlib.h" -#include <limits.h> - -#define ROUND(v, a, w) \ - do { \ - if (v & (((UINT32_C(1) << w) - 1) << w)) { \ - a += w; \ - v >>= w; \ - } \ - } while (0) - - -#if defined(__GNUC__) && defined(__x86_64__) - -int ilog2_32(uint32_t v) -{ - int n; - - __asm__("bsrl %1,%0" - : "=r" (n) - : "rm" (v), "0" (0)); - return n; -} - -#elif defined(__GNUC__) && defined(__i386__) - -int ilog2_32(uint32_t v) -{ - int n; - -#ifdef __i686__ - __asm__("bsrl %1,%0 ; cmovz %2,%0\n" - : "=&r" (n) - : "rm" (v), "r" (0)); -#else - __asm__("bsrl %1,%0 ; jnz 1f ; xorl %0,%0\n" - "1:" - : "=&r" (n) - : "rm" (v)); -#endif - return n; -} - -#elif defined(HAVE___BUILTIN_CLZ) && INT_MAX == 2147483647 - -int ilog2_32(uint32_t v) -{ - if (!v) - return 0; - - return __builtin_clz(v) ^ 31; -} - -#elif defined(HAVE__BITSCANREVERSE) - -int ilog2_32(uint32_t v) -{ - unsigned long ix; - return _BitScanReverse(&ix, v) ? v : 0; -} - -#else - -int ilog2_32(uint32_t v) -{ - int p = 0; - - ROUND(v, p, 16); - ROUND(v, p, 8); - ROUND(v, p, 4); - ROUND(v, p, 2); - ROUND(v, p, 1); - - return p; -} - -#endif - -#if defined(__GNUC__) && defined(__x86_64__) - -int ilog2_64(uint64_t v) -{ - uint64_t n; - - __asm__("bsrq %1,%0" - : "=r" (n) - : "rm" (v), "0" (UINT64_C(0))); - return n; -} - -#elif defined(HAVE__BUILTIN_CLZLL) && LLONG_MAX == 9223372036854775807LL - -int ilog2_64(uint64_t v) -{ - if (!v) - return 0; - - return __builtin_clzll(v) ^ 63; -} - -#elif defined(HAVE__BITSCANREVERSE64) - -int ilog2_64(uint64_t v) -{ - unsigned long ix; - return _BitScanReverse64(&ix, v) ? ix : 0; -} - -#else - -int ilog2_64(uint64_t vv) -{ - int p = 0; - uint32_t v; - - v = vv >> 32; - if (v) - p += 32; - else - v = vv; - - ROUND(v, p, 16); - ROUND(v, p, 8); - ROUND(v, p, 4); - ROUND(v, p, 2); - ROUND(v, p, 1); - - return p; -} - -#endif - -/* - * v == 0 ? 0 : is_power2(x) ? ilog2_X(v) : -1 - */ -int alignlog2_32(uint32_t v) -{ - if (unlikely(v & (v-1))) - return -1; /* invalid alignment */ - - return ilog2_32(v); -} - -int alignlog2_64(uint64_t v) -{ - if (unlikely(v & (v-1))) - return -1; /* invalid alignment */ - - return ilog2_64(v); -} +#define ILOG2_C +#include "ilog2.h" |