* time.c (v2w_bignum): Simplified using rb_integer_pack.

(rb_big_abs_find_maxbit): Removed.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41178 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
akr 2013-06-08 12:48:39 +00:00
parent 747894a32d
commit f1a6b64b1d
2 changed files with 19 additions and 37 deletions

View File

@ -1,3 +1,8 @@
Sat Jun 8 21:47:33 2013 Tanaka Akira <akr@fsij.org>
* time.c (v2w_bignum): Simplified using rb_integer_pack.
(rb_big_abs_find_maxbit): Removed.
Sat Jun 8 21:03:40 2013 Tanaka Akira <akr@fsij.org> Sat Jun 8 21:03:40 2013 Tanaka Akira <akr@fsij.org>
* bignum.c (rb_absint_singlebit_p): New function. * bignum.c (rb_absint_singlebit_p): New function.

49
time.c
View File

@ -296,48 +296,25 @@ w2v(wideval_t w)
} }
#if WIDEVALUE_IS_WIDER #if WIDEVALUE_IS_WIDER
static VALUE
rb_big_abs_find_maxbit(VALUE big)
{
int num_zeros;
size_t bytesize;
VALUE res;
bytesize = rb_absint_size(big, &num_zeros);
if (bytesize == 0)
return Qnil;
res = mul(SIZET2NUM(bytesize), LONG2FIX(CHAR_BIT));
if (num_zeros)
res = sub(res, LONG2FIX(num_zeros));
return res;
}
static wideval_t static wideval_t
v2w_bignum(VALUE v) v2w_bignum(VALUE v)
{ {
long len = RBIGNUM_LEN(v); int sign;
BDIGIT *ds; uwideint_t u;
wideval_t w;
VALUE maxbit;
ds = RBIGNUM_DIGITS(v);
w = WIDEVAL_WRAP(v);
maxbit = rb_big_abs_find_maxbit(v);
if (NIL_P(maxbit))
return WINT2FIXWV(0);
if (lt(maxbit, INT2FIX(sizeof(wideint_t) * CHAR_BIT - 2)) ||
(eq(maxbit, INT2FIX(sizeof(wideint_t) * CHAR_BIT - 2)) &&
RBIGNUM_NEGATIVE_P(v) && rb_absint_singlebit_p(v))) {
wideint_t i; wideint_t i;
i = 0; rb_integer_pack(v, &sign, NULL, &u, 1, sizeof(i), 0,
while (len) INTEGER_PACK_LSWORD_FIRST|INTEGER_PACK_NATIVE_BYTE_ORDER);
i = (i << sizeof(BDIGIT)*CHAR_BIT) | ds[--len]; if (sign == 0)
if (RBIGNUM_NEGATIVE_P(v)) { return WINT2FIXWV(0);
i = -i; else if (sign == -1) {
if (u <= -FIXWV_MIN)
return WINT2FIXWV(-(wideint_t)u);
} }
w = WINT2FIXWV(i); else if (sign == +1) {
if (u <= FIXWV_MAX)
return WINT2FIXWV((wideint_t)u);
} }
return w; return WIDEVAL_WRAP(v);
} }
#endif #endif