annotate src/opus-1.3/celt/mips/pitch_mipsr1.h @ 81:7029a4916348

Merge build update
author Chris Cannam
date Thu, 31 Oct 2019 13:36:58 +0000
parents 7aeed7906520
children
rev   line source
Chris@69 1 /* Copyright (c) 2007-2008 CSIRO
Chris@69 2 Copyright (c) 2007-2009 Xiph.Org Foundation
Chris@69 3 Written by Jean-Marc Valin */
Chris@69 4 /**
Chris@69 5 @file pitch.h
Chris@69 6 @brief Pitch analysis
Chris@69 7 */
Chris@69 8
Chris@69 9 /*
Chris@69 10 Redistribution and use in source and binary forms, with or without
Chris@69 11 modification, are permitted provided that the following conditions
Chris@69 12 are met:
Chris@69 13
Chris@69 14 - Redistributions of source code must retain the above copyright
Chris@69 15 notice, this list of conditions and the following disclaimer.
Chris@69 16
Chris@69 17 - Redistributions in binary form must reproduce the above copyright
Chris@69 18 notice, this list of conditions and the following disclaimer in the
Chris@69 19 documentation and/or other materials provided with the distribution.
Chris@69 20
Chris@69 21 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Chris@69 22 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Chris@69 23 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Chris@69 24 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
Chris@69 25 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
Chris@69 26 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
Chris@69 27 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
Chris@69 28 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Chris@69 29 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Chris@69 30 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Chris@69 31 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Chris@69 32 */
Chris@69 33
Chris@69 34 #ifndef PITCH_MIPSR1_H
Chris@69 35 #define PITCH_MIPSR1_H
Chris@69 36
Chris@69 37 #define OVERRIDE_DUAL_INNER_PROD
Chris@69 38 static inline void dual_inner_prod(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02,
Chris@69 39 int N, opus_val32 *xy1, opus_val32 *xy2, int arch)
Chris@69 40 {
Chris@69 41 int j;
Chris@69 42 opus_val32 xy01=0;
Chris@69 43 opus_val32 xy02=0;
Chris@69 44
Chris@69 45 (void)arch;
Chris@69 46
Chris@69 47 asm volatile("MULT $ac1, $0, $0");
Chris@69 48 asm volatile("MULT $ac2, $0, $0");
Chris@69 49 /* Compute the norm of X+Y and X-Y as |X|^2 + |Y|^2 +/- sum(xy) */
Chris@69 50 for (j=0;j<N;j++)
Chris@69 51 {
Chris@69 52 asm volatile("MADD $ac1, %0, %1" : : "r" ((int)x[j]), "r" ((int)y01[j]));
Chris@69 53 asm volatile("MADD $ac2, %0, %1" : : "r" ((int)x[j]), "r" ((int)y02[j]));
Chris@69 54 ++j;
Chris@69 55 asm volatile("MADD $ac1, %0, %1" : : "r" ((int)x[j]), "r" ((int)y01[j]));
Chris@69 56 asm volatile("MADD $ac2, %0, %1" : : "r" ((int)x[j]), "r" ((int)y02[j]));
Chris@69 57 }
Chris@69 58 asm volatile ("mflo %0, $ac1": "=r"(xy01));
Chris@69 59 asm volatile ("mflo %0, $ac2": "=r"(xy02));
Chris@69 60 *xy1 = xy01;
Chris@69 61 *xy2 = xy02;
Chris@69 62 }
Chris@69 63
Chris@69 64 static inline void xcorr_kernel_mips(const opus_val16 * x,
Chris@69 65 const opus_val16 * y, opus_val32 sum[4], int len)
Chris@69 66 {
Chris@69 67 int j;
Chris@69 68 opus_val16 y_0, y_1, y_2, y_3;
Chris@69 69
Chris@69 70 opus_int64 sum_0, sum_1, sum_2, sum_3;
Chris@69 71 sum_0 = (opus_int64)sum[0];
Chris@69 72 sum_1 = (opus_int64)sum[1];
Chris@69 73 sum_2 = (opus_int64)sum[2];
Chris@69 74 sum_3 = (opus_int64)sum[3];
Chris@69 75
Chris@69 76 y_3=0; /* gcc doesn't realize that y_3 can't be used uninitialized */
Chris@69 77 y_0=*y++;
Chris@69 78 y_1=*y++;
Chris@69 79 y_2=*y++;
Chris@69 80 for (j=0;j<len-3;j+=4)
Chris@69 81 {
Chris@69 82 opus_val16 tmp;
Chris@69 83 tmp = *x++;
Chris@69 84 y_3=*y++;
Chris@69 85
Chris@69 86 sum_0 = __builtin_mips_madd( sum_0, tmp, y_0);
Chris@69 87 sum_1 = __builtin_mips_madd( sum_1, tmp, y_1);
Chris@69 88 sum_2 = __builtin_mips_madd( sum_2, tmp, y_2);
Chris@69 89 sum_3 = __builtin_mips_madd( sum_3, tmp, y_3);
Chris@69 90
Chris@69 91 tmp=*x++;
Chris@69 92 y_0=*y++;
Chris@69 93
Chris@69 94 sum_0 = __builtin_mips_madd( sum_0, tmp, y_1 );
Chris@69 95 sum_1 = __builtin_mips_madd( sum_1, tmp, y_2 );
Chris@69 96 sum_2 = __builtin_mips_madd( sum_2, tmp, y_3);
Chris@69 97 sum_3 = __builtin_mips_madd( sum_3, tmp, y_0);
Chris@69 98
Chris@69 99 tmp=*x++;
Chris@69 100 y_1=*y++;
Chris@69 101
Chris@69 102 sum_0 = __builtin_mips_madd( sum_0, tmp, y_2 );
Chris@69 103 sum_1 = __builtin_mips_madd( sum_1, tmp, y_3 );
Chris@69 104 sum_2 = __builtin_mips_madd( sum_2, tmp, y_0);
Chris@69 105 sum_3 = __builtin_mips_madd( sum_3, tmp, y_1);
Chris@69 106
Chris@69 107
Chris@69 108 tmp=*x++;
Chris@69 109 y_2=*y++;
Chris@69 110
Chris@69 111 sum_0 = __builtin_mips_madd( sum_0, tmp, y_3 );
Chris@69 112 sum_1 = __builtin_mips_madd( sum_1, tmp, y_0 );
Chris@69 113 sum_2 = __builtin_mips_madd( sum_2, tmp, y_1);
Chris@69 114 sum_3 = __builtin_mips_madd( sum_3, tmp, y_2);
Chris@69 115
Chris@69 116 }
Chris@69 117 if (j++<len)
Chris@69 118 {
Chris@69 119 opus_val16 tmp = *x++;
Chris@69 120 y_3=*y++;
Chris@69 121
Chris@69 122 sum_0 = __builtin_mips_madd( sum_0, tmp, y_0 );
Chris@69 123 sum_1 = __builtin_mips_madd( sum_1, tmp, y_1 );
Chris@69 124 sum_2 = __builtin_mips_madd( sum_2, tmp, y_2);
Chris@69 125 sum_3 = __builtin_mips_madd( sum_3, tmp, y_3);
Chris@69 126 }
Chris@69 127
Chris@69 128 if (j++<len)
Chris@69 129 {
Chris@69 130 opus_val16 tmp=*x++;
Chris@69 131 y_0=*y++;
Chris@69 132
Chris@69 133 sum_0 = __builtin_mips_madd( sum_0, tmp, y_1 );
Chris@69 134 sum_1 = __builtin_mips_madd( sum_1, tmp, y_2 );
Chris@69 135 sum_2 = __builtin_mips_madd( sum_2, tmp, y_3);
Chris@69 136 sum_3 = __builtin_mips_madd( sum_3, tmp, y_0);
Chris@69 137 }
Chris@69 138
Chris@69 139 if (j<len)
Chris@69 140 {
Chris@69 141 opus_val16 tmp=*x++;
Chris@69 142 y_1=*y++;
Chris@69 143
Chris@69 144 sum_0 = __builtin_mips_madd( sum_0, tmp, y_2 );
Chris@69 145 sum_1 = __builtin_mips_madd( sum_1, tmp, y_3 );
Chris@69 146 sum_2 = __builtin_mips_madd( sum_2, tmp, y_0);
Chris@69 147 sum_3 = __builtin_mips_madd( sum_3, tmp, y_1);
Chris@69 148
Chris@69 149 }
Chris@69 150
Chris@69 151 sum[0] = (opus_val32)sum_0;
Chris@69 152 sum[1] = (opus_val32)sum_1;
Chris@69 153 sum[2] = (opus_val32)sum_2;
Chris@69 154 sum[3] = (opus_val32)sum_3;
Chris@69 155 }
Chris@69 156
Chris@69 157 #define OVERRIDE_XCORR_KERNEL
Chris@69 158 #define xcorr_kernel(x, y, sum, len, arch) \
Chris@69 159 ((void)(arch), xcorr_kernel_mips(x, y, sum, len))
Chris@69 160
Chris@69 161 #endif /* PITCH_MIPSR1_H */