1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* bignum.c (rb_big2ulong): the old logic seems to try to avoid

calculating `-(long)(num-1)-1` if `num` is not LONG_MIN. (Note that
  `-LONG_MIN` may be larger than LONG_MAX) But C compilers can
  optimize it into single NEG instruction.
  Therefore those two conditions can be single if-body.

* bignum.c (rb_big2long): ditto.

* bignum.c (rb_big2ull): ditto.

* bignum.c (rb_big2ll): ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55528 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
naruse 2016-06-28 18:42:12 +00:00
parent c9df0f82b7
commit 236b5e9778
2 changed files with 22 additions and 16 deletions

View file

@ -1,3 +1,17 @@
Wed Jun 29 03:34:41 2016 NARUSE, Yui <naruse@ruby-lang.org>
* bignum.c (rb_big2ulong): the old logic seems to try to avoid
calculating `-(long)(num-1)-1` if `num` is not LONG_MIN. (Note that
`-LONG_MIN` may be larger than LONG_MAX) But C compilers can
optimize it into single NEG instruction.
Therefore those two conditions can be single if-body.
* bignum.c (rb_big2long): ditto.
* bignum.c (rb_big2ull): ditto.
* bignum.c (rb_big2ll): ditto.
Tue Jun 28 22:55:00 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
* lib/pstore.rb (PStore::CHECKSUM_ALGO): extract the algorithm for

View file

@ -5079,10 +5079,8 @@ rb_big2ulong(VALUE x)
return num;
}
else {
if (num <= LONG_MAX)
return -(long)num;
if (num == 1+(unsigned long)(-(LONG_MIN+1)))
return LONG_MIN;
if (num <= 1+(unsigned long)(-(LONG_MIN+1)))
return -(long)(num-1)-1;
}
rb_raise(rb_eRangeError, "bignum out of range of unsigned long");
}
@ -5097,10 +5095,8 @@ rb_big2long(VALUE x)
return num;
}
else {
if (num <= LONG_MAX)
return -(long)num;
if (num == 1+(unsigned long)(-(LONG_MIN+1)))
return LONG_MIN;
if (num <= 1+(unsigned long)(-(LONG_MIN+1)))
return -(long)(num-1)-1;
}
rb_raise(rb_eRangeError, "bignum too big to convert into `long'");
}
@ -5139,10 +5135,8 @@ rb_big2ull(VALUE x)
return num;
}
else {
if (num <= LLONG_MAX)
return -(LONG_LONG)num;
if (num == 1+(unsigned LONG_LONG)(-(LLONG_MIN+1)))
return LLONG_MIN;
if (num <= 1+(unsigned LONG_LONG)(-(LLONG_MIN+1)))
return -(LONG_LONG)(num-1)-1;
}
rb_raise(rb_eRangeError, "bignum out of range of unsigned long long");
}
@ -5157,10 +5151,8 @@ rb_big2ll(VALUE x)
return num;
}
else {
if (num <= LLONG_MAX)
return -(LONG_LONG)num;
if (num == 1+(unsigned LONG_LONG)(-(LLONG_MIN+1)))
return LLONG_MIN;
if (num <= 1+(unsigned LONG_LONG)(-(LLONG_MIN+1)))
return -(LONG_LONG)(num-1)-1;
}
rb_raise(rb_eRangeError, "bignum too big to convert into `long long'");
}