With GCC 4.9, the MIPS NDK toolchain has been changed to only support 16 spregs by default - the even-numbered ones. This has been changed to support the R6 MIPS architecture. While the old behaviour could be restored by adding "-modd-spreg", this would come with a performance hit because the kernel would emulate odd-numbered spregs and missing R2 instructions. As a result of this change, the functions removed in this CL no longer compile as there are no longer enough spregs for the compiler to assign. So we are removing these functions and they will use the C implementation until the MIPS code is rewritten. R=andrew@webrtc.org, ljubomir.papuga@gmail.com, pasko@chromium.org Review URL: https://webrtc-codereview.appspot.com/16159005 Patch from Fabrice de Gans-Riberi <fdegans@chromium.org>. git-svn-id: http://webrtc.googlecode.com/svn/trunk@6797 4adac7df-926f-26a2-2b94-8c16560cd09d
336 lines
7.0 KiB
C
336 lines
7.0 KiB
C
/*
|
|
* Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include "webrtc/modules/audio_processing/aec/aec_rdft.h"
|
|
#include "webrtc/typedefs.h"
|
|
|
|
static void bitrv2_128_mips(float *a) {
|
|
// n is 128
|
|
float xr, xi, yr, yi;
|
|
|
|
xr = a[8];
|
|
xi = a[9];
|
|
yr = a[16];
|
|
yi = a[17];
|
|
a[8] = yr;
|
|
a[9] = yi;
|
|
a[16] = xr;
|
|
a[17] = xi;
|
|
|
|
xr = a[64];
|
|
xi = a[65];
|
|
yr = a[2];
|
|
yi = a[3];
|
|
a[64] = yr;
|
|
a[65] = yi;
|
|
a[2] = xr;
|
|
a[3] = xi;
|
|
|
|
xr = a[72];
|
|
xi = a[73];
|
|
yr = a[18];
|
|
yi = a[19];
|
|
a[72] = yr;
|
|
a[73] = yi;
|
|
a[18] = xr;
|
|
a[19] = xi;
|
|
|
|
xr = a[80];
|
|
xi = a[81];
|
|
yr = a[10];
|
|
yi = a[11];
|
|
a[80] = yr;
|
|
a[81] = yi;
|
|
a[10] = xr;
|
|
a[11] = xi;
|
|
|
|
xr = a[88];
|
|
xi = a[89];
|
|
yr = a[26];
|
|
yi = a[27];
|
|
a[88] = yr;
|
|
a[89] = yi;
|
|
a[26] = xr;
|
|
a[27] = xi;
|
|
|
|
xr = a[74];
|
|
xi = a[75];
|
|
yr = a[82];
|
|
yi = a[83];
|
|
a[74] = yr;
|
|
a[75] = yi;
|
|
a[82] = xr;
|
|
a[83] = xi;
|
|
|
|
xr = a[32];
|
|
xi = a[33];
|
|
yr = a[4];
|
|
yi = a[5];
|
|
a[32] = yr;
|
|
a[33] = yi;
|
|
a[4] = xr;
|
|
a[5] = xi;
|
|
|
|
xr = a[40];
|
|
xi = a[41];
|
|
yr = a[20];
|
|
yi = a[21];
|
|
a[40] = yr;
|
|
a[41] = yi;
|
|
a[20] = xr;
|
|
a[21] = xi;
|
|
|
|
xr = a[48];
|
|
xi = a[49];
|
|
yr = a[12];
|
|
yi = a[13];
|
|
a[48] = yr;
|
|
a[49] = yi;
|
|
a[12] = xr;
|
|
a[13] = xi;
|
|
|
|
xr = a[56];
|
|
xi = a[57];
|
|
yr = a[28];
|
|
yi = a[29];
|
|
a[56] = yr;
|
|
a[57] = yi;
|
|
a[28] = xr;
|
|
a[29] = xi;
|
|
|
|
xr = a[34];
|
|
xi = a[35];
|
|
yr = a[68];
|
|
yi = a[69];
|
|
a[34] = yr;
|
|
a[35] = yi;
|
|
a[68] = xr;
|
|
a[69] = xi;
|
|
|
|
xr = a[42];
|
|
xi = a[43];
|
|
yr = a[84];
|
|
yi = a[85];
|
|
a[42] = yr;
|
|
a[43] = yi;
|
|
a[84] = xr;
|
|
a[85] = xi;
|
|
|
|
xr = a[50];
|
|
xi = a[51];
|
|
yr = a[76];
|
|
yi = a[77];
|
|
a[50] = yr;
|
|
a[51] = yi;
|
|
a[76] = xr;
|
|
a[77] = xi;
|
|
|
|
xr = a[58];
|
|
xi = a[59];
|
|
yr = a[92];
|
|
yi = a[93];
|
|
a[58] = yr;
|
|
a[59] = yi;
|
|
a[92] = xr;
|
|
a[93] = xi;
|
|
|
|
xr = a[44];
|
|
xi = a[45];
|
|
yr = a[52];
|
|
yi = a[53];
|
|
a[44] = yr;
|
|
a[45] = yi;
|
|
a[52] = xr;
|
|
a[53] = xi;
|
|
|
|
xr = a[96];
|
|
xi = a[97];
|
|
yr = a[6];
|
|
yi = a[7];
|
|
a[96] = yr;
|
|
a[97] = yi;
|
|
a[6] = xr;
|
|
a[7] = xi;
|
|
|
|
xr = a[104];
|
|
xi = a[105];
|
|
yr = a[22];
|
|
yi = a[23];
|
|
a[104] = yr;
|
|
a[105] = yi;
|
|
a[22] = xr;
|
|
a[23] = xi;
|
|
|
|
xr = a[112];
|
|
xi = a[113];
|
|
yr = a[14];
|
|
yi = a[15];
|
|
a[112] = yr;
|
|
a[113] = yi;
|
|
a[14] = xr;
|
|
a[15] = xi;
|
|
|
|
xr = a[120];
|
|
xi = a[121];
|
|
yr = a[30];
|
|
yi = a[31];
|
|
a[120] = yr;
|
|
a[121] = yi;
|
|
a[30] = xr;
|
|
a[31] = xi;
|
|
|
|
xr = a[98];
|
|
xi = a[99];
|
|
yr = a[70];
|
|
yi = a[71];
|
|
a[98] = yr;
|
|
a[99] = yi;
|
|
a[70] = xr;
|
|
a[71] = xi;
|
|
|
|
xr = a[106];
|
|
xi = a[107];
|
|
yr = a[86];
|
|
yi = a[87];
|
|
a[106] = yr;
|
|
a[107] = yi;
|
|
a[86] = xr;
|
|
a[87] = xi;
|
|
|
|
xr = a[114];
|
|
xi = a[115];
|
|
yr = a[78];
|
|
yi = a[79];
|
|
a[114] = yr;
|
|
a[115] = yi;
|
|
a[78] = xr;
|
|
a[79] = xi;
|
|
|
|
xr = a[122];
|
|
xi = a[123];
|
|
yr = a[94];
|
|
yi = a[95];
|
|
a[122] = yr;
|
|
a[123] = yi;
|
|
a[94] = xr;
|
|
a[95] = xi;
|
|
|
|
xr = a[100];
|
|
xi = a[101];
|
|
yr = a[38];
|
|
yi = a[39];
|
|
a[100] = yr;
|
|
a[101] = yi;
|
|
a[38] = xr;
|
|
a[39] = xi;
|
|
|
|
xr = a[108];
|
|
xi = a[109];
|
|
yr = a[54];
|
|
yi = a[55];
|
|
a[108] = yr;
|
|
a[109] = yi;
|
|
a[54] = xr;
|
|
a[55] = xi;
|
|
|
|
xr = a[116];
|
|
xi = a[117];
|
|
yr = a[46];
|
|
yi = a[47];
|
|
a[116] = yr;
|
|
a[117] = yi;
|
|
a[46] = xr;
|
|
a[47] = xi;
|
|
|
|
xr = a[124];
|
|
xi = a[125];
|
|
yr = a[62];
|
|
yi = a[63];
|
|
a[124] = yr;
|
|
a[125] = yi;
|
|
a[62] = xr;
|
|
a[63] = xi;
|
|
|
|
xr = a[110];
|
|
xi = a[111];
|
|
yr = a[118];
|
|
yi = a[119];
|
|
a[110] = yr;
|
|
a[111] = yi;
|
|
a[118] = xr;
|
|
a[119] = xi;
|
|
}
|
|
|
|
static void cftfsub_128_mips(float *a) {
|
|
float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
|
|
float f0, f1, f2, f3, f4, f5, f6, f7;
|
|
int tmp_a, count;
|
|
|
|
cft1st_128(a);
|
|
cftmdl_128(a);
|
|
|
|
__asm __volatile (
|
|
".set push \n\t"
|
|
".set noreorder \n\t"
|
|
"addiu %[tmp_a], %[a], 0 \n\t"
|
|
"addiu %[count], $zero, 16 \n\t"
|
|
"1: \n\t"
|
|
"addiu %[count], %[count], -1 \n\t"
|
|
"lwc1 %[f0], 0(%[tmp_a]) \n\t"
|
|
"lwc1 %[f1], 4(%[tmp_a]) \n\t"
|
|
"lwc1 %[f2], 128(%[tmp_a]) \n\t"
|
|
"lwc1 %[f3], 132(%[tmp_a]) \n\t"
|
|
"lwc1 %[f4], 256(%[tmp_a]) \n\t"
|
|
"lwc1 %[f5], 260(%[tmp_a]) \n\t"
|
|
"lwc1 %[f6], 384(%[tmp_a]) \n\t"
|
|
"lwc1 %[f7], 388(%[tmp_a]) \n\t"
|
|
"add.s %[x0r], %[f0], %[f2] \n\t"
|
|
"add.s %[x0i], %[f1], %[f3] \n\t"
|
|
"add.s %[x2r], %[f4], %[f6] \n\t"
|
|
"add.s %[x2i], %[f5], %[f7] \n\t"
|
|
"sub.s %[x1r], %[f0], %[f2] \n\t"
|
|
"sub.s %[x1i], %[f1], %[f3] \n\t"
|
|
"sub.s %[x3r], %[f4], %[f6] \n\t"
|
|
"sub.s %[x3i], %[f5], %[f7] \n\t"
|
|
"add.s %[f0], %[x0r], %[x2r] \n\t"
|
|
"add.s %[f1], %[x0i], %[x2i] \n\t"
|
|
"sub.s %[f4], %[x0r], %[x2r] \n\t"
|
|
"sub.s %[f5], %[x0i], %[x2i] \n\t"
|
|
"sub.s %[f2], %[x1r], %[x3i] \n\t"
|
|
"add.s %[f3], %[x1i], %[x3r] \n\t"
|
|
"add.s %[f6], %[x1r], %[x3i] \n\t"
|
|
"sub.s %[f7], %[x1i], %[x3r] \n\t"
|
|
"swc1 %[f0], 0(%[tmp_a]) \n\t"
|
|
"swc1 %[f1], 4(%[tmp_a]) \n\t"
|
|
"swc1 %[f2], 128(%[tmp_a]) \n\t"
|
|
"swc1 %[f3], 132(%[tmp_a]) \n\t"
|
|
"swc1 %[f4], 256(%[tmp_a]) \n\t"
|
|
"swc1 %[f5], 260(%[tmp_a]) \n\t"
|
|
"swc1 %[f6], 384(%[tmp_a]) \n\t"
|
|
"swc1 %[f7], 388(%[tmp_a]) \n\t"
|
|
"bgtz %[count], 1b \n\t"
|
|
" addiu %[tmp_a], %[tmp_a], 8 \n\t"
|
|
".set pop \n\t"
|
|
: [f0] "=&f" (f0), [f1] "=&f" (f1), [f2] "=&f" (f2), [f3] "=&f" (f3),
|
|
[f4] "=&f" (f4), [f5] "=&f" (f5), [f6] "=&f" (f6), [f7] "=&f" (f7),
|
|
[x0r] "=&f" (x0r), [x0i] "=&f" (x0i), [x1r] "=&f" (x1r),
|
|
[x1i] "=&f" (x1i), [x2r] "=&f" (x2r), [x2i] "=&f" (x2i),
|
|
[x3r] "=&f" (x3r), [x3i] "=&f" (x3i), [tmp_a] "=&r" (tmp_a),
|
|
[count] "=&r" (count)
|
|
: [a] "r" (a)
|
|
: "memory"
|
|
);
|
|
}
|
|
|
|
void aec_rdft_init_mips(void) {
|
|
cftfsub_128 = cftfsub_128_mips;
|
|
bitrv2_128 = bitrv2_128_mips;
|
|
}
|