annotate ffmpeg/libavcodec/mips/compute_antialias_float.h @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * Copyright (c) 2012
yading@10 3 * MIPS Technologies, Inc., California.
yading@10 4 *
yading@10 5 * Redistribution and use in source and binary forms, with or without
yading@10 6 * modification, are permitted provided that the following conditions
yading@10 7 * are met:
yading@10 8 * 1. Redistributions of source code must retain the above copyright
yading@10 9 * notice, this list of conditions and the following disclaimer.
yading@10 10 * 2. Redistributions in binary form must reproduce the above copyright
yading@10 11 * notice, this list of conditions and the following disclaimer in the
yading@10 12 * documentation and/or other materials provided with the distribution.
yading@10 13 * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its
yading@10 14 * contributors may be used to endorse or promote products derived from
yading@10 15 * this software without specific prior written permission.
yading@10 16 *
yading@10 17 * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND
yading@10 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
yading@10 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
yading@10 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE
yading@10 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
yading@10 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
yading@10 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
yading@10 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
yading@10 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
yading@10 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
yading@10 27 * SUCH DAMAGE.
yading@10 28 *
yading@10 29 * Author: Bojan Zivkovic (bojan@mips.com)
yading@10 30 *
yading@10 31 * Compute antialias function optimised for MIPS floating-point architecture
yading@10 32 *
yading@10 33 * This file is part of FFmpeg.
yading@10 34 *
yading@10 35 * FFmpeg is free software; you can redistribute it and/or
yading@10 36 * modify it under the terms of the GNU Lesser General Public
yading@10 37 * License as published by the Free Software Foundation; either
yading@10 38 * version 2.1 of the License, or (at your option) any later version.
yading@10 39 *
yading@10 40 * FFmpeg is distributed in the hope that it will be useful,
yading@10 41 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 42 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 43 * Lesser General Public License for more details.
yading@10 44 *
yading@10 45 * You should have received a copy of the GNU Lesser General Public
yading@10 46 * License along with FFmpeg; if not, write to the Free Software
yading@10 47 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 48 */
yading@10 49
yading@10 50 /**
yading@10 51 * @file
yading@10 52 * Reference: libavcodec/mpegaudiodec.c
yading@10 53 */
yading@10 54
yading@10 55 #ifndef AVCODEC_MIPS_COMPUTE_ANTIALIAS_FLOAT_H
yading@10 56 #define AVCODEC_MIPS_COMPUTE_ANTIALIAS_FLOAT_H
yading@10 57
yading@10 58 #if HAVE_INLINE_ASM
yading@10 59 static void compute_antialias_mips_float(MPADecodeContext *s,
yading@10 60 GranuleDef *g)
yading@10 61 {
yading@10 62 float *ptr, *ptr_end;
yading@10 63 float *csa = &csa_table[0][0];
yading@10 64 int n;
yading@10 65 /* temporary variables */
yading@10 66 float in1, in2, in3, in4, in5, in6, in7, in8;
yading@10 67 float out1, out2, out3, out4;
yading@10 68
yading@10 69 ptr = g->sb_hybrid + 18;
yading@10 70 /* we antialias only "long" bands */
yading@10 71 if (g->block_type == 2) {
yading@10 72 if (!g->switch_point)
yading@10 73 return;
yading@10 74 /* XXX: check this for 8000Hz case */
yading@10 75 n = 1;
yading@10 76 ptr_end = ptr + 18;
yading@10 77 } else {
yading@10 78 n = 31;
yading@10 79 ptr_end = ptr + 558;
yading@10 80 }
yading@10 81
yading@10 82 /**
yading@10 83 * instructions are scheduled to minimize pipeline stall.
yading@10 84 */
yading@10 85
yading@10 86 __asm__ volatile (
yading@10 87 "compute_antialias_float_loop%=: \t\n"
yading@10 88 "lwc1 %[in1], -1*4(%[ptr]) \t\n"
yading@10 89 "lwc1 %[in2], 0(%[csa]) \t\n"
yading@10 90 "lwc1 %[in3], 1*4(%[csa]) \t\n"
yading@10 91 "lwc1 %[in4], 0(%[ptr]) \t\n"
yading@10 92 "lwc1 %[in5], -2*4(%[ptr]) \t\n"
yading@10 93 "lwc1 %[in6], 4*4(%[csa]) \t\n"
yading@10 94 "mul.s %[out1], %[in1], %[in2] \t\n"
yading@10 95 "mul.s %[out2], %[in1], %[in3] \t\n"
yading@10 96 "lwc1 %[in7], 5*4(%[csa]) \t\n"
yading@10 97 "lwc1 %[in8], 1*4(%[ptr]) \t\n"
yading@10 98 "nmsub.s %[out1], %[out1], %[in3], %[in4] \t\n"
yading@10 99 "madd.s %[out2], %[out2], %[in2], %[in4] \t\n"
yading@10 100 "mul.s %[out3], %[in5], %[in6] \t\n"
yading@10 101 "mul.s %[out4], %[in5], %[in7] \t\n"
yading@10 102 "lwc1 %[in1], -3*4(%[ptr]) \t\n"
yading@10 103 "swc1 %[out1], -1*4(%[ptr]) \t\n"
yading@10 104 "swc1 %[out2], 0(%[ptr]) \t\n"
yading@10 105 "nmsub.s %[out3], %[out3], %[in7], %[in8] \t\n"
yading@10 106 "madd.s %[out4], %[out4], %[in6], %[in8] \t\n"
yading@10 107 "lwc1 %[in2], 8*4(%[csa]) \t\n"
yading@10 108 "swc1 %[out3], -2*4(%[ptr]) \t\n"
yading@10 109 "swc1 %[out4], 1*4(%[ptr]) \t\n"
yading@10 110 "lwc1 %[in3], 9*4(%[csa]) \t\n"
yading@10 111 "lwc1 %[in4], 2*4(%[ptr]) \t\n"
yading@10 112 "mul.s %[out1], %[in1], %[in2] \t\n"
yading@10 113 "lwc1 %[in5], -4*4(%[ptr]) \t\n"
yading@10 114 "lwc1 %[in6], 12*4(%[csa]) \t\n"
yading@10 115 "mul.s %[out2], %[in1], %[in3] \t\n"
yading@10 116 "lwc1 %[in7], 13*4(%[csa]) \t\n"
yading@10 117 "nmsub.s %[out1], %[out1], %[in3], %[in4] \t\n"
yading@10 118 "lwc1 %[in8], 3*4(%[ptr]) \t\n"
yading@10 119 "mul.s %[out3], %[in5], %[in6] \t\n"
yading@10 120 "madd.s %[out2], %[out2], %[in2], %[in4] \t\n"
yading@10 121 "mul.s %[out4], %[in5], %[in7] \t\n"
yading@10 122 "swc1 %[out1], -3*4(%[ptr]) \t\n"
yading@10 123 "lwc1 %[in1], -5*4(%[ptr]) \t\n"
yading@10 124 "nmsub.s %[out3], %[out3], %[in7], %[in8] \t\n"
yading@10 125 "swc1 %[out2], 2*4(%[ptr]) \t\n"
yading@10 126 "madd.s %[out4], %[out4], %[in6], %[in8] \t\n"
yading@10 127 "lwc1 %[in2], 16*4(%[csa]) \t\n"
yading@10 128 "lwc1 %[in3], 17*4(%[csa]) \t\n"
yading@10 129 "swc1 %[out3], -4*4(%[ptr]) \t\n"
yading@10 130 "lwc1 %[in4], 4*4(%[ptr]) \t\n"
yading@10 131 "swc1 %[out4], 3*4(%[ptr]) \t\n"
yading@10 132 "mul.s %[out1], %[in1], %[in2] \t\n"
yading@10 133 "mul.s %[out2], %[in1], %[in3] \t\n"
yading@10 134 "lwc1 %[in5], -6*4(%[ptr]) \t\n"
yading@10 135 "lwc1 %[in6], 20*4(%[csa]) \t\n"
yading@10 136 "lwc1 %[in7], 21*4(%[csa]) \t\n"
yading@10 137 "nmsub.s %[out1], %[out1], %[in3], %[in4] \t\n"
yading@10 138 "madd.s %[out2], %[out2], %[in2], %[in4] \t\n"
yading@10 139 "lwc1 %[in8], 5*4(%[ptr]) \t\n"
yading@10 140 "mul.s %[out3], %[in5], %[in6] \t\n"
yading@10 141 "mul.s %[out4], %[in5], %[in7] \t\n"
yading@10 142 "swc1 %[out1], -5*4(%[ptr]) \t\n"
yading@10 143 "swc1 %[out2], 4*4(%[ptr]) \t\n"
yading@10 144 "lwc1 %[in1], -7*4(%[ptr]) \t\n"
yading@10 145 "nmsub.s %[out3], %[out3], %[in7], %[in8] \t\n"
yading@10 146 "madd.s %[out4], %[out4], %[in6], %[in8] \t\n"
yading@10 147 "lwc1 %[in2], 24*4(%[csa]) \t\n"
yading@10 148 "lwc1 %[in3], 25*4(%[csa]) \t\n"
yading@10 149 "lwc1 %[in4], 6*4(%[ptr]) \t\n"
yading@10 150 "swc1 %[out3], -6*4(%[ptr]) \t\n"
yading@10 151 "swc1 %[out4], 5*4(%[ptr]) \t\n"
yading@10 152 "mul.s %[out1], %[in1], %[in2] \t\n"
yading@10 153 "lwc1 %[in5], -8*4(%[ptr]) \t\n"
yading@10 154 "mul.s %[out2], %[in1], %[in3] \t\n"
yading@10 155 "lwc1 %[in6], 28*4(%[csa]) \t\n"
yading@10 156 "lwc1 %[in7], 29*4(%[csa]) \t\n"
yading@10 157 "nmsub.s %[out1], %[out1], %[in3], %[in4] \t\n"
yading@10 158 "lwc1 %[in8], 7*4(%[ptr]) \t\n"
yading@10 159 "madd.s %[out2], %[out2], %[in2], %[in4] \t\n"
yading@10 160 "mul.s %[out3], %[in5], %[in6] \t\n"
yading@10 161 "mul.s %[out4], %[in5], %[in7] \t\n"
yading@10 162 "swc1 %[out1], -7*4(%[ptr]) \t\n"
yading@10 163 "swc1 %[out2], 6*4(%[ptr]) \t\n"
yading@10 164 "addiu %[ptr], %[ptr], 72 \t\n"
yading@10 165 "nmsub.s %[out3], %[out3], %[in7], %[in8] \t\n"
yading@10 166 "madd.s %[out4], %[out4], %[in6], %[in8] \t\n"
yading@10 167 "swc1 %[out3], -26*4(%[ptr]) \t\n"
yading@10 168 "swc1 %[out4], -11*4(%[ptr]) \t\n"
yading@10 169 "bne %[ptr], %[ptr_end], compute_antialias_float_loop%= \t\n"
yading@10 170
yading@10 171 : [ptr] "+r" (ptr),
yading@10 172 [in1] "=&f" (in1), [in2] "=&f" (in2),
yading@10 173 [in3] "=&f" (in3), [in4] "=&f" (in4),
yading@10 174 [in5] "=&f" (in5), [in6] "=&f" (in6),
yading@10 175 [in7] "=&f" (in7), [in8] "=&f" (in8),
yading@10 176 [out1] "=&f" (out1), [out2] "=&f" (out2),
yading@10 177 [out3] "=&f" (out3), [out4] "=&f" (out4)
yading@10 178 : [csa] "r" (csa), [ptr_end] "r" (ptr_end)
yading@10 179 : "memory"
yading@10 180 );
yading@10 181 }
yading@10 182 #define compute_antialias compute_antialias_mips_float
yading@10 183 #endif /* HAVE_INLINE_ASM */
yading@10 184
yading@10 185 #endif /* AVCODEC_MIPS_COMPUTE_ANTIALIAS_FLOAT_H */