Speeding up extract_collapse_mask() slightly
[opus.git] / celt / entcode.c
1 /* Copyright (c) 2001-2011 Timothy B. Terriberry
2 */
3 /*
4    Redistribution and use in source and binary forms, with or without
5    modification, are permitted provided that the following conditions
6    are met:
7
8    - Redistributions of source code must retain the above copyright
9    notice, this list of conditions and the following disclaimer.
10
11    - Redistributions in binary form must reproduce the above copyright
12    notice, this list of conditions and the following disclaimer in the
13    documentation and/or other materials provided with the distribution.
14
15    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
19    OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28 #ifdef HAVE_CONFIG_H
29 #include "config.h"
30 #endif
31
32 #include "entcode.h"
33 #include "arch.h"
34
35 #if !defined(EC_CLZ)
36 /*This is a fallback for systems where we don't know how to access
37    a BSR or CLZ instruction (see ecintrin.h).
38   If you are optimizing Opus on a new platform and it has a native CLZ or
39    BZR (e.g. cell, MIPS, x86, etc) then making it available to Opus will be
40    an easy performance win.*/
41 int ec_ilog(opus_uint32 _v){
42   /*On a Pentium M, this branchless version tested as the fastest on
43      1,000,000,000 random 32-bit integers, edging out a similar version with
44      branches, and a 256-entry LUT version.*/
45   int ret;
46   int m;
47   ret=!!_v;
48   m=!!(_v&0xFFFF0000)<<4;
49   _v>>=m;
50   ret|=m;
51   m=!!(_v&0xFF00)<<3;
52   _v>>=m;
53   ret|=m;
54   m=!!(_v&0xF0)<<2;
55   _v>>=m;
56   ret|=m;
57   m=!!(_v&0xC)<<1;
58   _v>>=m;
59   ret|=m;
60   ret+=!!(_v&0x2);
61   return ret;
62 }
63 #endif
64
65 opus_uint32 ec_tell_frac(ec_ctx *_this){
66   opus_uint32 nbits;
67   opus_uint32 r;
68   int         l;
69   int         i;
70   /*To handle the non-integral number of bits still left in the encoder/decoder
71      state, we compute the worst-case number of bits of val that must be
72      encoded to ensure that the value is inside the range for any possible
73      subsequent bits.
74     The computation here is independent of val itself (the decoder does not
75      even track that value), even though the real number of bits used after
76      ec_enc_done() may be 1 smaller if rng is a power of two and the
77      corresponding trailing bits of val are all zeros.
78     If we did try to track that special case, then coding a value with a
79      probability of 1/(1<<n) might sometimes appear to use more than n bits.
80     This may help explain the surprising result that a newly initialized
81      encoder or decoder claims to have used 1 bit.*/
82   nbits=_this->nbits_total<<BITRES;
83   l=EC_ILOG(_this->rng);
84   r=_this->rng>>(l-16);
85   for(i=BITRES;i-->0;){
86     int b;
87     r=r*r>>15;
88     b=(int)(r>>16);
89     l=l<<1|b;
90     r>>=b;
91   }
92   return nbits-l;
93 }
94
95 #ifdef USE_SMALL_DIV_TABLE
96 /* Result of 2^32/(2*i+1), except for i=0. */
97 const opus_uint32 SMALL_DIV_TABLE[129] = {
98    0xFFFFFFFF, 0x55555555, 0x33333333, 0x24924924,
99    0x1C71C71C, 0x1745D174, 0x13B13B13, 0x11111111,
100    0x0F0F0F0F, 0x0D79435E, 0x0C30C30C, 0x0B21642C,
101    0x0A3D70A3, 0x097B425E, 0x08D3DCB0, 0x08421084,
102    0x07C1F07C, 0x07507507, 0x06EB3E45, 0x06906906,
103    0x063E7063, 0x05F417D0, 0x05B05B05, 0x0572620A,
104    0x05397829, 0x05050505, 0x04D4873E, 0x04A7904A,
105    0x047DC11F, 0x0456C797, 0x04325C53, 0x04104104,
106    0x03F03F03, 0x03D22635, 0x03B5CC0E, 0x039B0AD1,
107    0x0381C0E0, 0x0369D036, 0x03531DEC, 0x033D91D2,
108    0x0329161F, 0x03159721, 0x03030303, 0x02F14990,
109    0x02E05C0B, 0x02D02D02, 0x02C0B02C, 0x02B1DA46,
110    0x02A3A0FD, 0x0295FAD4, 0x0288DF0C, 0x027C4597,
111    0x02702702, 0x02647C69, 0x02593F69, 0x024E6A17,
112    0x0243F6F0, 0x0239E0D5, 0x02302302, 0x0226B902,
113    0x021D9EAD, 0x0214D021, 0x020C49BA, 0x02040810,
114    0x01FC07F0, 0x01F44659, 0x01ECC07B, 0x01E573AC,
115    0x01DE5D6E, 0x01D77B65, 0x01D0CB58, 0x01CA4B30,
116    0x01C3F8F0, 0x01BDD2B8, 0x01B7D6C3, 0x01B20364,
117    0x01AC5701, 0x01A6D01A, 0x01A16D3F, 0x019C2D14,
118    0x01970E4F, 0x01920FB4, 0x018D3018, 0x01886E5F,
119    0x0183C977, 0x017F405F, 0x017AD220, 0x01767DCE,
120    0x01724287, 0x016E1F76, 0x016A13CD, 0x01661EC6,
121    0x01623FA7, 0x015E75BB, 0x015AC056, 0x01571ED3,
122    0x01539094, 0x01501501, 0x014CAB88, 0x0149539E,
123    0x01460CBC, 0x0142D662, 0x013FB013, 0x013C995A,
124    0x013991C2, 0x013698DF, 0x0133AE45, 0x0130D190,
125    0x012E025C, 0x012B404A, 0x01288B01, 0x0125E227,
126    0x01234567, 0x0120B470, 0x011E2EF3, 0x011BB4A4,
127    0x01194538, 0x0116E068, 0x011485F0, 0x0112358E,
128    0x010FEF01, 0x010DB20A, 0x010B7E6E, 0x010953F3,
129    0x01073260, 0x0105197F, 0x0103091B, 0x01010101
130 };
131 #endif