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