|
1 #if !defined(_mathops_H) |
|
2 # define _mathops_H (1) |
|
3 # include <ogg/ogg.h> |
|
4 |
|
5 # if __GNUC_PREREQ(3,4) |
|
6 # include <limits.h> |
|
7 /*Note the casts to (int) below: this prevents OC_CLZ{32|64}_OFFS from |
|
8 "upgrading" the type of an entire expression to an (unsigned) size_t.*/ |
|
9 # if INT_MAX>=2147483647 |
|
10 # define OC_CLZ32_OFFS ((int)sizeof(unsigned)*CHAR_BIT) |
|
11 # define OC_CLZ32(_x) (__builtin_clz(_x)) |
|
12 # elif LONG_MAX>=2147483647L |
|
13 # define OC_CLZ32_OFFS ((int)sizeof(unsigned long)*CHAR_BIT) |
|
14 # define OC_CLZ32(_x) (__builtin_clzl(_x)) |
|
15 # endif |
|
16 # if INT_MAX>=9223372036854775807LL |
|
17 # define OC_CLZ64_OFFS ((int)sizeof(unsigned)*CHAR_BIT) |
|
18 # define OC_CLZ64(_x) (__builtin_clz(_x)) |
|
19 # elif LONG_MAX>=9223372036854775807LL |
|
20 # define OC_CLZ64_OFFS ((int)sizeof(unsigned long)*CHAR_BIT) |
|
21 # define OC_CLZ64(_x) (__builtin_clzl(_x)) |
|
22 # elif LLONG_MAX>=9223372036854775807LL|| \ |
|
23 __LONG_LONG_MAX__>=9223372036854775807LL |
|
24 # define OC_CLZ64_OFFS ((int)sizeof(unsigned long long)*CHAR_BIT) |
|
25 # define OC_CLZ64(_x) (__builtin_clzll(_x)) |
|
26 # endif |
|
27 # endif |
|
28 |
|
29 |
|
30 |
|
31 /** |
|
32 * oc_ilog32 - Integer binary logarithm of a 32-bit value. |
|
33 * @_v: A 32-bit value. |
|
34 * Returns floor(log2(_v))+1, or 0 if _v==0. |
|
35 * This is the number of bits that would be required to represent _v in two's |
|
36 * complement notation with all of the leading zeros stripped. |
|
37 * The OC_ILOG_32() or OC_ILOGNZ_32() macros may be able to use a builtin |
|
38 * function instead, which should be faster. |
|
39 */ |
|
40 int oc_ilog32(ogg_uint32_t _v); |
|
41 /** |
|
42 * oc_ilog64 - Integer binary logarithm of a 64-bit value. |
|
43 * @_v: A 64-bit value. |
|
44 * Returns floor(log2(_v))+1, or 0 if _v==0. |
|
45 * This is the number of bits that would be required to represent _v in two's |
|
46 * complement notation with all of the leading zeros stripped. |
|
47 * The OC_ILOG_64() or OC_ILOGNZ_64() macros may be able to use a builtin |
|
48 * function instead, which should be faster. |
|
49 */ |
|
50 int oc_ilog64(ogg_int64_t _v); |
|
51 |
|
52 |
|
53 # if defined(OC_CLZ32) |
|
54 /** |
|
55 * OC_ILOGNZ_32 - Integer binary logarithm of a non-zero 32-bit value. |
|
56 * @_v: A non-zero 32-bit value. |
|
57 * Returns floor(log2(_v))+1. |
|
58 * This is the number of bits that would be required to represent _v in two's |
|
59 * complement notation with all of the leading zeros stripped. |
|
60 * If _v is zero, the return value is undefined; use OC_ILOG_32() instead. |
|
61 */ |
|
62 # define OC_ILOGNZ_32(_v) (OC_CLZ32_OFFS-OC_CLZ32(_v)) |
|
63 /** |
|
64 * OC_ILOG_32 - Integer binary logarithm of a 32-bit value. |
|
65 * @_v: A 32-bit value. |
|
66 * Returns floor(log2(_v))+1, or 0 if _v==0. |
|
67 * This is the number of bits that would be required to represent _v in two's |
|
68 * complement notation with all of the leading zeros stripped. |
|
69 */ |
|
70 # define OC_ILOG_32(_v) (OC_ILOGNZ_32(_v)&-!!(_v)) |
|
71 # else |
|
72 # define OC_ILOGNZ_32(_v) (oc_ilog32(_v)) |
|
73 # define OC_ILOG_32(_v) (oc_ilog32(_v)) |
|
74 # endif |
|
75 |
|
76 # if defined(CLZ64) |
|
77 /** |
|
78 * OC_ILOGNZ_64 - Integer binary logarithm of a non-zero 64-bit value. |
|
79 * @_v: A non-zero 64-bit value. |
|
80 * Returns floor(log2(_v))+1. |
|
81 * This is the number of bits that would be required to represent _v in two's |
|
82 * complement notation with all of the leading zeros stripped. |
|
83 * If _v is zero, the return value is undefined; use OC_ILOG_64() instead. |
|
84 */ |
|
85 # define OC_ILOGNZ_64(_v) (CLZ64_OFFS-CLZ64(_v)) |
|
86 /** |
|
87 * OC_ILOG_64 - Integer binary logarithm of a 64-bit value. |
|
88 * @_v: A 64-bit value. |
|
89 * Returns floor(log2(_v))+1, or 0 if _v==0. |
|
90 * This is the number of bits that would be required to represent _v in two's |
|
91 * complement notation with all of the leading zeros stripped. |
|
92 */ |
|
93 # define OC_ILOG_64(_v) (OC_ILOGNZ_64(_v)&-!!(_v)) |
|
94 # else |
|
95 # define OC_ILOGNZ_64(_v) (oc_ilog64(_v)) |
|
96 # define OC_ILOG_64(_v) (oc_ilog64(_v)) |
|
97 # endif |
|
98 |
|
99 # define OC_STATIC_ILOG0(_v) (!!(_v)) |
|
100 # define OC_STATIC_ILOG1(_v) (((_v)&0x2)?2:OC_STATIC_ILOG0(_v)) |
|
101 # define OC_STATIC_ILOG2(_v) \ |
|
102 (((_v)&0xC)?2+OC_STATIC_ILOG1((_v)>>2):OC_STATIC_ILOG1(_v)) |
|
103 # define OC_STATIC_ILOG3(_v) \ |
|
104 (((_v)&0xF0)?4+OC_STATIC_ILOG2((_v)>>4):OC_STATIC_ILOG2(_v)) |
|
105 # define OC_STATIC_ILOG4(_v) \ |
|
106 (((_v)&0xFF00)?8+OC_STATIC_ILOG3((_v)>>8):OC_STATIC_ILOG3(_v)) |
|
107 # define OC_STATIC_ILOG5(_v) \ |
|
108 (((_v)&0xFFFF0000)?16+OC_STATIC_ILOG4((_v)>>16):OC_STATIC_ILOG4(_v)) |
|
109 # define OC_STATIC_ILOG6(_v) \ |
|
110 (((_v)&0xFFFFFFFF00000000ULL)?32+OC_STATIC_ILOG5((_v)>>32):OC_STATIC_ILOG5(_v)) |
|
111 /** |
|
112 * OC_STATIC_ILOG_32 - The integer logarithm of an (unsigned, 32-bit) constant. |
|
113 * @_v: A non-negative 32-bit constant. |
|
114 * Returns floor(log2(_v))+1, or 0 if _v==0. |
|
115 * This is the number of bits that would be required to represent _v in two's |
|
116 * complement notation with all of the leading zeros stripped. |
|
117 * This macro is suitable for evaluation at compile time, but it should not be |
|
118 * used on values that can change at runtime, as it operates via exhaustive |
|
119 * search. |
|
120 */ |
|
121 # define OC_STATIC_ILOG_32(_v) (OC_STATIC_ILOG5((ogg_uint32_t)(_v))) |
|
122 /** |
|
123 * OC_STATIC_ILOG_64 - The integer logarithm of an (unsigned, 64-bit) constant. |
|
124 * @_v: A non-negative 64-bit constant. |
|
125 * Returns floor(log2(_v))+1, or 0 if _v==0. |
|
126 * This is the number of bits that would be required to represent _v in two's |
|
127 * complement notation with all of the leading zeros stripped. |
|
128 * This macro is suitable for evaluation at compile time, but it should not be |
|
129 * used on values that can change at runtime, as it operates via exhaustive |
|
130 * search. |
|
131 */ |
|
132 # define OC_STATIC_ILOG_64(_v) (OC_STATIC_ILOG6((ogg_int64_t)(_v))) |
|
133 |
|
134 #define OC_Q57(_v) ((ogg_int64_t)(_v)<<57) |
|
135 #define OC_Q10(_v) ((_v)<<10) |
|
136 |
|
137 ogg_int64_t oc_bexp64(ogg_int64_t _z); |
|
138 ogg_int64_t oc_blog64(ogg_int64_t _w); |
|
139 |
|
140 ogg_uint32_t oc_bexp32_q10(int _z); |
|
141 int oc_blog32_q10(ogg_uint32_t _w); |
|
142 |
|
143 #endif |