filters_arm4.h
资源名称:tcpmp.rar [点击查看]
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:12k
源码类别:
Windows CE
开发平台:
C/C++
- /* Copyright (C) 2004 Jean-Marc Valin
- File: filters_arm4.h
- ARM4-optimized filtering routines
- 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.
- */
- #define OVERRIDE_NORMALIZE16
- int normalize16(const spx_sig_t *x, spx_word16_t *y, int max_scale, int len)
- {
- int i;
- spx_sig_t max_val=1;
- int sig_shift;
- int dead1, dead2, dead3, dead4, dead5, dead6;
- __asm__ __volatile__ (
- "tmov %1, #1 n"
- "tmov %3, #0 n"
- ".normalize16loop1%=: n"
- "tldr %4, [%0], #4 n"
- "tcmps %4, %1 n"
- "tmovgt %1, %4 n"
- "tcmps %4, %3 n"
- "tmovlt %3, %4 n"
- "tsubs %2, %2, #1 n"
- "tbne .normalize16loop1%=n"
- "trsb %3, %3, #0 n"
- "tcmp %1, %3 n"
- "tmovlt %1, %3 n"
- : "=r" (dead1), "=r" (max_val), "=r" (dead3), "=r" (dead4),
- "=r" (dead5), "=r" (dead6)
- : "0" (x), "2" (len)
- : "cc");
- sig_shift=0;
- while (max_val>max_scale)
- {
- sig_shift++;
- max_val >>= 1;
- }
- __asm__ __volatile__ (
- ".normalize16loop%=: n"
- "tldr %4, [%0], #4 n"
- "tldr %5, [%0], #4 n"
- "tmov %4, %4, asr %3 n"
- "tstrh %4, [%1], #2 n"
- "tldr %4, [%0], #4 n"
- "tmov %5, %5, asr %3 n"
- "tstrh %5, [%1], #2 n"
- "tldr %5, [%0], #4 n"
- "tmov %4, %4, asr %3 n"
- "tstrh %4, [%1], #2 n"
- "tsubs %2, %2, #1 n"
- "tmov %5, %5, asr %3 n"
- "tstrh %5, [%1], #2 n"
- "tbge .normalize16loop%=n"
- : "=r" (dead1), "=r" (dead2), "=r" (dead3), "=r" (dead4),
- "=r" (dead5), "=r" (dead6)
- : "0" (x), "1" (y), "2" (len>>2), "3" (sig_shift)
- : "cc", "memory");
- return sig_shift;
- }
- #define OVERRIDE_FILTER_MEM2
- void filter_mem2(const spx_sig_t *x, const spx_coef_t *num, const spx_coef_t *den, spx_sig_t *y, int N, int ord, spx_mem_t *mem)
- {
- int i,j;
- spx_sig_t xi,yi,nyi;
- for (i=0;i<N;i++)
- {
- int deadm, deadn, deadd, deadidx, x1, y1, dead1, dead2, dead3, dead4, dead5, dead6;
- xi=SATURATE(x[i],805306368);
- yi = SATURATE(ADD32(xi, SHL(mem[0],2)),805306368);
- nyi = -yi;
- y[i] = yi;
- __asm__ __volatile__ (
- "tldrsh %6, [%1], #2n"
- "tsmull %8, %9, %4, %6n"
- #ifdef SHORTCUTS
- "tldrsh %6, [%2], #2n"
- "tldr %10, [%0, #4]n"
- "tmov %8, %8, lsr #15n"
- "tsmull %7, %11, %5, %6n"
- "tldrsh %6, [%1], #2n"
- "tadd %8, %8, %9, lsl #17n"
- "tadd %10, %10, %8n"
- "tsmull %8, %9, %4, %6n"
- "tadd %10, %10, %7, lsr #15n"
- "tadd %10, %10, %11, lsl #17n"
- "tstr %10, [%0], #4 n"
- "tldrsh %6, [%2], #2n"
- "tldr %10, [%0, #4]n"
- "tmov %8, %8, lsr #15n"
- "tsmull %7, %11, %5, %6n"
- "tldrsh %6, [%1], #2n"
- "tadd %8, %8, %9, lsl #17n"
- "tadd %10, %10, %8n"
- "tsmull %8, %9, %4, %6n"
- "tadd %10, %10, %7, lsr #15n"
- "tadd %10, %10, %11, lsl #17n"
- "tstr %10, [%0], #4 n"
- "tldrsh %6, [%2], #2n"
- "tldr %10, [%0, #4]n"
- "tmov %8, %8, lsr #15n"
- "tsmull %7, %11, %5, %6n"
- "tldrsh %6, [%1], #2n"
- "tadd %8, %8, %9, lsl #17n"
- "tadd %10, %10, %8n"
- "tsmull %8, %9, %4, %6n"
- "tadd %10, %10, %7, lsr #15n"
- "tadd %10, %10, %11, lsl #17n"
- "tstr %10, [%0], #4 n"
- "tldrsh %6, [%2], #2n"
- "tldr %10, [%0, #4]n"
- "tmov %8, %8, lsr #15n"
- "tsmull %7, %11, %5, %6n"
- "tldrsh %6, [%1], #2n"
- "tadd %8, %8, %9, lsl #17n"
- "tadd %10, %10, %8n"
- "tsmull %8, %9, %4, %6n"
- "tadd %10, %10, %7, lsr #15n"
- "tadd %10, %10, %11, lsl #17n"
- "tstr %10, [%0], #4 n"
- "tldrsh %6, [%2], #2n"
- "tldr %10, [%0, #4]n"
- "tmov %8, %8, lsr #15n"
- "tsmull %7, %11, %5, %6n"
- "tldrsh %6, [%1], #2n"
- "tadd %8, %8, %9, lsl #17n"
- "tadd %10, %10, %8n"
- "tsmull %8, %9, %4, %6n"
- "tadd %10, %10, %7, lsr #15n"
- "tadd %10, %10, %11, lsl #17n"
- "tstr %10, [%0], #4 n"
- "tldrsh %6, [%2], #2n"
- "tldr %10, [%0, #4]n"
- "tmov %8, %8, lsr #15n"
- "tsmull %7, %11, %5, %6n"
- "tldrsh %6, [%1], #2n"
- "tadd %8, %8, %9, lsl #17n"
- "tadd %10, %10, %8n"
- "tsmull %8, %9, %4, %6n"
- "tadd %10, %10, %7, lsr #15n"
- "tadd %10, %10, %11, lsl #17n"
- "tstr %10, [%0], #4 n"
- "tldrsh %6, [%2], #2n"
- "tldr %10, [%0, #4]n"
- "tmov %8, %8, lsr #15n"
- "tsmull %7, %11, %5, %6n"
- "tldrsh %6, [%1], #2n"
- "tadd %8, %8, %9, lsl #17n"
- "tadd %10, %10, %8n"
- "tsmull %8, %9, %4, %6n"
- "tadd %10, %10, %7, lsr #15n"
- "tadd %10, %10, %11, lsl #17n"
- "tstr %10, [%0], #4 n"
- "tldrsh %6, [%2], #2n"
- "tldr %10, [%0, #4]n"
- "tmov %8, %8, lsr #15n"
- "tsmull %7, %11, %5, %6n"
- "tldrsh %6, [%1], #2n"
- "tadd %8, %8, %9, lsl #17n"
- "tadd %10, %10, %8n"
- "tsmull %8, %9, %4, %6n"
- "tadd %10, %10, %7, lsr #15n"
- "tadd %10, %10, %11, lsl #17n"
- "tstr %10, [%0], #4 n"
- "tldrsh %6, [%2], #2n"
- "tldr %10, [%0, #4]n"
- "tmov %8, %8, lsr #15n"
- "tsmull %7, %11, %5, %6n"
- "tldrsh %6, [%1], #2n"
- "tadd %8, %8, %9, lsl #17n"
- "tadd %10, %10, %8n"
- "tsmull %8, %9, %4, %6n"
- "tadd %10, %10, %7, lsr #15n"
- "tadd %10, %10, %11, lsl #17n"
- "tstr %10, [%0], #4 n"
- #else
- ".filterloop%=: n"
- "tldrsh %6, [%2], #2n"
- "tldr %10, [%0, #4]n"
- "tmov %8, %8, lsr #15n"
- "tsmull %7, %11, %5, %6n"
- "tadd %8, %8, %9, lsl #17n"
- "tldrsh %6, [%1], #2n"
- "tadd %10, %10, %8n"
- "tsmull %8, %9, %4, %6n"
- "tadd %10, %10, %7, lsr #15n"
- "tsubs %3, %3, #1n"
- "tadd %10, %10, %11, lsl #17n"
- "tstr %10, [%0], #4 n"
- "t bne .filterloop%=n"
- #endif
- "tmov %8, %8, lsr #15n"
- "tadd %10, %8, %9, lsl #17n"
- "tldrsh %6, [%2], #2n"
- "tsmull %8, %9, %5, %6n"
- "tadd %10, %10, %8, lsr #15n"
- "tadd %10, %10, %9, lsl #17n"
- "tstr %10, [%0], #4 n"
- : "=r" (deadm), "=r" (deadn), "=r" (deadd), "=r" (deadidx),
- "=r" (xi), "=r" (nyi), "=r" (dead1), "=r" (dead2),
- "=r" (dead3), "=r" (dead4), "=r" (dead5), "=r" (dead6)
- : "0" (mem), "1" (num), "2" (den), "3" (ord-1), "4" (xi), "5" (nyi)
- : "cc", "memory");
- }
- }
- #define OVERRIDE_IIR_MEM2
- void iir_mem2(const spx_sig_t *x, const spx_coef_t *den, spx_sig_t *y, int N, int ord, spx_mem_t *mem)
- {
- int i,j;
- spx_sig_t xi,yi,nyi;
- for (i=0;i<N;i++)
- {
- int deadm, deadd, deadidx, dead1, dead2, dead3, dead4, dead5, dead6;
- xi=SATURATE(x[i],805306368);
- yi = SATURATE(ADD32(xi, SHL(mem[0],2)),805306368);
- nyi = -yi;
- y[i] = yi;
- __asm__ __volatile__ (
- "tldrsh %4, [%1], #2n"
- "tsmull %5, %6, %3, %4n"
- #ifdef SHORTCUTS
- "tldrsh %4, [%1], #2n"
- "tmov %5, %5, lsr #15n"
- "tldr %7, [%0, #4]n"
- "tadd %8, %5, %6, lsl #17n"
- "tsmull %5, %6, %3, %4n"
- "tadd %7, %7, %8n"
- "tstr %7, [%0], #4 n"
- "tldrsh %4, [%1], #2n"
- "tmov %5, %5, lsr #15n"
- "tldr %9, [%0, #4]n"
- "tadd %8, %5, %6, lsl #17n"
- "tsmull %5, %6, %3, %4n"
- "tadd %9, %9, %8n"
- "tstr %9, [%0], #4 n"
- "tldrsh %4, [%1], #2n"
- "tmov %5, %5, lsr #15n"
- "tldr %7, [%0, #4]n"
- "tadd %8, %5, %6, lsl #17n"
- "tsmull %5, %6, %3, %4n"
- "tadd %7, %7, %8n"
- "tstr %7, [%0], #4 n"
- "tldrsh %4, [%1], #2n"
- "tmov %5, %5, lsr #15n"
- "tldr %9, [%0, #4]n"
- "tadd %8, %5, %6, lsl #17n"
- "tsmull %5, %6, %3, %4n"
- "tadd %9, %9, %8n"
- "tstr %9, [%0], #4 n"
- "tldrsh %4, [%1], #2n"
- "tmov %5, %5, lsr #15n"
- "tldr %7, [%0, #4]n"
- "tadd %8, %5, %6, lsl #17n"
- "tsmull %5, %6, %3, %4n"
- "tadd %7, %7, %8n"
- "tstr %7, [%0], #4 n"
- "tldrsh %4, [%1], #2n"
- "tmov %5, %5, lsr #15n"
- "tldr %9, [%0, #4]n"
- "tadd %8, %5, %6, lsl #17n"
- "tsmull %5, %6, %3, %4n"
- "tadd %9, %9, %8n"
- "tstr %9, [%0], #4 n"
- "tldrsh %4, [%1], #2n"
- "tmov %5, %5, lsr #15n"
- "tldr %7, [%0, #4]n"
- "tadd %8, %5, %6, lsl #17n"
- "tsmull %5, %6, %3, %4n"
- "tadd %7, %7, %8n"
- "tstr %7, [%0], #4 n"
- "tldrsh %4, [%1], #2n"
- "tmov %5, %5, lsr #15n"
- "tldr %9, [%0, #4]n"
- "tadd %8, %5, %6, lsl #17n"
- "tsmull %5, %6, %3, %4n"
- "tadd %9, %9, %8n"
- "tstr %9, [%0], #4 n"
- "tldrsh %4, [%1], #2n"
- "tmov %5, %5, lsr #15n"
- "tldr %7, [%0, #4]n"
- "tadd %8, %5, %6, lsl #17n"
- "tsmull %5, %6, %3, %4n"
- "tadd %7, %7, %8n"
- "tstr %7, [%0], #4 n"
- #else
- ".iirloop%=: n"
- "tldr %7, [%0, #4]n"
- "tldrsh %4, [%1], #2n"
- "tmov %5, %5, lsr #15n"
- "tadd %8, %5, %6, lsl #17n"
- "tsmull %5, %6, %3, %4n"
- "tadd %7, %7, %8n"
- "tstr %7, [%0], #4 n"
- "tsubs %2, %2, #1n"
- "t bne .iirloop%=n"
- #endif
- "tmov %5, %5, lsr #15n"
- "tadd %7, %5, %6, lsl #17n"
- "tstr %7, [%0], #4 n"
- : "=r" (deadm), "=r" (deadd), "=r" (deadidx), "=r" (nyi),
- "=r" (dead1), "=r" (dead2), "=r" (dead3), "=r" (dead4),
- "=r" (dead5), "=r" (dead6)
- : "0" (mem), "1" (den), "2" (ord-1), "3" (nyi)
- : "cc", "memory");
- }
- }