diff options
| author | Mattias Andrée <maandree@kth.se> | 2016-03-14 17:56:37 +0100 |
|---|---|---|
| committer | Mattias Andrée <maandree@kth.se> | 2016-03-14 17:56:37 +0100 |
| commit | b2c44d8c961090c2773f3a98d12fcafc7f5c5b2b (patch) | |
| tree | 8d7d19fd6ebd768023b3030d3e7b69d985fbf1c5 /src/zxor.c | |
| parent | Fix so that no workaround is required. (diff) | |
| download | libzahl-b2c44d8c961090c2773f3a98d12fcafc7f5c5b2b.tar.gz libzahl-b2c44d8c961090c2773f3a98d12fcafc7f5c5b2b.tar.bz2 libzahl-b2c44d8c961090c2773f3a98d12fcafc7f5c5b2b.tar.xz | |
Mostly optimisations
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'src/zxor.c')
| -rw-r--r-- | src/zxor.c | 35 |
1 files changed, 16 insertions, 19 deletions
@@ -2,16 +2,21 @@ #include "internals.h" +static inline void +zxor_impl(zahl_char_t *restrict a, const zahl_char_t *restrict b, size_t n) +{ + size_t i; + for (i = 0; i < n; i++) + a[i] ^= b[i]; +} + void zxor(z_t a, z_t b, z_t c) { size_t n, m; if (unlikely(zzero(b))) { - if (zzero(c)) - SET_SIGNUM(a, 0); - else - SET(a, c); + SET(a, c); return; } else if (unlikely(zzero(c))) { SET(a, b); @@ -24,29 +29,21 @@ zxor(z_t a, z_t b, z_t c) ENSURE_SIZE(a, m); if (a == b) { - if (b->used < c->used) + if (a->used < c->used) zmemcpy(a->chars + n, c->chars + n, m - n); - while (n--) - a->chars[n] ^= c->chars[n]; + zxor_impl(a->chars, c->chars, n); } else if (unlikely(a == c)) { - if (c->used < b->used) + if (a->used < b->used) zmemcpy(a->chars + n, b->chars + n, m - n); - while (n--) - a->chars[n] ^= b->chars[n]; + zxor_impl(a->chars, b->chars, n); } else if (m == b->used) { zmemcpy(a->chars, b->chars, m); - while (n--) - a->chars[n] ^= c->chars[n]; + zxor_impl(a->chars, c->chars, n); } else { zmemcpy(a->chars, c->chars, m); - while (n--) - a->chars[n] ^= b->chars[n]; + zxor_impl(a->chars, b->chars, n); } a->used = m; - TRIM(a); - if (a->used) - SET_SIGNUM(a, 1 - 2 * ((zsignum(b) ^ zsignum(c)) < 0)); - else - SET_SIGNUM(a, 0); + TRIM_AND_SIGN(a, 1 - 2 * ((zsignum(b) ^ zsignum(c)) < 0)); } |
