|
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 #define CELT_SIG_SCALE 32768.f |
|
50 |
|
51 #define celt_fatal(str) _celt_fatal(str, __FILE__, __LINE__); |
|
52 #ifdef ENABLE_ASSERTIONS |
|
53 #include <stdio.h> |
|
54 #include <stdlib.h> |
|
55 #ifdef __GNUC__ |
|
56 __attribute__((noreturn)) |
|
57 #endif |
|
58 static OPUS_INLINE void _celt_fatal(const char *str, const char *file, int line) |
|
59 { |
|
60 fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str); |
|
61 abort(); |
|
62 } |
|
63 #define celt_assert(cond) {if (!(cond)) {celt_fatal("assertion failed: " #cond);}} |
|
64 #define celt_assert2(cond, message) {if (!(cond)) {celt_fatal("assertion failed: " #cond "\n" message);}} |
|
65 #else |
|
66 #define celt_assert(cond) |
|
67 #define celt_assert2(cond, message) |
|
68 #endif |
|
69 |
|
70 #define IMUL32(a,b) ((a)*(b)) |
|
71 |
|
72 #define ABS(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute integer value. */ |
|
73 #define ABS16(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 16-bit value. */ |
|
74 #define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum 16-bit value. */ |
|
75 #define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */ |
|
76 #define ABS32(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 32-bit value. */ |
|
77 #define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum 32-bit value. */ |
|
78 #define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */ |
|
79 #define IMIN(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum int value. */ |
|
80 #define IMAX(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum int value. */ |
|
81 #define UADD32(a,b) ((a)+(b)) |
|
82 #define USUB32(a,b) ((a)-(b)) |
|
83 |
|
84 #define PRINT_MIPS(file) |
|
85 |
|
86 #ifdef FIXED_POINT |
|
87 |
|
88 typedef opus_int16 opus_val16; |
|
89 typedef opus_int32 opus_val32; |
|
90 |
|
91 typedef opus_val32 celt_sig; |
|
92 typedef opus_val16 celt_norm; |
|
93 typedef opus_val32 celt_ener; |
|
94 |
|
95 #define Q15ONE 32767 |
|
96 |
|
97 #define SIG_SHIFT 12 |
|
98 |
|
99 #define NORM_SCALING 16384 |
|
100 |
|
101 #define DB_SHIFT 10 |
|
102 |
|
103 #define EPSILON 1 |
|
104 #define VERY_SMALL 0 |
|
105 #define VERY_LARGE16 ((opus_val16)32767) |
|
106 #define Q15_ONE ((opus_val16)32767) |
|
107 |
|
108 #define SCALEIN(a) (a) |
|
109 #define SCALEOUT(a) (a) |
|
110 |
|
111 #ifdef FIXED_DEBUG |
|
112 #include "fixed_debug.h" |
|
113 #else |
|
114 |
|
115 #include "fixed_generic.h" |
|
116 |
|
117 #ifdef OPUS_ARM_INLINE_EDSP |
|
118 #include "arm/fixed_armv5e.h" |
|
119 #elif defined (OPUS_ARM_INLINE_ASM) |
|
120 #include "arm/fixed_armv4.h" |
|
121 #elif defined (BFIN_ASM) |
|
122 #include "fixed_bfin.h" |
|
123 #elif defined (TI_C5X_ASM) |
|
124 #include "fixed_c5x.h" |
|
125 #elif defined (TI_C6X_ASM) |
|
126 #include "fixed_c6x.h" |
|
127 #endif |
|
128 |
|
129 #endif |
|
130 |
|
131 #else /* FIXED_POINT */ |
|
132 |
|
133 typedef float opus_val16; |
|
134 typedef float opus_val32; |
|
135 |
|
136 typedef float celt_sig; |
|
137 typedef float celt_norm; |
|
138 typedef float celt_ener; |
|
139 |
|
140 #define Q15ONE 1.0f |
|
141 |
|
142 #define NORM_SCALING 1.f |
|
143 |
|
144 #define EPSILON 1e-15f |
|
145 #define VERY_SMALL 1e-30f |
|
146 #define VERY_LARGE16 1e15f |
|
147 #define Q15_ONE ((opus_val16)1.f) |
|
148 |
|
149 #define QCONST16(x,bits) (x) |
|
150 #define QCONST32(x,bits) (x) |
|
151 |
|
152 #define NEG16(x) (-(x)) |
|
153 #define NEG32(x) (-(x)) |
|
154 #define EXTRACT16(x) (x) |
|
155 #define EXTEND32(x) (x) |
|
156 #define SHR16(a,shift) (a) |
|
157 #define SHL16(a,shift) (a) |
|
158 #define SHR32(a,shift) (a) |
|
159 #define SHL32(a,shift) (a) |
|
160 #define PSHR32(a,shift) (a) |
|
161 #define VSHR32(a,shift) (a) |
|
162 |
|
163 #define PSHR(a,shift) (a) |
|
164 #define SHR(a,shift) (a) |
|
165 #define SHL(a,shift) (a) |
|
166 #define SATURATE(x,a) (x) |
|
167 #define SATURATE16(x) (x) |
|
168 |
|
169 #define ROUND16(a,shift) (a) |
|
170 #define HALF16(x) (.5f*(x)) |
|
171 #define HALF32(x) (.5f*(x)) |
|
172 |
|
173 #define ADD16(a,b) ((a)+(b)) |
|
174 #define SUB16(a,b) ((a)-(b)) |
|
175 #define ADD32(a,b) ((a)+(b)) |
|
176 #define SUB32(a,b) ((a)-(b)) |
|
177 #define MULT16_16_16(a,b) ((a)*(b)) |
|
178 #define MULT16_16(a,b) ((opus_val32)(a)*(opus_val32)(b)) |
|
179 #define MAC16_16(c,a,b) ((c)+(opus_val32)(a)*(opus_val32)(b)) |
|
180 |
|
181 #define MULT16_32_Q15(a,b) ((a)*(b)) |
|
182 #define MULT16_32_Q16(a,b) ((a)*(b)) |
|
183 |
|
184 #define MULT32_32_Q31(a,b) ((a)*(b)) |
|
185 |
|
186 #define MAC16_32_Q15(c,a,b) ((c)+(a)*(b)) |
|
187 |
|
188 #define MULT16_16_Q11_32(a,b) ((a)*(b)) |
|
189 #define MULT16_16_Q11(a,b) ((a)*(b)) |
|
190 #define MULT16_16_Q13(a,b) ((a)*(b)) |
|
191 #define MULT16_16_Q14(a,b) ((a)*(b)) |
|
192 #define MULT16_16_Q15(a,b) ((a)*(b)) |
|
193 #define MULT16_16_P15(a,b) ((a)*(b)) |
|
194 #define MULT16_16_P13(a,b) ((a)*(b)) |
|
195 #define MULT16_16_P14(a,b) ((a)*(b)) |
|
196 #define MULT16_32_P16(a,b) ((a)*(b)) |
|
197 |
|
198 #define DIV32_16(a,b) (((opus_val32)(a))/(opus_val16)(b)) |
|
199 #define DIV32(a,b) (((opus_val32)(a))/(opus_val32)(b)) |
|
200 |
|
201 #define SCALEIN(a) ((a)*CELT_SIG_SCALE) |
|
202 #define SCALEOUT(a) ((a)*(1/CELT_SIG_SCALE)) |
|
203 |
|
204 #endif /* !FIXED_POINT */ |
|
205 |
|
206 #ifndef GLOBAL_STACK_SIZE |
|
207 #ifdef FIXED_POINT |
|
208 #define GLOBAL_STACK_SIZE 100000 |
|
209 #else |
|
210 #define GLOBAL_STACK_SIZE 100000 |
|
211 #endif |
|
212 #endif |
|
213 |
|
214 #endif /* ARCH_H */ |