diff options
author | Juan Linietsky <reduzio@gmail.com> | 2016-05-03 22:32:38 -0300 |
---|---|---|
committer | Juan Linietsky <reduzio@gmail.com> | 2016-05-03 22:32:38 -0300 |
commit | dd69aeceac3d1798d0869d8adfb44af883b5fb93 (patch) | |
tree | 717e9b909ada0661940f6f3d2bd5349c6424bbf1 /drivers/opus/celt/entcode.h | |
parent | 567cb691ec49844101247bb9dc34bc2722f6af4f (diff) | |
parent | b81d9e6d614a67fd58e2256e90055589205bfa30 (diff) |
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'drivers/opus/celt/entcode.h')
-rw-r--r-- | drivers/opus/celt/entcode.h | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/drivers/opus/celt/entcode.h b/drivers/opus/celt/entcode.h index c129f9b7d9..4d736d4dca 100644 --- a/drivers/opus/celt/entcode.h +++ b/drivers/opus/celt/entcode.h @@ -34,6 +34,12 @@ # include <stddef.h> # include "opus/celt/ecintrin.h" +extern const opus_uint32 SMALL_DIV_TABLE[129]; + +#ifdef OPUS_ARM_ASM +#define USE_SMALL_DIV_TABLE +#endif + /*OPT: ec_window must be at least 32 bits, but if you have fast arithmetic on a larger type, you can speed up the decoder by using it here.*/ typedef opus_uint32 ec_window; @@ -114,4 +120,33 @@ static OPUS_INLINE int ec_tell(ec_ctx *_this){ rounding error is in the positive direction).*/ opus_uint32 ec_tell_frac(ec_ctx *_this); +/* Tested exhaustively for all n and for 1<=d<=256 */ +static OPUS_INLINE opus_uint32 celt_udiv(opus_uint32 n, opus_uint32 d) { + celt_assert(d>0); +#ifdef USE_SMALL_DIV_TABLE + if (d>256) + return n/d; + else { + opus_uint32 t, q; + t = EC_ILOG(d&-d); + q = (opus_uint64)SMALL_DIV_TABLE[d>>t]*(n>>(t-1))>>32; + return q+(n-q*d >= d); + } +#else + return n/d; +#endif +} + +static OPUS_INLINE opus_int32 celt_sudiv(opus_int32 n, opus_int32 d) { + celt_assert(d>0); +#ifdef USE_SMALL_DIV_TABLE + if (n<0) + return -(opus_int32)celt_udiv(-n, d); + else + return celt_udiv(n, d); +#else + return n/d; +#endif +} + #endif |