aboutsummaryrefslogtreecommitdiffstats
path: root/src/zand.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2016-04-30 05:47:05 +0200
committerMattias Andrée <maandree@kth.se>2016-04-30 05:47:05 +0200
commit83d95da004c8cc2387a4070b781a71a0c6433faa (patch)
treee5eaaa0e42bf7eeed461dc936bd2bed0600fb612 /src/zand.c
parentSome optimisations (diff)
downloadlibzahl-83d95da004c8cc2387a4070b781a71a0c6433faa.tar.gz
libzahl-83d95da004c8cc2387a4070b781a71a0c6433faa.tar.bz2
libzahl-83d95da004c8cc2387a4070b781a71a0c6433faa.tar.xz
Some optimisations
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'src/zand.c')
-rw-r--r--src/zand.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/zand.c b/src/zand.c
index a8f53a6..6d3a184 100644
--- a/src/zand.c
+++ b/src/zand.c
@@ -2,14 +2,25 @@
#include "internals.h"
-static inline O2 void
-zand_impl(zahl_char_t *restrict a, const zahl_char_t *restrict b, size_t n)
+O2 static inline void
+zand_impl_3(register zahl_char_t *restrict a,
+ register const zahl_char_t *restrict b, size_t n)
{
size_t i;
for (i = 0; i < n; i++)
a[i] &= b[i];
}
+static inline void
+zand_impl_4(register zahl_char_t *restrict a,
+ register const zahl_char_t *restrict b,
+ register const zahl_char_t *restrict c, size_t n)
+{
+ size_t i;
+ for (i = 0; i < n; i++)
+ a[i] = b[i] & c[i];
+}
+
void
zand(z_t a, z_t b, z_t c)
{
@@ -25,13 +36,12 @@ zand(z_t a, z_t b, z_t c)
a->used = MIN(b->used, c->used);
if (a == b) {
- zand_impl(a->chars, c->chars, a->used);
+ zand_impl_3(a->chars, c->chars, a->used);
} else if (unlikely(a == c)) {
- zand_impl(a->chars, b->chars, a->used);
+ zand_impl_3(a->chars, b->chars, a->used);
} else {
ENSURE_SIZE(a, a->used);
- zmemcpy(a->chars, c->chars, a->used);
- zand_impl(a->chars, b->chars, a->used);
+ zand_impl_4(a->chars, b->chars, c->chars, a->used);
}
TRIM_AND_SIGN(a, zpositive1(b, c) * 2 - 1);