1ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org/*
2ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org *
4ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org */
10ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
11c2c4117477afe9586b86069a158fc972f618b5efbjornv@webrtc.org#include <assert.h>
120f911d71a75f9fbfc1006a1fdedfd6a7f6a6af62Bjorn Volcker#include <string.h>
13c2c4117477afe9586b86069a158fc972f618b5efbjornv@webrtc.org
149b72af94cd61782ada88f777b07854daf9657bb2Henrik Kjellander#include "webrtc/modules/audio_processing/ns/noise_suppression_x.h"
15ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org#include "webrtc/modules/audio_processing/ns/nsx_core.h"
16ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
17ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.orgstatic const int16_t kIndicatorTable[17] = {
18ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  0, 2017, 3809, 5227, 6258, 6963, 7424, 7718,
19ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  7901, 8014, 8084, 8126, 8152, 8168, 8177, 8183, 8187
20ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org};
21ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
22ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org// Compute speech/noise probability
23ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org// speech/noise probability is returned in: probSpeechFinal
24ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org//snrLocPrior is the prior SNR for each frequency (in Q11)
25ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org//snrLocPost is the post SNR for each frequency (in Q11)
26e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.orgvoid WebRtcNsx_SpeechNoiseProb(NoiseSuppressionFixedC* inst,
27ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org                               uint16_t* nonSpeechProbFinal,
28ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org                               uint32_t* priorLocSnr,
29ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org                               uint32_t* postLocSnr) {
30ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  uint32_t tmpU32no1, tmpU32no2, tmpU32no3;
31ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int32_t indPriorFX, tmp32no1;
32ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int32_t logLrtTimeAvgKsumFX;
33ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int16_t indPriorFX16;
34ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int16_t tmp16, tmp16no1, tmp16no2, tmpIndFX, tableIndex, frac;
35dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  size_t i;
36dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  int normTmp, nShifts;
37ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
38ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int32_t r0, r1, r2, r3, r4, r5, r6, r7, r8, r9;
39ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int32_t const_max = 0x7fffffff;
40ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int32_t const_neg43 = -43;
41ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int32_t const_5412 = 5412;
42ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int32_t const_11rsh12 = (11 << 12);
43ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int32_t const_178 = 178;
44ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
45ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
46ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  // compute feature based on average LR factor
47ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  // this is the average over all frequencies of the smooth log LRT
48ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  logLrtTimeAvgKsumFX = 0;
49ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  for (i = 0; i < inst->magnLen; i++) {
50ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    r0 = postLocSnr[i]; // Q11
51ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    r1 = priorLocSnr[i];
52ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    r2 = inst->logLrtTimeAvgW32[i];
53ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
54ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    __asm __volatile(
55ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      ".set       push                                    \n\t"
56ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      ".set       noreorder                               \n\t"
57ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "clz        %[r3],    %[r0]                         \n\t"
58ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "clz        %[r5],    %[r1]                         \n\t"
59ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "slti       %[r4],    %[r3],    32                  \n\t"
60ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "slti       %[r6],    %[r5],    32                  \n\t"
61ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "movz       %[r3],    $0,       %[r4]               \n\t"
62ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "movz       %[r5],    $0,       %[r6]               \n\t"
63ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "slti       %[r4],    %[r3],    11                  \n\t"
64ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "addiu      %[r6],    %[r3],    -11                 \n\t"
65ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "neg        %[r7],    %[r6]                         \n\t"
66ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "sllv       %[r6],    %[r1],    %[r6]               \n\t"
67ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "srav       %[r7],    %[r1],    %[r7]               \n\t"
68ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "movn       %[r6],    %[r7],    %[r4]               \n\t"
69ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "sllv       %[r1],    %[r1],    %[r5]               \n\t"
70ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "and        %[r1],    %[r1],    %[const_max]        \n\t"
71ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "sra        %[r1],    %[r1],    19                  \n\t"
72ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "mul        %[r7],    %[r1],    %[r1]               \n\t"
73ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "sllv       %[r3],    %[r0],    %[r3]               \n\t"
74ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "divu       %[r8],    %[r3],    %[r6]               \n\t"
75ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "slti       %[r6],    %[r6],    1                   \n\t"
76ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "mul        %[r7],    %[r7],    %[const_neg43]      \n\t"
77ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "sra        %[r7],    %[r7],    19                  \n\t"
78ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "movz       %[r3],    %[r8],    %[r6]               \n\t"
79ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "subu       %[r0],    %[r0],    %[r3]               \n\t"
8048f2568d89c09c4363040cfc3cb63a1df0121955bjornv@webrtc.org      "movn       %[r0],    $0,       %[r6]               \n\t"
81ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "mul        %[r1],    %[r1],    %[const_5412]       \n\t"
82ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "sra        %[r1],    %[r1],    12                  \n\t"
83ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "addu       %[r7],    %[r7],    %[r1]               \n\t"
84ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "addiu      %[r1],    %[r7],    37                  \n\t"
85ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "addiu      %[r5],    %[r5],    -31                 \n\t"
86ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "neg        %[r5],    %[r5]                         \n\t"
87ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "sll        %[r5],    %[r5],    12                  \n\t"
88ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "addu       %[r5],    %[r5],    %[r1]               \n\t"
89ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "subu       %[r7],    %[r5],    %[const_11rsh12]    \n\t"
90ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "mul        %[r7],    %[r7],    %[const_178]        \n\t"
91ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "sra        %[r7],    %[r7],    8                   \n\t"
92ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "addu       %[r7],    %[r7],    %[r2]               \n\t"
93ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "sra        %[r7],    %[r7],    1                   \n\t"
94ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "subu       %[r2],    %[r2],    %[r7]               \n\t"
95ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      "addu       %[r2],    %[r2],    %[r0]               \n\t"
96ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      ".set       pop                                     \n\t"
97ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      : [r0] "+r" (r0), [r1] "+r" (r1), [r2] "+r" (r2),
98ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org        [r3] "=&r" (r3), [r4] "=&r" (r4), [r5] "=&r" (r5),
99ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org        [r6] "=&r" (r6), [r7] "=&r" (r7), [r8] "=&r" (r8)
100ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      : [const_max] "r" (const_max), [const_neg43] "r" (const_neg43),
101ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org        [const_5412] "r" (const_5412), [const_11rsh12] "r" (const_11rsh12),
102ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org        [const_178] "r" (const_178)
103ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      : "hi", "lo"
104ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    );
105ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    inst->logLrtTimeAvgW32[i] = r2;
106ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    logLrtTimeAvgKsumFX += r2;
107ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  }
108ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
1098dc00d76af99f4a76626e20e3d5cea342ef8f44cbjornv@webrtc.org  inst->featureLogLrt = (logLrtTimeAvgKsumFX * BIN_SIZE_LRT) >>
1108dc00d76af99f4a76626e20e3d5cea342ef8f44cbjornv@webrtc.org      (inst->stages + 11);
1118dc00d76af99f4a76626e20e3d5cea342ef8f44cbjornv@webrtc.org
112ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  // done with computation of LR factor
113ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
114ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  //
115ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  // compute the indicator functions
116ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  //
117ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
118ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  // average LRT feature
119ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  // FLOAT code
120ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  // indicator0 = 0.5 * (tanh(widthPrior *
121ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  //                      (logLrtTimeAvgKsum - threshPrior0)) + 1.0);
122ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  tmpIndFX = 16384; // Q14(1.0)
123ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  tmp32no1 = logLrtTimeAvgKsumFX - inst->thresholdLogLrt; // Q12
124ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  nShifts = 7 - inst->stages; // WIDTH_PR_MAP_SHIFT - inst->stages + 5;
125ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  //use larger width in tanh map for pause regions
126ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  if (tmp32no1 < 0) {
127ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    tmpIndFX = 0;
128ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    tmp32no1 = -tmp32no1;
129ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    //widthPrior = widthPrior * 2.0;
130ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    nShifts++;
131ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  }
132ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  tmp32no1 = WEBRTC_SPL_SHIFT_W32(tmp32no1, nShifts); // Q14
133ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  // compute indicator function: sigmoid map
1348dc00d76af99f4a76626e20e3d5cea342ef8f44cbjornv@webrtc.org  tableIndex = (int16_t)(tmp32no1 >> 14);
135ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  if ((tableIndex < 16) && (tableIndex >= 0)) {
136ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    tmp16no2 = kIndicatorTable[tableIndex];
137ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    tmp16no1 = kIndicatorTable[tableIndex + 1] - kIndicatorTable[tableIndex];
138ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    frac = (int16_t)(tmp32no1 & 0x00003fff); // Q14
1397ef8b12a3b70b3abdd5b0bf56051d61ec19724e2bjornv@webrtc.org    tmp16no2 += (int16_t)((tmp16no1 * frac) >> 14);
140ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    if (tmpIndFX == 0) {
141ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      tmpIndFX = 8192 - tmp16no2; // Q14
142ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    } else {
143ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      tmpIndFX = 8192 + tmp16no2; // Q14
144ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    }
145ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  }
146dec649cbabe4aa6c3b150664d73ee17a8e0ec76fbjornv@webrtc.org  indPriorFX = inst->weightLogLrt * tmpIndFX;  // 6*Q14
147ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
148ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  //spectral flatness feature
149ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  if (inst->weightSpecFlat) {
150ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    tmpU32no1 = WEBRTC_SPL_UMUL(inst->featureSpecFlat, 400); // Q10
151ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    tmpIndFX = 16384; // Q14(1.0)
152ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    //use larger width in tanh map for pause regions
153ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    tmpU32no2 = inst->thresholdSpecFlat - tmpU32no1; //Q10
154ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    nShifts = 4;
155ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    if (inst->thresholdSpecFlat < tmpU32no1) {
156ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      tmpIndFX = 0;
157ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      tmpU32no2 = tmpU32no1 - inst->thresholdSpecFlat;
158ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      //widthPrior = widthPrior * 2.0;
159ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      nShifts++;
160ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    }
161c2c4117477afe9586b86069a158fc972f618b5efbjornv@webrtc.org    tmpU32no1 = WebRtcSpl_DivU32U16(tmpU32no2 << nShifts, 25);  //Q14
162ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    // compute indicator function: sigmoid map
163ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    // FLOAT code
164ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    // indicator1 = 0.5 * (tanh(sgnMap * widthPrior *
165ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    //                          (threshPrior1 - tmpFloat1)) + 1.0);
166348eac641e921e9f9414837e6f44df1127ce2670bjornv@webrtc.org    tableIndex = (int16_t)(tmpU32no1 >> 14);
167ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    if (tableIndex < 16) {
168ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      tmp16no2 = kIndicatorTable[tableIndex];
169ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      tmp16no1 = kIndicatorTable[tableIndex + 1] - kIndicatorTable[tableIndex];
170ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      frac = (int16_t)(tmpU32no1 & 0x00003fff); // Q14
1717ef8b12a3b70b3abdd5b0bf56051d61ec19724e2bjornv@webrtc.org      tmp16no2 += (int16_t)((tmp16no1 * frac) >> 14);
172ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      if (tmpIndFX) {
173ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org        tmpIndFX = 8192 + tmp16no2; // Q14
174ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      } else {
175ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org        tmpIndFX = 8192 - tmp16no2; // Q14
176ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      }
177ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    }
178dec649cbabe4aa6c3b150664d73ee17a8e0ec76fbjornv@webrtc.org    indPriorFX += inst->weightSpecFlat * tmpIndFX;  // 6*Q14
179ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  }
180ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
181ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  //for template spectral-difference
182ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  if (inst->weightSpecDiff) {
183ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    tmpU32no1 = 0;
184ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    if (inst->featureSpecDiff) {
185ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      normTmp = WEBRTC_SPL_MIN(20 - inst->stages,
186ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org                               WebRtcSpl_NormU32(inst->featureSpecDiff));
187c2c4117477afe9586b86069a158fc972f618b5efbjornv@webrtc.org      assert(normTmp >= 0);
188c2c4117477afe9586b86069a158fc972f618b5efbjornv@webrtc.org      tmpU32no1 = inst->featureSpecDiff << normTmp;  // Q(normTmp-2*stages)
189348eac641e921e9f9414837e6f44df1127ce2670bjornv@webrtc.org      tmpU32no2 = inst->timeAvgMagnEnergy >> (20 - inst->stages - normTmp);
190ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      if (tmpU32no2 > 0) {
191ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org        // Q(20 - inst->stages)
1924f71e22bf97903ba52bed537a3f614089ce1fb93bjornv@webrtc.org        tmpU32no1 /= tmpU32no2;
193ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      } else {
194ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org        tmpU32no1 = (uint32_t)(0x7fffffff);
195ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      }
196ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    }
1974f71e22bf97903ba52bed537a3f614089ce1fb93bjornv@webrtc.org    tmpU32no3 = (inst->thresholdSpecDiff << 17) / 25;
198ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    tmpU32no2 = tmpU32no1 - tmpU32no3;
199ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    nShifts = 1;
200ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    tmpIndFX = 16384; // Q14(1.0)
201ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    //use larger width in tanh map for pause regions
202ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    if (tmpU32no2 & 0x80000000) {
203ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      tmpIndFX = 0;
204ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      tmpU32no2 = tmpU32no3 - tmpU32no1;
205ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      //widthPrior = widthPrior * 2.0;
206ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      nShifts--;
207ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    }
208348eac641e921e9f9414837e6f44df1127ce2670bjornv@webrtc.org    tmpU32no1 = tmpU32no2 >> nShifts;
209ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    // compute indicator function: sigmoid map
210ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    /* FLOAT code
211ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org     indicator2 = 0.5 * (tanh(widthPrior * (tmpFloat1 - threshPrior2)) + 1.0);
212ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org     */
213348eac641e921e9f9414837e6f44df1127ce2670bjornv@webrtc.org    tableIndex = (int16_t)(tmpU32no1 >> 14);
214ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    if (tableIndex < 16) {
215ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      tmp16no2 = kIndicatorTable[tableIndex];
216ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      tmp16no1 = kIndicatorTable[tableIndex + 1] - kIndicatorTable[tableIndex];
217ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      frac = (int16_t)(tmpU32no1 & 0x00003fff); // Q14
218ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      tmp16no2 += (int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(
219ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org                    tmp16no1, frac, 14);
220ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      if (tmpIndFX) {
221ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org        tmpIndFX = 8192 + tmp16no2;
222ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      } else {
223ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org        tmpIndFX = 8192 - tmp16no2;
224ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      }
225ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    }
226dec649cbabe4aa6c3b150664d73ee17a8e0ec76fbjornv@webrtc.org    indPriorFX += inst->weightSpecDiff * tmpIndFX;  // 6*Q14
227ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  }
228ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
229ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  //combine the indicator function with the feature weights
230ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  // FLOAT code
231ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  // indPrior = 1 - (weightIndPrior0 * indicator0 + weightIndPrior1 *
232ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  //                 indicator1 + weightIndPrior2 * indicator2);
233ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  indPriorFX16 = WebRtcSpl_DivW32W16ResW16(98307 - indPriorFX, 6); // Q14
234ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  // done with computing indicator function
235ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
236ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  //compute the prior probability
237ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  // FLOAT code
238ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  // inst->priorNonSpeechProb += PRIOR_UPDATE *
239ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  //                             (indPriorNonSpeech - inst->priorNonSpeechProb);
240ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  tmp16 = indPriorFX16 - inst->priorNonSpeechProb; // Q14
2417ef8b12a3b70b3abdd5b0bf56051d61ec19724e2bjornv@webrtc.org  inst->priorNonSpeechProb += (int16_t)((PRIOR_UPDATE_Q14 * tmp16) >> 14);
242ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
243ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  //final speech probability: combine prior model with LR factor:
244ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
245ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  memset(nonSpeechProbFinal, 0, sizeof(uint16_t) * inst->magnLen);
246ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
247ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  if (inst->priorNonSpeechProb > 0) {
248ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    r0 = inst->priorNonSpeechProb;
249ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    r1 = 16384 - r0;
250ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    int32_t const_23637 = 23637;
251ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    int32_t const_44 = 44;
252ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    int32_t const_84 = 84;
253ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    int32_t const_1 = 1;
254ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    int32_t const_neg8 = -8;
255ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    for (i = 0; i < inst->magnLen; i++) {
256ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      r2 = inst->logLrtTimeAvgW32[i];
257ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      if (r2 < 65300) {
258ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org        __asm __volatile(
259ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          ".set         push                                      \n\t"
260ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          ".set         noreorder                                 \n\t"
261ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "mul          %[r2],    %[r2],          %[const_23637]  \n\t"
262ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "sll          %[r6],    %[r1],          16              \n\t"
263ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "clz          %[r7],    %[r6]                           \n\t"
264ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "clo          %[r8],    %[r6]                           \n\t"
265ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "slt          %[r9],    %[r6],          $0              \n\t"
266ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "movn         %[r7],    %[r8],          %[r9]           \n\t"
267ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "sra          %[r2],    %[r2],          14              \n\t"
268ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "andi         %[r3],    %[r2],          0xfff           \n\t"
269ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "mul          %[r4],    %[r3],          %[r3]           \n\t"
270ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "mul          %[r3],    %[r3],          %[const_84]     \n\t"
271ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "sra          %[r2],    %[r2],          12              \n\t"
272ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "slt          %[r5],    %[r2],          %[const_neg8]   \n\t"
273ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "movn         %[r2],    %[const_neg8],  %[r5]           \n\t"
274ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "mul          %[r4],    %[r4],          %[const_44]     \n\t"
275ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "sra          %[r3],    %[r3],          7               \n\t"
276ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "addiu        %[r7],    %[r7],          -1              \n\t"
277ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "slti         %[r9],    %[r7],          31              \n\t"
278ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "movz         %[r7],    $0,             %[r9]           \n\t"
279ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "sra          %[r4],    %[r4],          19              \n\t"
280ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "addu         %[r4],    %[r4],          %[r3]           \n\t"
281ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "addiu        %[r3],    %[r2],          8               \n\t"
282ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "addiu        %[r2],    %[r2],          -4              \n\t"
283ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "neg          %[r5],    %[r2]                           \n\t"
284ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "sllv         %[r6],    %[r4],          %[r2]           \n\t"
285ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "srav         %[r5],    %[r4],          %[r5]           \n\t"
286ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "slt          %[r2],    %[r2],          $0              \n\t"
287ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "movn         %[r6],    %[r5],          %[r2]           \n\t"
288ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "sllv         %[r3],    %[const_1],     %[r3]           \n\t"
289ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "addu         %[r2],    %[r3],          %[r6]           \n\t"
290ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "clz          %[r4],    %[r2]                           \n\t"
291ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "clo          %[r5],    %[r2]                           \n\t"
292ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "slt          %[r8],    %[r2],          $0              \n\t"
293ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "movn         %[r4],    %[r5],          %[r8]           \n\t"
294ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "addiu        %[r4],    %[r4],          -1              \n\t"
295ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "slt          %[r5],    $0,             %[r2]           \n\t"
296ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "or           %[r5],    %[r5],          %[r7]           \n\t"
297ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "movz         %[r4],    $0,             %[r5]           \n\t"
298ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "addiu        %[r6],    %[r7],          -7              \n\t"
299ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "addu         %[r6],    %[r6],          %[r4]           \n\t"
300ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "bltz         %[r6],    1f                              \n\t"
301ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          " nop                                                   \n\t"
302ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "addiu        %[r4],    %[r6],          -8              \n\t"
303ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "neg          %[r3],    %[r4]                           \n\t"
304ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "srav         %[r5],    %[r2],          %[r3]           \n\t"
305ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "mul          %[r5],    %[r5],          %[r1]           \n\t"
306ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "mul          %[r2],    %[r2],          %[r1]           \n\t"
307ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "slt          %[r4],    %[r4],          $0              \n\t"
308ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "srav         %[r5],    %[r5],          %[r6]           \n\t"
309ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "sra          %[r2],    %[r2],          8               \n\t"
310ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "movn         %[r2],    %[r5],          %[r4]           \n\t"
311ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "sll          %[r3],    %[r0],          8               \n\t"
312ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "addu         %[r2],    %[r0],          %[r2]           \n\t"
313ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          "divu         %[r3],    %[r3],          %[r2]           \n\t"
314ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org         "1:                                                      \n\t"
315ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          ".set         pop                                       \n\t"
316ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          : [r2] "+r" (r2), [r3] "=&r" (r3), [r4] "=&r" (r4),
317ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org            [r5] "=&r" (r5), [r6] "=&r" (r6), [r7] "=&r" (r7),
318ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org            [r8] "=&r" (r8), [r9] "=&r" (r9)
319ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          : [r0] "r" (r0), [r1] "r" (r1), [const_23637] "r" (const_23637),
320ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org            [const_neg8] "r" (const_neg8), [const_84] "r" (const_84),
321ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org            [const_1] "r" (const_1), [const_44] "r" (const_44)
322ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org          : "hi", "lo"
323ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org        );
324ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org        nonSpeechProbFinal[i] = r3;
325ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      }
326ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    }
327ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  }
328ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org}
329ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
330ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org// Update analysis buffer for lower band, and window data before FFT.
331e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.orgvoid WebRtcNsx_AnalysisUpdate_mips(NoiseSuppressionFixedC* inst,
332ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org                                   int16_t* out,
333ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org                                   int16_t* new_speech) {
334ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int iters, after;
335dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  int anaLen = (int)inst->anaLen;
336ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int *window = (int*)inst->window;
337ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int *anaBuf = (int*)inst->analysisBuffer;
338ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int *outBuf = (int*)out;
339ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int r0, r1, r2, r3, r4, r5, r6, r7;
340ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org#if defined(MIPS_DSP_R1_LE)
341ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int r8;
342ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org#endif
343ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
344ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  // For lower band update analysis buffer.
3450f911d71a75f9fbfc1006a1fdedfd6a7f6a6af62Bjorn Volcker  memcpy(inst->analysisBuffer, inst->analysisBuffer + inst->blockLen10ms,
3460f911d71a75f9fbfc1006a1fdedfd6a7f6a6af62Bjorn Volcker      (inst->anaLen - inst->blockLen10ms) * sizeof(*inst->analysisBuffer));
3470f911d71a75f9fbfc1006a1fdedfd6a7f6a6af62Bjorn Volcker  memcpy(inst->analysisBuffer + inst->anaLen - inst->blockLen10ms, new_speech,
3480f911d71a75f9fbfc1006a1fdedfd6a7f6a6af62Bjorn Volcker      inst->blockLen10ms * sizeof(*inst->analysisBuffer));
349ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
350ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  // Window data before FFT.
351ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org#if defined(MIPS_DSP_R1_LE)
352ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  __asm __volatile(
353ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    ".set              push                                \n\t"
354ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    ".set              noreorder                           \n\t"
355ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra               %[iters],   %[anaLen],    3         \n\t"
356ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "1:                                                     \n\t"
357ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "blez              %[iters],   2f                      \n\t"
358ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " nop                                                  \n\t"
359ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lw                %[r0],      0(%[window])            \n\t"
360ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lw                %[r1],      0(%[anaBuf])            \n\t"
361ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lw                %[r2],      4(%[window])            \n\t"
362ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lw                %[r3],      4(%[anaBuf])            \n\t"
363ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lw                %[r4],      8(%[window])            \n\t"
364ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lw                %[r5],      8(%[anaBuf])            \n\t"
365ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lw                %[r6],      12(%[window])           \n\t"
366ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lw                %[r7],      12(%[anaBuf])           \n\t"
367ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "muleq_s.w.phl     %[r8],      %[r0],        %[r1]     \n\t"
368ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "muleq_s.w.phr     %[r0],      %[r0],        %[r1]     \n\t"
369ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "muleq_s.w.phl     %[r1],      %[r2],        %[r3]     \n\t"
370ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "muleq_s.w.phr     %[r2],      %[r2],        %[r3]     \n\t"
371ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "muleq_s.w.phl     %[r3],      %[r4],        %[r5]     \n\t"
372ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "muleq_s.w.phr     %[r4],      %[r4],        %[r5]     \n\t"
373ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "muleq_s.w.phl     %[r5],      %[r6],        %[r7]     \n\t"
374ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "muleq_s.w.phr     %[r6],      %[r6],        %[r7]     \n\t"
375ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org#if defined(MIPS_DSP_R2_LE)
376ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "precr_sra_r.ph.w  %[r8],      %[r0],        15        \n\t"
377ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "precr_sra_r.ph.w  %[r1],      %[r2],        15        \n\t"
378ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "precr_sra_r.ph.w  %[r3],      %[r4],        15        \n\t"
379ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "precr_sra_r.ph.w  %[r5],      %[r6],        15        \n\t"
380ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sw                %[r8],      0(%[outBuf])            \n\t"
381ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sw                %[r1],      4(%[outBuf])            \n\t"
382ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sw                %[r3],      8(%[outBuf])            \n\t"
383ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sw                %[r5],      12(%[outBuf])           \n\t"
384ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org#else
385ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "shra_r.w          %[r8],      %[r8],        15        \n\t"
386ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "shra_r.w          %[r0],      %[r0],        15        \n\t"
387ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "shra_r.w          %[r1],      %[r1],        15        \n\t"
388ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "shra_r.w          %[r2],      %[r2],        15        \n\t"
389ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "shra_r.w          %[r3],      %[r3],        15        \n\t"
390ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "shra_r.w          %[r4],      %[r4],        15        \n\t"
391ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "shra_r.w          %[r5],      %[r5],        15        \n\t"
392ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "shra_r.w          %[r6],      %[r6],        15        \n\t"
393ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sll               %[r0],      %[r0],        16        \n\t"
394ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sll               %[r2],      %[r2],        16        \n\t"
395ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sll               %[r4],      %[r4],        16        \n\t"
396ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sll               %[r6],      %[r6],        16        \n\t"
397ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "packrl.ph         %[r0],      %[r8],        %[r0]     \n\t"
398ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "packrl.ph         %[r2],      %[r1],        %[r2]     \n\t"
399ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "packrl.ph         %[r4],      %[r3],        %[r4]     \n\t"
400ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "packrl.ph         %[r6],      %[r5],        %[r6]     \n\t"
401ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sw                %[r0],      0(%[outBuf])            \n\t"
402ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sw                %[r2],      4(%[outBuf])            \n\t"
403ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sw                %[r4],      8(%[outBuf])            \n\t"
404ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sw                %[r6],      12(%[outBuf])           \n\t"
405ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org#endif
406ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu             %[window],  %[window],    16        \n\t"
407ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu             %[anaBuf],  %[anaBuf],    16        \n\t"
408ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu             %[outBuf],  %[outBuf],    16        \n\t"
409ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "b                 1b                                  \n\t"
410ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " addiu            %[iters],   %[iters],     -1        \n\t"
411ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "2:                                                     \n\t"
412ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "andi              %[after],   %[anaLen],    7         \n\t"
413ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "3:                                                     \n\t"
414ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "blez              %[after],   4f                      \n\t"
415ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " nop                                                  \n\t"
416ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh                %[r0],      0(%[window])            \n\t"
417ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh                %[r1],      0(%[anaBuf])            \n\t"
418ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul               %[r0],      %[r0],        %[r1]     \n\t"
419ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu             %[window],  %[window],    2         \n\t"
420ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu             %[anaBuf],  %[anaBuf],    2         \n\t"
421ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu             %[outBuf],  %[outBuf],    2         \n\t"
422ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "shra_r.w          %[r0],      %[r0],        14        \n\t"
423ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh                %[r0],      -2(%[outBuf])           \n\t"
424ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "b                 3b                                  \n\t"
425ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " addiu            %[after],   %[after],     -1        \n\t"
426ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "4:                                                     \n\t"
427ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    ".set              pop                                 \n\t"
428ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    : [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2),
429ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [r3] "=&r" (r3), [r4] "=&r" (r4), [r5] "=&r" (r5),
430ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [r6] "=&r" (r6), [r7] "=&r" (r7), [r8] "=&r" (r8),
431ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [iters] "=&r" (iters), [after] "=&r" (after),
432ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [window] "+r" (window),[anaBuf] "+r" (anaBuf),
433ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [outBuf] "+r" (outBuf)
434ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    : [anaLen] "r" (anaLen)
435ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    : "memory", "hi", "lo"
436ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  );
437ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org#else
438ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  __asm  __volatile(
439ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    ".set           push                                    \n\t"
440ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    ".set           noreorder                               \n\t"
441ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra            %[iters],   %[anaLen],      2           \n\t"
442ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "1:                                                      \n\t"
443ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "blez           %[iters],   2f                          \n\t"
444ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " nop                                                   \n\t"
445ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh             %[r0],      0(%[window])                \n\t"
446ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh             %[r1],      0(%[anaBuf])                \n\t"
447ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh             %[r2],      2(%[window])                \n\t"
448ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh             %[r3],      2(%[anaBuf])                \n\t"
449ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh             %[r4],      4(%[window])                \n\t"
450ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh             %[r5],      4(%[anaBuf])                \n\t"
451ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh             %[r6],      6(%[window])                \n\t"
452ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh             %[r7],      6(%[anaBuf])                \n\t"
453ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul            %[r0],      %[r0],          %[r1]       \n\t"
454ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul            %[r2],      %[r2],          %[r3]       \n\t"
455ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul            %[r4],      %[r4],          %[r5]       \n\t"
456ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul            %[r6],      %[r6],          %[r7]       \n\t"
457ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu          %[window],  %[window],      8           \n\t"
458ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu          %[anaBuf],  %[anaBuf],      8           \n\t"
459ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu          %[r0],      %[r0],          0x2000      \n\t"
460ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu          %[r2],      %[r2],          0x2000      \n\t"
461ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu          %[r4],      %[r4],          0x2000      \n\t"
462ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu          %[r6],      %[r6],          0x2000      \n\t"
463ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra            %[r0],      %[r0],          14          \n\t"
464ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra            %[r2],      %[r2],          14          \n\t"
465ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra            %[r4],      %[r4],          14          \n\t"
466ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra            %[r6],      %[r6],          14          \n\t"
467ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh             %[r0],      0(%[outBuf])                \n\t"
468ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh             %[r2],      2(%[outBuf])                \n\t"
469ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh             %[r4],      4(%[outBuf])                \n\t"
470ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh             %[r6],      6(%[outBuf])                \n\t"
471ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu          %[outBuf],  %[outBuf],      8           \n\t"
472ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "b              1b                                      \n\t"
473ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " addiu         %[iters],   %[iters],       -1          \n\t"
474ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "2:                                                      \n\t"
475ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "andi           %[after],   %[anaLen],      3           \n\t"
476ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "3:                                                      \n\t"
477ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "blez           %[after],   4f                          \n\t"
478ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " nop                                                   \n\t"
479ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh             %[r0],      0(%[window])                \n\t"
480ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh             %[r1],      0(%[anaBuf])                \n\t"
481ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul            %[r0],      %[r0],          %[r1]       \n\t"
482ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu          %[window],  %[window],      2           \n\t"
483ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu          %[anaBuf],  %[anaBuf],      2           \n\t"
484ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu          %[outBuf],  %[outBuf],      2           \n\t"
485ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu          %[r0],      %[r0],          0x2000      \n\t"
486ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra            %[r0],      %[r0],          14          \n\t"
487ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh             %[r0],      -2(%[outBuf])               \n\t"
488ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "b              3b                                      \n\t"
489ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " addiu         %[after],   %[after],       -1          \n\t"
490ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "4:                                                      \n\t"
491ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    ".set           pop                                     \n\t"
492ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    : [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2),
493ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [r3] "=&r" (r3), [r4] "=&r" (r4), [r5] "=&r" (r5),
494ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [r6] "=&r" (r6), [r7] "=&r" (r7), [iters] "=&r" (iters),
495ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [after] "=&r" (after), [window] "+r" (window),
496ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [anaBuf] "+r" (anaBuf), [outBuf] "+r" (outBuf)
497ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    : [anaLen] "r" (anaLen)
498ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    : "memory", "hi", "lo"
499ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  );
500ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org#endif
501ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org}
502ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
503ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org// For the noise supression process, synthesis, read out fully processed
504ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org// segment, and update synthesis buffer.
505e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.orgvoid WebRtcNsx_SynthesisUpdate_mips(NoiseSuppressionFixedC* inst,
506ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org                                    int16_t* out_frame,
507ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org                                    int16_t gain_factor) {
508dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  int iters = (int)inst->blockLen10ms >> 2;
509ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int after = inst->blockLen10ms & 3;
510ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int r0, r1, r2, r3, r4, r5, r6, r7;
511ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int16_t *window = (int16_t*)inst->window;
512ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int16_t *real = inst->real;
513ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int16_t *synthBuf = inst->synthesisBuffer;
514ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int16_t *out = out_frame;
515ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int sat_pos = 0x7fff;
516ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int sat_neg = 0xffff8000;
517ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int block10 = (int)inst->blockLen10ms;
518ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int anaLen = (int)inst->anaLen;
519ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
520ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  __asm __volatile(
521ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    ".set       push                                        \n\t"
522ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    ".set       noreorder                                   \n\t"
523ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "1:                                                      \n\t"
524ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "blez       %[iters],   2f                              \n\t"
525ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " nop                                                   \n\t"
526ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r0],      0(%[window])                    \n\t"
527ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r1],      0(%[real])                      \n\t"
528ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r2],      2(%[window])                    \n\t"
529ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r3],      2(%[real])                      \n\t"
530ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r4],      4(%[window])                    \n\t"
531ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r5],      4(%[real])                      \n\t"
532ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r6],      6(%[window])                    \n\t"
533ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r7],      6(%[real])                      \n\t"
534ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r0],      %[r0],          %[r1]           \n\t"
535ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r2],      %[r2],          %[r3]           \n\t"
536ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r4],      %[r4],          %[r5]           \n\t"
537ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r6],      %[r6],          %[r7]           \n\t"
538ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r0],      %[r0],          0x2000          \n\t"
539ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r2],      %[r2],          0x2000          \n\t"
540ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r4],      %[r4],          0x2000          \n\t"
541ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r6],      %[r6],          0x2000          \n\t"
542ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r0],      %[r0],          14              \n\t"
543ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r2],      %[r2],          14              \n\t"
544ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r4],      %[r4],          14              \n\t"
545ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r6],      %[r6],          14              \n\t"
546ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r0],      %[r0],          %[gain_factor]  \n\t"
547ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r2],      %[r2],          %[gain_factor]  \n\t"
548ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r4],      %[r4],          %[gain_factor]  \n\t"
549ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r6],      %[r6],          %[gain_factor]  \n\t"
550ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r0],      %[r0],          0x1000          \n\t"
551ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r2],      %[r2],          0x1000          \n\t"
552ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r4],      %[r4],          0x1000          \n\t"
553ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r6],      %[r6],          0x1000          \n\t"
554ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r0],      %[r0],          13              \n\t"
555ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r2],      %[r2],          13              \n\t"
556ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r4],      %[r4],          13              \n\t"
557ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r6],      %[r6],          13              \n\t"
558ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
559ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r3],      %[r2],          %[sat_pos]      \n\t"
560ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r5],      %[r4],          %[sat_pos]      \n\t"
561ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r7],      %[r6],          %[sat_pos]      \n\t"
562ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
563ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r2],      %[sat_pos],     %[r3]           \n\t"
564ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r4],      %[sat_pos],     %[r5]           \n\t"
565ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r6],      %[sat_pos],     %[r7]           \n\t"
566ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r1],      0(%[synthBuf])                  \n\t"
567ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r3],      2(%[synthBuf])                  \n\t"
568ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r5],      4(%[synthBuf])                  \n\t"
569ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r7],      6(%[synthBuf])                  \n\t"
570ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addu       %[r0],      %[r0],          %[r1]           \n\t"
571ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addu       %[r2],      %[r2],          %[r3]           \n\t"
572ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addu       %[r4],      %[r4],          %[r5]           \n\t"
573ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addu       %[r6],      %[r6],          %[r7]           \n\t"
574ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
575ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r3],      %[r2],          %[sat_pos]      \n\t"
576ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r5],      %[r4],          %[sat_pos]      \n\t"
577ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r7],      %[r6],          %[sat_pos]      \n\t"
578ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
579ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r2],      %[sat_pos],     %[r3]           \n\t"
580ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r4],      %[sat_pos],     %[r5]           \n\t"
581ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r6],      %[sat_pos],     %[r7]           \n\t"
582ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r1],      %[r0],          %[sat_neg]      \n\t"
583ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r3],      %[r2],          %[sat_neg]      \n\t"
584ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r5],      %[r4],          %[sat_neg]      \n\t"
585ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r7],      %[r6],          %[sat_neg]      \n\t"
586ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movn       %[r0],      %[sat_neg],     %[r1]           \n\t"
587ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movn       %[r2],      %[sat_neg],     %[r3]           \n\t"
588ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movn       %[r4],      %[sat_neg],     %[r5]           \n\t"
589ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movn       %[r6],      %[sat_neg],     %[r7]           \n\t"
590ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[r0],      0(%[synthBuf])                  \n\t"
591ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[r2],      2(%[synthBuf])                  \n\t"
592ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[r4],      4(%[synthBuf])                  \n\t"
593ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[r6],      6(%[synthBuf])                  \n\t"
594ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[r0],      0(%[out])                       \n\t"
595ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[r2],      2(%[out])                       \n\t"
596ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[r4],      4(%[out])                       \n\t"
597ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[r6],      6(%[out])                       \n\t"
598ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[window],  %[window],      8               \n\t"
599ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[real],    %[real],        8               \n\t"
600ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[synthBuf],%[synthBuf],    8               \n\t"
601ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[out],     %[out],         8               \n\t"
602ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "b          1b                                          \n\t"
603ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " addiu     %[iters],   %[iters],       -1              \n\t"
604ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "2:                                                      \n\t"
605ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "blez       %[after],   3f                              \n\t"
606ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " subu      %[block10], %[anaLen],      %[block10]      \n\t"
607ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r0],      0(%[window])                    \n\t"
608ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r1],      0(%[real])                      \n\t"
609ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r0],      %[r0],          %[r1]           \n\t"
610ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[window],  %[window],      2               \n\t"
611ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[real],    %[real],        2               \n\t"
612ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r0],      %[r0],          0x2000          \n\t"
613ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r0],      %[r0],          14              \n\t"
614ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r0],      %[r0],          %[gain_factor]  \n\t"
615ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r0],      %[r0],          0x1000          \n\t"
616ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r0],      %[r0],          13              \n\t"
617ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
618ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
619ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r1],      0(%[synthBuf])                  \n\t"
620ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addu       %[r0],      %[r0],          %[r1]           \n\t"
621ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
622ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
623ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r1],      %[r0],          %[sat_neg]      \n\t"
624ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movn       %[r0],      %[sat_neg],     %[r1]           \n\t"
625ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[r0],      0(%[synthBuf])                  \n\t"
626ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[r0],      0(%[out])                       \n\t"
627ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[synthBuf],%[synthBuf],    2               \n\t"
628ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[out],     %[out],         2               \n\t"
629ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "b          2b                                          \n\t"
630ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " addiu     %[after],   %[after],       -1              \n\t"
631ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "3:                                                      \n\t"
632ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[iters],   %[block10],     2               \n\t"
633ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "4:                                                      \n\t"
634ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "blez       %[iters],   5f                              \n\t"
635ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " andi      %[after],   %[block10],     3               \n\t"
636ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r0],      0(%[window])                    \n\t"
637ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r1],      0(%[real])                      \n\t"
638ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r2],      2(%[window])                    \n\t"
639ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r3],      2(%[real])                      \n\t"
640ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r4],      4(%[window])                    \n\t"
641ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r5],      4(%[real])                      \n\t"
642ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r6],      6(%[window])                    \n\t"
643ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r7],      6(%[real])                      \n\t"
644ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r0],      %[r0],          %[r1]           \n\t"
645ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r2],      %[r2],          %[r3]           \n\t"
646ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r4],      %[r4],          %[r5]           \n\t"
647ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r6],      %[r6],          %[r7]           \n\t"
648ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r0],      %[r0],          0x2000          \n\t"
649ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r2],      %[r2],          0x2000          \n\t"
650ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r4],      %[r4],          0x2000          \n\t"
651ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r6],      %[r6],          0x2000          \n\t"
652ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r0],      %[r0],          14              \n\t"
653ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r2],      %[r2],          14              \n\t"
654ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r4],      %[r4],          14              \n\t"
655ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r6],      %[r6],          14              \n\t"
656ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r0],      %[r0],          %[gain_factor]  \n\t"
657ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r2],      %[r2],          %[gain_factor]  \n\t"
658ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r4],      %[r4],          %[gain_factor]  \n\t"
659ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r6],      %[r6],          %[gain_factor]  \n\t"
660ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r0],      %[r0],          0x1000          \n\t"
661ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r2],      %[r2],          0x1000          \n\t"
662ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r4],      %[r4],          0x1000          \n\t"
663ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r6],      %[r6],          0x1000          \n\t"
664ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r0],      %[r0],          13              \n\t"
665ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r2],      %[r2],          13              \n\t"
666ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r4],      %[r4],          13              \n\t"
667ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r6],      %[r6],          13              \n\t"
668ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
669ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r3],      %[r2],          %[sat_pos]      \n\t"
670ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r5],      %[r4],          %[sat_pos]      \n\t"
671ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r7],      %[r6],          %[sat_pos]      \n\t"
672ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
673ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r2],      %[sat_pos],     %[r3]           \n\t"
674ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r4],      %[sat_pos],     %[r5]           \n\t"
675ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r6],      %[sat_pos],     %[r7]           \n\t"
676ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r1],      0(%[synthBuf])                  \n\t"
677ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r3],      2(%[synthBuf])                  \n\t"
678ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r5],      4(%[synthBuf])                  \n\t"
679ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r7],      6(%[synthBuf])                  \n\t"
680ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addu       %[r0],      %[r0],          %[r1]           \n\t"
681ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addu       %[r2],      %[r2],          %[r3]           \n\t"
682ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addu       %[r4],      %[r4],          %[r5]           \n\t"
683ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addu       %[r6],      %[r6],          %[r7]           \n\t"
684ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
685ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r3],      %[r2],          %[sat_pos]      \n\t"
686ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r5],      %[r4],          %[sat_pos]      \n\t"
687ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r7],      %[r6],          %[sat_pos]      \n\t"
688ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
689ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r2],      %[sat_pos],     %[r3]           \n\t"
690ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r4],      %[sat_pos],     %[r5]           \n\t"
691ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r6],      %[sat_pos],     %[r7]           \n\t"
692ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r1],      %[r0],          %[sat_neg]      \n\t"
693ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r3],      %[r2],          %[sat_neg]      \n\t"
694ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r5],      %[r4],          %[sat_neg]      \n\t"
695ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r7],      %[r6],          %[sat_neg]      \n\t"
696ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movn       %[r0],      %[sat_neg],     %[r1]           \n\t"
697ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movn       %[r2],      %[sat_neg],     %[r3]           \n\t"
698ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movn       %[r4],      %[sat_neg],     %[r5]           \n\t"
699ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movn       %[r6],      %[sat_neg],     %[r7]           \n\t"
700ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[r0],      0(%[synthBuf])                  \n\t"
701ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[r2],      2(%[synthBuf])                  \n\t"
702ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[r4],      4(%[synthBuf])                  \n\t"
703ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[r6],      6(%[synthBuf])                  \n\t"
704ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[window],  %[window],      8               \n\t"
705ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[real],    %[real],        8               \n\t"
706ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[synthBuf],%[synthBuf],    8               \n\t"
707ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "b          4b                                          \n\t"
708ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " addiu     %[iters],   %[iters],       -1              \n\t"
709ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "5:                                                      \n\t"
710ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "blez       %[after],   6f                              \n\t"
711ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " nop                                                   \n\t"
712ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r0],      0(%[window])                    \n\t"
713ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r1],      0(%[real])                      \n\t"
714ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r0],      %[r0],          %[r1]           \n\t"
715ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[window],  %[window],      2               \n\t"
716ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[real],    %[real],        2               \n\t"
717ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r0],      %[r0],          0x2000          \n\t"
718ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r0],      %[r0],          14              \n\t"
719ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[r0],      %[r0],          %[gain_factor]  \n\t"
720ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[r0],      %[r0],          0x1000          \n\t"
721ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[r0],      %[r0],          13              \n\t"
722ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
723ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
724ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[r1],      0(%[synthBuf])                  \n\t"
725ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addu       %[r0],      %[r0],          %[r1]           \n\t"
726ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
727ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
728ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "slt        %[r1],      %[r0],          %[sat_neg]      \n\t"
729ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "movn       %[r0],      %[sat_neg],     %[r1]           \n\t"
730ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[r0],      0(%[synthBuf])                  \n\t"
731ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[synthBuf],%[synthBuf],    2               \n\t"
732ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "b          2b                                          \n\t"
733ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " addiu     %[after],   %[after],       -1              \n\t"
734ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "6:                                                      \n\t"
735ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    ".set       pop                                         \n\t"
736ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    : [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2),
737ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [r3] "=&r" (r3), [r4] "=&r" (r4), [r5] "=&r" (r5),
738ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [r6] "=&r" (r6), [r7] "=&r" (r7), [iters] "+r" (iters),
739ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [after] "+r" (after), [block10] "+r" (block10),
740ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [window] "+r" (window), [real] "+r" (real),
741ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [synthBuf] "+r" (synthBuf), [out] "+r" (out)
742ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    : [gain_factor] "r" (gain_factor), [sat_pos] "r" (sat_pos),
743ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [sat_neg] "r" (sat_neg), [anaLen] "r" (anaLen)
744ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    : "memory", "hi", "lo"
745ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  );
746ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
747ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  // update synthesis buffer
7480f911d71a75f9fbfc1006a1fdedfd6a7f6a6af62Bjorn Volcker  memcpy(inst->synthesisBuffer, inst->synthesisBuffer + inst->blockLen10ms,
7490f911d71a75f9fbfc1006a1fdedfd6a7f6a6af62Bjorn Volcker      (inst->anaLen - inst->blockLen10ms) * sizeof(*inst->synthesisBuffer));
750ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  WebRtcSpl_ZerosArrayW16(inst->synthesisBuffer
751ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      + inst->anaLen - inst->blockLen10ms, inst->blockLen10ms);
752ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org}
753ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
754ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org// Filter the data in the frequency domain, and create spectrum.
755e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.orgvoid WebRtcNsx_PrepareSpectrum_mips(NoiseSuppressionFixedC* inst,
756e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.org                                    int16_t* freq_buf) {
757ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  uint16_t *noiseSupFilter = inst->noiseSupFilter;
758ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int16_t *real = inst->real;
759ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int16_t *imag = inst->imag;
760ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int32_t loop_count = 2;
761ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int16_t tmp_1, tmp_2, tmp_3, tmp_4, tmp_5, tmp_6;
762b7e5054414ff524f9db81dab7917729b8c4c8bcbPeter Kasting  int16_t tmp16 = (int16_t)(inst->anaLen << 1) - 4;
763ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int16_t* freq_buf_f = freq_buf;
764ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int16_t* freq_buf_s = &freq_buf[tmp16];
765ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
766ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  __asm __volatile (
767ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    ".set       push                                                 \n\t"
768ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    ".set       noreorder                                            \n\t"
769ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    //first sample
770ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[tmp_1],           0(%[noiseSupFilter])             \n\t"
771ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[tmp_2],           0(%[real])                       \n\t"
772ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[tmp_3],           0(%[imag])                       \n\t"
773ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[tmp_2],           %[tmp_2],             %[tmp_1]   \n\t"
774ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[tmp_3],           %[tmp_3],             %[tmp_1]   \n\t"
775ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[tmp_2],           %[tmp_2],             14         \n\t"
776ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[tmp_3],           %[tmp_3],             14         \n\t"
777ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_2],           0(%[real])                       \n\t"
778ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_3],           0(%[imag])                       \n\t"
779ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "negu       %[tmp_3],           %[tmp_3]                         \n\t"
780ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_2],           0(%[freq_buf_f])                 \n\t"
781ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_3],           2(%[freq_buf_f])                 \n\t"
782ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[real],            %[real],              2          \n\t"
783ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[imag],            %[imag],              2          \n\t"
784ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[noiseSupFilter],  %[noiseSupFilter],    2          \n\t"
785ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[freq_buf_f],      %[freq_buf_f],        4          \n\t"
786ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "1:                                                               \n\t"
787ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[tmp_1],           0(%[noiseSupFilter])             \n\t"
788ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[tmp_2],           0(%[real])                       \n\t"
789ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[tmp_3],           0(%[imag])                       \n\t"
790ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[tmp_4],           2(%[noiseSupFilter])             \n\t"
791ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[tmp_5],           2(%[real])                       \n\t"
792ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[tmp_6],           2(%[imag])                       \n\t"
793ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[tmp_2],           %[tmp_2],             %[tmp_1]   \n\t"
794ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[tmp_3],           %[tmp_3],             %[tmp_1]   \n\t"
795ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[tmp_5],           %[tmp_5],             %[tmp_4]   \n\t"
796ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[tmp_6],           %[tmp_6],             %[tmp_4]   \n\t"
797ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[loop_count],      %[loop_count],        2          \n\t"
798ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[tmp_2],           %[tmp_2],             14         \n\t"
799ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[tmp_3],           %[tmp_3],             14         \n\t"
800ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[tmp_5],           %[tmp_5],             14         \n\t"
801ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[tmp_6],           %[tmp_6],             14         \n\t"
802ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[noiseSupFilter],  %[noiseSupFilter],    4          \n\t"
803ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_2],           0(%[real])                       \n\t"
804ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_2],           4(%[freq_buf_s])                 \n\t"
805ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_3],           0(%[imag])                       \n\t"
806ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_3],           6(%[freq_buf_s])                 \n\t"
807ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "negu       %[tmp_3],           %[tmp_3]                         \n\t"
808ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_5],           2(%[real])                       \n\t"
809ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_5],           0(%[freq_buf_s])                 \n\t"
810ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_6],           2(%[imag])                       \n\t"
811ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_6],           2(%[freq_buf_s])                 \n\t"
812ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "negu       %[tmp_6],           %[tmp_6]                         \n\t"
813ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[freq_buf_s],      %[freq_buf_s],        -8         \n\t"
814ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[real],            %[real],              4          \n\t"
815ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu      %[imag],            %[imag],              4          \n\t"
816ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_2],           0(%[freq_buf_f])                 \n\t"
817ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_3],           2(%[freq_buf_f])                 \n\t"
818ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_5],           4(%[freq_buf_f])                 \n\t"
819ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_6],           6(%[freq_buf_f])                 \n\t"
820ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "blt        %[loop_count],      %[loop_size],         1b         \n\t"
821ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " addiu     %[freq_buf_f],      %[freq_buf_f],        8          \n\t"
822ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    //last two samples:
823ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[tmp_1],           0(%[noiseSupFilter])             \n\t"
824ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[tmp_2],           0(%[real])                       \n\t"
825ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[tmp_3],           0(%[imag])                       \n\t"
826ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[tmp_4],           2(%[noiseSupFilter])             \n\t"
827ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[tmp_5],           2(%[real])                       \n\t"
828ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh         %[tmp_6],           2(%[imag])                       \n\t"
829ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[tmp_2],           %[tmp_2],             %[tmp_1]   \n\t"
830ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[tmp_3],           %[tmp_3],             %[tmp_1]   \n\t"
831ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[tmp_5],           %[tmp_5],             %[tmp_4]   \n\t"
832ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "mul        %[tmp_6],           %[tmp_6],             %[tmp_4]   \n\t"
833ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[tmp_2],           %[tmp_2],             14         \n\t"
834ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[tmp_3],           %[tmp_3],             14         \n\t"
835ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[tmp_5],           %[tmp_5],             14         \n\t"
836ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sra        %[tmp_6],           %[tmp_6],             14         \n\t"
837ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_2],           0(%[real])                       \n\t"
838ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_2],           4(%[freq_buf_s])                 \n\t"
839ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_3],           0(%[imag])                       \n\t"
840ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_3],           6(%[freq_buf_s])                 \n\t"
841ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "negu       %[tmp_3],           %[tmp_3]                         \n\t"
842ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_2],           0(%[freq_buf_f])                 \n\t"
843ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_3],           2(%[freq_buf_f])                 \n\t"
844ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_5],           4(%[freq_buf_f])                 \n\t"
845ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_6],           6(%[freq_buf_f])                 \n\t"
846ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_5],           2(%[real])                       \n\t"
847ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh         %[tmp_6],           2(%[imag])                       \n\t"
848ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    ".set       pop                                                  \n\t"
849ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    : [real] "+r" (real), [imag] "+r" (imag),
850ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [freq_buf_f] "+r" (freq_buf_f), [freq_buf_s] "+r" (freq_buf_s),
851ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [loop_count] "+r" (loop_count), [noiseSupFilter] "+r" (noiseSupFilter),
852ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [tmp_1] "=&r" (tmp_1), [tmp_2] "=&r" (tmp_2), [tmp_3] "=&r" (tmp_3),
853ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [tmp_4] "=&r" (tmp_4), [tmp_5] "=&r" (tmp_5), [tmp_6] "=&r" (tmp_6)
854ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    : [loop_size] "r" (inst->anaLen2)
855ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    : "memory", "hi", "lo"
856ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  );
857ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org}
858ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
859ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org#if defined(MIPS_DSP_R1_LE)
860ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org// Denormalize the real-valued signal |in|, the output from inverse FFT.
861e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.orgvoid WebRtcNsx_Denormalize_mips(NoiseSuppressionFixedC* inst,
862e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.org                                int16_t* in,
863e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.org                                int factor) {
864ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int32_t r0, r1, r2, r3, t0;
865dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  int len = (int)inst->anaLen;
866ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int16_t *out = &inst->real[0];
867ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int shift = factor - inst->normData;
868ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
869ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  __asm __volatile (
870ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    ".set          push                                \n\t"
871ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    ".set          noreorder                           \n\t"
872ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "beqz          %[len],     8f                      \n\t"
873ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " nop                                              \n\t"
874ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "bltz          %[shift],   4f                      \n\t"
875ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " sra          %[t0],      %[len],      2          \n\t"
876ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "beqz          %[t0],      2f                      \n\t"
877ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " andi         %[len],     %[len],      3          \n\t"
878ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "1:                                                 \n\t"
879ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh            %[r0],      0(%[in])                \n\t"
880ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh            %[r1],      2(%[in])                \n\t"
881ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh            %[r2],      4(%[in])                \n\t"
882ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh            %[r3],      6(%[in])                \n\t"
883ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "shllv_s.ph    %[r0],      %[r0],       %[shift]   \n\t"
884ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "shllv_s.ph    %[r1],      %[r1],       %[shift]   \n\t"
885ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "shllv_s.ph    %[r2],      %[r2],       %[shift]   \n\t"
886ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "shllv_s.ph    %[r3],      %[r3],       %[shift]   \n\t"
887ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu         %[in],      %[in],       8          \n\t"
888ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu         %[t0],      %[t0],       -1         \n\t"
889ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh            %[r0],      0(%[out])               \n\t"
890ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh            %[r1],      2(%[out])               \n\t"
891ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh            %[r2],      4(%[out])               \n\t"
892ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh            %[r3],      6(%[out])               \n\t"
893ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "bgtz          %[t0],      1b                      \n\t"
894ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " addiu        %[out],     %[out],      8          \n\t"
895ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "2:                                                 \n\t"
896ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "beqz          %[len],     8f                      \n\t"
897ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " nop                                              \n\t"
898ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "3:                                                 \n\t"
899ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh            %[r0],      0(%[in])                \n\t"
900ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu         %[in],      %[in],       2          \n\t"
901ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu         %[len],     %[len],      -1         \n\t"
902ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "shllv_s.ph    %[r0],      %[r0],       %[shift]   \n\t"
903ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu         %[out],     %[out],      2          \n\t"
904ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "bgtz          %[len],     3b                      \n\t"
905ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " sh           %[r0],      -2(%[out])              \n\t"
906ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "b             8f                                  \n\t"
907ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "4:                                                 \n\t"
908ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "negu          %[shift],   %[shift]                \n\t"
909ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "beqz          %[t0],      6f                      \n\t"
910ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " andi         %[len],     %[len],      3          \n\t"
911ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "5:                                                 \n\t"
912ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh            %[r0],      0(%[in])                \n\t"
913ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh            %[r1],      2(%[in])                \n\t"
914ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh            %[r2],      4(%[in])                \n\t"
915ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh            %[r3],      6(%[in])                \n\t"
916ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "srav          %[r0],      %[r0],       %[shift]   \n\t"
917ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "srav          %[r1],      %[r1],       %[shift]   \n\t"
918ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "srav          %[r2],      %[r2],       %[shift]   \n\t"
919ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "srav          %[r3],      %[r3],       %[shift]   \n\t"
920ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu         %[in],      %[in],       8          \n\t"
921ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu         %[t0],      %[t0],       -1         \n\t"
922ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh            %[r0],      0(%[out])               \n\t"
923ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh            %[r1],      2(%[out])               \n\t"
924ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh            %[r2],      4(%[out])               \n\t"
925ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh            %[r3],      6(%[out])               \n\t"
926ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "bgtz          %[t0],      5b                      \n\t"
927ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " addiu        %[out],     %[out],      8          \n\t"
928ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "6:                                                 \n\t"
929ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "beqz          %[len],     8f                      \n\t"
930ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " nop                                              \n\t"
931ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "7:                                                 \n\t"
932ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh            %[r0],      0(%[in])                \n\t"
933ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu         %[in],      %[in],       2          \n\t"
934ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu         %[len],     %[len],      -1         \n\t"
935ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "srav          %[r0],      %[r0],       %[shift]   \n\t"
936ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu         %[out],     %[out],      2          \n\t"
937ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "bgtz          %[len],     7b                      \n\t"
938ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " sh           %[r0],      -2(%[out])              \n\t"
939ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "8:                                                 \n\t"
940ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    ".set          pop                                 \n\t"
941ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    : [t0] "=&r" (t0), [r0] "=&r" (r0), [r1] "=&r" (r1),
942ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [r2] "=&r" (r2), [r3] "=&r" (r3)
943ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    : [len] "r" (len), [shift] "r" (shift), [in] "r" (in),
944ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [out] "r" (out)
945ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    : "memory"
946ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  );
947ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org}
948ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org#endif
949ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
950ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org// Normalize the real-valued signal |in|, the input to forward FFT.
951e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.orgvoid WebRtcNsx_NormalizeRealBuffer_mips(NoiseSuppressionFixedC* inst,
952ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org                                        const int16_t* in,
953ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org                                        int16_t* out) {
954ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int32_t r0, r1, r2, r3, t0;
955dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  int len = (int)inst->anaLen;
956ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  int shift = inst->normData;
957ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
958ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  __asm __volatile (
959ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    ".set          push                                \n\t"
960ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    ".set          noreorder                           \n\t"
961ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "beqz          %[len],     4f                      \n\t"
962ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " sra          %[t0],      %[len],      2          \n\t"
963ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "beqz          %[t0],      2f                      \n\t"
964ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " andi         %[len],     %[len],      3          \n\t"
965ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "1:                                                 \n\t"
966ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh            %[r0],      0(%[in])                \n\t"
967ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh            %[r1],      2(%[in])                \n\t"
968ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh            %[r2],      4(%[in])                \n\t"
969ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh            %[r3],      6(%[in])                \n\t"
970ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sllv          %[r0],      %[r0],       %[shift]   \n\t"
971ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sllv          %[r1],      %[r1],       %[shift]   \n\t"
972ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sllv          %[r2],      %[r2],       %[shift]   \n\t"
973ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sllv          %[r3],      %[r3],       %[shift]   \n\t"
974ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu         %[in],      %[in],       8          \n\t"
975ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu         %[t0],      %[t0],       -1         \n\t"
976ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh            %[r0],      0(%[out])               \n\t"
977ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh            %[r1],      2(%[out])               \n\t"
978ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh            %[r2],      4(%[out])               \n\t"
979ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sh            %[r3],      6(%[out])               \n\t"
980ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "bgtz          %[t0],      1b                      \n\t"
981ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " addiu        %[out],     %[out],      8          \n\t"
982ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "2:                                                 \n\t"
983ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "beqz          %[len],     4f                      \n\t"
984ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " nop                                              \n\t"
985ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "3:                                                 \n\t"
986ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "lh            %[r0],      0(%[in])                \n\t"
987ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu         %[in],      %[in],       2          \n\t"
988ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu         %[len],     %[len],      -1         \n\t"
989ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "sllv          %[r0],      %[r0],       %[shift]   \n\t"
990ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "addiu         %[out],     %[out],      2          \n\t"
991ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    "bgtz          %[len],     3b                      \n\t"
992ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    " sh           %[r0],      -2(%[out])              \n\t"
993ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org   "4:                                                 \n\t"
994ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    ".set          pop                                 \n\t"
995ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    : [t0] "=&r" (t0), [r0] "=&r" (r0), [r1] "=&r" (r1),
996ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [r2] "=&r" (r2), [r3] "=&r" (r3)
997ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    : [len] "r" (len), [shift] "r" (shift), [in] "r" (in),
998ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org      [out] "r" (out)
999ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org    : "memory"
1000ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org  );
1001ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org}
1002ea9392d5ebcde13a0cf3c97787bc1799c9ba41aaandrew@webrtc.org
1003