123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494 |
- /* Copyright (C) 2007 Hong Zhiqian */
- /**
- @file vq_tm.h
- @author Hong Zhiqian
- @brief Various compatibility routines for Speex (TriMedia version)
- */
- /*
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- - Neither the name of the Xiph.org Foundation nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- #include <ops/custom_defs.h>
- #include "profile_tm.h"
- #ifdef FIXED_POINT
- inline void vq_nbest_dist(int i, int N, int dist, int *used, int *nbest, Int32 *best_dist)
- {
- register int k;
-
- if (i<N || dist<best_dist[N-1])
- {
- for (k=N-1; (k >= 1) && (k > *used || dist < best_dist[k-1]); k--)
- { best_dist[k]=best_dist[k-1];
- nbest[k] = nbest[k-1];
- }
-
- best_dist[k]=dist;
- nbest[k]=i;
- *used++;
- }
- }
- void vq_nbest_5(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist)
- {
- register int i, j;
- register int in10, in32, in4;
- int used = 0;
-
- in10 = pack16lsb(in[1],in[0]); /* Note: memory is not align here */
- in32 = pack16lsb(in[3],in[2]);
- in4 = sex16(in[4]);
- #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0)
- #pragma TCS_unroll=2
- #pragma TCS_unrollexact=1
- #endif
- for ( i=0,j=0 ; i<entries ; i+=2,j+=5 )
- {
- register int dist1, dist2;
- register int cb10, cb32, cb54, cb76, cb98, cb87, cb65;
-
- cb10 = ld32x(codebook,j);
- cb32 = ld32x(codebook,j+1);
- cb54 = ld32x(codebook,j+2);
- cb76 = ld32x(codebook,j+3);
- cb98 = ld32x(codebook,j+4);
- dist1 = sex16(cb54) * in4;
- dist1 += ifir16(in10,cb10) + ifir16(in32,cb32);
- dist1 = (E[i] >> 1) - dist1;
-
- cb65 = funshift2(cb76,cb54);
- cb87 = funshift2(cb98,cb76);
- dist2 = asri(16,cb98) * in4;
- dist2 += ifir16(in10,cb65) + ifir16(in32,cb87);
- dist2 = (E[i+1] >> 1) - dist2;
- vq_nbest_dist(i,N,dist1,&used,nbest,best_dist);
- vq_nbest_dist(i+1,N,dist2,&used,nbest,best_dist);
- }
- #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0)
- #pragma TCS_unrollexact=0
- #pragma TCS_unroll=0
- #endif
- }
- void vq_nbest_8(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist)
- {
- register int i, j;
- register int in10, in32, in54, in76;
- int used = 0;
-
- in10 = pack16lsb(in[1],in[0]); /* Note: memory is not align here */
- in32 = pack16lsb(in[3],in[2]);
- in54 = pack16lsb(in[5],in[4]);
- in76 = pack16lsb(in[7],in[6]);
- #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0)
- #pragma TCS_unroll=4
- #pragma TCS_unrollexact=1
- #endif
- for ( i=0,j=0 ; i<entries ; ++i,j+=4 )
- {
- register int dist;
- register int cb10, cb32, cb54, cb76;
-
- cb10 = ld32x(codebook,j);
- cb32 = ld32x(codebook,j+1);
- cb54 = ld32x(codebook,j+2);
- cb76 = ld32x(codebook,j+3);
-
- dist = ifir16(in10,cb10) + ifir16(in32,cb32);
- dist += ifir16(in54,cb54) + ifir16(in76,cb76);
- dist = (E[i] >> 1) - dist;
-
- vq_nbest_dist(i,N,dist,&used,nbest,best_dist);
- }
- #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0)
- #pragma TCS_unrollexact=0
- #pragma TCS_unroll=0
- #endif
- }
- void vq_nbest_10(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist)
- {
- register int i, j;
- register int in10, in32, in54, in76, in98;
- int used = 0;
-
- in10 = pack16lsb(in[1],in[0]);
- in32 = pack16lsb(in[3],in[2]);
- in54 = pack16lsb(in[5],in[4]);
- in76 = pack16lsb(in[7],in[6]);
- in98 = pack16lsb(in[9],in[8]);
- #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0)
- #pragma TCS_unroll=4
- #pragma TCS_unrollexact=1
- #endif
- for ( i=0,j=0 ; i<entries ; ++i,j+=5 )
- {
- register int dist;
- register int cb10, cb32, cb54, cb76, cb98;
-
- cb10 = ld32x(codebook,j);
- cb32 = ld32x(codebook,j+1);
- cb54 = ld32x(codebook,j+2);
- cb76 = ld32x(codebook,j+3);
- cb98 = ld32x(codebook,j+4);
- dist = ifir16(in10,cb10) + ifir16(in32,cb32);
- dist += ifir16(in54,cb54) + ifir16(in76,cb76);
- dist += ifir16(in98,cb98);
- dist = (E[i] >> 1) - dist;
-
- vq_nbest_dist(i,N,dist,&used,nbest,best_dist);
- }
- #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0)
- #pragma TCS_unrollexact=0
- #pragma TCS_unroll=0
- #endif
- }
- void vq_nbest_20(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist)
- {
- register int i, j;
- register int in10, in32, in54, in76, in98, in_10, in_32, in_54, in_76, in_98;
- int used = 0;
-
- in10 = pack16lsb(in[1],in[0]); /* Note: memory is not align here */
- in32 = pack16lsb(in[3],in[2]);
- in54 = pack16lsb(in[5],in[4]);
- in76 = pack16lsb(in[6],in[6]);
- in98 = pack16lsb(in[9],in[8]);
- in_10 = pack16lsb(in[11],in[10]);
- in_32 = pack16lsb(in[13],in[12]);
- in_54 = pack16lsb(in[15],in[14]);
- in_76 = pack16lsb(in[17],in[16]);
- in_98 = pack16lsb(in[19],in[18]);
- #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0)
- #pragma TCS_unroll=2
- #pragma TCS_unrollexact=1
- #endif
- for ( i=0,j=0 ; i<entries ; ++i,j+=10 )
- {
- register int dist;
- register int cb10, cb32, cb54, cb76, cb98, cb_10, cb_32, cb_54, cb_76, cb_98;
-
- cb10 = ld32x(codebook,j);
- cb32 = ld32x(codebook,j+1);
- cb54 = ld32x(codebook,j+2);
- cb76 = ld32x(codebook,j+3);
- cb98 = ld32x(codebook,j+4);
- cb_10 = ld32x(codebook,j+5);
- cb_32 = ld32x(codebook,j+6);
- cb_54 = ld32x(codebook,j+7);
- cb_76 = ld32x(codebook,j+8);
- cb_98 = ld32x(codebook,j+9);
- dist = ifir16(in10,cb10) + ifir16(in32,cb32);
- dist += ifir16(in54,cb54) + ifir16(in76,cb76);
- dist += ifir16(in98,cb98) + ifir16(in_10,cb_10);
- dist += ifir16(in_32,cb_32) + ifir16(in_54,cb_54);
- dist += ifir16(in_76,cb_76) + ifir16(in_98,cb_98);
- dist = (E[i] >> 1) - dist;
- vq_nbest_dist(i,N,dist,&used,nbest,best_dist);
- }
- #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0)
- #pragma TCS_unrollexact=0
- #pragma TCS_unroll=0
- #endif
- }
- #define OVERRIDE_VQ_NBEST
- void vq_nbest (Int16 *in, const Int16 *codebook, int len, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist, char *stack)
- {
- TMDEBUG_ALIGNMEM(codebook);
- VQNBEST_START();
- if( len==5 )
- vq_nbest_5(in,codebook,entries,E,N,nbest,best_dist);
- else if ( len==8 )
- vq_nbest_8(in,codebook,entries,E,N,nbest,best_dist);
- else if ( len==10 )
- vq_nbest_10(in,codebook,entries,E,N,nbest,best_dist);
- else if ( len==20 )
- vq_nbest_20(in,codebook,entries,E,N,nbest,best_dist);
- #ifndef REMARK_ON
- (void)stack;
- #endif
- VQNBEST_STOP();
- }
- inline void vq_nbest_sign_dist(int i, int N, int dist, int sign, int entries, int *used, int *nbest, Int32 *best_dist)
- {
- register int k;
- if (i<N || dist<best_dist[N-1])
- { for (k=N-1; (k >= 1) && (k > *used || dist < best_dist[k-1]); k--)
- {
- best_dist[k]=best_dist[k-1];
- nbest[k] = nbest[k-1];
- }
-
- if ( sign ) i += entries;
- best_dist[k]=dist;
- *used++;
- nbest[k] = i;
- }
- }
- void vq_nbest_sign_5(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist)
- {
- register int i, j;
- register int in10, in32, in4;
- int used = 0;
-
- in10 = ld32(in);
- in32 = ld32x(in,1);
- in4 = sex16(in[4]);
- #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0)
- #pragma TCS_unroll=2
- #pragma TCS_unrollexact=1
- #endif
- for ( i=0,j=0 ; i<entries ; i+=2,j+=5 )
- {
- register int dist1, dist2, sign1, sign2;
- register int cb10, cb32, cb54, cb76, cb98, cb87, cb65;
-
- cb10 = ld32x(codebook,j);
- cb32 = ld32x(codebook,j+1);
- cb54 = ld32x(codebook,j+2);
- cb76 = ld32x(codebook,j+3);
- cb98 = ld32x(codebook,j+4);
- dist1 = sex16(cb54) * in4;
- dist1 += ifir16(in10,cb10) + ifir16(in32,cb32);
-
- sign1 = mux(dist1>0,0,1);
- dist1 = iflip(dist1>0,dist1);
- dist1 = (E[i] >> 1) + dist1;
-
- cb65 = funshift2(cb76,cb54);
- cb87 = funshift2(cb98,cb76);
- dist2 = asri(16,cb98) * in4;
- dist2 += ifir16(in10,cb65) + ifir16(in32,cb87);
-
- sign2 = mux(dist2>0,0,1);
- dist2 = iflip(dist2>0,dist2);
- dist2 = (E[i] >> 1) + dist2;
-
- vq_nbest_sign_dist(i,N,dist1,sign1,entries,&used,nbest,best_dist);
- vq_nbest_sign_dist(i+1,N,dist2,sign2,entries,&used,nbest,best_dist);
- }
- #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0)
- #pragma TCS_unrollexact=0
- #pragma TCS_unroll=0
- #endif
- }
- void vq_nbest_sign_8(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist)
- {
- register int i, j;
- register int sign;
- register int in10, in32, in54, in76;
- int used = 0;
- in10 = ld32(in);
- in32 = ld32x(in,1);
- in54 = ld32x(in,2);
- in76 = ld32x(in,3);
- #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0)
- #pragma TCS_unroll=4
- #pragma TCS_unrollexact=1
- #endif
- for ( i=0,j=0 ; i<entries ; ++i,j+=4 )
- {
- register int dist;
- register int cb10, cb32, cb54, cb76;
-
- cb10 = ld32x(codebook,j);
- cb32 = ld32x(codebook,j+1);
- cb54 = ld32x(codebook,j+2);
- cb76 = ld32x(codebook,j+3);
-
- dist = ifir16(in10,cb10) + ifir16(in32,cb32);
- dist += ifir16(in54,cb54) + ifir16(in76,cb76);
-
- sign = mux(dist>0,0,1);
- dist = iflip(dist>0,dist);
- dist = (E[i] >> 1) + dist;
-
- vq_nbest_sign_dist(i,N,dist,sign,entries,&used,nbest,best_dist);
- }
- #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0)
- #pragma TCS_unrollexact=0
- #pragma TCS_unroll=0
- #endif
- }
- void vq_nbest_sign_10(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist)
- {
- register int i, j;
- register int sign;
- register int in10, in32, in54, in76, in98;
- int used = 0;
-
- in10 = ld32(in);
- in32 = ld32x(in,1);
- in54 = ld32x(in,2);
- in76 = ld32x(in,3);
- in98 = ld32x(in,4);
- #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0)
- #pragma TCS_unroll=4
- #pragma TCS_unrollexact=1
- #endif
- for ( i=0,j=0 ; i<entries ; ++i,j+=5 )
- {
- register int dist;
- register int cb10, cb32, cb54, cb76, cb98;
-
- cb10 = ld32x(codebook,j);
- cb32 = ld32x(codebook,j+1);
- cb54 = ld32x(codebook,j+2);
- cb76 = ld32x(codebook,j+3);
- cb98 = ld32x(codebook,j+4);
-
- dist = ifir16(in10,cb10) + ifir16(in32,cb32);
- dist += ifir16(in54,cb54) + ifir16(in76,cb76);
- dist += ifir16(in98,cb98);
-
- sign = mux(dist>0,0,1);
- dist = iflip(dist>0,dist);
- dist = (E[i] >> 1) + dist;
-
- vq_nbest_sign_dist(i,N,dist,sign,entries,&used,nbest,best_dist);
- }
- #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0)
- #pragma TCS_unrollexact=0
- #pragma TCS_unroll=0
- #endif
- }
- void vq_nbest_sign_20(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist)
- {
- register int i, j;
- register int sign;
- register int in10, in32, in54, in76, in98, in_10, in_32, in_54, in_76, in_98;
- int used = 0;
-
- in10 = ld32(in);
- in32 = ld32x(in,1);
- in54 = ld32x(in,2);
- in76 = ld32x(in,3);
- in98 = ld32x(in,4);
- in_10 = ld32x(in,5);
- in_32 = ld32x(in,6);
- in_54 = ld32x(in,7);
- in_76 = ld32x(in,8);
- in_98 = ld32x(in,9);
- #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0)
- #pragma TCS_unroll=2
- #pragma TCS_unrollexact=1
- #endif
- for ( i=0,j=0 ; i<entries ; ++i,j+=10 )
- {
- register int dist;
- register int cb10, cb32, cb54, cb76, cb98, cb_10, cb_32, cb_54, cb_76, cb_98;
-
- cb10 = ld32x(codebook,j);
- cb32 = ld32x(codebook,j+1);
- cb54 = ld32x(codebook,j+2);
- cb76 = ld32x(codebook,j+3);
- cb98 = ld32x(codebook,j+4);
- cb_10 = ld32x(codebook,j+5);
- cb_32 = ld32x(codebook,j+6);
- cb_54 = ld32x(codebook,j+7);
- cb_76 = ld32x(codebook,j+8);
- cb_98 = ld32x(codebook,j+9);
- dist = ifir16(in10,cb10) + ifir16(in32,cb32);
- dist += ifir16(in54,cb54) + ifir16(in76,cb76);
- dist += ifir16(in98,cb98) + ifir16(in_10,cb_10);
- dist += ifir16(in_32,cb_32) + ifir16(in_54,cb_54);
- dist += ifir16(in_76,cb_76) + ifir16(in_98,cb_98);
-
- sign = mux(dist>0,0,1);
- dist = iflip(dist>0,dist);
- dist = (E[i] >> 1) + dist;
-
- vq_nbest_sign_dist(i,N,dist,sign,entries,&used,nbest,best_dist);
- }
- #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0)
- #pragma TCS_unrollexact=0
- #pragma TCS_unroll=0
- #endif
- }
- #define OVERRIDE_VQ_NBEST_SIGN
- void vq_nbest_sign (Int16 *in, const Int16 *codebook, int len, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist, char *stack)
- {
- TMDEBUG_ALIGNMEM(in);
- TMDEBUG_ALIGNMEM(codebook);
- VQNBESTSIGN_START();
- if( len==5 )
- vq_nbest_sign_5(in,codebook,entries,E,N,nbest,best_dist);
- else if ( len==8 )
- vq_nbest_sign_8(in,codebook,entries,E,N,nbest,best_dist);
- else if ( len==10 )
- vq_nbest_sign_10(in,codebook,entries,E,N,nbest,best_dist);
- else if ( len==20 )
- vq_nbest_sign_20(in,codebook,entries,E,N,nbest,best_dist);
- #ifndef REMARK_ON
- (void)stack;
- #endif
- VQNBESTSIGN_STOP();
- }
- #endif
|