annotate src/opus-1.3/celt/mips/kiss_fft_mipsr1.h @ 167:bd3cc4d1df30

Add FFTW 3.3.8 source, and a Linux build
author Chris Cannam <cannam@all-day-breakfast.com>
date Tue, 19 Nov 2019 14:52:55 +0000
parents 4664ac0c1032
children
rev   line source
cannam@154 1 /*Copyright (c) 2013, Xiph.Org Foundation and contributors.
cannam@154 2
cannam@154 3 All rights reserved.
cannam@154 4
cannam@154 5 Redistribution and use in source and binary forms, with or without
cannam@154 6 modification, are permitted provided that the following conditions are met:
cannam@154 7
cannam@154 8 * Redistributions of source code must retain the above copyright notice,
cannam@154 9 this list of conditions and the following disclaimer.
cannam@154 10 * Redistributions in binary form must reproduce the above copyright notice,
cannam@154 11 this list of conditions and the following disclaimer in the
cannam@154 12 documentation and/or other materials provided with the distribution.
cannam@154 13
cannam@154 14 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
cannam@154 15 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
cannam@154 16 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
cannam@154 17 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
cannam@154 18 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
cannam@154 19 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
cannam@154 20 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
cannam@154 21 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
cannam@154 22 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
cannam@154 23 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
cannam@154 24 POSSIBILITY OF SUCH DAMAGE.*/
cannam@154 25
cannam@154 26 #ifndef KISS_FFT_MIPSR1_H
cannam@154 27 #define KISS_FFT_MIPSR1_H
cannam@154 28
cannam@154 29 #if !defined(KISS_FFT_GUTS_H)
cannam@154 30 #error "This file should only be included from _kiss_fft_guts.h"
cannam@154 31 #endif
cannam@154 32
cannam@154 33 #ifdef FIXED_POINT
cannam@154 34
cannam@154 35 #define S_MUL_ADD(a, b, c, d) (S_MUL(a,b)+S_MUL(c,d))
cannam@154 36 #define S_MUL_SUB(a, b, c, d) (S_MUL(a,b)-S_MUL(c,d))
cannam@154 37
cannam@154 38 #undef S_MUL_ADD
cannam@154 39 static inline int S_MUL_ADD(int a, int b, int c, int d) {
cannam@154 40 int m;
cannam@154 41 asm volatile("MULT $ac1, %0, %1" : : "r" ((int)a), "r" ((int)b));
cannam@154 42 asm volatile("madd $ac1, %0, %1" : : "r" ((int)c), "r" ((int)d));
cannam@154 43 asm volatile("EXTR.W %0,$ac1, %1" : "=r" (m): "i" (15));
cannam@154 44 return m;
cannam@154 45 }
cannam@154 46
cannam@154 47 #undef S_MUL_SUB
cannam@154 48 static inline int S_MUL_SUB(int a, int b, int c, int d) {
cannam@154 49 int m;
cannam@154 50 asm volatile("MULT $ac1, %0, %1" : : "r" ((int)a), "r" ((int)b));
cannam@154 51 asm volatile("msub $ac1, %0, %1" : : "r" ((int)c), "r" ((int)d));
cannam@154 52 asm volatile("EXTR.W %0,$ac1, %1" : "=r" (m): "i" (15));
cannam@154 53 return m;
cannam@154 54 }
cannam@154 55
cannam@154 56 #undef C_MUL
cannam@154 57 # define C_MUL(m,a,b) (m=C_MUL_fun(a,b))
cannam@154 58 static inline kiss_fft_cpx C_MUL_fun(kiss_fft_cpx a, kiss_twiddle_cpx b) {
cannam@154 59 kiss_fft_cpx m;
cannam@154 60
cannam@154 61 asm volatile("MULT $ac1, %0, %1" : : "r" ((int)a.r), "r" ((int)b.r));
cannam@154 62 asm volatile("msub $ac1, %0, %1" : : "r" ((int)a.i), "r" ((int)b.i));
cannam@154 63 asm volatile("EXTR.W %0,$ac1, %1" : "=r" (m.r): "i" (15));
cannam@154 64 asm volatile("MULT $ac1, %0, %1" : : "r" ((int)a.r), "r" ((int)b.i));
cannam@154 65 asm volatile("madd $ac1, %0, %1" : : "r" ((int)a.i), "r" ((int)b.r));
cannam@154 66 asm volatile("EXTR.W %0,$ac1, %1" : "=r" (m.i): "i" (15));
cannam@154 67
cannam@154 68 return m;
cannam@154 69 }
cannam@154 70 #undef C_MULC
cannam@154 71 # define C_MULC(m,a,b) (m=C_MULC_fun(a,b))
cannam@154 72 static inline kiss_fft_cpx C_MULC_fun(kiss_fft_cpx a, kiss_twiddle_cpx b) {
cannam@154 73 kiss_fft_cpx m;
cannam@154 74
cannam@154 75 asm volatile("MULT $ac1, %0, %1" : : "r" ((int)a.r), "r" ((int)b.r));
cannam@154 76 asm volatile("madd $ac1, %0, %1" : : "r" ((int)a.i), "r" ((int)b.i));
cannam@154 77 asm volatile("EXTR.W %0,$ac1, %1" : "=r" (m.r): "i" (15));
cannam@154 78 asm volatile("MULT $ac1, %0, %1" : : "r" ((int)a.i), "r" ((int)b.r));
cannam@154 79 asm volatile("msub $ac1, %0, %1" : : "r" ((int)a.r), "r" ((int)b.i));
cannam@154 80 asm volatile("EXTR.W %0,$ac1, %1" : "=r" (m.i): "i" (15));
cannam@154 81
cannam@154 82 return m;
cannam@154 83 }
cannam@154 84
cannam@154 85 #endif /* FIXED_POINT */
cannam@154 86
cannam@154 87 #define OVERRIDE_kf_bfly5
cannam@154 88 static void kf_bfly5(
cannam@154 89 kiss_fft_cpx * Fout,
cannam@154 90 const size_t fstride,
cannam@154 91 const kiss_fft_state *st,
cannam@154 92 int m,
cannam@154 93 int N,
cannam@154 94 int mm
cannam@154 95 )
cannam@154 96 {
cannam@154 97 kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4;
cannam@154 98 int i, u;
cannam@154 99 kiss_fft_cpx scratch[13];
cannam@154 100
cannam@154 101 const kiss_twiddle_cpx *tw;
cannam@154 102 kiss_twiddle_cpx ya,yb;
cannam@154 103 kiss_fft_cpx * Fout_beg = Fout;
cannam@154 104
cannam@154 105 #ifdef FIXED_POINT
cannam@154 106 ya.r = 10126;
cannam@154 107 ya.i = -31164;
cannam@154 108 yb.r = -26510;
cannam@154 109 yb.i = -19261;
cannam@154 110 #else
cannam@154 111 ya = st->twiddles[fstride*m];
cannam@154 112 yb = st->twiddles[fstride*2*m];
cannam@154 113 #endif
cannam@154 114
cannam@154 115 tw=st->twiddles;
cannam@154 116
cannam@154 117 for (i=0;i<N;i++)
cannam@154 118 {
cannam@154 119 Fout = Fout_beg + i*mm;
cannam@154 120 Fout0=Fout;
cannam@154 121 Fout1=Fout0+m;
cannam@154 122 Fout2=Fout0+2*m;
cannam@154 123 Fout3=Fout0+3*m;
cannam@154 124 Fout4=Fout0+4*m;
cannam@154 125
cannam@154 126 /* For non-custom modes, m is guaranteed to be a multiple of 4. */
cannam@154 127 for ( u=0; u<m; ++u ) {
cannam@154 128 scratch[0] = *Fout0;
cannam@154 129
cannam@154 130
cannam@154 131 C_MUL(scratch[1] ,*Fout1, tw[u*fstride]);
cannam@154 132 C_MUL(scratch[2] ,*Fout2, tw[2*u*fstride]);
cannam@154 133 C_MUL(scratch[3] ,*Fout3, tw[3*u*fstride]);
cannam@154 134 C_MUL(scratch[4] ,*Fout4, tw[4*u*fstride]);
cannam@154 135
cannam@154 136 C_ADD( scratch[7],scratch[1],scratch[4]);
cannam@154 137 C_SUB( scratch[10],scratch[1],scratch[4]);
cannam@154 138 C_ADD( scratch[8],scratch[2],scratch[3]);
cannam@154 139 C_SUB( scratch[9],scratch[2],scratch[3]);
cannam@154 140
cannam@154 141 Fout0->r += scratch[7].r + scratch[8].r;
cannam@154 142 Fout0->i += scratch[7].i + scratch[8].i;
cannam@154 143 scratch[5].r = scratch[0].r + S_MUL_ADD(scratch[7].r,ya.r,scratch[8].r,yb.r);
cannam@154 144 scratch[5].i = scratch[0].i + S_MUL_ADD(scratch[7].i,ya.r,scratch[8].i,yb.r);
cannam@154 145
cannam@154 146 scratch[6].r = S_MUL_ADD(scratch[10].i,ya.i,scratch[9].i,yb.i);
cannam@154 147 scratch[6].i = -S_MUL_ADD(scratch[10].r,ya.i,scratch[9].r,yb.i);
cannam@154 148
cannam@154 149 C_SUB(*Fout1,scratch[5],scratch[6]);
cannam@154 150 C_ADD(*Fout4,scratch[5],scratch[6]);
cannam@154 151
cannam@154 152 scratch[11].r = scratch[0].r + S_MUL_ADD(scratch[7].r,yb.r,scratch[8].r,ya.r);
cannam@154 153 scratch[11].i = scratch[0].i + S_MUL_ADD(scratch[7].i,yb.r,scratch[8].i,ya.r);
cannam@154 154
cannam@154 155 scratch[12].r = S_MUL_SUB(scratch[9].i,ya.i,scratch[10].i,yb.i);
cannam@154 156 scratch[12].i = S_MUL_SUB(scratch[10].r,yb.i,scratch[9].r,ya.i);
cannam@154 157
cannam@154 158 C_ADD(*Fout2,scratch[11],scratch[12]);
cannam@154 159 C_SUB(*Fout3,scratch[11],scratch[12]);
cannam@154 160
cannam@154 161 ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4;
cannam@154 162 }
cannam@154 163 }
cannam@154 164 }
cannam@154 165
cannam@154 166
cannam@154 167 #endif /* KISS_FFT_MIPSR1_H */