From 0a126062fbeb22658ab4f7aace115c6353f33f08 Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Wed, 27 Sep 2017 13:34:42 -0700 Subject: [PATCH] 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 --- Makefile.in | 34 +++---- Mkfiles/msvc.mak | 36 +++---- Mkfiles/openwcom.mak | 36 +++---- asm/directiv.c | 1 + asm/eval.c | 1 + include/compiler.h | 23 +++++ include/iflag.h | 4 +- nasmlib/ilog2.c => include/ilog2.h | 47 +++++++--- include/nasmlib.h | 12 --- nasmlib/ilog2.c | 186 +------------------------------------ output/outcoff.c | 1 + output/outmacho.c | 1 + 12 files changed, 119 insertions(+), 263 deletions(-) copy nasmlib/ilog2.c => include/ilog2.h (79%) rewrite nasmlib/ilog2.c (100%) diff --git a/Makefile.in b/Makefile.in index 5024974c..e7cf172f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -470,18 +470,19 @@ asm/directiv.$(O): asm/directiv.c asm/assemble.h asm/directiv.h asm/eval.h \ asm/float.h asm/listing.h asm/pptok.h asm/preproc.h asm/stdscan.h \ config/config.h config/msvc.h config/unknown.h config/watcom.h \ include/bytesex.h include/compiler.h include/error.h include/iflag.h \ - include/labels.h include/nasm.h include/nasmint.h include/nasmlib.h \ - include/opflags.h include/perfhash.h include/strlist.h include/tables.h \ - output/outform.h x86/iflaggen.h x86/insnsi.h x86/regs.h + include/ilog2.h include/labels.h include/nasm.h include/nasmint.h \ + include/nasmlib.h include/opflags.h include/perfhash.h include/strlist.h \ + include/tables.h output/outform.h x86/iflaggen.h x86/insnsi.h x86/regs.h asm/error.$(O): asm/error.c config/config.h config/msvc.h config/unknown.h \ config/watcom.h include/bytesex.h include/compiler.h include/error.h \ include/nasmint.h include/nasmlib.h asm/eval.$(O): asm/eval.c asm/assemble.h asm/directiv.h asm/eval.h \ asm/float.h asm/pptok.h asm/preproc.h config/config.h config/msvc.h \ config/unknown.h config/watcom.h include/bytesex.h include/compiler.h \ - include/error.h include/iflag.h include/labels.h include/nasm.h \ - include/nasmint.h include/nasmlib.h include/opflags.h include/perfhash.h \ - include/strlist.h include/tables.h x86/iflaggen.h x86/insnsi.h x86/regs.h + include/error.h include/iflag.h include/ilog2.h include/labels.h \ + include/nasm.h include/nasmint.h include/nasmlib.h include/opflags.h \ + include/perfhash.h include/strlist.h include/tables.h x86/iflaggen.h \ + x86/insnsi.h x86/regs.h asm/exprdump.$(O): asm/exprdump.c asm/directiv.h asm/pptok.h asm/preproc.h \ config/config.h config/msvc.h config/unknown.h config/watcom.h \ include/bytesex.h include/compiler.h include/nasm.h include/nasmint.h \ @@ -628,8 +629,8 @@ nasmlib/hashtbl.$(O): nasmlib/hashtbl.c asm/directiv.h asm/pptok.h \ include/perfhash.h include/strlist.h include/tables.h x86/insnsi.h \ x86/regs.h nasmlib/ilog2.$(O): nasmlib/ilog2.c config/config.h config/msvc.h \ - config/unknown.h config/watcom.h include/bytesex.h include/compiler.h \ - include/nasmint.h include/nasmlib.h + config/unknown.h config/watcom.h include/compiler.h include/ilog2.h \ + include/nasmint.h nasmlib/malloc.$(O): nasmlib/malloc.c config/config.h config/msvc.h \ config/unknown.h config/watcom.h include/bytesex.h include/compiler.h \ include/error.h include/nasmint.h include/nasmlib.h @@ -721,10 +722,10 @@ output/outbin.$(O): output/outbin.c asm/directiv.h asm/eval.h asm/pptok.h \ output/outcoff.$(O): output/outcoff.c asm/directiv.h asm/eval.h asm/pptok.h \ asm/preproc.h config/config.h config/msvc.h config/unknown.h \ config/watcom.h include/bytesex.h include/compiler.h include/error.h \ - include/nasm.h include/nasmint.h include/nasmlib.h include/opflags.h \ - include/perfhash.h include/raa.h include/saa.h include/strlist.h \ - include/tables.h output/outform.h output/outlib.h output/pecoff.h \ - x86/insnsi.h x86/regs.h + include/ilog2.h include/nasm.h include/nasmint.h include/nasmlib.h \ + include/opflags.h include/perfhash.h include/raa.h include/saa.h \ + include/strlist.h include/tables.h output/outform.h output/outlib.h \ + output/pecoff.h x86/insnsi.h x86/regs.h output/outdbg.$(O): output/outdbg.c asm/directiv.h asm/pptok.h asm/preproc.h \ asm/tokens.h config/config.h config/msvc.h config/unknown.h config/watcom.h \ include/bytesex.h include/compiler.h include/error.h include/iflag.h \ @@ -758,10 +759,11 @@ output/outlib.$(O): output/outlib.c asm/directiv.h asm/pptok.h asm/preproc.h \ output/outmacho.$(O): output/outmacho.c asm/directiv.h asm/pptok.h \ asm/preproc.h config/config.h config/msvc.h config/unknown.h \ config/watcom.h include/bytesex.h include/compiler.h include/error.h \ - include/labels.h include/nasm.h include/nasmint.h include/nasmlib.h \ - include/opflags.h include/perfhash.h include/raa.h include/rbtree.h \ - include/saa.h include/strlist.h include/tables.h include/ver.h \ - output/dwarf.h output/outform.h output/outlib.h x86/insnsi.h x86/regs.h + include/ilog2.h include/labels.h include/nasm.h include/nasmint.h \ + include/nasmlib.h include/opflags.h include/perfhash.h include/raa.h \ + include/rbtree.h include/saa.h include/strlist.h include/tables.h \ + include/ver.h output/dwarf.h output/outform.h output/outlib.h x86/insnsi.h \ + x86/regs.h output/outobj.$(O): output/outobj.c asm/directiv.h asm/eval.h asm/pptok.h \ asm/preproc.h asm/stdscan.h config/config.h config/msvc.h config/unknown.h \ config/watcom.h include/bytesex.h include/compiler.h include/error.h \ diff --git a/Mkfiles/msvc.mak b/Mkfiles/msvc.mak index 1483f3eb..51f6fffc 100644 --- a/Mkfiles/msvc.mak +++ b/Mkfiles/msvc.mak @@ -369,19 +369,19 @@ asm\directbl.$(O): asm\directbl.c asm\directiv.h config\msvc.h \ asm\directiv.$(O): asm\directiv.c asm\assemble.h asm\directiv.h asm\eval.h \ asm\float.h asm\listing.h asm\pptok.h asm\preproc.h asm\stdscan.h \ config\msvc.h config\unknown.h config\watcom.h include\bytesex.h \ - include\compiler.h include\error.h include\iflag.h include\labels.h \ - include\nasm.h include\nasmint.h include\nasmlib.h include\opflags.h \ - include\perfhash.h include\strlist.h include\tables.h output\outform.h \ - x86\iflaggen.h x86\insnsi.h x86\regs.h + include\compiler.h include\error.h include\iflag.h include\ilog2.h \ + include\labels.h include\nasm.h include\nasmint.h include\nasmlib.h \ + include\opflags.h include\perfhash.h include\strlist.h include\tables.h \ + output\outform.h x86\iflaggen.h x86\insnsi.h x86\regs.h asm\error.$(O): asm\error.c config\msvc.h config\unknown.h config\watcom.h \ include\bytesex.h include\compiler.h include\error.h include\nasmint.h \ include\nasmlib.h asm\eval.$(O): asm\eval.c asm\assemble.h asm\directiv.h asm\eval.h \ asm\float.h asm\pptok.h asm\preproc.h config\msvc.h config\unknown.h \ config\watcom.h include\bytesex.h include\compiler.h include\error.h \ - include\iflag.h include\labels.h include\nasm.h include\nasmint.h \ - include\nasmlib.h include\opflags.h include\perfhash.h include\strlist.h \ - include\tables.h x86\iflaggen.h x86\insnsi.h x86\regs.h + include\iflag.h include\ilog2.h include\labels.h include\nasm.h \ + include\nasmint.h include\nasmlib.h include\opflags.h include\perfhash.h \ + include\strlist.h include\tables.h x86\iflaggen.h x86\insnsi.h x86\regs.h asm\exprdump.$(O): asm\exprdump.c asm\directiv.h asm\pptok.h asm\preproc.h \ config\msvc.h config\unknown.h config\watcom.h include\bytesex.h \ include\compiler.h include\nasm.h include\nasmint.h include\nasmlib.h \ @@ -522,8 +522,7 @@ nasmlib\hashtbl.$(O): nasmlib\hashtbl.c asm\directiv.h asm\pptok.h \ include\nasmint.h include\nasmlib.h include\opflags.h include\perfhash.h \ include\strlist.h include\tables.h x86\insnsi.h x86\regs.h nasmlib\ilog2.$(O): nasmlib\ilog2.c config\msvc.h config\unknown.h \ - config\watcom.h include\bytesex.h include\compiler.h include\nasmint.h \ - include\nasmlib.h + config\watcom.h include\compiler.h include\ilog2.h include\nasmint.h nasmlib\malloc.$(O): nasmlib\malloc.c config\msvc.h config\unknown.h \ config\watcom.h include\bytesex.h include\compiler.h include\error.h \ include\nasmint.h include\nasmlib.h @@ -609,10 +608,11 @@ output\outbin.$(O): output\outbin.c asm\directiv.h asm\eval.h asm\pptok.h \ output\outform.h output\outlib.h x86\insnsi.h x86\regs.h output\outcoff.$(O): output\outcoff.c asm\directiv.h asm\eval.h asm\pptok.h \ asm\preproc.h config\msvc.h config\unknown.h config\watcom.h \ - include\bytesex.h include\compiler.h include\error.h include\nasm.h \ - include\nasmint.h include\nasmlib.h include\opflags.h include\perfhash.h \ - include\raa.h include\saa.h include\strlist.h include\tables.h \ - output\outform.h output\outlib.h output\pecoff.h x86\insnsi.h x86\regs.h + include\bytesex.h include\compiler.h include\error.h include\ilog2.h \ + include\nasm.h include\nasmint.h include\nasmlib.h include\opflags.h \ + include\perfhash.h include\raa.h include\saa.h include\strlist.h \ + include\tables.h output\outform.h output\outlib.h output\pecoff.h \ + x86\insnsi.h x86\regs.h output\outdbg.$(O): output\outdbg.c asm\directiv.h asm\pptok.h asm\preproc.h \ asm\tokens.h config\msvc.h config\unknown.h config\watcom.h \ include\bytesex.h include\compiler.h include\error.h include\iflag.h \ @@ -644,11 +644,11 @@ output\outlib.$(O): output\outlib.c asm\directiv.h asm\pptok.h asm\preproc.h \ include\tables.h output\outlib.h x86\insnsi.h x86\regs.h output\outmacho.$(O): output\outmacho.c asm\directiv.h asm\pptok.h \ asm\preproc.h config\msvc.h config\unknown.h config\watcom.h \ - include\bytesex.h include\compiler.h include\error.h include\labels.h \ - include\nasm.h include\nasmint.h include\nasmlib.h include\opflags.h \ - include\perfhash.h include\raa.h include\rbtree.h include\saa.h \ - include\strlist.h include\tables.h include\ver.h output\dwarf.h \ - output\outform.h output\outlib.h x86\insnsi.h x86\regs.h + include\bytesex.h include\compiler.h include\error.h include\ilog2.h \ + include\labels.h include\nasm.h include\nasmint.h include\nasmlib.h \ + include\opflags.h include\perfhash.h include\raa.h include\rbtree.h \ + include\saa.h include\strlist.h include\tables.h include\ver.h \ + output\dwarf.h output\outform.h output\outlib.h x86\insnsi.h x86\regs.h output\outobj.$(O): output\outobj.c asm\directiv.h asm\eval.h asm\pptok.h \ asm\preproc.h asm\stdscan.h config\msvc.h config\unknown.h config\watcom.h \ include\bytesex.h include\compiler.h include\error.h include\nasm.h \ diff --git a/Mkfiles/openwcom.mak b/Mkfiles/openwcom.mak index 461c7347..033c45e9 100644 --- a/Mkfiles/openwcom.mak +++ b/Mkfiles/openwcom.mak @@ -343,19 +343,19 @@ asm/directbl.$(O): asm/directbl.c asm/directiv.h config/msvc.h & asm/directiv.$(O): asm/directiv.c asm/assemble.h asm/directiv.h asm/eval.h & asm/float.h asm/listing.h asm/pptok.h asm/preproc.h asm/stdscan.h & config/msvc.h config/unknown.h config/watcom.h include/bytesex.h & - include/compiler.h include/error.h include/iflag.h include/labels.h & - include/nasm.h include/nasmint.h include/nasmlib.h include/opflags.h & - include/perfhash.h include/strlist.h include/tables.h output/outform.h & - x86/iflaggen.h x86/insnsi.h x86/regs.h + include/compiler.h include/error.h include/iflag.h include/ilog2.h & + include/labels.h include/nasm.h include/nasmint.h include/nasmlib.h & + include/opflags.h include/perfhash.h include/strlist.h include/tables.h & + output/outform.h x86/iflaggen.h x86/insnsi.h x86/regs.h asm/error.$(O): asm/error.c config/msvc.h config/unknown.h config/watcom.h & include/bytesex.h include/compiler.h include/error.h include/nasmint.h & include/nasmlib.h asm/eval.$(O): asm/eval.c asm/assemble.h asm/directiv.h asm/eval.h & asm/float.h asm/pptok.h asm/preproc.h config/msvc.h config/unknown.h & config/watcom.h include/bytesex.h include/compiler.h include/error.h & - include/iflag.h include/labels.h include/nasm.h include/nasmint.h & - include/nasmlib.h include/opflags.h include/perfhash.h include/strlist.h & - include/tables.h x86/iflaggen.h x86/insnsi.h x86/regs.h + include/iflag.h include/ilog2.h include/labels.h include/nasm.h & + include/nasmint.h include/nasmlib.h include/opflags.h include/perfhash.h & + include/strlist.h include/tables.h x86/iflaggen.h x86/insnsi.h x86/regs.h asm/exprdump.$(O): asm/exprdump.c asm/directiv.h asm/pptok.h asm/preproc.h & config/msvc.h config/unknown.h config/watcom.h include/bytesex.h & include/compiler.h include/nasm.h include/nasmint.h include/nasmlib.h & @@ -496,8 +496,7 @@ nasmlib/hashtbl.$(O): nasmlib/hashtbl.c asm/directiv.h asm/pptok.h & include/nasmint.h include/nasmlib.h include/opflags.h include/perfhash.h & include/strlist.h include/tables.h x86/insnsi.h x86/regs.h nasmlib/ilog2.$(O): nasmlib/ilog2.c config/msvc.h config/unknown.h & - config/watcom.h include/bytesex.h include/compiler.h include/nasmint.h & - include/nasmlib.h + config/watcom.h include/compiler.h include/ilog2.h include/nasmint.h nasmlib/malloc.$(O): nasmlib/malloc.c config/msvc.h config/unknown.h & config/watcom.h include/bytesex.h include/compiler.h include/error.h & include/nasmint.h include/nasmlib.h @@ -583,10 +582,11 @@ output/outbin.$(O): output/outbin.c asm/directiv.h asm/eval.h asm/pptok.h & output/outform.h output/outlib.h x86/insnsi.h x86/regs.h output/outcoff.$(O): output/outcoff.c asm/directiv.h asm/eval.h asm/pptok.h & asm/preproc.h config/msvc.h config/unknown.h config/watcom.h & - include/bytesex.h include/compiler.h include/error.h include/nasm.h & - include/nasmint.h include/nasmlib.h include/opflags.h include/perfhash.h & - include/raa.h include/saa.h include/strlist.h include/tables.h & - output/outform.h output/outlib.h output/pecoff.h x86/insnsi.h x86/regs.h + include/bytesex.h include/compiler.h include/error.h include/ilog2.h & + include/nasm.h include/nasmint.h include/nasmlib.h include/opflags.h & + include/perfhash.h include/raa.h include/saa.h include/strlist.h & + include/tables.h output/outform.h output/outlib.h output/pecoff.h & + x86/insnsi.h x86/regs.h output/outdbg.$(O): output/outdbg.c asm/directiv.h asm/pptok.h asm/preproc.h & asm/tokens.h config/msvc.h config/unknown.h config/watcom.h & include/bytesex.h include/compiler.h include/error.h include/iflag.h & @@ -618,11 +618,11 @@ output/outlib.$(O): output/outlib.c asm/directiv.h asm/pptok.h asm/preproc.h & include/tables.h output/outlib.h x86/insnsi.h x86/regs.h output/outmacho.$(O): output/outmacho.c asm/directiv.h asm/pptok.h & asm/preproc.h config/msvc.h config/unknown.h config/watcom.h & - include/bytesex.h include/compiler.h include/error.h include/labels.h & - include/nasm.h include/nasmint.h include/nasmlib.h include/opflags.h & - include/perfhash.h include/raa.h include/rbtree.h include/saa.h & - include/strlist.h include/tables.h include/ver.h output/dwarf.h & - output/outform.h output/outlib.h x86/insnsi.h x86/regs.h + include/bytesex.h include/compiler.h include/error.h include/ilog2.h & + include/labels.h include/nasm.h include/nasmint.h include/nasmlib.h & + include/opflags.h include/perfhash.h include/raa.h include/rbtree.h & + include/saa.h include/strlist.h include/tables.h include/ver.h & + output/dwarf.h output/outform.h output/outlib.h x86/insnsi.h x86/regs.h output/outobj.$(O): output/outobj.c asm/directiv.h asm/eval.h asm/pptok.h & asm/preproc.h asm/stdscan.h config/msvc.h config/unknown.h config/watcom.h & include/bytesex.h include/compiler.h include/error.h include/nasm.h & diff --git a/asm/directiv.c b/asm/directiv.c index d6dfed85..21f70e56 100644 --- a/asm/directiv.c +++ b/asm/directiv.c @@ -44,6 +44,7 @@ #include "nasm.h" #include "nasmlib.h" +#include "ilog2.h" #include "error.h" #include "float.h" #include "stdscan.h" diff --git a/asm/eval.c b/asm/eval.c index 89f66fb7..4ce60cec 100644 --- a/asm/eval.c +++ b/asm/eval.c @@ -45,6 +45,7 @@ #include "nasm.h" #include "nasmlib.h" +#include "ilog2.h" #include "error.h" #include "eval.h" #include "labels.h" diff --git a/include/compiler.h b/include/compiler.h index 3bdd9ee2..b074b478 100644 --- a/include/compiler.h +++ b/include/compiler.h @@ -208,6 +208,29 @@ size_t strnlen(const char *s, size_t maxlen); #endif /* + * Hack to support external-linkage inline functions + */ +#ifdef __GNUC__ +# ifdef __GNUC_STDC_INLINE__ +# define HAVE_STDC_INLINE +# else +# define HAVE_GNU_INLINE +# endif +#elif defined(__STDC_VERSION__) +# if __STDC_VERSION__ >= 199901L +# define HAVE_STDC_INLINE +# endif +#endif + +#ifdef HAVE_STDC_INLINE +# define extern_inline inline +#elif defined(HAVE_GNU_INLINE) +# define extern_inline extern inline +#else +# define inline_prototypes +#endif + +/* * Hints to the compiler that a particular branch of code is more or * less likely to be taken. */ diff --git a/include/iflag.h b/include/iflag.h index 02787de9..289e4272 100644 --- a/include/iflag.h +++ b/include/iflag.h @@ -4,9 +4,7 @@ #include #include "compiler.h" - -int ilog2_32(uint32_t v); - +#include "ilog2.h" #include "iflaggen.h" #define IF_GENBIT(bit) (UINT32_C(1) << (bit)) diff --git a/nasmlib/ilog2.c b/include/ilog2.h similarity index 79% copy from nasmlib/ilog2.c copy to include/ilog2.h index 7f4624f5..15b3a2a9 100644 --- a/nasmlib/ilog2.c +++ b/include/ilog2.h @@ -31,10 +31,27 @@ * * ----------------------------------------------------------------------- */ +#ifndef ILOG2_H +#define ILOG2_H + #include "compiler.h" -#include "nasmlib.h" #include +#ifdef ILOG2_C /* For generating the out-of-line functions */ +# undef extern_inline +# define extern_inline +# define inline_prototypes +#endif + +#ifdef inline_prototypes +extern int const_func ilog2_32(uint32_t v); +extern int const_func ilog2_64(uint64_t v); +extern int const_func ilog2_64(uint64_t vv); +extern int const_func alignlog2_32(uint32_t v); +#endif + +#ifdef extern_inline + #define ROUND(v, a, w) \ do { \ if (v & (((UINT32_C(1) << w) - 1) << w)) { \ @@ -46,7 +63,7 @@ #if defined(__GNUC__) && defined(__x86_64__) -int ilog2_32(uint32_t v) +extern_inline int const_func ilog2_32(uint32_t v) { int n; @@ -58,7 +75,7 @@ int ilog2_32(uint32_t v) #elif defined(__GNUC__) && defined(__i386__) -int ilog2_32(uint32_t v) +extern_inline int const_func ilog2_32(uint32_t v) { int n; @@ -77,7 +94,7 @@ int ilog2_32(uint32_t v) #elif defined(HAVE___BUILTIN_CLZ) && INT_MAX == 2147483647 -int ilog2_32(uint32_t v) +extern_inline int const_func ilog2_32(uint32_t v) { if (!v) return 0; @@ -87,7 +104,7 @@ int ilog2_32(uint32_t v) #elif defined(HAVE__BITSCANREVERSE) -int ilog2_32(uint32_t v) +extern_inline int const_func ilog2_32(uint32_t v) { unsigned long ix; return _BitScanReverse(&ix, v) ? v : 0; @@ -95,7 +112,7 @@ int ilog2_32(uint32_t v) #else -int ilog2_32(uint32_t v) +extern_inline int const_func ilog2_32(uint32_t v) { int p = 0; @@ -112,7 +129,7 @@ int ilog2_32(uint32_t v) #if defined(__GNUC__) && defined(__x86_64__) -int ilog2_64(uint64_t v) +extern_inline int const_func ilog2_64(uint64_t v) { uint64_t n; @@ -124,7 +141,7 @@ int ilog2_64(uint64_t v) #elif defined(HAVE__BUILTIN_CLZLL) && LLONG_MAX == 9223372036854775807LL -int ilog2_64(uint64_t v) +extern_inline int const_func ilog2_64(uint64_t v) { if (!v) return 0; @@ -134,7 +151,7 @@ int ilog2_64(uint64_t v) #elif defined(HAVE__BITSCANREVERSE64) -int ilog2_64(uint64_t v) +extern_inline int const_func ilog2_64(uint64_t v) { unsigned long ix; return _BitScanReverse64(&ix, v) ? ix : 0; @@ -142,7 +159,7 @@ int ilog2_64(uint64_t v) #else -int ilog2_64(uint64_t vv) +extern_inline int const_func ilog2_64(uint64_t vv) { int p = 0; uint32_t v; @@ -167,7 +184,7 @@ int ilog2_64(uint64_t vv) /* * v == 0 ? 0 : is_power2(x) ? ilog2_X(v) : -1 */ -int alignlog2_32(uint32_t v) +extern_inline int const_func alignlog2_32(uint32_t v) { if (unlikely(v & (v-1))) return -1; /* invalid alignment */ @@ -175,10 +192,16 @@ int alignlog2_32(uint32_t v) return ilog2_32(v); } -int alignlog2_64(uint64_t v) +extern_inline int const_func alignlog2_64(uint64_t v) { if (unlikely(v & (v-1))) return -1; /* invalid alignment */ return ilog2_64(v); } + +#undef ROUND + +#endif /* extern_inline */ + +#endif /* ILOG2_H */ diff --git a/include/nasmlib.h b/include/nasmlib.h index fc3b4c4e..f0a670be 100644 --- a/include/nasmlib.h +++ b/include/nasmlib.h @@ -414,16 +414,4 @@ static inline int64_t const_func signed_bits(int64_t value, int bits) /* check if value is power of 2 */ #define is_power2(v) ((v) && ((v) & ((v) - 1)) == 0) -/* - * floor(log2(v)) - */ -int const_func ilog2_32(uint32_t v); -int const_func ilog2_64(uint64_t v); - -/* - * v == 0 ? 0 : is_power2(x) ? ilog2_X(v) : -1 - */ -int const_func alignlog2_32(uint32_t v); -int const_func alignlog2_64(uint64_t v); - #endif diff --git a/nasmlib/ilog2.c b/nasmlib/ilog2.c dissimilarity index 100% 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 - -#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" diff --git a/output/outcoff.c b/output/outcoff.c index df3dab72..d3a1b22c 100644 --- a/output/outcoff.c +++ b/output/outcoff.c @@ -46,6 +46,7 @@ #include "nasm.h" #include "nasmlib.h" +#include "ilog2.h" #include "error.h" #include "saa.h" #include "raa.h" diff --git a/output/outmacho.c b/output/outmacho.c index af0e61e7..d3a1d84d 100644 --- a/output/outmacho.c +++ b/output/outmacho.c @@ -45,6 +45,7 @@ #include "nasm.h" #include "nasmlib.h" +#include "ilog2.h" #include "labels.h" #include "error.h" #include "saa.h" -- 2.11.4.GIT