aboutsummaryrefslogtreecommitdiffstats
path: root/src/ztrunc.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2016-03-13 05:30:01 +0100
committerMattias Andrée <maandree@kth.se>2016-03-13 05:30:01 +0100
commitf6cb7f3e7382a19a6d6d9990c243ffb8a666182d (patch)
treedbf43f976f66a39fd87ffa38d59194b425efaa68 /src/ztrunc.c
parentMake zabs, zneg and zswap inline (diff)
downloadlibzahl-f6cb7f3e7382a19a6d6d9990c243ffb8a666182d.tar.gz
libzahl-f6cb7f3e7382a19a6d6d9990c243ffb8a666182d.tar.bz2
libzahl-f6cb7f3e7382a19a6d6d9990c243ffb8a666182d.tar.xz
Optimisations
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'src/ztrunc.c')
-rw-r--r--src/ztrunc.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/src/ztrunc.c b/src/ztrunc.c
index c634707..7dcafd9 100644
--- a/src/ztrunc.c
+++ b/src/ztrunc.c
@@ -6,9 +6,9 @@ void
ztrunc(z_t a, z_t b, size_t bits)
{
zahl_char_t mask = 1;
- size_t chars, i;
+ size_t chars;
- if (zzero(b)) {
+ if (EXPECT(zzero(b), 0)) {
SET_SIGNUM(a, 0);
return;
}
@@ -16,21 +16,20 @@ ztrunc(z_t a, z_t b, size_t bits)
chars = CEILING_BITS_TO_CHARS(bits);
a->sign = b->sign;
a->used = MIN(chars, b->used);
- if (a->used < chars)
+ if (EXPECT(a->used < chars, 0))
bits = 0;
- if (a != b) {
+ if (EXPECT(a != b, 1)) {
ENSURE_SIZE(a, a->used);
zmemcpy(a->chars, b->chars, a->used);
}
bits = BITS_IN_LAST_CHAR(bits);
- if (bits) {
+ if (EXPECT(!!bits, 1)) {
mask <<= bits;
mask -= 1;
a->chars[a->used - 1] &= mask;
}
- for (i = a->used; i--;)
- if (a->chars[i])
- return;
- SET_SIGNUM(a, 0);
+ TRIM(a);
+ if (!a->used)
+ SET_SIGNUM(a, 0);
}