commit 64157e1d0e47a8b4e34817d77325fa09e1250b5f
Author:     Mattias Andrée <[email protected]>
AuthorDate: Sat Mar 5 20:42:34 2016 +0100
Commit:     Mattias Andrée <[email protected]>
CommitDate: Sat Mar 5 20:42:34 2016 +0100

    Improve zsub, only copy to temp when necessary
    
    Signed-off-by: Mattias Andrée <[email protected]>

diff --git a/src/internals.h b/src/internals.h
index 9f276db..5c0ac32 100644
--- a/src/internals.h
+++ b/src/internals.h
@@ -21,6 +21,7 @@
        X(libzahl_tmp_str_rem)\
        X(libzahl_tmp_gcd_u)\
        X(libzahl_tmp_gcd_v)\
+       X(libzahl_tmp_sub)\
        X(libzahl_tmp_modmul)\
        X(libzahl_tmp_div)\
        X(libzahl_tmp_mod)\
diff --git a/src/zsub.c b/src/zsub.c
index 5096eb0..cdb13f4 100644
--- a/src/zsub.c
+++ b/src/zsub.c
@@ -17,17 +17,6 @@ zsub_unsigned(z_t a, z_t b, z_t c)
        } else if (zzero(c)) {
                zabs(a, b);
                return;
-       } else if (a == b || a == c) {
-               /* TODO This should not be necessary. */
-               z_t tb, tc;
-               zinit(tb);
-               zinit(tc);
-               zset(tb, b);
-               zset(tc, c);
-               zsub_unsigned(a, tb, tc);
-               zfree(tb);
-               zfree(tc);
-               return;
        }
 
        magcmp = zcmpmag(b, c);
@@ -36,13 +25,23 @@ zsub_unsigned(z_t a, z_t b, z_t c)
                        SET_SIGNUM(a, 0);
                        return;
                }
+               n = MIN(b->used, c->used);
+               if (a == b) {
+                       zset(libzahl_tmp_sub, b);
+                       s = libzahl_tmp_sub->chars;
+               } else {
+                       s = b->chars;
+               }
                SET(a, c);
-               n = MIN(a->used, b->used);
-               s = b->chars;
        } else {
+               n = MIN(b->used, c->used);
+               if (a == c) {
+                       zset(libzahl_tmp_sub, c);
+                       s = libzahl_tmp_sub->chars;
+               } else {
+                       s = c->chars;
+               }
                SET(a, b);
-               n = MIN(a->used, c->used);
-               s = c->chars;
        }
 
        for (i = 0; i < n; i++) {

Reply via email to