ltp_arm4.h revision 98913fed6520d8849fb2e246be943e04474aefa4
12e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/* Copyright (C) 2004 Jean-Marc Valin */
22e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/**
32e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   @file ltp_arm4.h
42e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   @brief Long-Term Prediction functions (ARM4 version)
52e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor*/
62e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/*
72e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   Redistribution and use in source and binary forms, with or without
82e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   modification, are permitted provided that the following conditions
92e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   are met:
102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   - Redistributions of source code must retain the above copyright
122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   notice, this list of conditions and the following disclaimer.
132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   - Redistributions in binary form must reproduce the above copyright
152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   notice, this list of conditions and the following disclaimer in the
162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   documentation and/or other materials provided with the distribution.
172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1850d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor   - Neither the name of the Xiph.org Foundation nor the names of its
19d7a3e2c5f61cd4893f95b69a424fe4def3aa0f69Benjamin Kramer   contributors may be used to endorse or promote products derived from
20aa49a7d70e58dac2aeb40664ba16d2ea571b8c95Daniel Dunbar   this software without specific prior written permission.
212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
262e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
293e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
332a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor*/
342577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#define OVERRIDE_INNER_PROD
362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorspx_word32_t inner_prod(const spx_word16_t *x, const spx_word16_t *y, int len)
372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor{
382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   spx_word32_t sum1=0,sum2=0;
392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   spx_word16_t *deadx, *deady;
402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   int deadlen, dead1, dead2, dead3, dead4, dead5, dead6;
412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   __asm__ __volatile__ (
422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tldrsh %5, [%0], #2 \n"
432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tldrsh %6, [%1], #2 \n"
442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         ".inner_prod_loop%=:\n"
452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tsub %7, %7, %7\n"
462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tsub %10, %10, %10\n"
472e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
482e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tldrsh %8, [%0], #2 \n"
492e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tldrsh %9, [%1], #2 \n"
502e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tmla %7, %5, %6, %7\n"
512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tldrsh %5, [%0], #2 \n"
52e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor         "\tldrsh %6, [%1], #2 \n"
532a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor         "\tmla %10, %8, %9, %10\n"
543e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt         "\tldrsh %8, [%0], #2 \n"
552a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor         "\tldrsh %9, [%1], #2 \n"
562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tmla %7, %5, %6, %7\n"
572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tldrsh %5, [%0], #2 \n"
582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tldrsh %6, [%1], #2 \n"
592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tmla %10, %8, %9, %10\n"
602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
6151603be62ba78adeb64246b222583dcde4b20b2aDouglas Gregor         "\tldrsh %8, [%0], #2 \n"
6251603be62ba78adeb64246b222583dcde4b20b2aDouglas Gregor         "\tldrsh %9, [%1], #2 \n"
6351603be62ba78adeb64246b222583dcde4b20b2aDouglas Gregor         "\tmla %7, %5, %6, %7\n"
642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tldrsh %5, [%0], #2 \n"
652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tldrsh %6, [%1], #2 \n"
6651603be62ba78adeb64246b222583dcde4b20b2aDouglas Gregor         "\tmla %10, %8, %9, %10\n"
6751603be62ba78adeb64246b222583dcde4b20b2aDouglas Gregor         "\tldrsh %8, [%0], #2 \n"
6851603be62ba78adeb64246b222583dcde4b20b2aDouglas Gregor         "\tldrsh %9, [%1], #2 \n"
692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tmla %7, %5, %6, %7\n"
702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tldrsh %5, [%0], #2 \n"
712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tldrsh %6, [%1], #2 \n"
722e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tmla %10, %8, %9, %10\n"
732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tsubs %4, %4, #1\n"
752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tadd %2, %2, %7, asr #5\n"
762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "\tadd %3, %3, %10, asr #5\n"
77e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor         "\tbne .inner_prod_loop%=\n"
78e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor   : "=r" (deadx), "=r" (deady), "+r" (sum1),  "+r" (sum2),
792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor     "=r" (deadlen), "=r" (dead1), "=r" (dead2), "=r" (dead3),
80e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor     "=r" (dead4), "=r" (dead5), "=r" (dead6)
81e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor   : "0" (x), "1" (y), "4" (len>>3)
82e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor   : "cc"
832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor                        );
84e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor   return (sum1+sum2)>>1;
85e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor}
86e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#define OVERRIDE_PITCH_XCORR
88e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregorvoid pitch_xcorr(const spx_word16_t *_x, const spx_word16_t *_y, spx_word32_t *corr, int len, int nb_pitch, char *stack)
89e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor{
90e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor   int i,j;
91e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor   for (i=0;i<nb_pitch;i+=4)
922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor   {
932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      /* Compute correlation*/
942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      //corr[nb_pitch-1-i]=inner_prod(x, _y+i, len);
952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      spx_word32_t sum1=0;
962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      spx_word32_t sum2=0;
972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      spx_word32_t sum3=0;
982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      spx_word32_t sum4=0;
992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      const spx_word16_t *y = _y+i;
1002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      const spx_word16_t *x = _x;
1012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      spx_word32_t y0, y1, y2, y3;
1022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      y0=*y++;
103e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      y1=*y++;
1042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      y2=*y++;
1052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      y3=*y++;
1062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      for (j=0;j<len;j+=4)
1072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      {
1082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         spx_word32_t part1, part2, part3, part4, x0;
1092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         spx_word32_t dead1;
1102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         __asm__ __volatile__ (
1112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#ifdef SHORTCUTS
1121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump               "\tldrsh %10, [%8], #4 \n"
1132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor               "\tmul %4, %10, %0 \n"
1142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor               "\tldrsh %15, [%8], #4 \n"
115ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner               "\tmul %5, %10, %1 \n"
1162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor               "\tldrsh %0, [%9], #2 \n"
1172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor               "\tmul %6, %10, %2 \n"
118e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor               "\tldrsh %1, [%9], #2 \n"
119e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor               "\tmul %7, %10, %3 \n"
120e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
121e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
122ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner               "\tmla %4, %15, %2, %4 \n"
123e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor               "\tldrsh %2, [%9], #2 \n"
124e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor               "\tmla %5, %15, %3, %5 \n"
1253e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt               "\tldrsh %3, [%9], #2 \n"
1263e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt               "\tmla %6, %15, %0, %6 \n"
1273e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt               "\tmla %7, %15, %1, %7 \n"
1283e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt
1293e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt#else
1303e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt               "\tldrsh %10, [%8], #2 \n"
1312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor               "\tmul %4, %10, %0 \n"
1322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor               "\tmul %5, %10, %1 \n"
1331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump               "\tmul %6, %10, %2 \n"
1341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump               "\tmul %7, %10, %3 \n"
1352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
136e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor               "\tldrsh %10, [%8], #2 \n"
137e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor               "\tldrsh %0, [%9], #2 \n"
138e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor               "\tmla %4, %10, %1, %4 \n"
139e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor               "\tmla %5, %10, %2, %5 \n"
140e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor               "\tmla %6, %10, %3, %6 \n"
1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump               "\tmla %7, %10, %0, %7 \n"
1421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
143e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor               "\tldrsh %10, [%8], #2 \n"
144e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor               "\tldrsh %1, [%9], #2 \n"
1452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor               "\tmla %4, %10, %2, %4 \n"
1462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor               "\tmla %5, %10, %3, %5 \n"
1473e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt               "\tmla %6, %10, %0, %6 \n"
1483e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt               "\tmla %7, %10, %1, %7 \n"
1493e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt
1503e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt               "\tldrsh %10, [%8], #2 \n"
1513e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt               "\tldrsh %2, [%9], #2 \n"
1523e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt               "\tmla %4, %10, %3, %4 \n"
1532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor               "\tmla %5, %10, %0, %5 \n"
1542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor               "\tmla %6, %10, %1, %6 \n"
1552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor               "\tmla %7, %10, %2, %7 \n"
1562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1572a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor               "\tldrsh %3, [%9], #2 \n"
1582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#endif
1592def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
1602def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor               "\tldr %10, %11 \n"
161514d3b6b93c83c0841d2f9dd7af8ecc2877fe921Douglas Gregor               "\tldr %15, %12 \n"
162514d3b6b93c83c0841d2f9dd7af8ecc2877fe921Douglas Gregor               "\tadd %4, %10, %4, asr #6 \n"
163514d3b6b93c83c0841d2f9dd7af8ecc2877fe921Douglas Gregor               "\tstr %4, %11 \n"
164514d3b6b93c83c0841d2f9dd7af8ecc2877fe921Douglas Gregor               "\tldr %10, %13 \n"
165514d3b6b93c83c0841d2f9dd7af8ecc2877fe921Douglas Gregor               "\tadd %5, %15, %5, asr #6 \n"
166514d3b6b93c83c0841d2f9dd7af8ecc2877fe921Douglas Gregor               "\tstr %5, %12 \n"
167514d3b6b93c83c0841d2f9dd7af8ecc2877fe921Douglas Gregor               "\tldr %15, %14 \n"
1682def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor               "\tadd %6, %10, %6, asr #6 \n"
1692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor               "\tadd %7, %15, %7, asr #6 \n"
1702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor               "\tstr %6, %13 \n"
1712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor               "\tstr %7, %14 \n"
1722e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor            : "+r" (y0), "+r" (y1), "+r" (y2), "+r" (y3),
1741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         "=r" (part1),  "=r" (part2),  "=r" (part3),  "=r" (part4),
1751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump              "+r" (x), "+r" (y), "=r" (x0), "+m" (sum1),
1762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor              "+m" (sum2), "+m" (sum3), "+m" (sum4), "=r" (dead1)
1772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor            :
1782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor            : "cc", "memory"
1792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor                              );
18051603be62ba78adeb64246b222583dcde4b20b2aDouglas Gregor      }
1812e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      corr[nb_pitch-1-i]=sum1;
1826ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor      corr[nb_pitch-2-i]=sum2;
1836ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor      corr[nb_pitch-3-i]=sum3;
1846ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor      corr[nb_pitch-4-i]=sum4;
1852def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor   }
1862def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
1871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
1881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump