Completed the separation of coarse and fine energy quantisation
[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
10
11
12
13 int ec_ilog(ec_uint32 _v){
14 #if defined(EC_CLZ)
15   return EC_CLZ0-EC_CLZ(_v);
16 #else
17   /*On a Pentium M, this branchless version tested as the fastest on
18      1,000,000,000 random 32-bit integers, edging out a similar version with
19      branches, and a 256-entry LUT version.*/
20   int ret;
21   int m;
22   ret=!!_v;
23   m=!!(_v&0xFFFF0000)<<4;
24   _v>>=m;
25   ret|=m;
26   m=!!(_v&0xFF00)<<3;
27   _v>>=m;
28   ret|=m;
29   m=!!(_v&0xF0)<<2;
30   _v>>=m;
31   ret|=m;
32   m=!!(_v&0xC)<<1;
33   _v>>=m;
34   ret|=m;
35   ret+=!!(_v&0x2);
36   return ret;
37 #endif
38 }
39
40 int ec_ilog64(ec_uint64 _v){
41 #if defined(EC_CLZ64)
42   return EC_CLZ64_0-EC_CLZ64(_v);
43 #else
44   ec_uint32 v;
45   int       ret;
46   int       m;
47   ret=!!_v;
48   m=!!(_v&((ec_uint64)0xFFFFFFFF)<<32)<<5;
49   v=(ec_uint32)(_v>>m);
50   ret|=m;
51   m=!!(v&0xFFFF0000)<<4;
52   v>>=m;
53   ret|=m;
54   m=!!(v&0xFF00)<<3;
55   v>>=m;
56   ret|=m;
57   m=!!(v&0xF0)<<2;
58   v>>=m;
59   ret|=m;
60   m=!!(v&0xC)<<1;
61   v>>=m;
62   ret|=m;
63   ret+=!!(v&0x2);
64   return ret;
65 #endif
66 }