Mercurial > hg > sv-dependency-builds
comparison src/opus-1.3/celt/arch.h @ 154:4664ac0c1032
Add Opus sources and macOS builds
author | Chris Cannam <cannam@all-day-breakfast.com> |
---|---|
date | Wed, 23 Jan 2019 13:48:08 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
153:84bc3a5ec321 | 154:4664ac0c1032 |
---|---|
1 /* Copyright (c) 2003-2008 Jean-Marc Valin | |
2 Copyright (c) 2007-2008 CSIRO | |
3 Copyright (c) 2007-2009 Xiph.Org Foundation | |
4 Written by Jean-Marc Valin */ | |
5 /** | |
6 @file arch.h | |
7 @brief Various architecture definitions for CELT | |
8 */ | |
9 /* | |
10 Redistribution and use in source and binary forms, with or without | |
11 modification, are permitted provided that the following conditions | |
12 are met: | |
13 | |
14 - Redistributions of source code must retain the above copyright | |
15 notice, this list of conditions and the following disclaimer. | |
16 | |
17 - Redistributions in binary form must reproduce the above copyright | |
18 notice, this list of conditions and the following disclaimer in the | |
19 documentation and/or other materials provided with the distribution. | |
20 | |
21 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
22 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
23 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
24 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER | |
25 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
26 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
27 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
28 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
29 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
30 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
31 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
32 */ | |
33 | |
34 #ifndef ARCH_H | |
35 #define ARCH_H | |
36 | |
37 #include "opus_types.h" | |
38 #include "opus_defines.h" | |
39 | |
40 # if !defined(__GNUC_PREREQ) | |
41 # if defined(__GNUC__)&&defined(__GNUC_MINOR__) | |
42 # define __GNUC_PREREQ(_maj,_min) \ | |
43 ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min)) | |
44 # else | |
45 # define __GNUC_PREREQ(_maj,_min) 0 | |
46 # endif | |
47 # endif | |
48 | |
49 #if OPUS_GNUC_PREREQ(3, 0) | |
50 #define opus_likely(x) (__builtin_expect(!!(x), 1)) | |
51 #define opus_unlikely(x) (__builtin_expect(!!(x), 0)) | |
52 #else | |
53 #define opus_likely(x) (!!(x)) | |
54 #define opus_unlikely(x) (!!(x)) | |
55 #endif | |
56 | |
57 #define CELT_SIG_SCALE 32768.f | |
58 | |
59 #define CELT_FATAL(str) celt_fatal(str, __FILE__, __LINE__); | |
60 | |
61 #if defined(ENABLE_ASSERTIONS) || defined(ENABLE_HARDENING) | |
62 #ifdef __GNUC__ | |
63 __attribute__((noreturn)) | |
64 #endif | |
65 void celt_fatal(const char *str, const char *file, int line); | |
66 | |
67 #if defined(CELT_C) && !defined(OVERRIDE_celt_fatal) | |
68 #include <stdio.h> | |
69 #include <stdlib.h> | |
70 #ifdef __GNUC__ | |
71 __attribute__((noreturn)) | |
72 #endif | |
73 void celt_fatal(const char *str, const char *file, int line) | |
74 { | |
75 fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str); | |
76 abort(); | |
77 } | |
78 #endif | |
79 | |
80 #define celt_assert(cond) {if (!(cond)) {CELT_FATAL("assertion failed: " #cond);}} | |
81 #define celt_assert2(cond, message) {if (!(cond)) {CELT_FATAL("assertion failed: " #cond "\n" message);}} | |
82 #define MUST_SUCCEED(call) celt_assert((call) == OPUS_OK) | |
83 #else | |
84 #define celt_assert(cond) | |
85 #define celt_assert2(cond, message) | |
86 #define MUST_SUCCEED(call) do {if((call) != OPUS_OK) {RESTORE_STACK; return OPUS_INTERNAL_ERROR;} } while (0) | |
87 #endif | |
88 | |
89 #if defined(ENABLE_ASSERTIONS) | |
90 #define celt_sig_assert(cond) {if (!(cond)) {CELT_FATAL("signal assertion failed: " #cond);}} | |
91 #else | |
92 #define celt_sig_assert(cond) | |
93 #endif | |
94 | |
95 #define IMUL32(a,b) ((a)*(b)) | |
96 | |
97 #define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum 16-bit value. */ | |
98 #define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */ | |
99 #define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum 32-bit value. */ | |
100 #define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */ | |
101 #define IMIN(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum int value. */ | |
102 #define IMAX(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum int value. */ | |
103 #define UADD32(a,b) ((a)+(b)) | |
104 #define USUB32(a,b) ((a)-(b)) | |
105 | |
106 /* Set this if opus_int64 is a native type of the CPU. */ | |
107 /* Assume that all LP64 architectures have fast 64-bit types; also x86_64 | |
108 (which can be ILP32 for x32) and Win64 (which is LLP64). */ | |
109 #if defined(__x86_64__) || defined(__LP64__) || defined(_WIN64) | |
110 #define OPUS_FAST_INT64 1 | |
111 #else | |
112 #define OPUS_FAST_INT64 0 | |
113 #endif | |
114 | |
115 #define PRINT_MIPS(file) | |
116 | |
117 #ifdef FIXED_POINT | |
118 | |
119 typedef opus_int16 opus_val16; | |
120 typedef opus_int32 opus_val32; | |
121 typedef opus_int64 opus_val64; | |
122 | |
123 typedef opus_val32 celt_sig; | |
124 typedef opus_val16 celt_norm; | |
125 typedef opus_val32 celt_ener; | |
126 | |
127 #define celt_isnan(x) 0 | |
128 | |
129 #define Q15ONE 32767 | |
130 | |
131 #define SIG_SHIFT 12 | |
132 /* Safe saturation value for 32-bit signals. Should be less than | |
133 2^31*(1-0.85) to avoid blowing up on DC at deemphasis.*/ | |
134 #define SIG_SAT (300000000) | |
135 | |
136 #define NORM_SCALING 16384 | |
137 | |
138 #define DB_SHIFT 10 | |
139 | |
140 #define EPSILON 1 | |
141 #define VERY_SMALL 0 | |
142 #define VERY_LARGE16 ((opus_val16)32767) | |
143 #define Q15_ONE ((opus_val16)32767) | |
144 | |
145 #define SCALEIN(a) (a) | |
146 #define SCALEOUT(a) (a) | |
147 | |
148 #define ABS16(x) ((x) < 0 ? (-(x)) : (x)) | |
149 #define ABS32(x) ((x) < 0 ? (-(x)) : (x)) | |
150 | |
151 static OPUS_INLINE opus_int16 SAT16(opus_int32 x) { | |
152 return x > 32767 ? 32767 : x < -32768 ? -32768 : (opus_int16)x; | |
153 } | |
154 | |
155 #ifdef FIXED_DEBUG | |
156 #include "fixed_debug.h" | |
157 #else | |
158 | |
159 #include "fixed_generic.h" | |
160 | |
161 #ifdef OPUS_ARM_PRESUME_AARCH64_NEON_INTR | |
162 #include "arm/fixed_arm64.h" | |
163 #elif OPUS_ARM_INLINE_EDSP | |
164 #include "arm/fixed_armv5e.h" | |
165 #elif defined (OPUS_ARM_INLINE_ASM) | |
166 #include "arm/fixed_armv4.h" | |
167 #elif defined (BFIN_ASM) | |
168 #include "fixed_bfin.h" | |
169 #elif defined (TI_C5X_ASM) | |
170 #include "fixed_c5x.h" | |
171 #elif defined (TI_C6X_ASM) | |
172 #include "fixed_c6x.h" | |
173 #endif | |
174 | |
175 #endif | |
176 | |
177 #else /* FIXED_POINT */ | |
178 | |
179 typedef float opus_val16; | |
180 typedef float opus_val32; | |
181 typedef float opus_val64; | |
182 | |
183 typedef float celt_sig; | |
184 typedef float celt_norm; | |
185 typedef float celt_ener; | |
186 | |
187 #ifdef FLOAT_APPROX | |
188 /* This code should reliably detect NaN/inf even when -ffast-math is used. | |
189 Assumes IEEE 754 format. */ | |
190 static OPUS_INLINE int celt_isnan(float x) | |
191 { | |
192 union {float f; opus_uint32 i;} in; | |
193 in.f = x; | |
194 return ((in.i>>23)&0xFF)==0xFF && (in.i&0x007FFFFF)!=0; | |
195 } | |
196 #else | |
197 #ifdef __FAST_MATH__ | |
198 #error Cannot build libopus with -ffast-math unless FLOAT_APPROX is defined. This could result in crashes on extreme (e.g. NaN) input | |
199 #endif | |
200 #define celt_isnan(x) ((x)!=(x)) | |
201 #endif | |
202 | |
203 #define Q15ONE 1.0f | |
204 | |
205 #define NORM_SCALING 1.f | |
206 | |
207 #define EPSILON 1e-15f | |
208 #define VERY_SMALL 1e-30f | |
209 #define VERY_LARGE16 1e15f | |
210 #define Q15_ONE ((opus_val16)1.f) | |
211 | |
212 /* This appears to be the same speed as C99's fabsf() but it's more portable. */ | |
213 #define ABS16(x) ((float)fabs(x)) | |
214 #define ABS32(x) ((float)fabs(x)) | |
215 | |
216 #define QCONST16(x,bits) (x) | |
217 #define QCONST32(x,bits) (x) | |
218 | |
219 #define NEG16(x) (-(x)) | |
220 #define NEG32(x) (-(x)) | |
221 #define NEG32_ovflw(x) (-(x)) | |
222 #define EXTRACT16(x) (x) | |
223 #define EXTEND32(x) (x) | |
224 #define SHR16(a,shift) (a) | |
225 #define SHL16(a,shift) (a) | |
226 #define SHR32(a,shift) (a) | |
227 #define SHL32(a,shift) (a) | |
228 #define PSHR32(a,shift) (a) | |
229 #define VSHR32(a,shift) (a) | |
230 | |
231 #define PSHR(a,shift) (a) | |
232 #define SHR(a,shift) (a) | |
233 #define SHL(a,shift) (a) | |
234 #define SATURATE(x,a) (x) | |
235 #define SATURATE16(x) (x) | |
236 | |
237 #define ROUND16(a,shift) (a) | |
238 #define SROUND16(a,shift) (a) | |
239 #define HALF16(x) (.5f*(x)) | |
240 #define HALF32(x) (.5f*(x)) | |
241 | |
242 #define ADD16(a,b) ((a)+(b)) | |
243 #define SUB16(a,b) ((a)-(b)) | |
244 #define ADD32(a,b) ((a)+(b)) | |
245 #define SUB32(a,b) ((a)-(b)) | |
246 #define ADD32_ovflw(a,b) ((a)+(b)) | |
247 #define SUB32_ovflw(a,b) ((a)-(b)) | |
248 #define MULT16_16_16(a,b) ((a)*(b)) | |
249 #define MULT16_16(a,b) ((opus_val32)(a)*(opus_val32)(b)) | |
250 #define MAC16_16(c,a,b) ((c)+(opus_val32)(a)*(opus_val32)(b)) | |
251 | |
252 #define MULT16_32_Q15(a,b) ((a)*(b)) | |
253 #define MULT16_32_Q16(a,b) ((a)*(b)) | |
254 | |
255 #define MULT32_32_Q31(a,b) ((a)*(b)) | |
256 | |
257 #define MAC16_32_Q15(c,a,b) ((c)+(a)*(b)) | |
258 #define MAC16_32_Q16(c,a,b) ((c)+(a)*(b)) | |
259 | |
260 #define MULT16_16_Q11_32(a,b) ((a)*(b)) | |
261 #define MULT16_16_Q11(a,b) ((a)*(b)) | |
262 #define MULT16_16_Q13(a,b) ((a)*(b)) | |
263 #define MULT16_16_Q14(a,b) ((a)*(b)) | |
264 #define MULT16_16_Q15(a,b) ((a)*(b)) | |
265 #define MULT16_16_P15(a,b) ((a)*(b)) | |
266 #define MULT16_16_P13(a,b) ((a)*(b)) | |
267 #define MULT16_16_P14(a,b) ((a)*(b)) | |
268 #define MULT16_32_P16(a,b) ((a)*(b)) | |
269 | |
270 #define DIV32_16(a,b) (((opus_val32)(a))/(opus_val16)(b)) | |
271 #define DIV32(a,b) (((opus_val32)(a))/(opus_val32)(b)) | |
272 | |
273 #define SCALEIN(a) ((a)*CELT_SIG_SCALE) | |
274 #define SCALEOUT(a) ((a)*(1/CELT_SIG_SCALE)) | |
275 | |
276 #define SIG2WORD16(x) (x) | |
277 | |
278 #endif /* !FIXED_POINT */ | |
279 | |
280 #ifndef GLOBAL_STACK_SIZE | |
281 #ifdef FIXED_POINT | |
282 #define GLOBAL_STACK_SIZE 120000 | |
283 #else | |
284 #define GLOBAL_STACK_SIZE 120000 | |
285 #endif | |
286 #endif | |
287 | |
288 #endif /* ARCH_H */ |