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: Nedeljko Babic (nbabic@mips.com) 30 * 31 * Math operations optimized for MIPS 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/celp_math.c 53 */ 54#include "config.h" 55#include "libavcodec/celp_math.h" 56 57#if HAVE_INLINE_ASM 58static float ff_dot_productf_mips(const float* a, const float* b, 59 int length) 60{ 61 float sum; 62 const float* a_end = a + length; 63 64 __asm__ volatile ( 65 "mtc1 $zero, %[sum] \n\t" 66 "blez %[length], ff_dot_productf_end%= \n\t" 67 "ff_dot_productf_madd%=: \n\t" 68 "lwc1 $f2, 0(%[a]) \n\t" 69 "lwc1 $f1, 0(%[b]) \n\t" 70 "addiu %[a], %[a], 4 \n\t" 71 "addiu %[b], %[b], 4 \n\t" 72 "madd.s %[sum], %[sum], $f1, $f2 \n\t" 73 "bne %[a], %[a_end], ff_dot_productf_madd%= \n\t" 74 "ff_dot_productf_end%=: \n\t" 75 76 : [sum] "=&f" (sum), [a] "+r" (a), [b] "+r" (b) 77 : [a_end]"r"(a_end), [length] "r" (length) 78 : "$f1", "$f2", "memory" 79 ); 80 return sum; 81} 82#endif /* HAVE_INLINE_ASM */ 83 84void ff_celp_math_init_mips(CELPMContext *c) 85{ 86#if HAVE_INLINE_ASM 87 c->dot_productf = ff_dot_productf_mips; 88#endif 89} 90