diff options
| author | Mattias Andrée <maandree@kth.se> | 2016-03-04 23:50:00 +0100 |
|---|---|---|
| committer | Mattias Andrée <maandree@kth.se> | 2016-03-04 23:50:00 +0100 |
| commit | 76d0af5599554d11f104d582cdac8fbaa8569fcc (patch) | |
| tree | 0ed9889a86d52ebd208382f2fd49dad0570d1f8c /src/zmul.c | |
| parent | Clean up, fix a few bugs, and add a test (diff) | |
| download | libzahl-76d0af5599554d11f104d582cdac8fbaa8569fcc.tar.gz libzahl-76d0af5599554d11f104d582cdac8fbaa8569fcc.tar.bz2 libzahl-76d0af5599554d11f104d582cdac8fbaa8569fcc.tar.xz | |
Clean up, add zerror and zperror, fix bugs and add more tests
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'src/zmul.c')
| -rw-r--r-- | src/zmul.c | 22 |
1 files changed, 13 insertions, 9 deletions
@@ -13,7 +13,10 @@ zmul(z_t a, z_t b, z_t c) z_t z0, z1, z2, b_high, b_low, c_high, c_low; int b_sign, c_sign; - if (zzero(b) || zzero(c)) { + b_sign = zsignum(b); + c_sign = zsignum(c); + + if (!b_sign || !c_sign) { SET_SIGNUM(a, 0); return; } @@ -21,11 +24,12 @@ zmul(z_t a, z_t b, z_t c) m = zbits(b); m2 = b == c ? m : zbits(c); - b_sign = zsignum(b); - c_sign = zsignum(c); - - if (m <= BITS_PER_CHAR / 2 && m2 <= BITS_PER_CHAR / 2) { - zsetu(a, b->chars[0] * c->chars[0]); + if (m + m2 <= BITS_PER_CHAR) { + /* zsetu(a, b->chars[0] * c->chars[0]); { */ + ENSURE_SIZE(a, 1); + a->used = 1; + a->chars[0] = b->chars[0] * c->chars[0]; + /* } */ SET_SIGNUM(a, b_sign * c_sign); return; } @@ -47,7 +51,7 @@ zmul(z_t a, z_t b, z_t c) zsplit(b_high, b_low, b, m2); zsplit(c_high, c_low, c, m2); -#if 0 +#if 1 zmul(z0, b_low, c_low); zmul(z2, b_high, c_high); zadd(b_low, b_low, b_high); @@ -57,9 +61,9 @@ zmul(z_t a, z_t b, z_t c) zsub(z1, z1, z0); zsub(z1, z1, z2); - zlsh(z2, z2, m2); - m2 <<= 1; zlsh(z1, z1, m2); + m2 <<= 1; + zlsh(z2, z2, m2); zadd(a, z2, z1); zadd(a, a, z0); |
