From 7bb549d6b597b581a2f95496928612f2059e2df2 Mon Sep 17 00:00:00 2001 From: akr Date: Sun, 1 Sep 2013 00:57:00 +0000 Subject: [PATCH] * internal.h (bit_length): Moved from bignum.c. (nlz_int): Ditto. (nlz_long): Ditto. (nlz_long_long): Ditto. (nlz_int128): Ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42750 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 8 ++++ bignum.c | 126 ----------------------------------------------------- internal.h | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+), 126 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9acbc6de45..2dd62fa5d3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Sun Sep 1 09:55:45 2013 Tanaka Akira + + * internal.h (bit_length): Moved from bignum.c. + (nlz_int): Ditto. + (nlz_long): Ditto. + (nlz_long_long): Ditto. + (nlz_int128): Ditto. + Sun Sep 1 03:32:22 2013 Tanaka Akira * bignum.c (bit_length): Renamed from bitsize. diff --git a/bignum.c b/bignum.c index 0545d5baac..b0159ecc46 100644 --- a/bignum.c +++ b/bignum.c @@ -154,115 +154,6 @@ static VALUE bigsq(VALUE x); static void bigdivmod(VALUE x, VALUE y, volatile VALUE *divp, volatile VALUE *modp); static inline VALUE power_cache_get_power(int base, int power_level, size_t *numdigits_ret); -static int -nlz_int(unsigned int x) -{ -#if defined(HAVE_BUILTIN___BUILTIN_CLZ) - if (x == 0) return SIZEOF_INT * CHAR_BIT; - return __builtin_clz(x); -#else - unsigned int y; -# if 64 < SIZEOF_INT * CHAR_BIT - int n = 128; -# elif 32 < SIZEOF_INT * CHAR_BIT - int n = 64; -# else - int n = 32; -# endif -# if 64 < SIZEOF_INT * CHAR_BIT - y = x >> 64; if (y) {n -= 64; x = y;} -# endif -# if 32 < SIZEOF_INT * CHAR_BIT - y = x >> 32; if (y) {n -= 32; x = y;} -# endif - y = x >> 16; if (y) {n -= 16; x = y;} - y = x >> 8; if (y) {n -= 8; x = y;} - y = x >> 4; if (y) {n -= 4; x = y;} - y = x >> 2; if (y) {n -= 2; x = y;} - y = x >> 1; if (y) {return n - 2;} - return (int)(n - x); -#endif -} - -static int -nlz_long(unsigned long x) -{ -#if defined(HAVE_BUILTIN___BUILTIN_CLZL) - if (x == 0) return SIZEOF_LONG * CHAR_BIT; - return __builtin_clzl(x); -#else - unsigned long y; -# if 64 < SIZEOF_LONG * CHAR_BIT - int n = 128; -# elif 32 < SIZEOF_LONG * CHAR_BIT - int n = 64; -# else - int n = 32; -# endif -# if 64 < SIZEOF_LONG * CHAR_BIT - y = x >> 64; if (y) {n -= 64; x = y;} -# endif -# if 32 < SIZEOF_LONG * CHAR_BIT - y = x >> 32; if (y) {n -= 32; x = y;} -# endif - y = x >> 16; if (y) {n -= 16; x = y;} - y = x >> 8; if (y) {n -= 8; x = y;} - y = x >> 4; if (y) {n -= 4; x = y;} - y = x >> 2; if (y) {n -= 2; x = y;} - y = x >> 1; if (y) {return n - 2;} - return (int)(n - x); -#endif -} - -#ifdef HAVE_LONG_LONG -static int -nlz_long_long(unsigned LONG_LONG x) -{ -#if defined(HAVE_BUILTIN___BUILTIN_CLZLL) - if (x == 0) return SIZEOF_LONG_LONG * CHAR_BIT; - return __builtin_clzll(x); -#else - unsigned LONG_LONG y; -# if 64 < SIZEOF_LONG_LONG * CHAR_BIT - int n = 128; -# elif 32 < SIZEOF_LONG_LONG * CHAR_BIT - int n = 64; -# else - int n = 32; -# endif -# if 64 < SIZEOF_LONG_LONG * CHAR_BIT - y = x >> 64; if (y) {n -= 64; x = y;} -# endif -# if 32 < SIZEOF_LONG_LONG * CHAR_BIT - y = x >> 32; if (y) {n -= 32; x = y;} -# endif - y = x >> 16; if (y) {n -= 16; x = y;} - y = x >> 8; if (y) {n -= 8; x = y;} - y = x >> 4; if (y) {n -= 4; x = y;} - y = x >> 2; if (y) {n -= 2; x = y;} - y = x >> 1; if (y) {return n - 2;} - return (int)(n - x); -#endif -} -#endif - -#ifdef HAVE_UINT128_T -static int -nlz_int128(uint128_t x) -{ - uint128_t y; - int n = 128; - y = x >> 64; if (y) {n -= 64; x = y;} - y = x >> 32; if (y) {n -= 32; x = y;} - y = x >> 16; if (y) {n -= 16; x = y;} - y = x >> 8; if (y) {n -= 8; x = y;} - y = x >> 4; if (y) {n -= 4; x = y;} - y = x >> 2; if (y) {n -= 2; x = y;} - y = x >> 1; if (y) {return n - 2;} - return (int)(n - x); -} -#endif - #if SIZEOF_BDIGITS <= SIZEOF_INT static int nlz(BDIGIT x) { return nlz_int((unsigned int)x) - (SIZEOF_INT-SIZEOF_BDIGITS) * CHAR_BIT; } #elif SIZEOF_BDIGITS <= SIZEOF_LONG @@ -273,23 +164,6 @@ static int nlz(BDIGIT x) { return nlz_long_long((unsigned LONG_LONG)x) - (SIZEOF static int nlz(BDIGIT x) { return nlz_int128((uint128_t)x) - (SIZEOF_INT128_T-SIZEOF_BDIGITS) * CHAR_BIT; } #endif -#if defined(HAVE_UINT128_T) -# define bit_length(x) \ - (sizeof(x) <= SIZEOF_INT ? SIZEOF_INT * CHAR_BIT - nlz_int(x) : \ - sizeof(x) <= SIZEOF_LONG ? SIZEOF_LONG * CHAR_BIT - nlz_long(x) : \ - sizeof(x) <= SIZEOF_LONG_LONG ? SIZEOF_LONG_LONG * CHAR_BIT - nlz_long_long(x) : \ - SIZEOF_INT128_T * CHAR_BIT - nlz_int128(x)) -#elif defined(HAVE_LONG_LONG) -# define bit_length(x) \ - (sizeof(x) <= SIZEOF_INT ? SIZEOF_INT * CHAR_BIT - nlz_int(x) : \ - sizeof(x) <= SIZEOF_LONG ? SIZEOF_LONG * CHAR_BIT - nlz_long(x) : \ - SIZEOF_LONG_LONG * CHAR_BIT - nlz_long_long(x)) -#else -# define bit_length(x) \ - (sizeof(x) <= SIZEOF_INT ? SIZEOF_INT * CHAR_BIT - nlz_int(x) : \ - SIZEOF_LONG * CHAR_BIT - nlz_long(x)) -#endif - #define U16(a) ((uint16_t)(a)) #define U32(a) ((uint32_t)(a)) #ifdef HAVE_UINT64_T diff --git a/internal.h b/internal.h index f33059b985..ec5456c13a 100644 --- a/internal.h +++ b/internal.h @@ -106,6 +106,132 @@ extern "C" { # endif #endif +static inline int +nlz_int(unsigned int x) +{ +#if defined(HAVE_BUILTIN___BUILTIN_CLZ) + if (x == 0) return SIZEOF_INT * CHAR_BIT; + return __builtin_clz(x); +#else + unsigned int y; +# if 64 < SIZEOF_INT * CHAR_BIT + int n = 128; +# elif 32 < SIZEOF_INT * CHAR_BIT + int n = 64; +# else + int n = 32; +# endif +# if 64 < SIZEOF_INT * CHAR_BIT + y = x >> 64; if (y) {n -= 64; x = y;} +# endif +# if 32 < SIZEOF_INT * CHAR_BIT + y = x >> 32; if (y) {n -= 32; x = y;} +# endif + y = x >> 16; if (y) {n -= 16; x = y;} + y = x >> 8; if (y) {n -= 8; x = y;} + y = x >> 4; if (y) {n -= 4; x = y;} + y = x >> 2; if (y) {n -= 2; x = y;} + y = x >> 1; if (y) {return n - 2;} + return (int)(n - x); +#endif +} + +static inline int +nlz_long(unsigned long x) +{ +#if defined(HAVE_BUILTIN___BUILTIN_CLZL) + if (x == 0) return SIZEOF_LONG * CHAR_BIT; + return __builtin_clzl(x); +#else + unsigned long y; +# if 64 < SIZEOF_LONG * CHAR_BIT + int n = 128; +# elif 32 < SIZEOF_LONG * CHAR_BIT + int n = 64; +# else + int n = 32; +# endif +# if 64 < SIZEOF_LONG * CHAR_BIT + y = x >> 64; if (y) {n -= 64; x = y;} +# endif +# if 32 < SIZEOF_LONG * CHAR_BIT + y = x >> 32; if (y) {n -= 32; x = y;} +# endif + y = x >> 16; if (y) {n -= 16; x = y;} + y = x >> 8; if (y) {n -= 8; x = y;} + y = x >> 4; if (y) {n -= 4; x = y;} + y = x >> 2; if (y) {n -= 2; x = y;} + y = x >> 1; if (y) {return n - 2;} + return (int)(n - x); +#endif +} + +#ifdef HAVE_LONG_LONG +static inline int +nlz_long_long(unsigned LONG_LONG x) +{ +#if defined(HAVE_BUILTIN___BUILTIN_CLZLL) + if (x == 0) return SIZEOF_LONG_LONG * CHAR_BIT; + return __builtin_clzll(x); +#else + unsigned LONG_LONG y; +# if 64 < SIZEOF_LONG_LONG * CHAR_BIT + int n = 128; +# elif 32 < SIZEOF_LONG_LONG * CHAR_BIT + int n = 64; +# else + int n = 32; +# endif +# if 64 < SIZEOF_LONG_LONG * CHAR_BIT + y = x >> 64; if (y) {n -= 64; x = y;} +# endif +# if 32 < SIZEOF_LONG_LONG * CHAR_BIT + y = x >> 32; if (y) {n -= 32; x = y;} +# endif + y = x >> 16; if (y) {n -= 16; x = y;} + y = x >> 8; if (y) {n -= 8; x = y;} + y = x >> 4; if (y) {n -= 4; x = y;} + y = x >> 2; if (y) {n -= 2; x = y;} + y = x >> 1; if (y) {return n - 2;} + return (int)(n - x); +#endif +} +#endif + +#ifdef HAVE_UINT128_T +static inline int +nlz_int128(uint128_t x) +{ + uint128_t y; + int n = 128; + y = x >> 64; if (y) {n -= 64; x = y;} + y = x >> 32; if (y) {n -= 32; x = y;} + y = x >> 16; if (y) {n -= 16; x = y;} + y = x >> 8; if (y) {n -= 8; x = y;} + y = x >> 4; if (y) {n -= 4; x = y;} + y = x >> 2; if (y) {n -= 2; x = y;} + y = x >> 1; if (y) {return n - 2;} + return (int)(n - x); +} +#endif + +#if defined(HAVE_UINT128_T) +# define bit_length(x) \ + (sizeof(x) <= SIZEOF_INT ? SIZEOF_INT * CHAR_BIT - nlz_int(x) : \ + sizeof(x) <= SIZEOF_LONG ? SIZEOF_LONG * CHAR_BIT - nlz_long(x) : \ + sizeof(x) <= SIZEOF_LONG_LONG ? SIZEOF_LONG_LONG * CHAR_BIT - nlz_long_long(x) : \ + SIZEOF_INT128_T * CHAR_BIT - nlz_int128(x)) +#elif defined(HAVE_LONG_LONG) +# define bit_length(x) \ + (sizeof(x) <= SIZEOF_INT ? SIZEOF_INT * CHAR_BIT - nlz_int(x) : \ + sizeof(x) <= SIZEOF_LONG ? SIZEOF_LONG * CHAR_BIT - nlz_long(x) : \ + SIZEOF_LONG_LONG * CHAR_BIT - nlz_long_long(x)) +#else +# define bit_length(x) \ + (sizeof(x) <= SIZEOF_INT ? SIZEOF_INT * CHAR_BIT - nlz_int(x) : \ + SIZEOF_LONG * CHAR_BIT - nlz_long(x)) +#endif + struct rb_deprecated_classext_struct { char conflict[sizeof(VALUE) * 3]; };