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