annotate src/opus-1.3/celt/mips/vq_mipsr1.h @ 168:ceec0dd9ec9c

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam <cannam@all-day-breakfast.com>
date Fri, 07 Feb 2020 11:51:13 +0000
parents 4664ac0c1032
children
rev   line source
cannam@154 1 /* Copyright (c) 2007-2008 CSIRO
cannam@154 2 Copyright (c) 2007-2009 Xiph.Org Foundation
cannam@154 3 Written by Jean-Marc Valin */
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
cannam@154 7 are met:
cannam@154 8
cannam@154 9 - Redistributions of source code must retain the above copyright
cannam@154 10 notice, this list of conditions and the following disclaimer.
cannam@154 11
cannam@154 12 - Redistributions in binary form must reproduce the above copyright
cannam@154 13 notice, this list of conditions and the following disclaimer in the
cannam@154 14 documentation and/or other materials provided with the distribution.
cannam@154 15
cannam@154 16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
cannam@154 17 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
cannam@154 18 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
cannam@154 19 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
cannam@154 20 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
cannam@154 21 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
cannam@154 22 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
cannam@154 23 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
cannam@154 24 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
cannam@154 25 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
cannam@154 26 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cannam@154 27 */
cannam@154 28
cannam@154 29 #ifndef __VQ_MIPSR1_H__
cannam@154 30 #define __VQ_MIPSR1_H__
cannam@154 31
cannam@154 32 #ifdef HAVE_CONFIG_H
cannam@154 33 #include "config.h"
cannam@154 34 #endif
cannam@154 35
cannam@154 36 #include "mathops.h"
cannam@154 37 #include "arch.h"
cannam@154 38
cannam@154 39 static void renormalise_vector_mips(celt_norm *X, int N, opus_val16 gain, int arch);
cannam@154 40
cannam@154 41 #define OVERRIDE_vq_exp_rotation1
cannam@154 42 static void exp_rotation1(celt_norm *X, int len, int stride, opus_val16 c, opus_val16 s)
cannam@154 43 {
cannam@154 44 int i;
cannam@154 45 opus_val16 ms;
cannam@154 46 celt_norm *Xptr;
cannam@154 47 Xptr = X;
cannam@154 48 ms = NEG16(s);
cannam@154 49 for (i=0;i<len-stride;i++)
cannam@154 50 {
cannam@154 51 celt_norm x1, x2;
cannam@154 52 x1 = Xptr[0];
cannam@154 53 x2 = Xptr[stride];
cannam@154 54 Xptr[stride] = EXTRACT16(PSHR32(MAC16_16(MULT16_16(c, x2), s, x1), 15));
cannam@154 55 *Xptr++ = EXTRACT16(PSHR32(MAC16_16(MULT16_16(c, x1), ms, x2), 15));
cannam@154 56 }
cannam@154 57 Xptr = &X[len-2*stride-1];
cannam@154 58 for (i=len-2*stride-1;i>=0;i--)
cannam@154 59 {
cannam@154 60 celt_norm x1, x2;
cannam@154 61 x1 = Xptr[0];
cannam@154 62 x2 = Xptr[stride];
cannam@154 63 Xptr[stride] = EXTRACT16(PSHR32(MAC16_16(MULT16_16(c, x2), s, x1), 15));
cannam@154 64 *Xptr-- = EXTRACT16(PSHR32(MAC16_16(MULT16_16(c, x1), ms, x2), 15));
cannam@154 65 }
cannam@154 66 }
cannam@154 67
cannam@154 68 #define OVERRIDE_renormalise_vector
cannam@154 69
cannam@154 70 #define renormalise_vector(X, N, gain, arch) \
cannam@154 71 (renormalise_vector_mips(X, N, gain, arch))
cannam@154 72
cannam@154 73 void renormalise_vector_mips(celt_norm *X, int N, opus_val16 gain, int arch)
cannam@154 74 {
cannam@154 75 int i;
cannam@154 76 #ifdef FIXED_POINT
cannam@154 77 int k;
cannam@154 78 #endif
cannam@154 79 opus_val32 E = EPSILON;
cannam@154 80 opus_val16 g;
cannam@154 81 opus_val32 t;
cannam@154 82 celt_norm *xptr = X;
cannam@154 83 int X0, X1;
cannam@154 84
cannam@154 85 (void)arch;
cannam@154 86
cannam@154 87 asm volatile("mult $ac1, $0, $0");
cannam@154 88 asm volatile("MTLO %0, $ac1" : :"r" (E));
cannam@154 89 /*if(N %4)
cannam@154 90 printf("error");*/
cannam@154 91 for (i=0;i<N-2;i+=2)
cannam@154 92 {
cannam@154 93 X0 = (int)*xptr++;
cannam@154 94 asm volatile("MADD $ac1, %0, %1" : : "r" (X0), "r" (X0));
cannam@154 95
cannam@154 96 X1 = (int)*xptr++;
cannam@154 97 asm volatile("MADD $ac1, %0, %1" : : "r" (X1), "r" (X1));
cannam@154 98 }
cannam@154 99
cannam@154 100 for (;i<N;i++)
cannam@154 101 {
cannam@154 102 X0 = (int)*xptr++;
cannam@154 103 asm volatile("MADD $ac1, %0, %1" : : "r" (X0), "r" (X0));
cannam@154 104 }
cannam@154 105
cannam@154 106 asm volatile("MFLO %0, $ac1" : "=r" (E));
cannam@154 107 #ifdef FIXED_POINT
cannam@154 108 k = celt_ilog2(E)>>1;
cannam@154 109 #endif
cannam@154 110 t = VSHR32(E, 2*(k-7));
cannam@154 111 g = MULT16_16_P15(celt_rsqrt_norm(t),gain);
cannam@154 112
cannam@154 113 xptr = X;
cannam@154 114 for (i=0;i<N;i++)
cannam@154 115 {
cannam@154 116 *xptr = EXTRACT16(PSHR32(MULT16_16(g, *xptr), k+1));
cannam@154 117 xptr++;
cannam@154 118 }
cannam@154 119 /*return celt_sqrt(E);*/
cannam@154 120 }
cannam@154 121
cannam@154 122 #endif /* __VQ_MIPSR1_H__ */