diff --git a/ChangeLog b/ChangeLog index 84ca5de3c8..a872256f05 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Mon Jun 24 23:30:31 2013 Tanaka Akira + + * bignum.c (integer_unpack_single_bdigit): Refine code to filling + higher bits and use BIGLO. + Mon Jun 24 22:26:31 2013 Hiroshi Shirosaki * test/rinda/test_rinda.rb (RingIPv6#prepare_ipv6): diff --git a/bignum.c b/bignum.c index 0bdceef045..ffd35cf5e4 100644 --- a/bignum.c +++ b/bignum.c @@ -1350,8 +1350,10 @@ integer_unpack_single_bdigit(BDIGIT u, size_t size, int flags, BDIGIT *dp) sign = (flags & INTEGER_PACK_NEGATIVE) ? ((size == SIZEOF_BDIGITS && u == 0) ? -2 : -1) : ((u >> (size * CHAR_BIT - 1)) ? -1 : 1); - if (sign < 0) - u = (BDIGIT)(-(u | LSHIFTX((~(BDIGIT)0), size * CHAR_BIT))); + if (sign < 0) { + u |= LSHIFTX(BDIGMAX, size * CHAR_BIT); + u = BIGLO(-u); + } } else sign = (flags & INTEGER_PACK_NEGATIVE) ? -1 : 1;