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 * Author: Stanislav Ocovaj (socovaj@mips.com) 30cabdff1aSopenharmony_ci * Author: Zoran Lukic (zoranl@mips.com) 31cabdff1aSopenharmony_ci * 32cabdff1aSopenharmony_ci * Optimized MDCT/IMDCT and FFT transforms 33cabdff1aSopenharmony_ci * 34cabdff1aSopenharmony_ci * This file is part of FFmpeg. 35cabdff1aSopenharmony_ci * 36cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 37cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 38cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 39cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 40cabdff1aSopenharmony_ci * 41cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 42cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 43cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 44cabdff1aSopenharmony_ci * Lesser General Public License for more details. 45cabdff1aSopenharmony_ci * 46cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 47cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 48cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 49cabdff1aSopenharmony_ci */ 50cabdff1aSopenharmony_ci#include "config.h" 51cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 52cabdff1aSopenharmony_ci#include "libavcodec/fft.h" 53cabdff1aSopenharmony_ci#include "libavcodec/fft_table.h" 54cabdff1aSopenharmony_ci#include "libavutil/mips/asmdefs.h" 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_ci/** 57cabdff1aSopenharmony_ci * FFT transform 58cabdff1aSopenharmony_ci */ 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_ci#if HAVE_INLINE_ASM 61cabdff1aSopenharmony_ci#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6 62cabdff1aSopenharmony_cistatic void ff_fft_calc_mips(FFTContext *s, FFTComplex *z) 63cabdff1aSopenharmony_ci{ 64cabdff1aSopenharmony_ci int nbits, i, n, num_transforms, offset, step; 65cabdff1aSopenharmony_ci int n4, n2, n34; 66cabdff1aSopenharmony_ci FFTSample tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8; 67cabdff1aSopenharmony_ci FFTComplex *tmpz; 68cabdff1aSopenharmony_ci float w_re, w_im; 69cabdff1aSopenharmony_ci float *w_re_ptr, *w_im_ptr; 70cabdff1aSopenharmony_ci const int fft_size = (1 << s->nbits); 71cabdff1aSopenharmony_ci float pom, pom1, pom2, pom3; 72cabdff1aSopenharmony_ci float temp, temp1, temp3, temp4; 73cabdff1aSopenharmony_ci FFTComplex * tmpz_n2, * tmpz_n34, * tmpz_n4; 74cabdff1aSopenharmony_ci FFTComplex * tmpz_n2_i, * tmpz_n34_i, * tmpz_n4_i, * tmpz_i; 75cabdff1aSopenharmony_ci float f1 = 0.7071067812; 76cabdff1aSopenharmony_ci 77cabdff1aSopenharmony_ci num_transforms = (21845 >> (17 - s->nbits)) | 1; 78cabdff1aSopenharmony_ci 79cabdff1aSopenharmony_ci for (n=0; n<num_transforms; n++) { 80cabdff1aSopenharmony_ci offset = ff_fft_offsets_lut[n] << 2; 81cabdff1aSopenharmony_ci tmpz = z + offset; 82cabdff1aSopenharmony_ci 83cabdff1aSopenharmony_ci tmp1 = tmpz[0].re + tmpz[1].re; 84cabdff1aSopenharmony_ci tmp5 = tmpz[2].re + tmpz[3].re; 85cabdff1aSopenharmony_ci tmp2 = tmpz[0].im + tmpz[1].im; 86cabdff1aSopenharmony_ci tmp6 = tmpz[2].im + tmpz[3].im; 87cabdff1aSopenharmony_ci tmp3 = tmpz[0].re - tmpz[1].re; 88cabdff1aSopenharmony_ci tmp8 = tmpz[2].im - tmpz[3].im; 89cabdff1aSopenharmony_ci tmp4 = tmpz[0].im - tmpz[1].im; 90cabdff1aSopenharmony_ci tmp7 = tmpz[2].re - tmpz[3].re; 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_ci tmpz[0].re = tmp1 + tmp5; 93cabdff1aSopenharmony_ci tmpz[2].re = tmp1 - tmp5; 94cabdff1aSopenharmony_ci tmpz[0].im = tmp2 + tmp6; 95cabdff1aSopenharmony_ci tmpz[2].im = tmp2 - tmp6; 96cabdff1aSopenharmony_ci tmpz[1].re = tmp3 + tmp8; 97cabdff1aSopenharmony_ci tmpz[3].re = tmp3 - tmp8; 98cabdff1aSopenharmony_ci tmpz[1].im = tmp4 - tmp7; 99cabdff1aSopenharmony_ci tmpz[3].im = tmp4 + tmp7; 100cabdff1aSopenharmony_ci 101cabdff1aSopenharmony_ci } 102cabdff1aSopenharmony_ci 103cabdff1aSopenharmony_ci if (fft_size < 8) 104cabdff1aSopenharmony_ci return; 105cabdff1aSopenharmony_ci 106cabdff1aSopenharmony_ci num_transforms = (num_transforms >> 1) | 1; 107cabdff1aSopenharmony_ci 108cabdff1aSopenharmony_ci for (n=0; n<num_transforms; n++) { 109cabdff1aSopenharmony_ci offset = ff_fft_offsets_lut[n] << 3; 110cabdff1aSopenharmony_ci tmpz = z + offset; 111cabdff1aSopenharmony_ci 112cabdff1aSopenharmony_ci __asm__ volatile ( 113cabdff1aSopenharmony_ci "lwc1 %[tmp1], 32(%[tmpz]) \n\t" 114cabdff1aSopenharmony_ci "lwc1 %[pom], 40(%[tmpz]) \n\t" 115cabdff1aSopenharmony_ci "lwc1 %[tmp3], 48(%[tmpz]) \n\t" 116cabdff1aSopenharmony_ci "lwc1 %[pom1], 56(%[tmpz]) \n\t" 117cabdff1aSopenharmony_ci "lwc1 %[tmp2], 36(%[tmpz]) \n\t" 118cabdff1aSopenharmony_ci "lwc1 %[pom2], 44(%[tmpz]) \n\t" 119cabdff1aSopenharmony_ci "lwc1 %[pom3], 60(%[tmpz]) \n\t" 120cabdff1aSopenharmony_ci "lwc1 %[tmp4], 52(%[tmpz]) \n\t" 121cabdff1aSopenharmony_ci "add.s %[tmp1], %[tmp1], %[pom] \n\t" // tmp1 = tmpz[4].re + tmpz[5].re; 122cabdff1aSopenharmony_ci "add.s %[tmp3], %[tmp3], %[pom1] \n\t" // tmp3 = tmpz[6].re + tmpz[7].re; 123cabdff1aSopenharmony_ci "add.s %[tmp2], %[tmp2], %[pom2] \n\t" // tmp2 = tmpz[4].im + tmpz[5].im; 124cabdff1aSopenharmony_ci "lwc1 %[pom], 40(%[tmpz]) \n\t" 125cabdff1aSopenharmony_ci "add.s %[tmp4], %[tmp4], %[pom3] \n\t" // tmp4 = tmpz[6].im + tmpz[7].im; 126cabdff1aSopenharmony_ci "add.s %[tmp5], %[tmp1], %[tmp3] \n\t" // tmp5 = tmp1 + tmp3; 127cabdff1aSopenharmony_ci "sub.s %[tmp7], %[tmp1], %[tmp3] \n\t" // tmp7 = tmp1 - tmp3; 128cabdff1aSopenharmony_ci "lwc1 %[tmp1], 32(%[tmpz]) \n\t" 129cabdff1aSopenharmony_ci "lwc1 %[pom1], 44(%[tmpz]) \n\t" 130cabdff1aSopenharmony_ci "add.s %[tmp6], %[tmp2], %[tmp4] \n\t" // tmp6 = tmp2 + tmp4; 131cabdff1aSopenharmony_ci "sub.s %[tmp8], %[tmp2], %[tmp4] \n\t" // tmp8 = tmp2 - tmp4; 132cabdff1aSopenharmony_ci "lwc1 %[tmp2], 36(%[tmpz]) \n\t" 133cabdff1aSopenharmony_ci "lwc1 %[pom2], 56(%[tmpz]) \n\t" 134cabdff1aSopenharmony_ci "lwc1 %[pom3], 60(%[tmpz]) \n\t" 135cabdff1aSopenharmony_ci "lwc1 %[tmp3], 48(%[tmpz]) \n\t" 136cabdff1aSopenharmony_ci "lwc1 %[tmp4], 52(%[tmpz]) \n\t" 137cabdff1aSopenharmony_ci "sub.s %[tmp1], %[tmp1], %[pom] \n\t" // tmp1 = tmpz[4].re - tmpz[5].re; 138cabdff1aSopenharmony_ci "lwc1 %[pom], 0(%[tmpz]) \n\t" 139cabdff1aSopenharmony_ci "sub.s %[tmp2], %[tmp2], %[pom1] \n\t" // tmp2 = tmpz[4].im - tmpz[5].im; 140cabdff1aSopenharmony_ci "sub.s %[tmp3], %[tmp3], %[pom2] \n\t" // tmp3 = tmpz[6].re - tmpz[7].re; 141cabdff1aSopenharmony_ci "lwc1 %[pom2], 4(%[tmpz]) \n\t" 142cabdff1aSopenharmony_ci "sub.s %[pom1], %[pom], %[tmp5] \n\t" 143cabdff1aSopenharmony_ci "sub.s %[tmp4], %[tmp4], %[pom3] \n\t" // tmp4 = tmpz[6].im - tmpz[7].im; 144cabdff1aSopenharmony_ci "add.s %[pom3], %[pom], %[tmp5] \n\t" 145cabdff1aSopenharmony_ci "sub.s %[pom], %[pom2], %[tmp6] \n\t" 146cabdff1aSopenharmony_ci "add.s %[pom2], %[pom2], %[tmp6] \n\t" 147cabdff1aSopenharmony_ci "swc1 %[pom1], 32(%[tmpz]) \n\t" // tmpz[4].re = tmpz[0].re - tmp5; 148cabdff1aSopenharmony_ci "swc1 %[pom3], 0(%[tmpz]) \n\t" // tmpz[0].re = tmpz[0].re + tmp5; 149cabdff1aSopenharmony_ci "swc1 %[pom], 36(%[tmpz]) \n\t" // tmpz[4].im = tmpz[0].im - tmp6; 150cabdff1aSopenharmony_ci "swc1 %[pom2], 4(%[tmpz]) \n\t" // tmpz[0].im = tmpz[0].im + tmp6; 151cabdff1aSopenharmony_ci "lwc1 %[pom1], 16(%[tmpz]) \n\t" 152cabdff1aSopenharmony_ci "lwc1 %[pom3], 20(%[tmpz]) \n\t" 153cabdff1aSopenharmony_ci "add.s %[temp1],%[tmp1], %[tmp2] \n\t" 154cabdff1aSopenharmony_ci "sub.s %[temp], %[pom1], %[tmp8] \n\t" 155cabdff1aSopenharmony_ci "add.s %[pom2], %[pom3], %[tmp7] \n\t" 156cabdff1aSopenharmony_ci "sub.s %[temp3],%[tmp3], %[tmp4] \n\t" 157cabdff1aSopenharmony_ci "sub.s %[temp4],%[tmp2], %[tmp1] \n\t" 158cabdff1aSopenharmony_ci "swc1 %[temp], 48(%[tmpz]) \n\t" // tmpz[6].re = tmpz[2].re - tmp8; 159cabdff1aSopenharmony_ci "swc1 %[pom2], 52(%[tmpz]) \n\t" // tmpz[6].im = tmpz[2].im + tmp7; 160cabdff1aSopenharmony_ci "add.s %[pom1], %[pom1], %[tmp8] \n\t" 161cabdff1aSopenharmony_ci "sub.s %[pom3], %[pom3], %[tmp7] \n\t" 162cabdff1aSopenharmony_ci "add.s %[tmp3], %[tmp3], %[tmp4] \n\t" 163cabdff1aSopenharmony_ci "mul.s %[tmp5], %[f1], %[temp1] \n\t" // tmp5 = pom * (tmp1 + tmp2); 164cabdff1aSopenharmony_ci "mul.s %[tmp7], %[f1], %[temp3] \n\t" // tmp7 = pom * (tmp3 - tmp4); 165cabdff1aSopenharmony_ci "mul.s %[tmp6], %[f1], %[temp4] \n\t" // tmp6 = pom * (tmp2 - tmp1); 166cabdff1aSopenharmony_ci "mul.s %[tmp8], %[f1], %[tmp3] \n\t" // tmp8 = pom * (tmp3 + tmp4); 167cabdff1aSopenharmony_ci "swc1 %[pom1], 16(%[tmpz]) \n\t" // tmpz[2].re = tmpz[2].re + tmp8; 168cabdff1aSopenharmony_ci "swc1 %[pom3], 20(%[tmpz]) \n\t" // tmpz[2].im = tmpz[2].im - tmp7; 169cabdff1aSopenharmony_ci "add.s %[tmp1], %[tmp5], %[tmp7] \n\t" // tmp1 = tmp5 + tmp7; 170cabdff1aSopenharmony_ci "sub.s %[tmp3], %[tmp5], %[tmp7] \n\t" // tmp3 = tmp5 - tmp7; 171cabdff1aSopenharmony_ci "add.s %[tmp2], %[tmp6], %[tmp8] \n\t" // tmp2 = tmp6 + tmp8; 172cabdff1aSopenharmony_ci "sub.s %[tmp4], %[tmp6], %[tmp8] \n\t" // tmp4 = tmp6 - tmp8; 173cabdff1aSopenharmony_ci "lwc1 %[temp], 8(%[tmpz]) \n\t" 174cabdff1aSopenharmony_ci "lwc1 %[temp1],12(%[tmpz]) \n\t" 175cabdff1aSopenharmony_ci "lwc1 %[pom], 24(%[tmpz]) \n\t" 176cabdff1aSopenharmony_ci "lwc1 %[pom2], 28(%[tmpz]) \n\t" 177cabdff1aSopenharmony_ci "sub.s %[temp4],%[temp], %[tmp1] \n\t" 178cabdff1aSopenharmony_ci "sub.s %[temp3],%[temp1], %[tmp2] \n\t" 179cabdff1aSopenharmony_ci "add.s %[temp], %[temp], %[tmp1] \n\t" 180cabdff1aSopenharmony_ci "add.s %[temp1],%[temp1], %[tmp2] \n\t" 181cabdff1aSopenharmony_ci "sub.s %[pom1], %[pom], %[tmp4] \n\t" 182cabdff1aSopenharmony_ci "add.s %[pom3], %[pom2], %[tmp3] \n\t" 183cabdff1aSopenharmony_ci "add.s %[pom], %[pom], %[tmp4] \n\t" 184cabdff1aSopenharmony_ci "sub.s %[pom2], %[pom2], %[tmp3] \n\t" 185cabdff1aSopenharmony_ci "swc1 %[temp4],40(%[tmpz]) \n\t" // tmpz[5].re = tmpz[1].re - tmp1; 186cabdff1aSopenharmony_ci "swc1 %[temp3],44(%[tmpz]) \n\t" // tmpz[5].im = tmpz[1].im - tmp2; 187cabdff1aSopenharmony_ci "swc1 %[temp], 8(%[tmpz]) \n\t" // tmpz[1].re = tmpz[1].re + tmp1; 188cabdff1aSopenharmony_ci "swc1 %[temp1],12(%[tmpz]) \n\t" // tmpz[1].im = tmpz[1].im + tmp2; 189cabdff1aSopenharmony_ci "swc1 %[pom1], 56(%[tmpz]) \n\t" // tmpz[7].re = tmpz[3].re - tmp4; 190cabdff1aSopenharmony_ci "swc1 %[pom3], 60(%[tmpz]) \n\t" // tmpz[7].im = tmpz[3].im + tmp3; 191cabdff1aSopenharmony_ci "swc1 %[pom], 24(%[tmpz]) \n\t" // tmpz[3].re = tmpz[3].re + tmp4; 192cabdff1aSopenharmony_ci "swc1 %[pom2], 28(%[tmpz]) \n\t" // tmpz[3].im = tmpz[3].im - tmp3; 193cabdff1aSopenharmony_ci : [tmp1]"=&f"(tmp1), [pom]"=&f"(pom), [pom1]"=&f"(pom1), [pom2]"=&f"(pom2), 194cabdff1aSopenharmony_ci [tmp3]"=&f"(tmp3), [tmp2]"=&f"(tmp2), [tmp4]"=&f"(tmp4), [tmp5]"=&f"(tmp5), [tmp7]"=&f"(tmp7), 195cabdff1aSopenharmony_ci [tmp6]"=&f"(tmp6), [tmp8]"=&f"(tmp8), [pom3]"=&f"(pom3),[temp]"=&f"(temp), [temp1]"=&f"(temp1), 196cabdff1aSopenharmony_ci [temp3]"=&f"(temp3), [temp4]"=&f"(temp4) 197cabdff1aSopenharmony_ci : [tmpz]"r"(tmpz), [f1]"f"(f1) 198cabdff1aSopenharmony_ci : "memory" 199cabdff1aSopenharmony_ci ); 200cabdff1aSopenharmony_ci } 201cabdff1aSopenharmony_ci 202cabdff1aSopenharmony_ci step = 1 << (MAX_LOG2_NFFT - 4); 203cabdff1aSopenharmony_ci n4 = 4; 204cabdff1aSopenharmony_ci 205cabdff1aSopenharmony_ci for (nbits=4; nbits<=s->nbits; nbits++) { 206cabdff1aSopenharmony_ci num_transforms = (num_transforms >> 1) | 1; 207cabdff1aSopenharmony_ci n2 = 2 * n4; 208cabdff1aSopenharmony_ci n34 = 3 * n4; 209cabdff1aSopenharmony_ci 210cabdff1aSopenharmony_ci for (n=0; n<num_transforms; n++) { 211cabdff1aSopenharmony_ci offset = ff_fft_offsets_lut[n] << nbits; 212cabdff1aSopenharmony_ci tmpz = z + offset; 213cabdff1aSopenharmony_ci 214cabdff1aSopenharmony_ci tmpz_n2 = tmpz + n2; 215cabdff1aSopenharmony_ci tmpz_n4 = tmpz + n4; 216cabdff1aSopenharmony_ci tmpz_n34 = tmpz + n34; 217cabdff1aSopenharmony_ci 218cabdff1aSopenharmony_ci __asm__ volatile ( 219cabdff1aSopenharmony_ci "lwc1 %[pom1], 0(%[tmpz_n2]) \n\t" 220cabdff1aSopenharmony_ci "lwc1 %[pom], 0(%[tmpz_n34]) \n\t" 221cabdff1aSopenharmony_ci "lwc1 %[pom2], 4(%[tmpz_n2]) \n\t" 222cabdff1aSopenharmony_ci "lwc1 %[pom3], 4(%[tmpz_n34]) \n\t" 223cabdff1aSopenharmony_ci "lwc1 %[temp1],0(%[tmpz]) \n\t" 224cabdff1aSopenharmony_ci "lwc1 %[temp3],4(%[tmpz]) \n\t" 225cabdff1aSopenharmony_ci "add.s %[tmp5], %[pom1], %[pom] \n\t" // tmp5 = tmpz[ n2].re + tmpz[n34].re; 226cabdff1aSopenharmony_ci "sub.s %[tmp1], %[pom1], %[pom] \n\t" // tmp1 = tmpz[ n2].re - tmpz[n34].re; 227cabdff1aSopenharmony_ci "add.s %[tmp6], %[pom2], %[pom3] \n\t" // tmp6 = tmpz[ n2].im + tmpz[n34].im; 228cabdff1aSopenharmony_ci "sub.s %[tmp2], %[pom2], %[pom3] \n\t" // tmp2 = tmpz[ n2].im - tmpz[n34].im; 229cabdff1aSopenharmony_ci "sub.s %[temp], %[temp1], %[tmp5] \n\t" 230cabdff1aSopenharmony_ci "add.s %[temp1],%[temp1], %[tmp5] \n\t" 231cabdff1aSopenharmony_ci "sub.s %[temp4],%[temp3], %[tmp6] \n\t" 232cabdff1aSopenharmony_ci "add.s %[temp3],%[temp3], %[tmp6] \n\t" 233cabdff1aSopenharmony_ci "swc1 %[temp], 0(%[tmpz_n2]) \n\t" // tmpz[ n2].re = tmpz[ 0].re - tmp5; 234cabdff1aSopenharmony_ci "swc1 %[temp1],0(%[tmpz]) \n\t" // tmpz[ 0].re = tmpz[ 0].re + tmp5; 235cabdff1aSopenharmony_ci "lwc1 %[pom1], 0(%[tmpz_n4]) \n\t" 236cabdff1aSopenharmony_ci "swc1 %[temp4],4(%[tmpz_n2]) \n\t" // tmpz[ n2].im = tmpz[ 0].im - tmp6; 237cabdff1aSopenharmony_ci "lwc1 %[temp], 4(%[tmpz_n4]) \n\t" 238cabdff1aSopenharmony_ci "swc1 %[temp3],4(%[tmpz]) \n\t" // tmpz[ 0].im = tmpz[ 0].im + tmp6; 239cabdff1aSopenharmony_ci "sub.s %[pom], %[pom1], %[tmp2] \n\t" 240cabdff1aSopenharmony_ci "add.s %[pom1], %[pom1], %[tmp2] \n\t" 241cabdff1aSopenharmony_ci "add.s %[temp1],%[temp], %[tmp1] \n\t" 242cabdff1aSopenharmony_ci "sub.s %[temp], %[temp], %[tmp1] \n\t" 243cabdff1aSopenharmony_ci "swc1 %[pom], 0(%[tmpz_n34]) \n\t" // tmpz[n34].re = tmpz[n4].re - tmp2; 244cabdff1aSopenharmony_ci "swc1 %[pom1], 0(%[tmpz_n4]) \n\t" // tmpz[ n4].re = tmpz[n4].re + tmp2; 245cabdff1aSopenharmony_ci "swc1 %[temp1],4(%[tmpz_n34]) \n\t" // tmpz[n34].im = tmpz[n4].im + tmp1; 246cabdff1aSopenharmony_ci "swc1 %[temp], 4(%[tmpz_n4]) \n\t" // tmpz[ n4].im = tmpz[n4].im - tmp1; 247cabdff1aSopenharmony_ci : [tmp5]"=&f"(tmp5), 248cabdff1aSopenharmony_ci [tmp1]"=&f"(tmp1), [pom]"=&f"(pom), [pom1]"=&f"(pom1), [pom2]"=&f"(pom2), 249cabdff1aSopenharmony_ci [tmp2]"=&f"(tmp2), [tmp6]"=&f"(tmp6), [pom3]"=&f"(pom3), 250cabdff1aSopenharmony_ci [temp]"=&f"(temp), [temp1]"=&f"(temp1), [temp3]"=&f"(temp3), [temp4]"=&f"(temp4) 251cabdff1aSopenharmony_ci : [tmpz]"r"(tmpz), [tmpz_n2]"r"(tmpz_n2), [tmpz_n34]"r"(tmpz_n34), [tmpz_n4]"r"(tmpz_n4) 252cabdff1aSopenharmony_ci : "memory" 253cabdff1aSopenharmony_ci ); 254cabdff1aSopenharmony_ci 255cabdff1aSopenharmony_ci w_re_ptr = (float*)(ff_cos_131072 + step); 256cabdff1aSopenharmony_ci w_im_ptr = (float*)(ff_cos_131072 + MAX_FFT_SIZE/4 - step); 257cabdff1aSopenharmony_ci 258cabdff1aSopenharmony_ci for (i=1; i<n4; i++) { 259cabdff1aSopenharmony_ci w_re = w_re_ptr[0]; 260cabdff1aSopenharmony_ci w_im = w_im_ptr[0]; 261cabdff1aSopenharmony_ci tmpz_n2_i = tmpz_n2 + i; 262cabdff1aSopenharmony_ci tmpz_n4_i = tmpz_n4 + i; 263cabdff1aSopenharmony_ci tmpz_n34_i= tmpz_n34 + i; 264cabdff1aSopenharmony_ci tmpz_i = tmpz + i; 265cabdff1aSopenharmony_ci 266cabdff1aSopenharmony_ci __asm__ volatile ( 267cabdff1aSopenharmony_ci "lwc1 %[temp], 0(%[tmpz_n2_i]) \n\t" 268cabdff1aSopenharmony_ci "lwc1 %[temp1], 4(%[tmpz_n2_i]) \n\t" 269cabdff1aSopenharmony_ci "lwc1 %[pom], 0(%[tmpz_n34_i]) \n\t" 270cabdff1aSopenharmony_ci "lwc1 %[pom1], 4(%[tmpz_n34_i]) \n\t" 271cabdff1aSopenharmony_ci "mul.s %[temp3], %[w_im], %[temp] \n\t" 272cabdff1aSopenharmony_ci "mul.s %[temp4], %[w_im], %[temp1] \n\t" 273cabdff1aSopenharmony_ci "mul.s %[pom2], %[w_im], %[pom1] \n\t" 274cabdff1aSopenharmony_ci "mul.s %[pom3], %[w_im], %[pom] \n\t" 275cabdff1aSopenharmony_ci "msub.s %[tmp2], %[temp3], %[w_re], %[temp1] \n\t" // tmp2 = w_re * tmpz[ n2+i].im - w_im * tmpz[ n2+i].re; 276cabdff1aSopenharmony_ci "madd.s %[tmp1], %[temp4], %[w_re], %[temp] \n\t" // tmp1 = w_re * tmpz[ n2+i].re + w_im * tmpz[ n2+i].im; 277cabdff1aSopenharmony_ci "msub.s %[tmp3], %[pom2], %[w_re], %[pom] \n\t" // tmp3 = w_re * tmpz[n34+i].re - w_im * tmpz[n34+i].im; 278cabdff1aSopenharmony_ci "madd.s %[tmp4], %[pom3], %[w_re], %[pom1] \n\t" // tmp4 = w_re * tmpz[n34+i].im + w_im * tmpz[n34+i].re; 279cabdff1aSopenharmony_ci "lwc1 %[temp], 0(%[tmpz_i]) \n\t" 280cabdff1aSopenharmony_ci "lwc1 %[pom], 4(%[tmpz_i]) \n\t" 281cabdff1aSopenharmony_ci "add.s %[tmp5], %[tmp1], %[tmp3] \n\t" // tmp5 = tmp1 + tmp3; 282cabdff1aSopenharmony_ci "sub.s %[tmp1], %[tmp1], %[tmp3] \n\t" // tmp1 = tmp1 - tmp3; 283cabdff1aSopenharmony_ci "add.s %[tmp6], %[tmp2], %[tmp4] \n\t" // tmp6 = tmp2 + tmp4; 284cabdff1aSopenharmony_ci "sub.s %[tmp2], %[tmp2], %[tmp4] \n\t" // tmp2 = tmp2 - tmp4; 285cabdff1aSopenharmony_ci "sub.s %[temp1], %[temp], %[tmp5] \n\t" 286cabdff1aSopenharmony_ci "add.s %[temp], %[temp], %[tmp5] \n\t" 287cabdff1aSopenharmony_ci "sub.s %[pom1], %[pom], %[tmp6] \n\t" 288cabdff1aSopenharmony_ci "add.s %[pom], %[pom], %[tmp6] \n\t" 289cabdff1aSopenharmony_ci "lwc1 %[temp3], 0(%[tmpz_n4_i]) \n\t" 290cabdff1aSopenharmony_ci "lwc1 %[pom2], 4(%[tmpz_n4_i]) \n\t" 291cabdff1aSopenharmony_ci "swc1 %[temp1], 0(%[tmpz_n2_i]) \n\t" // tmpz[ n2+i].re = tmpz[ i].re - tmp5; 292cabdff1aSopenharmony_ci "swc1 %[temp], 0(%[tmpz_i]) \n\t" // tmpz[ i].re = tmpz[ i].re + tmp5; 293cabdff1aSopenharmony_ci "swc1 %[pom1], 4(%[tmpz_n2_i]) \n\t" // tmpz[ n2+i].im = tmpz[ i].im - tmp6; 294cabdff1aSopenharmony_ci "swc1 %[pom] , 4(%[tmpz_i]) \n\t" // tmpz[ i].im = tmpz[ i].im + tmp6; 295cabdff1aSopenharmony_ci "sub.s %[temp4], %[temp3], %[tmp2] \n\t" 296cabdff1aSopenharmony_ci "add.s %[pom3], %[pom2], %[tmp1] \n\t" 297cabdff1aSopenharmony_ci "add.s %[temp3], %[temp3], %[tmp2] \n\t" 298cabdff1aSopenharmony_ci "sub.s %[pom2], %[pom2], %[tmp1] \n\t" 299cabdff1aSopenharmony_ci "swc1 %[temp4], 0(%[tmpz_n34_i]) \n\t" // tmpz[n34+i].re = tmpz[n4+i].re - tmp2; 300cabdff1aSopenharmony_ci "swc1 %[pom3], 4(%[tmpz_n34_i]) \n\t" // tmpz[n34+i].im = tmpz[n4+i].im + tmp1; 301cabdff1aSopenharmony_ci "swc1 %[temp3], 0(%[tmpz_n4_i]) \n\t" // tmpz[ n4+i].re = tmpz[n4+i].re + tmp2; 302cabdff1aSopenharmony_ci "swc1 %[pom2], 4(%[tmpz_n4_i]) \n\t" // tmpz[ n4+i].im = tmpz[n4+i].im - tmp1; 303cabdff1aSopenharmony_ci : [tmp1]"=&f"(tmp1), [tmp2]"=&f" (tmp2), [temp]"=&f"(temp), [tmp3]"=&f"(tmp3), 304cabdff1aSopenharmony_ci [tmp4]"=&f"(tmp4), [tmp5]"=&f"(tmp5), [tmp6]"=&f"(tmp6), 305cabdff1aSopenharmony_ci [temp1]"=&f"(temp1), [temp3]"=&f"(temp3), [temp4]"=&f"(temp4), 306cabdff1aSopenharmony_ci [pom]"=&f"(pom), [pom1]"=&f"(pom1), [pom2]"=&f"(pom2), [pom3]"=&f"(pom3) 307cabdff1aSopenharmony_ci : [w_re]"f"(w_re), [w_im]"f"(w_im), 308cabdff1aSopenharmony_ci [tmpz_i]"r"(tmpz_i),[tmpz_n2_i]"r"(tmpz_n2_i), 309cabdff1aSopenharmony_ci [tmpz_n34_i]"r"(tmpz_n34_i), [tmpz_n4_i]"r"(tmpz_n4_i) 310cabdff1aSopenharmony_ci : "memory" 311cabdff1aSopenharmony_ci ); 312cabdff1aSopenharmony_ci w_re_ptr += step; 313cabdff1aSopenharmony_ci w_im_ptr -= step; 314cabdff1aSopenharmony_ci } 315cabdff1aSopenharmony_ci } 316cabdff1aSopenharmony_ci step >>= 1; 317cabdff1aSopenharmony_ci n4 <<= 1; 318cabdff1aSopenharmony_ci } 319cabdff1aSopenharmony_ci} 320cabdff1aSopenharmony_ci 321cabdff1aSopenharmony_ci/** 322cabdff1aSopenharmony_ci * MDCT/IMDCT transforms. 323cabdff1aSopenharmony_ci */ 324cabdff1aSopenharmony_ci 325cabdff1aSopenharmony_cistatic void ff_imdct_half_mips(FFTContext *s, FFTSample *output, const FFTSample *input) 326cabdff1aSopenharmony_ci{ 327cabdff1aSopenharmony_ci int k, n8, n4, n2, n, j; 328cabdff1aSopenharmony_ci const uint16_t *revtab = s->revtab; 329cabdff1aSopenharmony_ci const FFTSample *tcos = s->tcos; 330cabdff1aSopenharmony_ci const FFTSample *tsin = s->tsin; 331cabdff1aSopenharmony_ci const FFTSample *in1, *in2, *in3, *in4; 332cabdff1aSopenharmony_ci FFTComplex *z = (FFTComplex *)output; 333cabdff1aSopenharmony_ci 334cabdff1aSopenharmony_ci int j1; 335cabdff1aSopenharmony_ci const float *tcos1, *tsin1, *tcos2, *tsin2; 336cabdff1aSopenharmony_ci float temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, 337cabdff1aSopenharmony_ci temp9, temp10, temp11, temp12, temp13, temp14, temp15, temp16; 338cabdff1aSopenharmony_ci FFTComplex *z1, *z2; 339cabdff1aSopenharmony_ci 340cabdff1aSopenharmony_ci n = 1 << s->mdct_bits; 341cabdff1aSopenharmony_ci n2 = n >> 1; 342cabdff1aSopenharmony_ci n4 = n >> 2; 343cabdff1aSopenharmony_ci n8 = n >> 3; 344cabdff1aSopenharmony_ci 345cabdff1aSopenharmony_ci /* pre rotation */ 346cabdff1aSopenharmony_ci in1 = input; 347cabdff1aSopenharmony_ci in2 = input + n2 - 1; 348cabdff1aSopenharmony_ci in3 = input + 2; 349cabdff1aSopenharmony_ci in4 = input + n2 - 3; 350cabdff1aSopenharmony_ci 351cabdff1aSopenharmony_ci tcos1 = tcos; 352cabdff1aSopenharmony_ci tsin1 = tsin; 353cabdff1aSopenharmony_ci 354cabdff1aSopenharmony_ci /* n4 = 64 or 128 */ 355cabdff1aSopenharmony_ci for(k = 0; k < n4; k += 2) { 356cabdff1aSopenharmony_ci j = revtab[k ]; 357cabdff1aSopenharmony_ci j1 = revtab[k + 1]; 358cabdff1aSopenharmony_ci 359cabdff1aSopenharmony_ci __asm__ volatile ( 360cabdff1aSopenharmony_ci "lwc1 %[temp1], 0(%[in2]) \t\n" 361cabdff1aSopenharmony_ci "lwc1 %[temp2], 0(%[tcos1]) \t\n" 362cabdff1aSopenharmony_ci "lwc1 %[temp3], 0(%[tsin1]) \t\n" 363cabdff1aSopenharmony_ci "lwc1 %[temp4], 0(%[in1]) \t\n" 364cabdff1aSopenharmony_ci "lwc1 %[temp5], 0(%[in4]) \t\n" 365cabdff1aSopenharmony_ci "mul.s %[temp9], %[temp1], %[temp2] \t\n" 366cabdff1aSopenharmony_ci "mul.s %[temp10], %[temp1], %[temp3] \t\n" 367cabdff1aSopenharmony_ci "lwc1 %[temp6], 4(%[tcos1]) \t\n" 368cabdff1aSopenharmony_ci "lwc1 %[temp7], 4(%[tsin1]) \t\n" 369cabdff1aSopenharmony_ci "nmsub.s %[temp9], %[temp9], %[temp4], %[temp3] \t\n" 370cabdff1aSopenharmony_ci "madd.s %[temp10], %[temp10], %[temp4], %[temp2] \t\n" 371cabdff1aSopenharmony_ci "mul.s %[temp11], %[temp5], %[temp6] \t\n" 372cabdff1aSopenharmony_ci "mul.s %[temp12], %[temp5], %[temp7] \t\n" 373cabdff1aSopenharmony_ci "lwc1 %[temp8], 0(%[in3]) \t\n" 374cabdff1aSopenharmony_ci PTR_ADDIU " %[tcos1], %[tcos1], 8 \t\n" 375cabdff1aSopenharmony_ci PTR_ADDIU " %[tsin1], %[tsin1], 8 \t\n" 376cabdff1aSopenharmony_ci PTR_ADDIU " %[in1], %[in1], 16 \t\n" 377cabdff1aSopenharmony_ci "nmsub.s %[temp11], %[temp11], %[temp8], %[temp7] \t\n" 378cabdff1aSopenharmony_ci "madd.s %[temp12], %[temp12], %[temp8], %[temp6] \t\n" 379cabdff1aSopenharmony_ci PTR_ADDIU " %[in2], %[in2], -16 \t\n" 380cabdff1aSopenharmony_ci PTR_ADDIU " %[in3], %[in3], 16 \t\n" 381cabdff1aSopenharmony_ci PTR_ADDIU " %[in4], %[in4], -16 \t\n" 382cabdff1aSopenharmony_ci 383cabdff1aSopenharmony_ci : [temp1]"=&f"(temp1), [temp2]"=&f"(temp2), 384cabdff1aSopenharmony_ci [temp3]"=&f"(temp3), [temp4]"=&f"(temp4), 385cabdff1aSopenharmony_ci [temp5]"=&f"(temp5), [temp6]"=&f"(temp6), 386cabdff1aSopenharmony_ci [temp7]"=&f"(temp7), [temp8]"=&f"(temp8), 387cabdff1aSopenharmony_ci [temp9]"=&f"(temp9), [temp10]"=&f"(temp10), 388cabdff1aSopenharmony_ci [temp11]"=&f"(temp11), [temp12]"=&f"(temp12), 389cabdff1aSopenharmony_ci [tsin1]"+r"(tsin1), [tcos1]"+r"(tcos1), 390cabdff1aSopenharmony_ci [in1]"+r"(in1), [in2]"+r"(in2), 391cabdff1aSopenharmony_ci [in3]"+r"(in3), [in4]"+r"(in4) 392cabdff1aSopenharmony_ci : 393cabdff1aSopenharmony_ci : "memory" 394cabdff1aSopenharmony_ci ); 395cabdff1aSopenharmony_ci 396cabdff1aSopenharmony_ci z[j ].re = temp9; 397cabdff1aSopenharmony_ci z[j ].im = temp10; 398cabdff1aSopenharmony_ci z[j1].re = temp11; 399cabdff1aSopenharmony_ci z[j1].im = temp12; 400cabdff1aSopenharmony_ci } 401cabdff1aSopenharmony_ci 402cabdff1aSopenharmony_ci s->fft_calc(s, z); 403cabdff1aSopenharmony_ci 404cabdff1aSopenharmony_ci /* post rotation + reordering */ 405cabdff1aSopenharmony_ci /* n8 = 32 or 64 */ 406cabdff1aSopenharmony_ci for(k = 0; k < n8; k += 2) { 407cabdff1aSopenharmony_ci tcos1 = &tcos[n8 - k - 2]; 408cabdff1aSopenharmony_ci tsin1 = &tsin[n8 - k - 2]; 409cabdff1aSopenharmony_ci tcos2 = &tcos[n8 + k]; 410cabdff1aSopenharmony_ci tsin2 = &tsin[n8 + k]; 411cabdff1aSopenharmony_ci z1 = &z[n8 - k - 2]; 412cabdff1aSopenharmony_ci z2 = &z[n8 + k ]; 413cabdff1aSopenharmony_ci 414cabdff1aSopenharmony_ci __asm__ volatile ( 415cabdff1aSopenharmony_ci "lwc1 %[temp1], 12(%[z1]) \t\n" 416cabdff1aSopenharmony_ci "lwc1 %[temp2], 4(%[tsin1]) \t\n" 417cabdff1aSopenharmony_ci "lwc1 %[temp3], 4(%[tcos1]) \t\n" 418cabdff1aSopenharmony_ci "lwc1 %[temp4], 8(%[z1]) \t\n" 419cabdff1aSopenharmony_ci "lwc1 %[temp5], 4(%[z1]) \t\n" 420cabdff1aSopenharmony_ci "mul.s %[temp9], %[temp1], %[temp2] \t\n" 421cabdff1aSopenharmony_ci "mul.s %[temp10], %[temp1], %[temp3] \t\n" 422cabdff1aSopenharmony_ci "lwc1 %[temp6], 0(%[tsin1]) \t\n" 423cabdff1aSopenharmony_ci "lwc1 %[temp7], 0(%[tcos1]) \t\n" 424cabdff1aSopenharmony_ci "nmsub.s %[temp9], %[temp9], %[temp4], %[temp3] \t\n" 425cabdff1aSopenharmony_ci "madd.s %[temp10], %[temp10], %[temp4], %[temp2] \t\n" 426cabdff1aSopenharmony_ci "mul.s %[temp11], %[temp5], %[temp6] \t\n" 427cabdff1aSopenharmony_ci "mul.s %[temp12], %[temp5], %[temp7] \t\n" 428cabdff1aSopenharmony_ci "lwc1 %[temp8], 0(%[z1]) \t\n" 429cabdff1aSopenharmony_ci "lwc1 %[temp1], 4(%[z2]) \t\n" 430cabdff1aSopenharmony_ci "lwc1 %[temp2], 0(%[tsin2]) \t\n" 431cabdff1aSopenharmony_ci "lwc1 %[temp3], 0(%[tcos2]) \t\n" 432cabdff1aSopenharmony_ci "nmsub.s %[temp11], %[temp11], %[temp8], %[temp7] \t\n" 433cabdff1aSopenharmony_ci "madd.s %[temp12], %[temp12], %[temp8], %[temp6] \t\n" 434cabdff1aSopenharmony_ci "mul.s %[temp13], %[temp1], %[temp2] \t\n" 435cabdff1aSopenharmony_ci "mul.s %[temp14], %[temp1], %[temp3] \t\n" 436cabdff1aSopenharmony_ci "lwc1 %[temp4], 0(%[z2]) \t\n" 437cabdff1aSopenharmony_ci "lwc1 %[temp5], 12(%[z2]) \t\n" 438cabdff1aSopenharmony_ci "lwc1 %[temp6], 4(%[tsin2]) \t\n" 439cabdff1aSopenharmony_ci "lwc1 %[temp7], 4(%[tcos2]) \t\n" 440cabdff1aSopenharmony_ci "nmsub.s %[temp13], %[temp13], %[temp4], %[temp3] \t\n" 441cabdff1aSopenharmony_ci "madd.s %[temp14], %[temp14], %[temp4], %[temp2] \t\n" 442cabdff1aSopenharmony_ci "mul.s %[temp15], %[temp5], %[temp6] \t\n" 443cabdff1aSopenharmony_ci "mul.s %[temp16], %[temp5], %[temp7] \t\n" 444cabdff1aSopenharmony_ci "lwc1 %[temp8], 8(%[z2]) \t\n" 445cabdff1aSopenharmony_ci "nmsub.s %[temp15], %[temp15], %[temp8], %[temp7] \t\n" 446cabdff1aSopenharmony_ci "madd.s %[temp16], %[temp16], %[temp8], %[temp6] \t\n" 447cabdff1aSopenharmony_ci : [temp1]"=&f"(temp1), [temp2]"=&f"(temp2), 448cabdff1aSopenharmony_ci [temp3]"=&f"(temp3), [temp4]"=&f"(temp4), 449cabdff1aSopenharmony_ci [temp5]"=&f"(temp5), [temp6]"=&f"(temp6), 450cabdff1aSopenharmony_ci [temp7]"=&f"(temp7), [temp8]"=&f"(temp8), 451cabdff1aSopenharmony_ci [temp9]"=&f"(temp9), [temp10]"=&f"(temp10), 452cabdff1aSopenharmony_ci [temp11]"=&f"(temp11), [temp12]"=&f"(temp12), 453cabdff1aSopenharmony_ci [temp13]"=&f"(temp13), [temp14]"=&f"(temp14), 454cabdff1aSopenharmony_ci [temp15]"=&f"(temp15), [temp16]"=&f"(temp16) 455cabdff1aSopenharmony_ci : [z1]"r"(z1), [z2]"r"(z2), 456cabdff1aSopenharmony_ci [tsin1]"r"(tsin1), [tcos1]"r"(tcos1), 457cabdff1aSopenharmony_ci [tsin2]"r"(tsin2), [tcos2]"r"(tcos2) 458cabdff1aSopenharmony_ci : "memory" 459cabdff1aSopenharmony_ci ); 460cabdff1aSopenharmony_ci 461cabdff1aSopenharmony_ci z1[1].re = temp9; 462cabdff1aSopenharmony_ci z1[1].im = temp14; 463cabdff1aSopenharmony_ci z2[0].re = temp13; 464cabdff1aSopenharmony_ci z2[0].im = temp10; 465cabdff1aSopenharmony_ci 466cabdff1aSopenharmony_ci z1[0].re = temp11; 467cabdff1aSopenharmony_ci z1[0].im = temp16; 468cabdff1aSopenharmony_ci z2[1].re = temp15; 469cabdff1aSopenharmony_ci z2[1].im = temp12; 470cabdff1aSopenharmony_ci } 471cabdff1aSopenharmony_ci} 472cabdff1aSopenharmony_ci 473cabdff1aSopenharmony_ci/** 474cabdff1aSopenharmony_ci * Compute inverse MDCT of size N = 2^nbits 475cabdff1aSopenharmony_ci * @param output N samples 476cabdff1aSopenharmony_ci * @param input N/2 samples 477cabdff1aSopenharmony_ci */ 478cabdff1aSopenharmony_cistatic void ff_imdct_calc_mips(FFTContext *s, FFTSample *output, const FFTSample *input) 479cabdff1aSopenharmony_ci{ 480cabdff1aSopenharmony_ci int k; 481cabdff1aSopenharmony_ci int n = 1 << s->mdct_bits; 482cabdff1aSopenharmony_ci int n2 = n >> 1; 483cabdff1aSopenharmony_ci int n4 = n >> 2; 484cabdff1aSopenharmony_ci 485cabdff1aSopenharmony_ci ff_imdct_half_mips(s, output+n4, input); 486cabdff1aSopenharmony_ci 487cabdff1aSopenharmony_ci for(k = 0; k < n4; k+=4) { 488cabdff1aSopenharmony_ci output[k] = -output[n2-k-1]; 489cabdff1aSopenharmony_ci output[k+1] = -output[n2-k-2]; 490cabdff1aSopenharmony_ci output[k+2] = -output[n2-k-3]; 491cabdff1aSopenharmony_ci output[k+3] = -output[n2-k-4]; 492cabdff1aSopenharmony_ci 493cabdff1aSopenharmony_ci output[n-k-1] = output[n2+k]; 494cabdff1aSopenharmony_ci output[n-k-2] = output[n2+k+1]; 495cabdff1aSopenharmony_ci output[n-k-3] = output[n2+k+2]; 496cabdff1aSopenharmony_ci output[n-k-4] = output[n2+k+3]; 497cabdff1aSopenharmony_ci } 498cabdff1aSopenharmony_ci} 499cabdff1aSopenharmony_ci#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */ 500cabdff1aSopenharmony_ci#endif /* HAVE_INLINE_ASM */ 501cabdff1aSopenharmony_ci 502cabdff1aSopenharmony_ciav_cold void ff_fft_init_mips(FFTContext *s) 503cabdff1aSopenharmony_ci{ 504cabdff1aSopenharmony_ci ff_fft_lut_init(); 505cabdff1aSopenharmony_ci ff_init_ff_cos_tabs(17); 506cabdff1aSopenharmony_ci 507cabdff1aSopenharmony_ci#if HAVE_INLINE_ASM 508cabdff1aSopenharmony_ci#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6 509cabdff1aSopenharmony_ci s->fft_calc = ff_fft_calc_mips; 510cabdff1aSopenharmony_ci#if CONFIG_MDCT 511cabdff1aSopenharmony_ci s->imdct_calc = ff_imdct_calc_mips; 512cabdff1aSopenharmony_ci s->imdct_half = ff_imdct_half_mips; 513cabdff1aSopenharmony_ci#endif 514cabdff1aSopenharmony_ci#endif 515cabdff1aSopenharmony_ci#endif 516cabdff1aSopenharmony_ci} 517