aboutsummaryrefslogtreecommitdiffstats
path: root/src/zmul.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2016-03-04 23:50:00 +0100
committerMattias Andrée <maandree@kth.se>2016-03-04 23:50:00 +0100
commit76d0af5599554d11f104d582cdac8fbaa8569fcc (patch)
tree0ed9889a86d52ebd208382f2fd49dad0570d1f8c /src/zmul.c
parentClean up, fix a few bugs, and add a test (diff)
downloadlibzahl-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.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/zmul.c b/src/zmul.c
index f237bc9..53e19f5 100644
--- a/src/zmul.c
+++ b/src/zmul.c
@@ -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);