fixed-point: got stereo to work again by fixing renormalise_bands()
[opus.git] / libcelt / entcode.c
1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4
5 #include "entcode.h"
6
7
8
9 void ec_byte_reset(ec_byte_buffer *_b){
10   _b->ptr=_b->buf;
11 }
12
13 long ec_byte_bytes(ec_byte_buffer *_b){
14   return _b->ptr-_b->buf;
15 }
16
17 unsigned char *ec_byte_get_buffer(ec_byte_buffer *_b){
18   return _b->buf;
19 }
20
21
22
23 int ec_ilog(ec_uint32 _v){
24 #if defined(EC_CLZ)
25   return EC_CLZ0-EC_CLZ(_v);
26 #else
27   /*On a Pentium M, this branchless version tested as the fastest on
28      1,000,000,000 random 32-bit integers, edging out a similar version with
29      branches, and a 256-entry LUT version.*/
30   int ret;
31   int m;
32   ret=!!_v;
33   m=!!(_v&0xFFFF0000)<<4;
34   _v>>=m;
35   ret|=m;
36   m=!!(_v&0xFF00)<<3;
37   _v>>=m;
38   ret|=m;
39   m=!!(_v&0xF0)<<2;
40   _v>>=m;
41   ret|=m;
42   m=!!(_v&0xC)<<1;
43   _v>>=m;
44   ret|=m;
45   ret+=!!(_v&0x2);
46   return ret;
47 #endif
48 }
49
50 int ec_ilog64(ec_uint64 _v){
51 #if defined(EC_CLZ64)
52   return EC_CLZ64_0-EC_CLZ64(_v);
53 #else
54   ec_uint32 v;
55   int       ret;
56   int       m;
57   ret=!!_v;
58   m=!!(_v&((ec_uint64)0xFFFFFFFF)<<32)<<5;
59   v=(ec_uint32)(_v>>m);
60   ret|=m;
61   m=!!(v&0xFFFF0000)<<4;
62   v>>=m;
63   ret|=m;
64   m=!!(v&0xFF00)<<3;
65   v>>=m;
66   ret|=m;
67   m=!!(v&0xF0)<<2;
68   v>>=m;
69   ret|=m;
70   m=!!(v&0xC)<<1;
71   v>>=m;
72   ret|=m;
73   ret+=!!(v&0x2);
74   return ret;
75 #endif
76 }