diff options
| author | Mattias Andrée <maandree@kth.se> | 2016-03-05 20:42:34 +0100 |
|---|---|---|
| committer | Mattias Andrée <maandree@kth.se> | 2016-03-05 20:42:34 +0100 |
| commit | 64157e1d0e47a8b4e34817d77325fa09e1250b5f (patch) | |
| tree | bc5ae2db359123d71f964181bd3089560f117932 /src | |
| parent | Fix bugs and add a randomised testing (diff) | |
| download | libzahl-64157e1d0e47a8b4e34817d77325fa09e1250b5f.tar.gz libzahl-64157e1d0e47a8b4e34817d77325fa09e1250b5f.tar.bz2 libzahl-64157e1d0e47a8b4e34817d77325fa09e1250b5f.tar.xz | |
Improve zsub, only copy to temp when necessary
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'src')
| -rw-r--r-- | src/internals.h | 1 | ||||
| -rw-r--r-- | src/zsub.c | 29 |
2 files changed, 15 insertions, 15 deletions
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)\ @@ -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++) { |
