Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/libtheora/mathops.h
9896 views
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) ((_v)?OC_ILOGNZ_32(_v):0)
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) ((_v)?OC_ILOGNZ_64(_v):0)
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) ((_v)*((ogg_int64_t)1<<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
144
145