diff options
author | Keith Packard <keithp@keithp.com> | 2013-05-22 14:38:19 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2013-08-25 22:24:01 -0700 |
commit | f7602ae566a5cbf2d2cbb1d68bad7e2d1177a33a (patch) | |
tree | 380bb509a93af2428d524d4c86fc1c88bef07ee9 | |
parent | 3114baef45803250a2e5cdd2ee4a9171f2045b0c (diff) |
altos: Make 64x16 mul a bit faster
the unsigned 32x32 multiply really does work, just use it
Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r-- | src/core/ao_int64.c | 11 |
1 files changed, 3 insertions, 8 deletions
diff --git a/src/core/ao_int64.c b/src/core/ao_int64.c index 1fe717dc..8e3caa24 100644 --- a/src/core/ao_int64.c +++ b/src/core/ao_int64.c @@ -86,11 +86,11 @@ void ao_mul64(ao_int64_t *r, int32_t a, int32_t b) { if (a < 0) { a = -a; - negative = 1; + negative = ~0; } if (b < 0) { b = -b; - negative = !negative; + negative = ~negative; } ao_umul64(r, a, b); if (negative) @@ -98,12 +98,7 @@ void ao_mul64(ao_int64_t *r, int32_t a, int32_t b) { } void ao_umul64_16(ao_int64_t *r, ao_int64_t *a, uint16_t b) { - uint32_t low = a->low; - ao_umul64(r, (uint32_t) low >> 1, (uint32_t) b << 1); - if (low & 1) { - if ((uint32_t) (r->low += b) < (uint32_t) b) - r->high++; - } + ao_umul64(r, a->low, b); r->high += a->high * b; } |