summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-07-10 13:06:33 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-07-10 13:06:33 +0000
commit55e60d05dce136e69981f8084505834501c96fa2 (patch)
treec4226aee6a1b1845e5c3ac5b30815d7895188abe
parentc37e6ab28dfb1e5ada877946b5727aa755d7a51b (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--ChangeLog5
-rw-r--r--bignum.c37
2 files changed, 27 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index bfd2a2a980..44d7d6f28d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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).
diff --git a/bignum.c b/bignum.c
index d432b0b031..3f5ea1745f 100644
--- a/bignum.c
+++ b/bignum.c
@@ -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);