diff options
| author | Mattias Andrée <maandree@kth.se> | 2016-03-15 22:38:08 +0100 |
|---|---|---|
| committer | Mattias Andrée <maandree@kth.se> | 2016-03-15 22:38:08 +0100 |
| commit | 0d409e30fd712507216d5b4bd32ab4b6cb5fae28 (patch) | |
| tree | 9f89ac5239298447db78b7f9ab3347353f04bbc8 /src/internals.h | |
| parent | Optimise zsetup, zgcd, zmul, and zsqr and add -flto (diff) | |
| download | libzahl-0d409e30fd712507216d5b4bd32ab4b6cb5fae28.tar.gz libzahl-0d409e30fd712507216d5b4bd32ab4b6cb5fae28.tar.bz2 libzahl-0d409e30fd712507216d5b4bd32ab4b6cb5fae28.tar.xz | |
Optimise zsqr, and optimise zmul a little
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'src/internals.h')
| -rw-r--r-- | src/internals.h | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/internals.h b/src/internals.h index 456a2df..bcb4c3f 100644 --- a/src/internals.h +++ b/src/internals.h @@ -232,3 +232,42 @@ zswap_tainted_unsigned(z_t a, z_t b) b->chars = a->chars; a->chars = t->chars; } + +static inline void +zsplit_fast_large_taint(z_t high, z_t low, z_t a, size_t n) +{ + n >>= LB_BITS_PER_CHAR; + high->sign = a->sign; + high->used = a->used - n; + high->chars = a->chars + n; + low->sign = a->sign; + low->used = n; + low->chars = a->chars; + TRIM_AND_ZERO(low); + TRIM_AND_ZERO(high); +} + +static inline void +zsplit_fast_small_tainted(z_t high, z_t low, z_t a, size_t n) +{ + zahl_char_t mask = 1; + mask = (mask << n) - 1; + + high->sign = a->sign; + high->used = 1; + high->chars[0] = a->chars[0] >> n; + if (a->used == 2) { + high->chars[1] = a->chars[1] >> n; + high->used += !!high->chars[1]; + n = BITS_PER_CHAR - n; + high->chars[0] |= (a->chars[1] & mask) << n; + } + if (unlikely(!high->chars[high->used - 1])) + high->sign = 0; + + low->sign = a->sign; + low->used = 1; + low->chars[0] = a->chars[0] & mask; + if (unlikely(!low->chars[0])) + low->sign = 0; +} |
