aboutsummaryrefslogtreecommitdiffstats
path: root/src/zsub.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2016-03-15 11:40:46 +0100
committerMattias Andrée <maandree@kth.se>2016-03-15 11:40:46 +0100
commitf3b969b6991f154a1fde1ea6b4488320ed0b486f (patch)
treed17fd525c8bcfed5dd218501214330262efb52c0 /src/zsub.c
parentOptimisations (diff)
downloadlibzahl-f3b969b6991f154a1fde1ea6b4488320ed0b486f.tar.gz
libzahl-f3b969b6991f154a1fde1ea6b4488320ed0b486f.tar.bz2
libzahl-f3b969b6991f154a1fde1ea6b4488320ed0b486f.tar.xz
Optimise zsetup, zgcd, zmul, and zsqr and add -flto
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'src/zsub.c')
-rw-r--r--src/zsub.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/zsub.c b/src/zsub.c
index b3f12f2..259526f 100644
--- a/src/zsub.c
+++ b/src/zsub.c
@@ -46,7 +46,7 @@ libzahl_zsub_unsigned(z_t a, z_t b, z_t c)
SET_SIGNUM(a, 0);
return;
}
- n = MIN(b->used, c->used);
+ n = b->used;
if (a == b) {
zset(libzahl_tmp_sub, b);
SET(a, c);
@@ -56,7 +56,7 @@ libzahl_zsub_unsigned(z_t a, z_t b, z_t c)
zsub_impl(a, b, n);
}
} else {
- n = MIN(b->used, c->used);
+ n = c->used;
if (unlikely(a == c)) {
zset(libzahl_tmp_sub, c);
SET(a, b);
@@ -77,6 +77,24 @@ zsub_unsigned(z_t a, z_t b, z_t c)
}
void
+zsub_nonnegative_assign(z_t a, z_t b)
+{
+ if (unlikely(zzero(b))) {
+ zabs(a, a);
+ } else if (unlikely(!zcmpmag(a, b))) {
+ SET_SIGNUM(a, 0);
+ } else {
+ zsub_impl(a, b, b->used);
+ }
+}
+
+void
+zsub_positive_assign(z_t a, z_t b)
+{
+ zsub_impl(a, b, b->used);
+}
+
+void
zsub(z_t a, z_t b, z_t c)
{
if (unlikely(zzero(b))) {