1 /* Copyright (C) 2003 Jean-Marc Valin */ |
|
2 /** |
|
3 @file arch.h |
|
4 @brief Various architecture definitions Speex |
|
5 */ |
|
6 /* |
|
7 Redistribution and use in source and binary forms, with or without |
|
8 modification, are permitted provided that the following conditions |
|
9 are met: |
|
10 |
|
11 - Redistributions of source code must retain the above copyright |
|
12 notice, this list of conditions and the following disclaimer. |
|
13 |
|
14 - Redistributions in binary form must reproduce the above copyright |
|
15 notice, this list of conditions and the following disclaimer in the |
|
16 documentation and/or other materials provided with the distribution. |
|
17 |
|
18 - Neither the name of the Xiph.org Foundation nor the names of its |
|
19 contributors may be used to endorse or promote products derived from |
|
20 this software without specific prior written permission. |
|
21 |
|
22 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
23 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
24 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
25 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR |
|
26 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
|
27 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
|
28 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|
29 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
|
30 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|
31 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|
32 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
33 */ |
|
34 |
|
35 #ifndef ARCH_H |
|
36 #define ARCH_H |
|
37 |
|
38 #ifndef SPEEX_VERSION |
|
39 #define SPEEX_MAJOR_VERSION 1 /**< Major Speex version. */ |
|
40 #define SPEEX_MINOR_VERSION 1 /**< Minor Speex version. */ |
|
41 #define SPEEX_MICRO_VERSION 15 /**< Micro Speex version. */ |
|
42 #define SPEEX_EXTRA_VERSION "" /**< Extra Speex version. */ |
|
43 #define SPEEX_VERSION "speex-1.2beta3" /**< Speex version string. */ |
|
44 #endif |
|
45 |
|
46 /* A couple test to catch stupid option combinations */ |
|
47 #ifdef FIXED_POINT |
|
48 |
|
49 #ifdef FLOATING_POINT |
|
50 #error You cannot compile as floating point and fixed point at the same time |
|
51 #endif |
|
52 #ifdef _USE_SSE |
|
53 #error SSE is only for floating-point |
|
54 #endif |
|
55 #if ((defined (ARM4_ASM)||defined (ARM4_ASM)) && defined(BFIN_ASM)) || (defined (ARM4_ASM)&&defined(ARM5E_ASM)) |
|
56 #error Make up your mind. What CPU do you have? |
|
57 #endif |
|
58 #ifdef VORBIS_PSYCHO |
|
59 #error Vorbis-psy model currently not implemented in fixed-point |
|
60 #endif |
|
61 |
|
62 #else |
|
63 |
|
64 #ifndef FLOATING_POINT |
|
65 #error You now need to define either FIXED_POINT or FLOATING_POINT |
|
66 #endif |
|
67 #if defined (ARM4_ASM) || defined(ARM5E_ASM) || defined(BFIN_ASM) |
|
68 #error I suppose you can have a [ARM4/ARM5E/Blackfin] that has float instructions? |
|
69 #endif |
|
70 #ifdef FIXED_POINT_DEBUG |
|
71 #error "Don't you think enabling fixed-point is a good thing to do if you want to debug that?" |
|
72 #endif |
|
73 |
|
74 |
|
75 #endif |
|
76 |
|
77 #ifndef OUTSIDE_SPEEX |
|
78 #include "../include/speex/speex_types.h" |
|
79 #endif |
|
80 |
|
81 #ifndef ABS |
|
82 #define ABS(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute integer value. */ |
|
83 #endif |
|
84 |
|
85 #define ABS16(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 16-bit value. */ |
|
86 #define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 16-bit value. */ |
|
87 #define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */ |
|
88 #define ABS32(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 32-bit value. */ |
|
89 #define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 32-bit value. */ |
|
90 #define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */ |
|
91 |
|
92 #ifdef FIXED_POINT |
|
93 |
|
94 typedef spx_int16_t spx_word16_t; |
|
95 typedef spx_int32_t spx_word32_t; |
|
96 typedef spx_word32_t spx_mem_t; |
|
97 typedef spx_word16_t spx_coef_t; |
|
98 typedef spx_word16_t spx_lsp_t; |
|
99 typedef spx_word32_t spx_sig_t; |
|
100 |
|
101 #define Q15ONE 32767 |
|
102 |
|
103 #define LPC_SCALING 8192 |
|
104 #define SIG_SCALING 16384 |
|
105 #define LSP_SCALING 8192. |
|
106 #define GAMMA_SCALING 32768. |
|
107 #define GAIN_SCALING 64 |
|
108 #define GAIN_SCALING_1 0.015625 |
|
109 |
|
110 #define LPC_SHIFT 13 |
|
111 #define LSP_SHIFT 13 |
|
112 #define SIG_SHIFT 14 |
|
113 #define GAIN_SHIFT 6 |
|
114 |
|
115 #define VERY_SMALL 0 |
|
116 #define VERY_LARGE32 ((spx_word32_t)2147483647) |
|
117 #define VERY_LARGE16 ((spx_word16_t)32767) |
|
118 #define Q15_ONE ((spx_word16_t)32767) |
|
119 |
|
120 |
|
121 #ifdef FIXED_DEBUG |
|
122 #include "fixed_debug.h" |
|
123 #else |
|
124 |
|
125 #include "fixed_generic.h" |
|
126 |
|
127 #ifdef ARM5E_ASM |
|
128 #include "fixed_arm5e.h" |
|
129 #elif defined (ARM4_ASM) |
|
130 #include "fixed_arm4.h" |
|
131 #elif defined (BFIN_ASM) |
|
132 #include "fixed_bfin.h" |
|
133 #endif |
|
134 |
|
135 #endif |
|
136 |
|
137 |
|
138 #else |
|
139 |
|
140 #ifdef DOUBLE_PRECISION |
|
141 typedef double spx_mem_t; |
|
142 typedef double spx_coef_t; |
|
143 typedef double spx_lsp_t; |
|
144 typedef double spx_sig_t; |
|
145 typedef double spx_word16_t; |
|
146 typedef double spx_word32_t; |
|
147 |
|
148 #define Q15ONE 1.0 |
|
149 #define LPC_SCALING 1. |
|
150 #define SIG_SCALING 1. |
|
151 #define LSP_SCALING 1. |
|
152 #define GAMMA_SCALING 1. |
|
153 #define GAIN_SCALING 1. |
|
154 #define GAIN_SCALING_1 1. |
|
155 |
|
156 |
|
157 #define VERY_SMALL 1e-20 |
|
158 #define VERY_LARGE32 1e20 |
|
159 #define VERY_LARGE16 1e20 |
|
160 #define Q15_ONE ((spx_word16_t)1.) |
|
161 #else /* !DOUBLE_PRECISION */ |
|
162 typedef float spx_mem_t; |
|
163 typedef float spx_coef_t; |
|
164 typedef float spx_lsp_t; |
|
165 typedef float spx_sig_t; |
|
166 typedef float spx_word16_t; |
|
167 typedef float spx_word32_t; |
|
168 |
|
169 #define Q15ONE 1.0f |
|
170 #define LPC_SCALING 1.f |
|
171 #define SIG_SCALING 1.f |
|
172 #define LSP_SCALING 1.f |
|
173 #define GAMMA_SCALING 1.f |
|
174 #define GAIN_SCALING 1.f |
|
175 #define GAIN_SCALING_1 1.f |
|
176 |
|
177 |
|
178 #define VERY_SMALL 1e-15f |
|
179 #define VERY_LARGE32 1e15f |
|
180 #define VERY_LARGE16 1e15f |
|
181 #define Q15_ONE ((spx_word16_t)1.f) |
|
182 #endif /* DOUBLE_PRECISION */ |
|
183 |
|
184 #define QCONST16(x,bits) (x) |
|
185 #define QCONST32(x,bits) (x) |
|
186 |
|
187 #define NEG16(x) (-(x)) |
|
188 #define NEG32(x) (-(x)) |
|
189 #define EXTRACT16(x) (x) |
|
190 #define EXTEND32(x) (x) |
|
191 #define SHR16(a,shift) (a) |
|
192 #define SHL16(a,shift) (a) |
|
193 #define SHR32(a,shift) (a) |
|
194 #define SHL32(a,shift) (a) |
|
195 #define PSHR16(a,shift) (a) |
|
196 #define PSHR32(a,shift) (a) |
|
197 #define VSHR32(a,shift) (a) |
|
198 #define SATURATE16(x,a) (x) |
|
199 #define SATURATE32(x,a) (x) |
|
200 |
|
201 #define PSHR(a,shift) (a) |
|
202 #define SHR(a,shift) (a) |
|
203 #define SHL(a,shift) (a) |
|
204 #define SATURATE(x,a) (x) |
|
205 |
|
206 #define ADD16(a,b) ((a)+(b)) |
|
207 #define SUB16(a,b) ((a)-(b)) |
|
208 #define ADD32(a,b) ((a)+(b)) |
|
209 #define SUB32(a,b) ((a)-(b)) |
|
210 #define MULT16_16_16(a,b) ((a)*(b)) |
|
211 #define MULT16_16(a,b) ((spx_word32_t)(a)*(spx_word32_t)(b)) |
|
212 #define MAC16_16(c,a,b) ((c)+(spx_word32_t)(a)*(spx_word32_t)(b)) |
|
213 |
|
214 #define MULT16_32_Q11(a,b) ((a)*(b)) |
|
215 #define MULT16_32_Q13(a,b) ((a)*(b)) |
|
216 #define MULT16_32_Q14(a,b) ((a)*(b)) |
|
217 #define MULT16_32_Q15(a,b) ((a)*(b)) |
|
218 #define MULT16_32_P15(a,b) ((a)*(b)) |
|
219 |
|
220 #define MAC16_32_Q11(c,a,b) ((c)+(a)*(b)) |
|
221 #define MAC16_32_Q15(c,a,b) ((c)+(a)*(b)) |
|
222 |
|
223 #define MAC16_16_Q11(c,a,b) ((c)+(a)*(b)) |
|
224 #define MAC16_16_Q13(c,a,b) ((c)+(a)*(b)) |
|
225 #define MAC16_16_P13(c,a,b) ((c)+(a)*(b)) |
|
226 #define MULT16_16_Q11_32(a,b) ((a)*(b)) |
|
227 #define MULT16_16_Q13(a,b) ((a)*(b)) |
|
228 #define MULT16_16_Q14(a,b) ((a)*(b)) |
|
229 #define MULT16_16_Q15(a,b) ((a)*(b)) |
|
230 #define MULT16_16_P15(a,b) ((a)*(b)) |
|
231 #define MULT16_16_P13(a,b) ((a)*(b)) |
|
232 #define MULT16_16_P14(a,b) ((a)*(b)) |
|
233 |
|
234 #define DIV32_16(a,b) (((spx_word32_t)(a))/(spx_word16_t)(b)) |
|
235 #define PDIV32_16(a,b) (((spx_word32_t)(a))/(spx_word16_t)(b)) |
|
236 #define DIV32(a,b) (((spx_word32_t)(a))/(spx_word32_t)(b)) |
|
237 #define PDIV32(a,b) (((spx_word32_t)(a))/(spx_word32_t)(b)) |
|
238 |
|
239 |
|
240 #endif |
|
241 |
|
242 |
|
243 #if defined (CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) |
|
244 |
|
245 /* 2 on TI C5x DSP */ |
|
246 #define BYTES_PER_CHAR 2 |
|
247 #define BITS_PER_CHAR 16 |
|
248 #define LOG2_BITS_PER_CHAR 4 |
|
249 |
|
250 #else |
|
251 |
|
252 #define BYTES_PER_CHAR 1 |
|
253 #define BITS_PER_CHAR 8 |
|
254 #define LOG2_BITS_PER_CHAR 3 |
|
255 |
|
256 #endif |
|
257 |
|
258 |
|
259 |
|
260 #ifdef FIXED_DEBUG |
|
261 extern long long spx_mips; |
|
262 #endif |
|
263 |
|
264 |
|
265 #endif |
|