diff options
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)); } |
