Remove unused tests from configure.ac
[speexdsp.git] / tmv / vq_tm.h
1 /* Copyright (C) 2007 Hong Zhiqian */\r
2 /**\r
3    @file vq_tm.h\r
4    @author Hong Zhiqian\r
5    @brief Various compatibility routines for Speex (TriMedia version)\r
6 */\r
7 /*\r
8    Redistribution and use in source and binary forms, with or without\r
9    modification, are permitted provided that the following conditions\r
10    are met:\r
11    \r
12    - Redistributions of source code must retain the above copyright\r
13    notice, this list of conditions and the following disclaimer.\r
14    \r
15    - Redistributions in binary form must reproduce the above copyright\r
16    notice, this list of conditions and the following disclaimer in the\r
17    documentation and/or other materials provided with the distribution.\r
18    \r
19    - Neither the name of the Xiph.org Foundation nor the names of its\r
20    contributors may be used to endorse or promote products derived from\r
21    this software without specific prior written permission.\r
22    \r
23    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
24    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
25    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
26    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR\r
27    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
28    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
29    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\r
30    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
31    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
32    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r
33    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
34 */\r
35 #include <ops/custom_defs.h>\r
36 #include "profile_tm.h"\r
37 \r
38 #ifdef FIXED_POINT\r
39 \r
40 inline void vq_nbest_dist(int i, int N, int dist, int *used, int *nbest, Int32 *best_dist)\r
41 {\r
42         register int k;\r
43         \r
44         if (i<N || dist<best_dist[N-1])\r
45         {\r
46                 for (k=N-1; (k >= 1) && (k > *used || dist < best_dist[k-1]); k--)\r
47                 {       best_dist[k]=best_dist[k-1];\r
48                         nbest[k] = nbest[k-1];\r
49                 }\r
50                 \r
51                 best_dist[k]=dist;\r
52                 nbest[k]=i;\r
53                 *used++;\r
54         }\r
55 }\r
56 \r
57 void vq_nbest_5(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist)\r
58 {\r
59         register int    i, j;\r
60         register int    in10, in32, in4;\r
61         int                     used = 0;\r
62         \r
63         in10 = pack16lsb(in[1],in[0]);                  /* Note: memory is not align here */\r
64         in32 = pack16lsb(in[3],in[2]);\r
65         in4 = sex16(in[4]);     \r
66 \r
67 #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0)\r
68 #pragma TCS_unroll=2\r
69 #pragma TCS_unrollexact=1\r
70 #endif\r
71 \r
72         for ( i=0,j=0 ; i<entries ; i+=2,j+=5 )\r
73         {\r
74                 register int dist1, dist2;\r
75                 register int cb10, cb32, cb54, cb76, cb98, cb87, cb65;\r
76                 \r
77                 cb10  =  ld32x(codebook,j);\r
78                 cb32  =  ld32x(codebook,j+1);\r
79                 cb54  =  ld32x(codebook,j+2);\r
80                 cb76  =  ld32x(codebook,j+3);\r
81                 cb98  =  ld32x(codebook,j+4);\r
82 \r
83                 dist1 = sex16(cb54) * in4;\r
84                 dist1 += ifir16(in10,cb10) + ifir16(in32,cb32);\r
85                 dist1 = (E[i] >> 1) - dist1;\r
86                 \r
87                 cb65  =  funshift2(cb76,cb54);\r
88                 cb87  =  funshift2(cb98,cb76);\r
89                 dist2 =  asri(16,cb98) * in4;\r
90                 dist2 += ifir16(in10,cb65) + ifir16(in32,cb87);\r
91                 dist2 = (E[i+1] >> 1) - dist2;\r
92 \r
93                 vq_nbest_dist(i,N,dist1,&used,nbest,best_dist);\r
94                 vq_nbest_dist(i+1,N,dist2,&used,nbest,best_dist);\r
95         }\r
96 \r
97 #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0)\r
98 #pragma TCS_unrollexact=0\r
99 #pragma TCS_unroll=0\r
100 #endif\r
101 }\r
102 \r
103 \r
104 void vq_nbest_8(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist)\r
105 {\r
106         register int    i, j;\r
107         register int    in10, in32, in54, in76;\r
108         int                     used = 0;\r
109         \r
110         in10 = pack16lsb(in[1],in[0]);                          /* Note: memory is not align here */\r
111         in32 = pack16lsb(in[3],in[2]);\r
112         in54 = pack16lsb(in[5],in[4]);  \r
113         in76 = pack16lsb(in[7],in[6]);  \r
114 \r
115 #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0)\r
116 #pragma TCS_unroll=4\r
117 #pragma TCS_unrollexact=1\r
118 #endif\r
119         for ( i=0,j=0 ; i<entries ; ++i,j+=4 )\r
120         {\r
121                 register int dist;\r
122                 register int cb10, cb32, cb54, cb76;\r
123                 \r
124                 cb10  =  ld32x(codebook,j);\r
125                 cb32  =  ld32x(codebook,j+1);\r
126                 cb54  =  ld32x(codebook,j+2);\r
127                 cb76  =  ld32x(codebook,j+3);\r
128                 \r
129                 dist  =  ifir16(in10,cb10) + ifir16(in32,cb32);\r
130                 dist  += ifir16(in54,cb54) + ifir16(in76,cb76);\r
131                 dist  =  (E[i] >> 1) - dist;\r
132           \r
133                 vq_nbest_dist(i,N,dist,&used,nbest,best_dist);\r
134         }\r
135 #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0)\r
136 #pragma TCS_unrollexact=0\r
137 #pragma TCS_unroll=0\r
138 #endif\r
139 \r
140 }\r
141 \r
142 \r
143 void vq_nbest_10(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist)\r
144 {\r
145         register int    i, j;\r
146         register int    in10, in32, in54, in76, in98;\r
147         int                             used = 0;\r
148         \r
149         in10 = pack16lsb(in[1],in[0]);\r
150         in32 = pack16lsb(in[3],in[2]);\r
151         in54 = pack16lsb(in[5],in[4]);\r
152         in76 = pack16lsb(in[7],in[6]);\r
153         in98 = pack16lsb(in[9],in[8]);\r
154 \r
155 #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0)\r
156 #pragma TCS_unroll=4\r
157 #pragma TCS_unrollexact=1\r
158 #endif\r
159         for ( i=0,j=0 ; i<entries ; ++i,j+=5 )\r
160         {\r
161                 register int dist;\r
162                 register int cb10, cb32, cb54, cb76, cb98;\r
163                 \r
164                 cb10  =  ld32x(codebook,j);\r
165                 cb32  =  ld32x(codebook,j+1);\r
166                 cb54  =  ld32x(codebook,j+2);\r
167                 cb76  =  ld32x(codebook,j+3);\r
168                 cb98  =  ld32x(codebook,j+4);\r
169 \r
170                 dist  =  ifir16(in10,cb10) + ifir16(in32,cb32);\r
171                 dist  += ifir16(in54,cb54) + ifir16(in76,cb76);\r
172                 dist  += ifir16(in98,cb98);\r
173                 dist  =  (E[i] >> 1) - dist;\r
174           \r
175                 vq_nbest_dist(i,N,dist,&used,nbest,best_dist);    \r
176         }\r
177 #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0)\r
178 #pragma TCS_unrollexact=0\r
179 #pragma TCS_unroll=0\r
180 #endif\r
181 }\r
182 \r
183 void vq_nbest_20(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist)\r
184 {\r
185         register int    i, j;\r
186         register int    in10, in32, in54, in76, in98, in_10, in_32, in_54, in_76, in_98;\r
187         int                     used = 0;\r
188         \r
189         in10  = pack16lsb(in[1],in[0]);                                 /* Note: memory is not align here */\r
190         in32  = pack16lsb(in[3],in[2]);\r
191         in54  = pack16lsb(in[5],in[4]);\r
192         in76  = pack16lsb(in[6],in[6]);\r
193         in98  = pack16lsb(in[9],in[8]);\r
194         in_10 = pack16lsb(in[11],in[10]);\r
195         in_32 = pack16lsb(in[13],in[12]);\r
196         in_54 = pack16lsb(in[15],in[14]);\r
197         in_76 = pack16lsb(in[17],in[16]);\r
198         in_98 = pack16lsb(in[19],in[18]);\r
199 \r
200 #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0)\r
201 #pragma TCS_unroll=2\r
202 #pragma TCS_unrollexact=1\r
203 #endif\r
204         for ( i=0,j=0 ; i<entries ; ++i,j+=10 )\r
205         {\r
206                 register int dist;\r
207                 register int cb10, cb32, cb54, cb76, cb98, cb_10, cb_32, cb_54, cb_76, cb_98;\r
208                 \r
209                 cb10   =  ld32x(codebook,j);\r
210                 cb32   =  ld32x(codebook,j+1);\r
211                 cb54   =  ld32x(codebook,j+2);\r
212                 cb76   =  ld32x(codebook,j+3);\r
213                 cb98   =  ld32x(codebook,j+4);\r
214                 cb_10  =  ld32x(codebook,j+5);\r
215                 cb_32  =  ld32x(codebook,j+6);\r
216                 cb_54  =  ld32x(codebook,j+7);\r
217                 cb_76  =  ld32x(codebook,j+8);\r
218                 cb_98  =  ld32x(codebook,j+9);\r
219 \r
220                 dist   =  ifir16(in10,cb10) + ifir16(in32,cb32);\r
221                 dist   += ifir16(in54,cb54) + ifir16(in76,cb76);\r
222                 dist   += ifir16(in98,cb98) + ifir16(in_10,cb_10);\r
223                 dist   += ifir16(in_32,cb_32) + ifir16(in_54,cb_54);\r
224                 dist   += ifir16(in_76,cb_76) + ifir16(in_98,cb_98);\r
225 \r
226                 dist   =  (E[i] >> 1) - dist;  \r
227                 vq_nbest_dist(i,N,dist,&used,nbest,best_dist);\r
228         }\r
229 #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0)\r
230 #pragma TCS_unrollexact=0\r
231 #pragma TCS_unroll=0\r
232 #endif\r
233 }\r
234 \r
235 \r
236 #define OVERRIDE_VQ_NBEST\r
237 void vq_nbest (Int16 *in, const Int16 *codebook, int len, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist, char *stack)\r
238 {\r
239         TMDEBUG_ALIGNMEM(codebook);\r
240 \r
241         VQNBEST_START();\r
242         if( len==5 )\r
243                 vq_nbest_5(in,codebook,entries,E,N,nbest,best_dist);\r
244         else if ( len==8 )\r
245                 vq_nbest_8(in,codebook,entries,E,N,nbest,best_dist);\r
246         else if ( len==10 )\r
247                 vq_nbest_10(in,codebook,entries,E,N,nbest,best_dist);\r
248         else if ( len==20 )\r
249                 vq_nbest_20(in,codebook,entries,E,N,nbest,best_dist);\r
250 \r
251 #ifndef REMARK_ON\r
252         (void)stack;\r
253 #endif\r
254 \r
255         VQNBEST_STOP();\r
256 }\r
257 \r
258 inline void vq_nbest_sign_dist(int i, int N, int dist, int sign, int entries, int *used, int *nbest, Int32 *best_dist)\r
259 {\r
260         register int k;\r
261 \r
262         if (i<N || dist<best_dist[N-1])\r
263         {       for (k=N-1; (k >= 1) && (k > *used || dist < best_dist[k-1]); k--)\r
264                 {\r
265                         best_dist[k]=best_dist[k-1];\r
266                         nbest[k] = nbest[k-1];\r
267                 }\r
268                 \r
269                 if ( sign ) i += entries;\r
270                 best_dist[k]=dist;\r
271                 *used++;\r
272                 nbest[k] = i;\r
273         }\r
274 }                                                                                       \r
275 \r
276 void vq_nbest_sign_5(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist)\r
277 {\r
278         register int    i, j;\r
279         register int    in10, in32, in4;\r
280         int                             used = 0;\r
281         \r
282         in10 = ld32(in);\r
283         in32 = ld32x(in,1);\r
284         in4      = sex16(in[4]);\r
285 \r
286 #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0)\r
287 #pragma TCS_unroll=2\r
288 #pragma TCS_unrollexact=1\r
289 #endif\r
290 \r
291         for ( i=0,j=0 ; i<entries ; i+=2,j+=5 )\r
292         {\r
293                 register int dist1, dist2, sign1, sign2;\r
294                 register int cb10, cb32, cb54, cb76, cb98, cb87, cb65;\r
295                 \r
296                 cb10  =  ld32x(codebook,j);\r
297                 cb32  =  ld32x(codebook,j+1);\r
298                 cb54  =  ld32x(codebook,j+2);\r
299                 cb76  =  ld32x(codebook,j+3);\r
300                 cb98  =  ld32x(codebook,j+4);\r
301 \r
302                 dist1 = sex16(cb54) * in4;\r
303                 dist1 += ifir16(in10,cb10) + ifir16(in32,cb32);\r
304                 \r
305                 sign1 = mux(dist1>0,0,1);       \r
306                 dist1 = iflip(dist1>0,dist1);\r
307                 dist1 =  (E[i] >> 1) + dist1;  \r
308                 \r
309                 cb65  =  funshift2(cb76,cb54);\r
310                 cb87  =  funshift2(cb98,cb76);\r
311                 dist2 =  asri(16,cb98) * in4;\r
312                 dist2 += ifir16(in10,cb65) + ifir16(in32,cb87);\r
313                 \r
314                 sign2 = mux(dist2>0,0,1);       \r
315                 dist2 = iflip(dist2>0,dist2);\r
316                 dist2 =  (E[i] >> 1) + dist2;  \r
317                 \r
318                 vq_nbest_sign_dist(i,N,dist1,sign1,entries,&used,nbest,best_dist);\r
319                 vq_nbest_sign_dist(i+1,N,dist2,sign2,entries,&used,nbest,best_dist);\r
320         }\r
321 #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0)\r
322 #pragma TCS_unrollexact=0\r
323 #pragma TCS_unroll=0\r
324 #endif\r
325 }\r
326 \r
327 void vq_nbest_sign_8(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist)\r
328 {\r
329         register int    i, j;\r
330         register int    sign;\r
331         register int    in10, in32, in54, in76;\r
332         int                             used = 0;\r
333 \r
334         in10 = ld32(in);\r
335         in32 = ld32x(in,1);\r
336         in54 = ld32x(in,2);\r
337         in76 = ld32x(in,3);\r
338 \r
339 #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0)\r
340 #pragma TCS_unroll=4\r
341 #pragma TCS_unrollexact=1\r
342 #endif\r
343 \r
344         for ( i=0,j=0 ; i<entries ; ++i,j+=4 )\r
345         {\r
346                 register int dist;\r
347                 register int cb10, cb32, cb54, cb76;\r
348                 \r
349                 cb10  =  ld32x(codebook,j);\r
350                 cb32  =  ld32x(codebook,j+1);\r
351                 cb54  =  ld32x(codebook,j+2);\r
352                 cb76  =  ld32x(codebook,j+3);\r
353                 \r
354                 dist  =  ifir16(in10,cb10) + ifir16(in32,cb32);\r
355                 dist  += ifir16(in54,cb54) + ifir16(in76,cb76);\r
356                 \r
357                 sign = mux(dist>0,0,1); \r
358                 dist = iflip(dist>0,dist);\r
359                 dist =  (E[i] >> 1) + dist;  \r
360       \r
361                 vq_nbest_sign_dist(i,N,dist,sign,entries,&used,nbest,best_dist);\r
362         }\r
363 #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0)\r
364 #pragma TCS_unrollexact=0\r
365 #pragma TCS_unroll=0\r
366 #endif\r
367 }\r
368 \r
369 void vq_nbest_sign_10(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist)\r
370 {\r
371         register int    i, j;\r
372         register int    sign;\r
373         register int    in10, in32, in54, in76, in98;\r
374         int                             used = 0;\r
375         \r
376         in10 = ld32(in);\r
377         in32 = ld32x(in,1);\r
378         in54 = ld32x(in,2);\r
379         in76 = ld32x(in,3);\r
380         in98 = ld32x(in,4);\r
381 \r
382 #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0)\r
383 #pragma TCS_unroll=4\r
384 #pragma TCS_unrollexact=1\r
385 #endif\r
386         for ( i=0,j=0 ; i<entries ; ++i,j+=5 )\r
387         {\r
388                 register int dist;\r
389                 register int cb10, cb32, cb54, cb76, cb98;\r
390                 \r
391                 cb10  =  ld32x(codebook,j);\r
392                 cb32  =  ld32x(codebook,j+1);\r
393                 cb54  =  ld32x(codebook,j+2);\r
394                 cb76  =  ld32x(codebook,j+3);\r
395                 cb98  =  ld32x(codebook,j+4);\r
396                 \r
397                 dist  =  ifir16(in10,cb10) + ifir16(in32,cb32);\r
398                 dist  += ifir16(in54,cb54) + ifir16(in76,cb76);\r
399                 dist  += ifir16(in98,cb98);\r
400                 \r
401                 sign = mux(dist>0,0,1); \r
402                 dist = iflip(dist>0,dist);\r
403                 dist =  (E[i] >> 1) + dist;  \r
404       \r
405                 vq_nbest_sign_dist(i,N,dist,sign,entries,&used,nbest,best_dist);\r
406         }\r
407 #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0)\r
408 #pragma TCS_unrollexact=0\r
409 #pragma TCS_unroll=0\r
410 #endif\r
411 }\r
412 \r
413 void vq_nbest_sign_20(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist)\r
414 {\r
415         register int    i, j;\r
416         register int    sign;\r
417         register int    in10, in32, in54, in76, in98, in_10, in_32, in_54, in_76, in_98;\r
418         int                             used = 0;\r
419         \r
420         in10  = ld32(in);\r
421         in32  = ld32x(in,1);\r
422         in54  = ld32x(in,2);\r
423         in76  = ld32x(in,3);\r
424         in98  = ld32x(in,4);\r
425         in_10 = ld32x(in,5); \r
426         in_32 = ld32x(in,6); \r
427         in_54 = ld32x(in,7); \r
428         in_76 = ld32x(in,8); \r
429         in_98 = ld32x(in,9); \r
430 \r
431 #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0)\r
432 #pragma TCS_unroll=2\r
433 #pragma TCS_unrollexact=1\r
434 #endif\r
435         for ( i=0,j=0 ; i<entries ; ++i,j+=10 )\r
436         {\r
437                 register int dist;\r
438                 register int cb10, cb32, cb54, cb76, cb98, cb_10, cb_32, cb_54, cb_76, cb_98;\r
439                 \r
440                 cb10   =  ld32x(codebook,j);\r
441                 cb32   =  ld32x(codebook,j+1);\r
442                 cb54   =  ld32x(codebook,j+2);\r
443                 cb76   =  ld32x(codebook,j+3);\r
444                 cb98   =  ld32x(codebook,j+4);\r
445                 cb_10  =  ld32x(codebook,j+5);\r
446                 cb_32  =  ld32x(codebook,j+6);\r
447                 cb_54  =  ld32x(codebook,j+7);\r
448                 cb_76  =  ld32x(codebook,j+8);\r
449                 cb_98  =  ld32x(codebook,j+9);\r
450 \r
451                 dist   =  ifir16(in10,cb10) + ifir16(in32,cb32);\r
452                 dist   += ifir16(in54,cb54) + ifir16(in76,cb76);\r
453                 dist   += ifir16(in98,cb98) + ifir16(in_10,cb_10);\r
454                 dist   += ifir16(in_32,cb_32) + ifir16(in_54,cb_54);\r
455                 dist   += ifir16(in_76,cb_76) + ifir16(in_98,cb_98);\r
456                                 \r
457                 sign = mux(dist>0,0,1); \r
458                 dist = iflip(dist>0,dist);\r
459                 dist =  (E[i] >> 1) + dist;  \r
460       \r
461                 vq_nbest_sign_dist(i,N,dist,sign,entries,&used,nbest,best_dist);\r
462         }\r
463 #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0)\r
464 #pragma TCS_unrollexact=0\r
465 #pragma TCS_unroll=0\r
466 #endif\r
467 }\r
468 \r
469 #define OVERRIDE_VQ_NBEST_SIGN\r
470 void vq_nbest_sign (Int16 *in, const Int16 *codebook, int len, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist, char *stack)\r
471 {\r
472         TMDEBUG_ALIGNMEM(in);\r
473         TMDEBUG_ALIGNMEM(codebook);\r
474 \r
475         VQNBESTSIGN_START();\r
476 \r
477         if( len==5 )\r
478                 vq_nbest_sign_5(in,codebook,entries,E,N,nbest,best_dist);\r
479         else if ( len==8 )\r
480                 vq_nbest_sign_8(in,codebook,entries,E,N,nbest,best_dist);\r
481         else if ( len==10 )\r
482                 vq_nbest_sign_10(in,codebook,entries,E,N,nbest,best_dist);\r
483         else if ( len==20 )\r
484                 vq_nbest_sign_20(in,codebook,entries,E,N,nbest,best_dist);\r
485 \r
486 #ifndef REMARK_ON\r
487         (void)stack;\r
488 #endif\r
489 \r
490         VQNBESTSIGN_STOP();\r
491 }\r
492 \r
493 #endif\r
494 \r