diff options
| author | Mattias Andrée <maandree@kth.se> | 2016-04-30 05:47:05 +0200 |
|---|---|---|
| committer | Mattias Andrée <maandree@kth.se> | 2016-04-30 05:47:05 +0200 |
| commit | 83d95da004c8cc2387a4070b781a71a0c6433faa (patch) | |
| tree | e5eaaa0e42bf7eeed461dc936bd2bed0600fb612 /src/zxor.c | |
| parent | Some optimisations (diff) | |
| download | libzahl-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/zxor.c')
| -rw-r--r-- | src/zxor.c | 48 |
1 files changed, 32 insertions, 16 deletions
@@ -2,18 +2,33 @@ #include "internals.h" -static inline void -zxor_impl(zahl_char_t *restrict a, const zahl_char_t *restrict b, size_t n) +O2 static inline void +zxor_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 +zxor_impl_5(register zahl_char_t *restrict a, + register const zahl_char_t *restrict b, size_t n, + register const zahl_char_t *restrict c, size_t m) +{ + size_t i; + for (i = 0; i < n; i++) + a[i] = b[i] ^ c[i]; + for (; i < m; i++) + a[i] = c[i]; +} + void zxor(z_t a, z_t b, z_t c) { - size_t n, m; + size_t n, m, bn, cn; + const zahl_char_t *restrict bc; + const zahl_char_t *restrict cc; if (unlikely(zzero(b))) { SET(a, c); @@ -23,25 +38,26 @@ zxor(z_t a, z_t b, z_t c) return; } - m = MAX(b->used, c->used); - n = b->used + c->used - m; + bn = b->used; + bc = b->chars; + cn = c->used; + cc = c->chars; + MIN_MAX_1(n, m, bn, cn); ENSURE_SIZE(a, m); if (a == b) { - if (a->used < c->used) - zmemcpy(a->chars + n, c->chars + n, m - n); - zxor_impl(a->chars, c->chars, n); + zxor_impl_3(a->chars, cc, n); + if (a->used < cn) + zmemcpy_range(a->chars, cc, n, m); } else if (unlikely(a == c)) { - if (a->used < b->used) - zmemcpy(a->chars + n, b->chars + n, m - n); - zxor_impl(a->chars, b->chars, n); - } else if (m == b->used) { - zmemcpy(a->chars, b->chars, m); - zxor_impl(a->chars, c->chars, n); + zxor_impl_3(a->chars, bc, n); + if (a->used < bn) + zmemcpy_range(a->chars, bc, n, m); + } else if (m == bn) { + zxor_impl_5(a->chars, cc, n, bc, m); } else { - zmemcpy(a->chars, c->chars, m); - zxor_impl(a->chars, b->chars, n); + zxor_impl_5(a->chars, bc, n, cc, m); } a->used = m; |
