1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2012 3cabdff1aSopenharmony_ci * MIPS Technologies, Inc., California. 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * Redistribution and use in source and binary forms, with or without 6cabdff1aSopenharmony_ci * modification, are permitted provided that the following conditions 7cabdff1aSopenharmony_ci * are met: 8cabdff1aSopenharmony_ci * 1. Redistributions of source code must retain the above copyright 9cabdff1aSopenharmony_ci * notice, this list of conditions and the following disclaimer. 10cabdff1aSopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright 11cabdff1aSopenharmony_ci * notice, this list of conditions and the following disclaimer in the 12cabdff1aSopenharmony_ci * documentation and/or other materials provided with the distribution. 13cabdff1aSopenharmony_ci * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its 14cabdff1aSopenharmony_ci * contributors may be used to endorse or promote products derived from 15cabdff1aSopenharmony_ci * this software without specific prior written permission. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND 18cabdff1aSopenharmony_ci * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19cabdff1aSopenharmony_ci * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20cabdff1aSopenharmony_ci * ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE 21cabdff1aSopenharmony_ci * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22cabdff1aSopenharmony_ci * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23cabdff1aSopenharmony_ci * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24cabdff1aSopenharmony_ci * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25cabdff1aSopenharmony_ci * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26cabdff1aSopenharmony_ci * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27cabdff1aSopenharmony_ci * SUCH DAMAGE. 28cabdff1aSopenharmony_ci * 29cabdff1aSopenharmony_ci * Authors: Darko Laus (darko@mips.com) 30cabdff1aSopenharmony_ci * Djordje Pesut (djordje@mips.com) 31cabdff1aSopenharmony_ci * Mirjana Vulin (mvulin@mips.com) 32cabdff1aSopenharmony_ci * 33cabdff1aSopenharmony_ci * AAC Spectral Band Replication decoding functions optimized for MIPS 34cabdff1aSopenharmony_ci * 35cabdff1aSopenharmony_ci * This file is part of FFmpeg. 36cabdff1aSopenharmony_ci * 37cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 38cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 39cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 40cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 41cabdff1aSopenharmony_ci * 42cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 43cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 44cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 45cabdff1aSopenharmony_ci * Lesser General Public License for more details. 46cabdff1aSopenharmony_ci * 47cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 48cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 49cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 50cabdff1aSopenharmony_ci */ 51cabdff1aSopenharmony_ci 52cabdff1aSopenharmony_ci/** 53cabdff1aSopenharmony_ci * @file 54cabdff1aSopenharmony_ci * Reference: libavcodec/aacdec.c 55cabdff1aSopenharmony_ci */ 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_ci#ifndef AVCODEC_MIPS_AACDEC_MIPS_H 58cabdff1aSopenharmony_ci#define AVCODEC_MIPS_AACDEC_MIPS_H 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_ci#include "libavcodec/aac.h" 61cabdff1aSopenharmony_ci#include "libavutil/mips/asmdefs.h" 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_ci#if HAVE_INLINE_ASM && HAVE_MIPSFPU 64cabdff1aSopenharmony_ci#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6 65cabdff1aSopenharmony_cistatic inline float *VMUL2_mips(float *dst, const float *v, unsigned idx, 66cabdff1aSopenharmony_ci const float *scale) 67cabdff1aSopenharmony_ci{ 68cabdff1aSopenharmony_ci float temp0, temp1, temp2; 69cabdff1aSopenharmony_ci int temp3, temp4; 70cabdff1aSopenharmony_ci float *ret; 71cabdff1aSopenharmony_ci 72cabdff1aSopenharmony_ci __asm__ volatile( 73cabdff1aSopenharmony_ci "andi %[temp3], %[idx], 0x0F \n\t" 74cabdff1aSopenharmony_ci "andi %[temp4], %[idx], 0xF0 \n\t" 75cabdff1aSopenharmony_ci "sll %[temp3], %[temp3], 2 \n\t" 76cabdff1aSopenharmony_ci "srl %[temp4], %[temp4], 2 \n\t" 77cabdff1aSopenharmony_ci "lwc1 %[temp2], 0(%[scale]) \n\t" 78cabdff1aSopenharmony_ci "lwxc1 %[temp0], %[temp3](%[v]) \n\t" 79cabdff1aSopenharmony_ci "lwxc1 %[temp1], %[temp4](%[v]) \n\t" 80cabdff1aSopenharmony_ci "mul.s %[temp0], %[temp0], %[temp2] \n\t" 81cabdff1aSopenharmony_ci "mul.s %[temp1], %[temp1], %[temp2] \n\t" 82cabdff1aSopenharmony_ci PTR_ADDIU "%[ret], %[dst], 8 \n\t" 83cabdff1aSopenharmony_ci "swc1 %[temp0], 0(%[dst]) \n\t" 84cabdff1aSopenharmony_ci "swc1 %[temp1], 4(%[dst]) \n\t" 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci : [temp0]"=&f"(temp0), [temp1]"=&f"(temp1), 87cabdff1aSopenharmony_ci [temp2]"=&f"(temp2), [temp3]"=&r"(temp3), 88cabdff1aSopenharmony_ci [temp4]"=&r"(temp4), [ret]"=&r"(ret) 89cabdff1aSopenharmony_ci : [idx]"r"(idx), [scale]"r"(scale), [v]"r"(v), 90cabdff1aSopenharmony_ci [dst]"r"(dst) 91cabdff1aSopenharmony_ci : "memory" 92cabdff1aSopenharmony_ci ); 93cabdff1aSopenharmony_ci return ret; 94cabdff1aSopenharmony_ci} 95cabdff1aSopenharmony_ci 96cabdff1aSopenharmony_cistatic inline float *VMUL4_mips(float *dst, const float *v, unsigned idx, 97cabdff1aSopenharmony_ci const float *scale) 98cabdff1aSopenharmony_ci{ 99cabdff1aSopenharmony_ci int temp0, temp1, temp2, temp3; 100cabdff1aSopenharmony_ci float temp4, temp5, temp6, temp7, temp8; 101cabdff1aSopenharmony_ci float *ret; 102cabdff1aSopenharmony_ci 103cabdff1aSopenharmony_ci __asm__ volatile( 104cabdff1aSopenharmony_ci "andi %[temp0], %[idx], 0x03 \n\t" 105cabdff1aSopenharmony_ci "andi %[temp1], %[idx], 0x0C \n\t" 106cabdff1aSopenharmony_ci "andi %[temp2], %[idx], 0x30 \n\t" 107cabdff1aSopenharmony_ci "andi %[temp3], %[idx], 0xC0 \n\t" 108cabdff1aSopenharmony_ci "sll %[temp0], %[temp0], 2 \n\t" 109cabdff1aSopenharmony_ci "srl %[temp2], %[temp2], 2 \n\t" 110cabdff1aSopenharmony_ci "srl %[temp3], %[temp3], 4 \n\t" 111cabdff1aSopenharmony_ci "lwc1 %[temp4], 0(%[scale]) \n\t" 112cabdff1aSopenharmony_ci "lwxc1 %[temp5], %[temp0](%[v]) \n\t" 113cabdff1aSopenharmony_ci "lwxc1 %[temp6], %[temp1](%[v]) \n\t" 114cabdff1aSopenharmony_ci "lwxc1 %[temp7], %[temp2](%[v]) \n\t" 115cabdff1aSopenharmony_ci "lwxc1 %[temp8], %[temp3](%[v]) \n\t" 116cabdff1aSopenharmony_ci "mul.s %[temp5], %[temp5], %[temp4] \n\t" 117cabdff1aSopenharmony_ci "mul.s %[temp6], %[temp6], %[temp4] \n\t" 118cabdff1aSopenharmony_ci "mul.s %[temp7], %[temp7], %[temp4] \n\t" 119cabdff1aSopenharmony_ci "mul.s %[temp8], %[temp8], %[temp4] \n\t" 120cabdff1aSopenharmony_ci PTR_ADDIU "%[ret], %[dst], 16 \n\t" 121cabdff1aSopenharmony_ci "swc1 %[temp5], 0(%[dst]) \n\t" 122cabdff1aSopenharmony_ci "swc1 %[temp6], 4(%[dst]) \n\t" 123cabdff1aSopenharmony_ci "swc1 %[temp7], 8(%[dst]) \n\t" 124cabdff1aSopenharmony_ci "swc1 %[temp8], 12(%[dst]) \n\t" 125cabdff1aSopenharmony_ci 126cabdff1aSopenharmony_ci : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), 127cabdff1aSopenharmony_ci [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), 128cabdff1aSopenharmony_ci [temp4]"=&f"(temp4), [temp5]"=&f"(temp5), 129cabdff1aSopenharmony_ci [temp6]"=&f"(temp6), [temp7]"=&f"(temp7), 130cabdff1aSopenharmony_ci [temp8]"=&f"(temp8), [ret]"=&r"(ret) 131cabdff1aSopenharmony_ci : [idx]"r"(idx), [scale]"r"(scale), [v]"r"(v), 132cabdff1aSopenharmony_ci [dst]"r"(dst) 133cabdff1aSopenharmony_ci : "memory" 134cabdff1aSopenharmony_ci ); 135cabdff1aSopenharmony_ci return ret; 136cabdff1aSopenharmony_ci} 137cabdff1aSopenharmony_ci 138cabdff1aSopenharmony_cistatic inline float *VMUL2S_mips(float *dst, const float *v, unsigned idx, 139cabdff1aSopenharmony_ci unsigned sign, const float *scale) 140cabdff1aSopenharmony_ci{ 141cabdff1aSopenharmony_ci int temp0, temp1, temp2, temp3, temp4, temp5; 142cabdff1aSopenharmony_ci float temp6, temp7, temp8, temp9; 143cabdff1aSopenharmony_ci float *ret; 144cabdff1aSopenharmony_ci 145cabdff1aSopenharmony_ci __asm__ volatile( 146cabdff1aSopenharmony_ci "andi %[temp0], %[idx], 0x0F \n\t" 147cabdff1aSopenharmony_ci "andi %[temp1], %[idx], 0xF0 \n\t" 148cabdff1aSopenharmony_ci "lw %[temp4], 0(%[scale]) \n\t" 149cabdff1aSopenharmony_ci "srl %[temp2], %[sign], 1 \n\t" 150cabdff1aSopenharmony_ci "sll %[temp3], %[sign], 31 \n\t" 151cabdff1aSopenharmony_ci "sll %[temp2], %[temp2], 31 \n\t" 152cabdff1aSopenharmony_ci "sll %[temp0], %[temp0], 2 \n\t" 153cabdff1aSopenharmony_ci "srl %[temp1], %[temp1], 2 \n\t" 154cabdff1aSopenharmony_ci "lwxc1 %[temp8], %[temp0](%[v]) \n\t" 155cabdff1aSopenharmony_ci "lwxc1 %[temp9], %[temp1](%[v]) \n\t" 156cabdff1aSopenharmony_ci "xor %[temp5], %[temp4], %[temp2] \n\t" 157cabdff1aSopenharmony_ci "xor %[temp4], %[temp4], %[temp3] \n\t" 158cabdff1aSopenharmony_ci "mtc1 %[temp5], %[temp6] \n\t" 159cabdff1aSopenharmony_ci "mtc1 %[temp4], %[temp7] \n\t" 160cabdff1aSopenharmony_ci "mul.s %[temp8], %[temp8], %[temp6] \n\t" 161cabdff1aSopenharmony_ci "mul.s %[temp9], %[temp9], %[temp7] \n\t" 162cabdff1aSopenharmony_ci PTR_ADDIU "%[ret], %[dst], 8 \n\t" 163cabdff1aSopenharmony_ci "swc1 %[temp8], 0(%[dst]) \n\t" 164cabdff1aSopenharmony_ci "swc1 %[temp9], 4(%[dst]) \n\t" 165cabdff1aSopenharmony_ci 166cabdff1aSopenharmony_ci : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), 167cabdff1aSopenharmony_ci [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), 168cabdff1aSopenharmony_ci [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), 169cabdff1aSopenharmony_ci [temp6]"=&f"(temp6), [temp7]"=&f"(temp7), 170cabdff1aSopenharmony_ci [temp8]"=&f"(temp8), [temp9]"=&f"(temp9), 171cabdff1aSopenharmony_ci [ret]"=&r"(ret) 172cabdff1aSopenharmony_ci : [idx]"r"(idx), [scale]"r"(scale), [v]"r"(v), 173cabdff1aSopenharmony_ci [dst]"r"(dst), [sign]"r"(sign) 174cabdff1aSopenharmony_ci : "memory" 175cabdff1aSopenharmony_ci ); 176cabdff1aSopenharmony_ci return ret; 177cabdff1aSopenharmony_ci} 178cabdff1aSopenharmony_ci 179cabdff1aSopenharmony_cistatic inline float *VMUL4S_mips(float *dst, const float *v, unsigned idx, 180cabdff1aSopenharmony_ci unsigned sign, const float *scale) 181cabdff1aSopenharmony_ci{ 182cabdff1aSopenharmony_ci int temp0, temp1, temp2, temp3, temp4; 183cabdff1aSopenharmony_ci float temp10, temp11, temp12, temp13, temp14, temp15, temp16, temp17; 184cabdff1aSopenharmony_ci float *ret; 185cabdff1aSopenharmony_ci unsigned int mask = 1U << 31; 186cabdff1aSopenharmony_ci 187cabdff1aSopenharmony_ci __asm__ volatile( 188cabdff1aSopenharmony_ci "lw %[temp0], 0(%[scale]) \n\t" 189cabdff1aSopenharmony_ci "andi %[temp1], %[idx], 0x03 \n\t" 190cabdff1aSopenharmony_ci "andi %[temp2], %[idx], 0x0C \n\t" 191cabdff1aSopenharmony_ci "andi %[temp3], %[idx], 0x30 \n\t" 192cabdff1aSopenharmony_ci "andi %[temp4], %[idx], 0xC0 \n\t" 193cabdff1aSopenharmony_ci "sll %[temp1], %[temp1], 2 \n\t" 194cabdff1aSopenharmony_ci "srl %[temp3], %[temp3], 2 \n\t" 195cabdff1aSopenharmony_ci "srl %[temp4], %[temp4], 4 \n\t" 196cabdff1aSopenharmony_ci "lwxc1 %[temp10], %[temp1](%[v]) \n\t" 197cabdff1aSopenharmony_ci "lwxc1 %[temp11], %[temp2](%[v]) \n\t" 198cabdff1aSopenharmony_ci "lwxc1 %[temp12], %[temp3](%[v]) \n\t" 199cabdff1aSopenharmony_ci "lwxc1 %[temp13], %[temp4](%[v]) \n\t" 200cabdff1aSopenharmony_ci "and %[temp1], %[sign], %[mask] \n\t" 201cabdff1aSopenharmony_ci "srl %[temp2], %[idx], 12 \n\t" 202cabdff1aSopenharmony_ci "srl %[temp3], %[idx], 13 \n\t" 203cabdff1aSopenharmony_ci "srl %[temp4], %[idx], 14 \n\t" 204cabdff1aSopenharmony_ci "andi %[temp2], %[temp2], 1 \n\t" 205cabdff1aSopenharmony_ci "andi %[temp3], %[temp3], 1 \n\t" 206cabdff1aSopenharmony_ci "andi %[temp4], %[temp4], 1 \n\t" 207cabdff1aSopenharmony_ci "sllv %[sign], %[sign], %[temp2] \n\t" 208cabdff1aSopenharmony_ci "xor %[temp1], %[temp0], %[temp1] \n\t" 209cabdff1aSopenharmony_ci "and %[temp2], %[sign], %[mask] \n\t" 210cabdff1aSopenharmony_ci "mtc1 %[temp1], %[temp14] \n\t" 211cabdff1aSopenharmony_ci "xor %[temp2], %[temp0], %[temp2] \n\t" 212cabdff1aSopenharmony_ci "sllv %[sign], %[sign], %[temp3] \n\t" 213cabdff1aSopenharmony_ci "mtc1 %[temp2], %[temp15] \n\t" 214cabdff1aSopenharmony_ci "and %[temp3], %[sign], %[mask] \n\t" 215cabdff1aSopenharmony_ci "sllv %[sign], %[sign], %[temp4] \n\t" 216cabdff1aSopenharmony_ci "xor %[temp3], %[temp0], %[temp3] \n\t" 217cabdff1aSopenharmony_ci "and %[temp4], %[sign], %[mask] \n\t" 218cabdff1aSopenharmony_ci "mtc1 %[temp3], %[temp16] \n\t" 219cabdff1aSopenharmony_ci "xor %[temp4], %[temp0], %[temp4] \n\t" 220cabdff1aSopenharmony_ci "mtc1 %[temp4], %[temp17] \n\t" 221cabdff1aSopenharmony_ci "mul.s %[temp10], %[temp10], %[temp14] \n\t" 222cabdff1aSopenharmony_ci "mul.s %[temp11], %[temp11], %[temp15] \n\t" 223cabdff1aSopenharmony_ci "mul.s %[temp12], %[temp12], %[temp16] \n\t" 224cabdff1aSopenharmony_ci "mul.s %[temp13], %[temp13], %[temp17] \n\t" 225cabdff1aSopenharmony_ci PTR_ADDIU "%[ret], %[dst], 16 \n\t" 226cabdff1aSopenharmony_ci "swc1 %[temp10], 0(%[dst]) \n\t" 227cabdff1aSopenharmony_ci "swc1 %[temp11], 4(%[dst]) \n\t" 228cabdff1aSopenharmony_ci "swc1 %[temp12], 8(%[dst]) \n\t" 229cabdff1aSopenharmony_ci "swc1 %[temp13], 12(%[dst]) \n\t" 230cabdff1aSopenharmony_ci 231cabdff1aSopenharmony_ci : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), 232cabdff1aSopenharmony_ci [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), 233cabdff1aSopenharmony_ci [temp4]"=&r"(temp4), [temp10]"=&f"(temp10), 234cabdff1aSopenharmony_ci [temp11]"=&f"(temp11), [temp12]"=&f"(temp12), 235cabdff1aSopenharmony_ci [temp13]"=&f"(temp13), [temp14]"=&f"(temp14), 236cabdff1aSopenharmony_ci [temp15]"=&f"(temp15), [temp16]"=&f"(temp16), 237cabdff1aSopenharmony_ci [temp17]"=&f"(temp17), [ret]"=&r"(ret), 238cabdff1aSopenharmony_ci [sign]"+r"(sign) 239cabdff1aSopenharmony_ci : [idx]"r"(idx), [scale]"r"(scale), [v]"r"(v), 240cabdff1aSopenharmony_ci [dst]"r"(dst), [mask]"r"(mask) 241cabdff1aSopenharmony_ci : "memory" 242cabdff1aSopenharmony_ci ); 243cabdff1aSopenharmony_ci return ret; 244cabdff1aSopenharmony_ci} 245cabdff1aSopenharmony_ci 246cabdff1aSopenharmony_ci#define VMUL2 VMUL2_mips 247cabdff1aSopenharmony_ci#define VMUL4 VMUL4_mips 248cabdff1aSopenharmony_ci#define VMUL2S VMUL2S_mips 249cabdff1aSopenharmony_ci#define VMUL4S VMUL4S_mips 250cabdff1aSopenharmony_ci#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */ 251cabdff1aSopenharmony_ci#endif /* HAVE_INLINE_ASM && HAVE_MIPSFPU */ 252cabdff1aSopenharmony_ci 253cabdff1aSopenharmony_ci#endif /* AVCODEC_MIPS_AACDEC_MIPS_H */ 254