From 236b5e977818df29cf18005cc1a5a650d40434bd Mon Sep 17 00:00:00 2001 From: naruse Date: Tue, 28 Jun 2016 18:42:12 +0000 Subject: * 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 --- bignum.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) (limited to 'bignum.c') diff --git a/bignum.c b/bignum.c index 767659d046..741fa2d21e 100644 --- a/bignum.c +++ b/bignum.c @@ -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'"); } -- cgit v1.2.3