Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 2012
  3.  *      MIPS Technologies, Inc., California.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its
  14.  *    contributors may be used to endorse or promote products derived from
  15.  *    this software without specific prior written permission.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND
  18.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  20.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE
  21.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  22.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  23.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  24.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  25.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  26.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  27.  * SUCH DAMAGE.
  28.  *
  29.  * Author:  Bojan Zivkovic (bojan@mips.com)
  30.  *
  31.  * Compute antialias function optimised for MIPS fixed-point architecture
  32.  *
  33.  * This file is part of FFmpeg.
  34.  *
  35.  * FFmpeg is free software; you can redistribute it and/or
  36.  * modify it under the terms of the GNU Lesser General Public
  37.  * License as published by the Free Software Foundation; either
  38.  * version 2.1 of the License, or (at your option) any later version.
  39.  *
  40.  * FFmpeg is distributed in the hope that it will be useful,
  41.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  42.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  43.  * Lesser General Public License for more details.
  44.  *
  45.  * You should have received a copy of the GNU Lesser General Public
  46.  * License along with FFmpeg; if not, write to the Free Software
  47.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  48.  */
  49.  
  50. /**
  51.  * @file
  52.  * Reference: libavcodec/mpegaudiodec.c
  53.  */
  54.  
  55. #ifndef AVCODEC_MIPS_COMPUTE_ANTIALIAS_FIXED_H
  56. #define AVCODEC_MIPS_COMPUTE_ANTIALIAS_FIXED_H
  57.  
  58. #if HAVE_INLINE_ASM
  59. static void compute_antialias_mips_fixed(MPADecodeContext *s,
  60.                                         GranuleDef *g)
  61. {
  62.     int32_t *ptr, *csa;
  63.     int n, i;
  64.     int MAX_lo = 0xffffffff;
  65.  
  66.     /* we antialias only "long" bands */
  67.     if (g->block_type == 2) {
  68.         if (!g->switch_point)
  69.             return;
  70.         /* XXX: check this for 8000Hz case */
  71.         n = 1;
  72.     } else {
  73.         n = SBLIMIT - 1;
  74.     }
  75.  
  76.  
  77.     ptr = g->sb_hybrid + 18;
  78.  
  79.     for(i = n;i > 0;i--) {
  80.         int tmp0, tmp1, tmp2, tmp00, tmp11;
  81.         int temp_reg1, temp_reg2, temp_reg3, temp_reg4, temp_reg5, temp_reg6;
  82.         csa = &csa_table[0][0];
  83.  
  84.         /**
  85.          * instructions are scheduled to minimize pipeline stall.
  86.          */
  87.         __asm__ volatile (
  88.             "lw   %[tmp0],      -1*4(%[ptr])                            \n\t"
  89.             "lw   %[tmp1],      0*4(%[ptr])                             \n\t"
  90.             "lw   %[temp_reg1], 0*4(%[csa])                             \n\t"
  91.             "lw   %[temp_reg2], 2*4(%[csa])                             \n\t"
  92.             "add  %[tmp2],      %[tmp0],      %[tmp1]                   \n\t"
  93.             "lw   %[temp_reg3], 3*4(%[csa])                             \n\t"
  94.             "mult $ac0,         %[tmp2],      %[temp_reg1]              \n\t"
  95.             "mult $ac1,         %[tmp2],      %[temp_reg1]              \n\t"
  96.             "lw   %[tmp00],     -2*4(%[ptr])                            \n\t"
  97.             "lw   %[tmp11],     1*4(%[ptr])                             \n\t"
  98.             "lw   %[temp_reg4], 4*4(%[csa])                             \n\t"
  99.             "mtlo %[MAX_lo],    $ac0                                    \n\t"
  100.             "mtlo $zero,        $ac1                                    \n\t"
  101.             "msub $ac0,         %[tmp1],      %[temp_reg2]              \n\t"
  102.             "madd $ac1,         %[tmp0],      %[temp_reg3]              \n\t"
  103.             "add  %[tmp2],      %[tmp00],     %[tmp11]                  \n\t"
  104.             "lw   %[temp_reg5], 6*4(%[csa])                             \n\t"
  105.             "mult $ac2,         %[tmp2],      %[temp_reg4]              \n\t"
  106.             "mult $ac3,         %[tmp2],      %[temp_reg4]              \n\t"
  107.             "mfhi %[temp_reg1], $ac0                                    \n\t"
  108.             "mfhi %[temp_reg2], $ac1                                    \n\t"
  109.             "lw   %[temp_reg6], 7*4(%[csa])                             \n\t"
  110.             "mtlo %[MAX_lo],    $ac2                                    \n\t"
  111.             "msub $ac2,         %[tmp11],     %[temp_reg5]              \n\t"
  112.             "mtlo $zero,        $ac3                                    \n\t"
  113.             "madd $ac3,         %[tmp00],     %[temp_reg6]              \n\t"
  114.             "sll  %[temp_reg1], %[temp_reg1], 2                         \n\t"
  115.             "sw   %[temp_reg1], -1*4(%[ptr])                            \n\t"
  116.             "mfhi %[temp_reg4], $ac2                                    \n\t"
  117.             "sll  %[temp_reg2], %[temp_reg2], 2                         \n\t"
  118.             "mfhi %[temp_reg5], $ac3                                    \n\t"
  119.             "sw   %[temp_reg2], 0*4(%[ptr])                             \n\t"
  120.             "lw   %[tmp0],      -3*4(%[ptr])                            \n\t"
  121.             "lw   %[tmp1],      2*4(%[ptr])                             \n\t"
  122.             "lw   %[temp_reg1], 8*4(%[csa])                             \n\t"
  123.             "sll  %[temp_reg4], %[temp_reg4], 2                         \n\t"
  124.             "add  %[tmp2],      %[tmp0],      %[tmp1]                   \n\t"
  125.             "sll  %[temp_reg5], %[temp_reg5], 2                         \n\t"
  126.             "mult $ac0,         %[tmp2],      %[temp_reg1]              \n\t"
  127.             "mult $ac1,         %[tmp2],      %[temp_reg1]              \n\t"
  128.             "sw   %[temp_reg4], -2*4(%[ptr])                            \n\t"
  129.             "sw   %[temp_reg5], 1*4(%[ptr])                             \n\t"
  130.             "lw   %[temp_reg2], 10*4(%[csa])                            \n\t"
  131.             "mtlo %[MAX_lo],    $ac0                                    \n\t"
  132.             "lw   %[temp_reg3], 11*4(%[csa])                            \n\t"
  133.             "msub $ac0,         %[tmp1],      %[temp_reg2]              \n\t"
  134.             "mtlo $zero,        $ac1                                    \n\t"
  135.             "madd $ac1,         %[tmp0],      %[temp_reg3]              \n\t"
  136.             "lw   %[tmp00],     -4*4(%[ptr])                            \n\t"
  137.             "lw   %[tmp11],     3*4(%[ptr])                             \n\t"
  138.             "mfhi %[temp_reg1], $ac0                                    \n\t"
  139.             "lw   %[temp_reg4], 12*4(%[csa])                            \n\t"
  140.             "mfhi %[temp_reg2], $ac1                                    \n\t"
  141.             "add  %[tmp2],      %[tmp00],     %[tmp11]                  \n\t"
  142.             "mult $ac2,         %[tmp2],      %[temp_reg4]              \n\t"
  143.             "mult $ac3,         %[tmp2],      %[temp_reg4]              \n\t"
  144.             "lw   %[temp_reg5], 14*4(%[csa])                            \n\t"
  145.             "lw   %[temp_reg6], 15*4(%[csa])                            \n\t"
  146.             "sll  %[temp_reg1], %[temp_reg1], 2                         \n\t"
  147.             "mtlo %[MAX_lo],    $ac2                                    \n\t"
  148.             "msub $ac2,         %[tmp11],     %[temp_reg5]              \n\t"
  149.             "mtlo $zero,        $ac3                                    \n\t"
  150.             "madd $ac3,         %[tmp00],     %[temp_reg6]              \n\t"
  151.             "sll  %[temp_reg2], %[temp_reg2], 2                         \n\t"
  152.             "sw   %[temp_reg1], -3*4(%[ptr])                            \n\t"
  153.             "mfhi %[temp_reg4], $ac2                                    \n\t"
  154.             "sw   %[temp_reg2], 2*4(%[ptr])                             \n\t"
  155.             "mfhi %[temp_reg5], $ac3                                    \n\t"
  156.             "lw   %[tmp0],      -5*4(%[ptr])                            \n\t"
  157.             "lw   %[tmp1],      4*4(%[ptr])                             \n\t"
  158.             "lw   %[temp_reg1], 16*4(%[csa])                            \n\t"
  159.             "lw   %[temp_reg2], 18*4(%[csa])                            \n\t"
  160.             "add  %[tmp2],      %[tmp0],      %[tmp1]                   \n\t"
  161.             "lw   %[temp_reg3], 19*4(%[csa])                            \n\t"
  162.             "mult $ac0,         %[tmp2],      %[temp_reg1]              \n\t"
  163.             "mult $ac1,         %[tmp2],      %[temp_reg1]              \n\t"
  164.             "sll  %[temp_reg4], %[temp_reg4], 2                         \n\t"
  165.             "sll  %[temp_reg5], %[temp_reg5], 2                         \n\t"
  166.             "sw   %[temp_reg4], -4*4(%[ptr])                            \n\t"
  167.             "mtlo %[MAX_lo],    $ac0                                    \n\t"
  168.             "msub $ac0,         %[tmp1],      %[temp_reg2]              \n\t"
  169.             "mtlo $zero,        $ac1                                    \n\t"
  170.             "madd $ac1,         %[tmp0],      %[temp_reg3]              \n\t"
  171.             "sw   %[temp_reg5], 3*4(%[ptr])                             \n\t"
  172.             "lw   %[tmp00],     -6*4(%[ptr])                            \n\t"
  173.             "mfhi %[temp_reg1], $ac0                                    \n\t"
  174.             "lw   %[tmp11],     5*4(%[ptr])                             \n\t"
  175.             "mfhi %[temp_reg2], $ac1                                    \n\t"
  176.             "lw   %[temp_reg4], 20*4(%[csa])                            \n\t"
  177.             "add  %[tmp2],      %[tmp00],     %[tmp11]                  \n\t"
  178.             "lw   %[temp_reg5], 22*4(%[csa])                            \n\t"
  179.             "mult $ac2,         %[tmp2],      %[temp_reg4]              \n\t"
  180.             "mult $ac3,         %[tmp2],      %[temp_reg4]              \n\t"
  181.             "lw   %[temp_reg6], 23*4(%[csa])                            \n\t"
  182.             "sll  %[temp_reg1], %[temp_reg1], 2                         \n\t"
  183.             "sll  %[temp_reg2], %[temp_reg2], 2                         \n\t"
  184.             "mtlo %[MAX_lo],    $ac2                                    \n\t"
  185.             "msub $ac2,         %[tmp11],     %[temp_reg5]              \n\t"
  186.             "mtlo $zero,        $ac3                                    \n\t"
  187.             "madd $ac3,         %[tmp00],     %[temp_reg6]              \n\t"
  188.             "sw   %[temp_reg1], -5*4(%[ptr])                            \n\t"
  189.             "sw   %[temp_reg2], 4*4(%[ptr])                             \n\t"
  190.             "mfhi %[temp_reg4], $ac2                                    \n\t"
  191.             "lw   %[tmp0],      -7*4(%[ptr])                            \n\t"
  192.             "mfhi %[temp_reg5], $ac3                                    \n\t"
  193.             "lw   %[tmp1],      6*4(%[ptr])                             \n\t"
  194.             "lw   %[temp_reg1], 24*4(%[csa])                            \n\t"
  195.             "lw   %[temp_reg2], 26*4(%[csa])                            \n\t"
  196.             "add  %[tmp2],      %[tmp0],      %[tmp1]                   \n\t"
  197.             "lw   %[temp_reg3], 27*4(%[csa])                            \n\t"
  198.             "mult $ac0,         %[tmp2],      %[temp_reg1]              \n\t"
  199.             "mult $ac1,         %[tmp2],      %[temp_reg1]              \n\t"
  200.             "sll  %[temp_reg4], %[temp_reg4], 2                         \n\t"
  201.             "sll  %[temp_reg5], %[temp_reg5], 2                         \n\t"
  202.             "sw   %[temp_reg4], -6*4(%[ptr])                            \n\t"
  203.             "mtlo %[MAX_lo],    $ac0                                    \n\t"
  204.             "msub $ac0,         %[tmp1],      %[temp_reg2]              \n\t"
  205.             "mtlo $zero,        $ac1                                    \n\t"
  206.             "madd $ac1,         %[tmp0],      %[temp_reg3]              \n\t"
  207.             "sw   %[temp_reg5], 5*4(%[ptr])                             \n\t"
  208.             "lw   %[tmp00],     -8*4(%[ptr])                            \n\t"
  209.             "mfhi %[temp_reg1], $ac0                                    \n\t"
  210.             "lw   %[tmp11],     7*4(%[ptr])                             \n\t"
  211.             "mfhi %[temp_reg2], $ac1                                    \n\t"
  212.             "lw   %[temp_reg4], 28*4(%[csa])                            \n\t"
  213.             "add  %[tmp2],      %[tmp00],     %[tmp11]                  \n\t"
  214.             "lw   %[temp_reg5], 30*4(%[csa])                            \n\t"
  215.             "mult $ac2,         %[tmp2],      %[temp_reg4]              \n\t"
  216.             "mult $ac3,         %[tmp2],      %[temp_reg4]              \n\t"
  217.             "lw   %[temp_reg6], 31*4(%[csa])                            \n\t"
  218.             "sll  %[temp_reg1], %[temp_reg1], 2                         \n\t"
  219.             "sll  %[temp_reg2], %[temp_reg2], 2                         \n\t"
  220.             "mtlo %[MAX_lo],    $ac2                                    \n\t"
  221.             "msub $ac2,         %[tmp11],     %[temp_reg5]              \n\t"
  222.             "mtlo $zero,        $ac3                                    \n\t"
  223.             "madd $ac3,         %[tmp00],     %[temp_reg6]              \n\t"
  224.             "sw   %[temp_reg1], -7*4(%[ptr])                            \n\t"
  225.             "sw   %[temp_reg2], 6*4(%[ptr])                             \n\t"
  226.             "mfhi %[temp_reg4], $ac2                                    \n\t"
  227.             "mfhi %[temp_reg5], $ac3                                    \n\t"
  228.             "sll  %[temp_reg4], %[temp_reg4], 2                         \n\t"
  229.             "sll  %[temp_reg5], %[temp_reg5], 2                         \n\t"
  230.             "sw   %[temp_reg4], -8*4(%[ptr])                            \n\t"
  231.             "sw   %[temp_reg5], 7*4(%[ptr])                             \n\t"
  232.  
  233.             : [tmp0] "=&r" (tmp0), [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2),
  234.               [tmp00] "=&r" (tmp00), [tmp11] "=&r" (tmp11),
  235.               [temp_reg1] "=&r" (temp_reg1), [temp_reg2] "=&r" (temp_reg2),
  236.               [temp_reg3] "=&r" (temp_reg3), [temp_reg4] "=&r" (temp_reg4),
  237.               [temp_reg5] "=&r" (temp_reg5), [temp_reg6] "=&r" (temp_reg6)
  238.             : [csa] "r" (csa), [ptr] "r" (ptr),
  239.               [MAX_lo] "r" (MAX_lo)
  240.             : "memory", "hi", "lo", "$ac1hi", "$ac1lo", "$ac2hi", "$ac2lo",
  241.               "$ac3hi", "$ac3lo"
  242.          );
  243.  
  244.         ptr += 18;
  245.     }
  246. }
  247. #define compute_antialias compute_antialias_mips_fixed
  248. #endif /* HAVE_INLINE_ASM */
  249.  
  250. #endif /* AVCODEC_MIPS_COMPUTE_ANTIALIAS_FIXED_H */
  251.