diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-07-10 13:06:33 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-07-10 13:06:33 +0000 |
commit | 55e60d05dce136e69981f8084505834501c96fa2 (patch) | |
tree | c4226aee6a1b1845e5c3ac5b30815d7895188abe | |
parent | c37e6ab28dfb1e5ada877946b5727aa755d7a51b (diff) |
* bignum.c (bary_2comp): Don't use bary_plus_one.
(bary_add_one): Replaced by the implementation of bary_plus_one.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41897 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | bignum.c | 37 |
2 files changed, 27 insertions, 15 deletions
@@ -1,3 +1,8 @@ +Wed Jul 10 22:03:27 2013 Tanaka Akira <akr@fsij.org> + + * bignum.c (bary_2comp): Don't use bary_plus_one. + (bary_add_one): Replaced by the implementation of bary_plus_one. + Wed Jul 10 20:48:22 2013 Nobuyoshi Nakada <nobu@ruby-lang.org> * bignum.c (sizeof_bdigit_dbl): check sizeof(BDIGIT_DBL). @@ -458,23 +458,24 @@ bary_neg(BDIGIT *ds, size_t n) } static int -bary_plus_one(BDIGIT *ds, size_t n) +bary_2comp(BDIGIT *ds, size_t n) { size_t i; + i = 0; for (i = 0; i < n; i++) { - ds[i] = BIGLO(ds[i]+1); - if (ds[i] != 0) - return 0; + if (ds[i] != 0) { + goto non_zero; + } } return 1; -} -static int -bary_2comp(BDIGIT *ds, size_t n) -{ - if (!n) return 1; - bary_neg(ds, n); - return bary_plus_one(ds, n); + non_zero: + ds[i] = BIGLO(~ds[i] + 1); + i++; + for (; i < n; i++) { + ds[i] = BIGLO(~ds[i]); + } + return 0; } static void @@ -1422,9 +1423,15 @@ bary_add(BDIGIT *zds, size_t zn, BDIGIT *xds, size_t xn, BDIGIT *yds, size_t yn) } static int -bary_add_one(BDIGIT *zds, size_t zn) +bary_add_one(BDIGIT *ds, size_t n) { - return bary_addc(zds, zn, NULL, 0, zds, zn, 1); + size_t i; + for (i = 0; i < n; i++) { + ds[i] = BIGLO(ds[i]+1); + if (ds[i] != 0) + return 0; + } + return 1; } static void @@ -4028,14 +4035,14 @@ rb_big_neg(VALUE x) if (!n) return INT2FIX(-1); if (RBIGNUM_POSITIVE_P(z)) { - if (bary_plus_one(ds, n)) { + if (bary_add_one(ds, n)) { big_extend_carry(z); } RBIGNUM_SET_NEGATIVE_SIGN(z); } else { bary_neg(ds, n); - if (bary_plus_one(ds, n)) + if (bary_add_one(ds, n)) return INT2FIX(-1); bary_neg(ds, n); RBIGNUM_SET_POSITIVE_SIGN(z); |