Moved the legacy noise suppressor to a separate build target

Bug: webrtc:5298
Change-Id: Ia1c5eb9d0f7b4ba578acb646e73229de63ae91fb
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/161441
Reviewed-by: Gustaf Ullberg <gustaf@webrtc.org>
Commit-Queue: Per Åhgren <peah@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30089}
diff --git a/modules/audio_processing/BUILD.gn b/modules/audio_processing/BUILD.gn
index dfbe9ff..2012634 100644
--- a/modules/audio_processing/BUILD.gn
+++ b/modules/audio_processing/BUILD.gn
@@ -121,8 +121,6 @@
     "gain_controller2.h",
     "include/aec_dump.cc",
     "include/aec_dump.h",
-    "legacy_noise_suppression.cc",
-    "legacy_noise_suppression.h",
     "level_estimator.cc",
     "level_estimator.h",
     "render_queue_item_verifier.h",
@@ -156,7 +154,6 @@
     ":audio_buffer",
     ":audio_frame_view",
     ":audio_generator_interface",
-    ":audio_processing_c",
     ":audio_processing_statistics",
     ":config",
     ":high_pass_filter",
@@ -186,17 +183,13 @@
     "agc2:adaptive_digital",
     "agc2:fixed_digital",
     "agc2:gain_applier",
+    "legacy_ns:legacy_ns",
+    "legacy_ns:legacy_ns_c",
     "ns",
     "vad",
     "//third_party/abseil-cpp/absl/types:optional",
   ]
 
-  if (rtc_prefer_fixed_point) {
-    defines += [ "WEBRTC_NS_FIXED" ]
-  } else {
-    defines += [ "WEBRTC_NS_FLOAT" ]
-  }
-
   deps += [
     "../../common_audio",
     "../../common_audio:fir_filter",
@@ -268,56 +261,6 @@
   ]
 }
 
-rtc_source_set("audio_processing_c") {
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  sources = [
-    "legacy_ns/windows_private.h",
-  ]
-
-  if (rtc_prefer_fixed_point) {
-    sources += [
-      "legacy_ns/noise_suppression_x.c",
-      "legacy_ns/noise_suppression_x.h",
-      "legacy_ns/nsx_core.c",
-      "legacy_ns/nsx_core.h",
-      "legacy_ns/nsx_defines.h",
-    ]
-    if (current_cpu == "mipsel") {
-      sources += [ "legacy_ns/nsx_core_mips.c" ]
-    } else {
-      sources += [ "legacy_ns/nsx_core_c.c" ]
-    }
-  } else {
-    sources += [
-      "legacy_ns/defines.h",
-      "legacy_ns/noise_suppression.c",
-      "legacy_ns/noise_suppression.h",
-      "legacy_ns/ns_core.c",
-      "legacy_ns/ns_core.h",
-    ]
-  }
-
-  deps = [
-    "../../common_audio",
-    "../../common_audio:common_audio_c",
-    "../../common_audio/third_party/fft4g",
-    "../../rtc_base:checks",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers:cpu_features_api",
-    "agc:agc_legacy_c",
-  ]
-
-  if (rtc_build_with_neon) {
-    sources += [ "legacy_ns/nsx_core_neon.c" ]
-
-    if (current_cpu != "arm64") {
-      # Enable compilation for the NEON instruction set.
-      suppressed_configs += [ "//build/config/compiler:compiler_arm_fpu" ]
-      cflags = [ "-mfpu=neon" ]
-    }
-  }
-}
-
 if (rtc_enable_protobuf) {
   proto_library("audioproc_debug_proto") {
     sources = [
@@ -443,6 +386,7 @@
       "agc2:rnn_vad_with_level_unittests",
       "agc2:test_utils",
       "agc2/rnn_vad:unittests",
+      "legacy_ns:legacy_ns",
       "test/conversational_speech:unittest",
       "utility:legacy_delay_estimator_unittest",
       "utility:pffft_wrapper_unittest",
@@ -486,7 +430,6 @@
         "echo_detector/normalized_covariance_estimator_unittest.cc",
         "gain_control_unittest.cc",
         "high_pass_filter_unittest.cc",
-        "legacy_noise_suppression_unittest.cc",
         "level_estimator_unittest.cc",
         "residual_echo_detector_unittest.cc",
         "rms_level_unittest.cc",
diff --git a/modules/audio_processing/audio_processing_impl.h b/modules/audio_processing/audio_processing_impl.h
index dcc2fa6..08379ad 100644
--- a/modules/audio_processing/audio_processing_impl.h
+++ b/modules/audio_processing/audio_processing_impl.h
@@ -27,7 +27,7 @@
 #include "modules/audio_processing/include/aec_dump.h"
 #include "modules/audio_processing/include/audio_processing.h"
 #include "modules/audio_processing/include/audio_processing_statistics.h"
-#include "modules/audio_processing/legacy_noise_suppression.h"
+#include "modules/audio_processing/legacy_ns/legacy_noise_suppression.h"
 #include "modules/audio_processing/level_estimator.h"
 #include "modules/audio_processing/ns/noise_suppressor.h"
 #include "modules/audio_processing/render_queue_item_verifier.h"
diff --git a/modules/audio_processing/legacy_ns/BUILD.gn b/modules/audio_processing/legacy_ns/BUILD.gn
new file mode 100644
index 0000000..649caf00
--- /dev/null
+++ b/modules/audio_processing/legacy_ns/BUILD.gn
@@ -0,0 +1,109 @@
+# Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
+#
+# Use of this source code is governed by a BSD-style license
+# that can be found in the LICENSE file in the root of the source
+# tree. An additional intellectual property rights grant can be found
+# in the file PATENTS.  All contributing project authors may
+# be found in the AUTHORS file in the root of the source tree.
+
+import("../../../webrtc.gni")
+
+rtc_library("legacy_ns") {
+  visibility = [ "*" ]  # Only targets in this file can depend on this.
+  sources = [
+    "legacy_noise_suppression.cc",
+    "legacy_noise_suppression.h",
+  ]
+
+  if (rtc_prefer_fixed_point) {
+    defines = [ "WEBRTC_NS_FIXED" ]
+  } else {
+    defines = [ "WEBRTC_NS_FLOAT" ]
+  }
+
+  deps = [
+    ":legacy_ns_c",
+    "..:audio_buffer",
+    "../../../common_audio",
+    "../../../common_audio:common_audio_c",
+    "../../../rtc_base:checks",
+    "../../../rtc_base:rtc_base_approved",
+    "../../../system_wrappers:cpu_features_api",
+  ]
+}
+
+rtc_library("legacy_ns_c") {
+  visibility = [ "*" ]  # Only targets in this file can depend on this.
+  sources = [
+    "windows_private.h",
+  ]
+
+  if (rtc_prefer_fixed_point) {
+    sources += [
+      "noise_suppression_x.c",
+      "noise_suppression_x.h",
+      "nsx_core.c",
+      "nsx_core.h",
+      "nsx_core_c.c",
+      "nsx_defines.h",
+    ]
+  } else {
+    sources += [
+      "defines.h",
+      "noise_suppression.c",
+      "noise_suppression.h",
+      "ns_core.c",
+      "ns_core.h",
+    ]
+  }
+
+  if (rtc_prefer_fixed_point) {
+    defines = [ "WEBRTC_NS_FIXED" ]
+  } else {
+    defines = [ "WEBRTC_NS_FLOAT" ]
+  }
+
+  deps = [
+    "..:audio_buffer",
+    "../../../common_audio",
+    "../../../common_audio:common_audio_c",
+    "../../../common_audio/third_party/fft4g",
+    "../../../rtc_base:checks",
+    "../../../rtc_base:rtc_base_approved",
+    "../../../system_wrappers:cpu_features_api",
+  ]
+
+  if (rtc_build_with_neon) {
+    sources += [ "nsx_core_neon.c" ]
+
+    if (current_cpu != "arm64") {
+      # Enable compilation for the NEON instruction set.
+      suppressed_configs += [ "//build/config/compiler:compiler_arm_fpu" ]
+      cflags = [ "-mfpu=neon" ]
+    }
+  }
+}
+
+if (rtc_include_tests) {
+  rtc_source_set("legacy_ns_unittests") {
+    testonly = true
+
+    configs += []
+    sources = [
+      "legacy_noise_suppression_unittest.cc",
+    ]
+
+    deps = [
+      "..:audio_buffer",
+      "..:audioproc_test_utils",
+      "../../../api:array_view",
+      "../../../test:test_support",
+    ]
+
+    defines = []
+
+    if (rtc_enable_protobuf) {
+      sources += []
+    }
+  }
+}
diff --git a/modules/audio_processing/legacy_noise_suppression.cc b/modules/audio_processing/legacy_ns/legacy_noise_suppression.cc
similarity index 98%
rename from modules/audio_processing/legacy_noise_suppression.cc
rename to modules/audio_processing/legacy_ns/legacy_noise_suppression.cc
index b2c8853..52193a9 100644
--- a/modules/audio_processing/legacy_noise_suppression.cc
+++ b/modules/audio_processing/legacy_ns/legacy_noise_suppression.cc
@@ -8,7 +8,7 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
-#include "modules/audio_processing/legacy_noise_suppression.h"
+#include "modules/audio_processing/legacy_ns/legacy_noise_suppression.h"
 
 #include "modules/audio_processing/audio_buffer.h"
 #include "rtc_base/checks.h"
diff --git a/modules/audio_processing/legacy_noise_suppression.h b/modules/audio_processing/legacy_ns/legacy_noise_suppression.h
similarity index 89%
rename from modules/audio_processing/legacy_noise_suppression.h
rename to modules/audio_processing/legacy_ns/legacy_noise_suppression.h
index c2435db..c599bc5 100644
--- a/modules/audio_processing/legacy_noise_suppression.h
+++ b/modules/audio_processing/legacy_ns/legacy_noise_suppression.h
@@ -8,8 +8,8 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
-#ifndef MODULES_AUDIO_PROCESSING_LEGACY_NOISE_SUPPRESSION_H_
-#define MODULES_AUDIO_PROCESSING_LEGACY_NOISE_SUPPRESSION_H_
+#ifndef MODULES_AUDIO_PROCESSING_LEGACY_NS_LEGACY_NOISE_SUPPRESSION_H_
+#define MODULES_AUDIO_PROCESSING_LEGACY_NS_LEGACY_NOISE_SUPPRESSION_H_
 
 #include <memory>
 #include <vector>
@@ -54,4 +54,4 @@
 };
 }  // namespace webrtc
 
-#endif  // MODULES_AUDIO_PROCESSING_LEGACY_NOISE_SUPPRESSION_H_
+#endif  // MODULES_AUDIO_PROCESSING_LEGACY_NS_LEGACY_NOISE_SUPPRESSION_H_
diff --git a/modules/audio_processing/legacy_noise_suppression_unittest.cc b/modules/audio_processing/legacy_ns/legacy_noise_suppression_unittest.cc
similarity index 100%
rename from modules/audio_processing/legacy_noise_suppression_unittest.cc
rename to modules/audio_processing/legacy_ns/legacy_noise_suppression_unittest.cc
diff --git a/modules/audio_processing/legacy_ns/nsx_core_mips.c b/modules/audio_processing/legacy_ns/nsx_core_mips.c
deleted file mode 100644
index af4c287..0000000
--- a/modules/audio_processing/legacy_ns/nsx_core_mips.c
+++ /dev/null
@@ -1,1001 +0,0 @@
-/*
- *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <string.h>
-
-#include "rtc_base/checks.h"
-#include "modules/audio_processing/legacy_ns/noise_suppression_x.h"
-#include "modules/audio_processing/legacy_ns/nsx_core.h"
-
-static const int16_t kIndicatorTable[17] = {
-  0, 2017, 3809, 5227, 6258, 6963, 7424, 7718,
-  7901, 8014, 8084, 8126, 8152, 8168, 8177, 8183, 8187
-};
-
-// Compute speech/noise probability
-// speech/noise probability is returned in: probSpeechFinal
-//snrLocPrior is the prior SNR for each frequency (in Q11)
-//snrLocPost is the post SNR for each frequency (in Q11)
-void WebRtcNsx_SpeechNoiseProb(NoiseSuppressionFixedC* inst,
-                               uint16_t* nonSpeechProbFinal,
-                               uint32_t* priorLocSnr,
-                               uint32_t* postLocSnr) {
-  uint32_t tmpU32no1, tmpU32no2, tmpU32no3;
-  int32_t indPriorFX, tmp32no1;
-  int32_t logLrtTimeAvgKsumFX;
-  int16_t indPriorFX16;
-  int16_t tmp16, tmp16no1, tmp16no2, tmpIndFX, tableIndex, frac;
-  size_t i;
-  int normTmp, nShifts;
-
-  int32_t r0, r1, r2, r3, r4, r5, r6, r7, r8, r9;
-  int32_t const_max = 0x7fffffff;
-  int32_t const_neg43 = -43;
-  int32_t const_5412 = 5412;
-  int32_t const_11rsh12 = (11 << 12);
-  int32_t const_178 = 178;
-
-
-  // compute feature based on average LR factor
-  // this is the average over all frequencies of the smooth log LRT
-  logLrtTimeAvgKsumFX = 0;
-  for (i = 0; i < inst->magnLen; i++) {
-    r0 = postLocSnr[i]; // Q11
-    r1 = priorLocSnr[i];
-    r2 = inst->logLrtTimeAvgW32[i];
-
-    __asm __volatile(
-      ".set       push                                    \n\t"
-      ".set       noreorder                               \n\t"
-      "clz        %[r3],    %[r0]                         \n\t"
-      "clz        %[r5],    %[r1]                         \n\t"
-      "slti       %[r4],    %[r3],    32                  \n\t"
-      "slti       %[r6],    %[r5],    32                  \n\t"
-      "movz       %[r3],    $0,       %[r4]               \n\t"
-      "movz       %[r5],    $0,       %[r6]               \n\t"
-      "slti       %[r4],    %[r3],    11                  \n\t"
-      "addiu      %[r6],    %[r3],    -11                 \n\t"
-      "neg        %[r7],    %[r6]                         \n\t"
-      "sllv       %[r6],    %[r1],    %[r6]               \n\t"
-      "srav       %[r7],    %[r1],    %[r7]               \n\t"
-      "movn       %[r6],    %[r7],    %[r4]               \n\t"
-      "sllv       %[r1],    %[r1],    %[r5]               \n\t"
-      "and        %[r1],    %[r1],    %[const_max]        \n\t"
-      "sra        %[r1],    %[r1],    19                  \n\t"
-      "mul        %[r7],    %[r1],    %[r1]               \n\t"
-      "sllv       %[r3],    %[r0],    %[r3]               \n\t"
-      "divu       %[r8],    %[r3],    %[r6]               \n\t"
-      "slti       %[r6],    %[r6],    1                   \n\t"
-      "mul        %[r7],    %[r7],    %[const_neg43]      \n\t"
-      "sra        %[r7],    %[r7],    19                  \n\t"
-      "movz       %[r3],    %[r8],    %[r6]               \n\t"
-      "subu       %[r0],    %[r0],    %[r3]               \n\t"
-      "movn       %[r0],    $0,       %[r6]               \n\t"
-      "mul        %[r1],    %[r1],    %[const_5412]       \n\t"
-      "sra        %[r1],    %[r1],    12                  \n\t"
-      "addu       %[r7],    %[r7],    %[r1]               \n\t"
-      "addiu      %[r1],    %[r7],    37                  \n\t"
-      "addiu      %[r5],    %[r5],    -31                 \n\t"
-      "neg        %[r5],    %[r5]                         \n\t"
-      "sll        %[r5],    %[r5],    12                  \n\t"
-      "addu       %[r5],    %[r5],    %[r1]               \n\t"
-      "subu       %[r7],    %[r5],    %[const_11rsh12]    \n\t"
-      "mul        %[r7],    %[r7],    %[const_178]        \n\t"
-      "sra        %[r7],    %[r7],    8                   \n\t"
-      "addu       %[r7],    %[r7],    %[r2]               \n\t"
-      "sra        %[r7],    %[r7],    1                   \n\t"
-      "subu       %[r2],    %[r2],    %[r7]               \n\t"
-      "addu       %[r2],    %[r2],    %[r0]               \n\t"
-      ".set       pop                                     \n\t"
-      : [r0] "+r" (r0), [r1] "+r" (r1), [r2] "+r" (r2),
-        [r3] "=&r" (r3), [r4] "=&r" (r4), [r5] "=&r" (r5),
-        [r6] "=&r" (r6), [r7] "=&r" (r7), [r8] "=&r" (r8)
-      : [const_max] "r" (const_max), [const_neg43] "r" (const_neg43),
-        [const_5412] "r" (const_5412), [const_11rsh12] "r" (const_11rsh12),
-        [const_178] "r" (const_178)
-      : "hi", "lo"
-    );
-    inst->logLrtTimeAvgW32[i] = r2;
-    logLrtTimeAvgKsumFX += r2;
-  }
-
-  inst->featureLogLrt = (logLrtTimeAvgKsumFX * BIN_SIZE_LRT) >>
-      (inst->stages + 11);
-
-  // done with computation of LR factor
-
-  //
-  // compute the indicator functions
-  //
-
-  // average LRT feature
-  // FLOAT code
-  // indicator0 = 0.5 * (tanh(widthPrior *
-  //                      (logLrtTimeAvgKsum - threshPrior0)) + 1.0);
-  tmpIndFX = 16384; // Q14(1.0)
-  tmp32no1 = logLrtTimeAvgKsumFX - inst->thresholdLogLrt; // Q12
-  nShifts = 7 - inst->stages; // WIDTH_PR_MAP_SHIFT - inst->stages + 5;
-  //use larger width in tanh map for pause regions
-  if (tmp32no1 < 0) {
-    tmpIndFX = 0;
-    tmp32no1 = -tmp32no1;
-    //widthPrior = widthPrior * 2.0;
-    nShifts++;
-  }
-  tmp32no1 = WEBRTC_SPL_SHIFT_W32(tmp32no1, nShifts); // Q14
-  // compute indicator function: sigmoid map
-  if (tmp32no1 < (16 << 14) && tmp32no1 >= 0) {
-    tableIndex = (int16_t)(tmp32no1 >> 14);
-    tmp16no2 = kIndicatorTable[tableIndex];
-    tmp16no1 = kIndicatorTable[tableIndex + 1] - kIndicatorTable[tableIndex];
-    frac = (int16_t)(tmp32no1 & 0x00003fff); // Q14
-    tmp16no2 += (int16_t)((tmp16no1 * frac) >> 14);
-    if (tmpIndFX == 0) {
-      tmpIndFX = 8192 - tmp16no2; // Q14
-    } else {
-      tmpIndFX = 8192 + tmp16no2; // Q14
-    }
-  }
-  indPriorFX = inst->weightLogLrt * tmpIndFX;  // 6*Q14
-
-  //spectral flatness feature
-  if (inst->weightSpecFlat) {
-    tmpU32no1 = WEBRTC_SPL_UMUL(inst->featureSpecFlat, 400); // Q10
-    tmpIndFX = 16384; // Q14(1.0)
-    //use larger width in tanh map for pause regions
-    tmpU32no2 = inst->thresholdSpecFlat - tmpU32no1; //Q10
-    nShifts = 4;
-    if (inst->thresholdSpecFlat < tmpU32no1) {
-      tmpIndFX = 0;
-      tmpU32no2 = tmpU32no1 - inst->thresholdSpecFlat;
-      //widthPrior = widthPrior * 2.0;
-      nShifts++;
-    }
-    tmpU32no1 = WebRtcSpl_DivU32U16(tmpU32no2 << nShifts, 25);  //Q14
-    // compute indicator function: sigmoid map
-    // FLOAT code
-    // indicator1 = 0.5 * (tanh(sgnMap * widthPrior *
-    //                          (threshPrior1 - tmpFloat1)) + 1.0);
-    if (tmpU32no1 < (16 << 14)) {
-      tableIndex = (int16_t)(tmpU32no1 >> 14);
-      tmp16no2 = kIndicatorTable[tableIndex];
-      tmp16no1 = kIndicatorTable[tableIndex + 1] - kIndicatorTable[tableIndex];
-      frac = (int16_t)(tmpU32no1 & 0x00003fff); // Q14
-      tmp16no2 += (int16_t)((tmp16no1 * frac) >> 14);
-      if (tmpIndFX) {
-        tmpIndFX = 8192 + tmp16no2; // Q14
-      } else {
-        tmpIndFX = 8192 - tmp16no2; // Q14
-      }
-    }
-    indPriorFX += inst->weightSpecFlat * tmpIndFX;  // 6*Q14
-  }
-
-  //for template spectral-difference
-  if (inst->weightSpecDiff) {
-    tmpU32no1 = 0;
-    if (inst->featureSpecDiff) {
-      normTmp = WEBRTC_SPL_MIN(20 - inst->stages,
-                               WebRtcSpl_NormU32(inst->featureSpecDiff));
-      RTC_DCHECK_GE(normTmp, 0);
-      tmpU32no1 = inst->featureSpecDiff << normTmp;  // Q(normTmp-2*stages)
-      tmpU32no2 = inst->timeAvgMagnEnergy >> (20 - inst->stages - normTmp);
-      if (tmpU32no2 > 0) {
-        // Q(20 - inst->stages)
-        tmpU32no1 /= tmpU32no2;
-      } else {
-        tmpU32no1 = (uint32_t)(0x7fffffff);
-      }
-    }
-    tmpU32no3 = (inst->thresholdSpecDiff << 17) / 25;
-    tmpU32no2 = tmpU32no1 - tmpU32no3;
-    nShifts = 1;
-    tmpIndFX = 16384; // Q14(1.0)
-    //use larger width in tanh map for pause regions
-    if (tmpU32no2 & 0x80000000) {
-      tmpIndFX = 0;
-      tmpU32no2 = tmpU32no3 - tmpU32no1;
-      //widthPrior = widthPrior * 2.0;
-      nShifts--;
-    }
-    tmpU32no1 = tmpU32no2 >> nShifts;
-    // compute indicator function: sigmoid map
-    /* FLOAT code
-     indicator2 = 0.5 * (tanh(widthPrior * (tmpFloat1 - threshPrior2)) + 1.0);
-     */
-    if (tmpU32no1 < (16 << 14)) {
-      tableIndex = (int16_t)(tmpU32no1 >> 14);
-      tmp16no2 = kIndicatorTable[tableIndex];
-      tmp16no1 = kIndicatorTable[tableIndex + 1] - kIndicatorTable[tableIndex];
-      frac = (int16_t)(tmpU32no1 & 0x00003fff); // Q14
-      tmp16no2 += (int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(
-                    tmp16no1, frac, 14);
-      if (tmpIndFX) {
-        tmpIndFX = 8192 + tmp16no2;
-      } else {
-        tmpIndFX = 8192 - tmp16no2;
-      }
-    }
-    indPriorFX += inst->weightSpecDiff * tmpIndFX;  // 6*Q14
-  }
-
-  //combine the indicator function with the feature weights
-  // FLOAT code
-  // indPrior = 1 - (weightIndPrior0 * indicator0 + weightIndPrior1 *
-  //                 indicator1 + weightIndPrior2 * indicator2);
-  indPriorFX16 = WebRtcSpl_DivW32W16ResW16(98307 - indPriorFX, 6); // Q14
-  // done with computing indicator function
-
-  //compute the prior probability
-  // FLOAT code
-  // inst->priorNonSpeechProb += PRIOR_UPDATE *
-  //                             (indPriorNonSpeech - inst->priorNonSpeechProb);
-  tmp16 = indPriorFX16 - inst->priorNonSpeechProb; // Q14
-  inst->priorNonSpeechProb += (int16_t)((PRIOR_UPDATE_Q14 * tmp16) >> 14);
-
-  //final speech probability: combine prior model with LR factor:
-
-  memset(nonSpeechProbFinal, 0, sizeof(uint16_t) * inst->magnLen);
-
-  if (inst->priorNonSpeechProb > 0) {
-    r0 = inst->priorNonSpeechProb;
-    r1 = 16384 - r0;
-    int32_t const_23637 = 23637;
-    int32_t const_44 = 44;
-    int32_t const_84 = 84;
-    int32_t const_1 = 1;
-    int32_t const_neg8 = -8;
-    for (i = 0; i < inst->magnLen; i++) {
-      r2 = inst->logLrtTimeAvgW32[i];
-      if (r2 < 65300) {
-        __asm __volatile(
-          ".set         push                                      \n\t"
-          ".set         noreorder                                 \n\t"
-          "mul          %[r2],    %[r2],          %[const_23637]  \n\t"
-          "sll          %[r6],    %[r1],          16              \n\t"
-          "clz          %[r7],    %[r6]                           \n\t"
-          "clo          %[r8],    %[r6]                           \n\t"
-          "slt          %[r9],    %[r6],          $0              \n\t"
-          "movn         %[r7],    %[r8],          %[r9]           \n\t"
-          "sra          %[r2],    %[r2],          14              \n\t"
-          "andi         %[r3],    %[r2],          0xfff           \n\t"
-          "mul          %[r4],    %[r3],          %[r3]           \n\t"
-          "mul          %[r3],    %[r3],          %[const_84]     \n\t"
-          "sra          %[r2],    %[r2],          12              \n\t"
-          "slt          %[r5],    %[r2],          %[const_neg8]   \n\t"
-          "movn         %[r2],    %[const_neg8],  %[r5]           \n\t"
-          "mul          %[r4],    %[r4],          %[const_44]     \n\t"
-          "sra          %[r3],    %[r3],          7               \n\t"
-          "addiu        %[r7],    %[r7],          -1              \n\t"
-          "slti         %[r9],    %[r7],          31              \n\t"
-          "movz         %[r7],    $0,             %[r9]           \n\t"
-          "sra          %[r4],    %[r4],          19              \n\t"
-          "addu         %[r4],    %[r4],          %[r3]           \n\t"
-          "addiu        %[r3],    %[r2],          8               \n\t"
-          "addiu        %[r2],    %[r2],          -4              \n\t"
-          "neg          %[r5],    %[r2]                           \n\t"
-          "sllv         %[r6],    %[r4],          %[r2]           \n\t"
-          "srav         %[r5],    %[r4],          %[r5]           \n\t"
-          "slt          %[r2],    %[r2],          $0              \n\t"
-          "movn         %[r6],    %[r5],          %[r2]           \n\t"
-          "sllv         %[r3],    %[const_1],     %[r3]           \n\t"
-          "addu         %[r2],    %[r3],          %[r6]           \n\t"
-          "clz          %[r4],    %[r2]                           \n\t"
-          "clo          %[r5],    %[r2]                           \n\t"
-          "slt          %[r8],    %[r2],          $0              \n\t"
-          "movn         %[r4],    %[r5],          %[r8]           \n\t"
-          "addiu        %[r4],    %[r4],          -1              \n\t"
-          "slt          %[r5],    $0,             %[r2]           \n\t"
-          "or           %[r5],    %[r5],          %[r7]           \n\t"
-          "movz         %[r4],    $0,             %[r5]           \n\t"
-          "addiu        %[r6],    %[r7],          -7              \n\t"
-          "addu         %[r6],    %[r6],          %[r4]           \n\t"
-          "bltz         %[r6],    1f                              \n\t"
-          " nop                                                   \n\t"
-          "addiu        %[r4],    %[r6],          -8              \n\t"
-          "neg          %[r3],    %[r4]                           \n\t"
-          "srav         %[r5],    %[r2],          %[r3]           \n\t"
-          "mul          %[r5],    %[r5],          %[r1]           \n\t"
-          "mul          %[r2],    %[r2],          %[r1]           \n\t"
-          "slt          %[r4],    %[r4],          $0              \n\t"
-          "srav         %[r5],    %[r5],          %[r6]           \n\t"
-          "sra          %[r2],    %[r2],          8               \n\t"
-          "movn         %[r2],    %[r5],          %[r4]           \n\t"
-          "sll          %[r3],    %[r0],          8               \n\t"
-          "addu         %[r2],    %[r0],          %[r2]           \n\t"
-          "divu         %[r3],    %[r3],          %[r2]           \n\t"
-         "1:                                                      \n\t"
-          ".set         pop                                       \n\t"
-          : [r2] "+r" (r2), [r3] "=&r" (r3), [r4] "=&r" (r4),
-            [r5] "=&r" (r5), [r6] "=&r" (r6), [r7] "=&r" (r7),
-            [r8] "=&r" (r8), [r9] "=&r" (r9)
-          : [r0] "r" (r0), [r1] "r" (r1), [const_23637] "r" (const_23637),
-            [const_neg8] "r" (const_neg8), [const_84] "r" (const_84),
-            [const_1] "r" (const_1), [const_44] "r" (const_44)
-          : "hi", "lo"
-        );
-        nonSpeechProbFinal[i] = r3;
-      }
-    }
-  }
-}
-
-// Update analysis buffer for lower band, and window data before FFT.
-void WebRtcNsx_AnalysisUpdate_mips(NoiseSuppressionFixedC* inst,
-                                   int16_t* out,
-                                   int16_t* new_speech) {
-  int iters, after;
-  int anaLen = (int)inst->anaLen;
-  int *window = (int*)inst->window;
-  int *anaBuf = (int*)inst->analysisBuffer;
-  int *outBuf = (int*)out;
-  int r0, r1, r2, r3, r4, r5, r6, r7;
-#if defined(MIPS_DSP_R1_LE)
-  int r8;
-#endif
-
-  // For lower band update analysis buffer.
-  memcpy(inst->analysisBuffer, inst->analysisBuffer + inst->blockLen10ms,
-      (inst->anaLen - inst->blockLen10ms) * sizeof(*inst->analysisBuffer));
-  memcpy(inst->analysisBuffer + inst->anaLen - inst->blockLen10ms, new_speech,
-      inst->blockLen10ms * sizeof(*inst->analysisBuffer));
-
-  // Window data before FFT.
-#if defined(MIPS_DSP_R1_LE)
-  __asm __volatile(
-    ".set              push                                \n\t"
-    ".set              noreorder                           \n\t"
-    "sra               %[iters],   %[anaLen],    3         \n\t"
-   "1:                                                     \n\t"
-    "blez              %[iters],   2f                      \n\t"
-    " nop                                                  \n\t"
-    "lw                %[r0],      0(%[window])            \n\t"
-    "lw                %[r1],      0(%[anaBuf])            \n\t"
-    "lw                %[r2],      4(%[window])            \n\t"
-    "lw                %[r3],      4(%[anaBuf])            \n\t"
-    "lw                %[r4],      8(%[window])            \n\t"
-    "lw                %[r5],      8(%[anaBuf])            \n\t"
-    "lw                %[r6],      12(%[window])           \n\t"
-    "lw                %[r7],      12(%[anaBuf])           \n\t"
-    "muleq_s.w.phl     %[r8],      %[r0],        %[r1]     \n\t"
-    "muleq_s.w.phr     %[r0],      %[r0],        %[r1]     \n\t"
-    "muleq_s.w.phl     %[r1],      %[r2],        %[r3]     \n\t"
-    "muleq_s.w.phr     %[r2],      %[r2],        %[r3]     \n\t"
-    "muleq_s.w.phl     %[r3],      %[r4],        %[r5]     \n\t"
-    "muleq_s.w.phr     %[r4],      %[r4],        %[r5]     \n\t"
-    "muleq_s.w.phl     %[r5],      %[r6],        %[r7]     \n\t"
-    "muleq_s.w.phr     %[r6],      %[r6],        %[r7]     \n\t"
-#if defined(MIPS_DSP_R2_LE)
-    "precr_sra_r.ph.w  %[r8],      %[r0],        15        \n\t"
-    "precr_sra_r.ph.w  %[r1],      %[r2],        15        \n\t"
-    "precr_sra_r.ph.w  %[r3],      %[r4],        15        \n\t"
-    "precr_sra_r.ph.w  %[r5],      %[r6],        15        \n\t"
-    "sw                %[r8],      0(%[outBuf])            \n\t"
-    "sw                %[r1],      4(%[outBuf])            \n\t"
-    "sw                %[r3],      8(%[outBuf])            \n\t"
-    "sw                %[r5],      12(%[outBuf])           \n\t"
-#else
-    "shra_r.w          %[r8],      %[r8],        15        \n\t"
-    "shra_r.w          %[r0],      %[r0],        15        \n\t"
-    "shra_r.w          %[r1],      %[r1],        15        \n\t"
-    "shra_r.w          %[r2],      %[r2],        15        \n\t"
-    "shra_r.w          %[r3],      %[r3],        15        \n\t"
-    "shra_r.w          %[r4],      %[r4],        15        \n\t"
-    "shra_r.w          %[r5],      %[r5],        15        \n\t"
-    "shra_r.w          %[r6],      %[r6],        15        \n\t"
-    "sll               %[r0],      %[r0],        16        \n\t"
-    "sll               %[r2],      %[r2],        16        \n\t"
-    "sll               %[r4],      %[r4],        16        \n\t"
-    "sll               %[r6],      %[r6],        16        \n\t"
-    "packrl.ph         %[r0],      %[r8],        %[r0]     \n\t"
-    "packrl.ph         %[r2],      %[r1],        %[r2]     \n\t"
-    "packrl.ph         %[r4],      %[r3],        %[r4]     \n\t"
-    "packrl.ph         %[r6],      %[r5],        %[r6]     \n\t"
-    "sw                %[r0],      0(%[outBuf])            \n\t"
-    "sw                %[r2],      4(%[outBuf])            \n\t"
-    "sw                %[r4],      8(%[outBuf])            \n\t"
-    "sw                %[r6],      12(%[outBuf])           \n\t"
-#endif
-    "addiu             %[window],  %[window],    16        \n\t"
-    "addiu             %[anaBuf],  %[anaBuf],    16        \n\t"
-    "addiu             %[outBuf],  %[outBuf],    16        \n\t"
-    "b                 1b                                  \n\t"
-    " addiu            %[iters],   %[iters],     -1        \n\t"
-   "2:                                                     \n\t"
-    "andi              %[after],   %[anaLen],    7         \n\t"
-   "3:                                                     \n\t"
-    "blez              %[after],   4f                      \n\t"
-    " nop                                                  \n\t"
-    "lh                %[r0],      0(%[window])            \n\t"
-    "lh                %[r1],      0(%[anaBuf])            \n\t"
-    "mul               %[r0],      %[r0],        %[r1]     \n\t"
-    "addiu             %[window],  %[window],    2         \n\t"
-    "addiu             %[anaBuf],  %[anaBuf],    2         \n\t"
-    "addiu             %[outBuf],  %[outBuf],    2         \n\t"
-    "shra_r.w          %[r0],      %[r0],        14        \n\t"
-    "sh                %[r0],      -2(%[outBuf])           \n\t"
-    "b                 3b                                  \n\t"
-    " addiu            %[after],   %[after],     -1        \n\t"
-   "4:                                                     \n\t"
-    ".set              pop                                 \n\t"
-    : [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2),
-      [r3] "=&r" (r3), [r4] "=&r" (r4), [r5] "=&r" (r5),
-      [r6] "=&r" (r6), [r7] "=&r" (r7), [r8] "=&r" (r8),
-      [iters] "=&r" (iters), [after] "=&r" (after),
-      [window] "+r" (window),[anaBuf] "+r" (anaBuf),
-      [outBuf] "+r" (outBuf)
-    : [anaLen] "r" (anaLen)
-    : "memory", "hi", "lo"
-  );
-#else
-  __asm  __volatile(
-    ".set           push                                    \n\t"
-    ".set           noreorder                               \n\t"
-    "sra            %[iters],   %[anaLen],      2           \n\t"
-   "1:                                                      \n\t"
-    "blez           %[iters],   2f                          \n\t"
-    " nop                                                   \n\t"
-    "lh             %[r0],      0(%[window])                \n\t"
-    "lh             %[r1],      0(%[anaBuf])                \n\t"
-    "lh             %[r2],      2(%[window])                \n\t"
-    "lh             %[r3],      2(%[anaBuf])                \n\t"
-    "lh             %[r4],      4(%[window])                \n\t"
-    "lh             %[r5],      4(%[anaBuf])                \n\t"
-    "lh             %[r6],      6(%[window])                \n\t"
-    "lh             %[r7],      6(%[anaBuf])                \n\t"
-    "mul            %[r0],      %[r0],          %[r1]       \n\t"
-    "mul            %[r2],      %[r2],          %[r3]       \n\t"
-    "mul            %[r4],      %[r4],          %[r5]       \n\t"
-    "mul            %[r6],      %[r6],          %[r7]       \n\t"
-    "addiu          %[window],  %[window],      8           \n\t"
-    "addiu          %[anaBuf],  %[anaBuf],      8           \n\t"
-    "addiu          %[r0],      %[r0],          0x2000      \n\t"
-    "addiu          %[r2],      %[r2],          0x2000      \n\t"
-    "addiu          %[r4],      %[r4],          0x2000      \n\t"
-    "addiu          %[r6],      %[r6],          0x2000      \n\t"
-    "sra            %[r0],      %[r0],          14          \n\t"
-    "sra            %[r2],      %[r2],          14          \n\t"
-    "sra            %[r4],      %[r4],          14          \n\t"
-    "sra            %[r6],      %[r6],          14          \n\t"
-    "sh             %[r0],      0(%[outBuf])                \n\t"
-    "sh             %[r2],      2(%[outBuf])                \n\t"
-    "sh             %[r4],      4(%[outBuf])                \n\t"
-    "sh             %[r6],      6(%[outBuf])                \n\t"
-    "addiu          %[outBuf],  %[outBuf],      8           \n\t"
-    "b              1b                                      \n\t"
-    " addiu         %[iters],   %[iters],       -1          \n\t"
-   "2:                                                      \n\t"
-    "andi           %[after],   %[anaLen],      3           \n\t"
-   "3:                                                      \n\t"
-    "blez           %[after],   4f                          \n\t"
-    " nop                                                   \n\t"
-    "lh             %[r0],      0(%[window])                \n\t"
-    "lh             %[r1],      0(%[anaBuf])                \n\t"
-    "mul            %[r0],      %[r0],          %[r1]       \n\t"
-    "addiu          %[window],  %[window],      2           \n\t"
-    "addiu          %[anaBuf],  %[anaBuf],      2           \n\t"
-    "addiu          %[outBuf],  %[outBuf],      2           \n\t"
-    "addiu          %[r0],      %[r0],          0x2000      \n\t"
-    "sra            %[r0],      %[r0],          14          \n\t"
-    "sh             %[r0],      -2(%[outBuf])               \n\t"
-    "b              3b                                      \n\t"
-    " addiu         %[after],   %[after],       -1          \n\t"
-   "4:                                                      \n\t"
-    ".set           pop                                     \n\t"
-    : [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2),
-      [r3] "=&r" (r3), [r4] "=&r" (r4), [r5] "=&r" (r5),
-      [r6] "=&r" (r6), [r7] "=&r" (r7), [iters] "=&r" (iters),
-      [after] "=&r" (after), [window] "+r" (window),
-      [anaBuf] "+r" (anaBuf), [outBuf] "+r" (outBuf)
-    : [anaLen] "r" (anaLen)
-    : "memory", "hi", "lo"
-  );
-#endif
-}
-
-// For the noise supression process, synthesis, read out fully processed
-// segment, and update synthesis buffer.
-void WebRtcNsx_SynthesisUpdate_mips(NoiseSuppressionFixedC* inst,
-                                    int16_t* out_frame,
-                                    int16_t gain_factor) {
-  int iters = (int)inst->blockLen10ms >> 2;
-  int after = inst->blockLen10ms & 3;
-  int r0, r1, r2, r3, r4, r5, r6, r7;
-  int16_t *window = (int16_t*)inst->window;
-  int16_t *real = inst->real;
-  int16_t *synthBuf = inst->synthesisBuffer;
-  int16_t *out = out_frame;
-  int sat_pos = 0x7fff;
-  int sat_neg = 0xffff8000;
-  int block10 = (int)inst->blockLen10ms;
-  int anaLen = (int)inst->anaLen;
-
-  __asm __volatile(
-    ".set       push                                        \n\t"
-    ".set       noreorder                                   \n\t"
-   "1:                                                      \n\t"
-    "blez       %[iters],   2f                              \n\t"
-    " nop                                                   \n\t"
-    "lh         %[r0],      0(%[window])                    \n\t"
-    "lh         %[r1],      0(%[real])                      \n\t"
-    "lh         %[r2],      2(%[window])                    \n\t"
-    "lh         %[r3],      2(%[real])                      \n\t"
-    "lh         %[r4],      4(%[window])                    \n\t"
-    "lh         %[r5],      4(%[real])                      \n\t"
-    "lh         %[r6],      6(%[window])                    \n\t"
-    "lh         %[r7],      6(%[real])                      \n\t"
-    "mul        %[r0],      %[r0],          %[r1]           \n\t"
-    "mul        %[r2],      %[r2],          %[r3]           \n\t"
-    "mul        %[r4],      %[r4],          %[r5]           \n\t"
-    "mul        %[r6],      %[r6],          %[r7]           \n\t"
-    "addiu      %[r0],      %[r0],          0x2000          \n\t"
-    "addiu      %[r2],      %[r2],          0x2000          \n\t"
-    "addiu      %[r4],      %[r4],          0x2000          \n\t"
-    "addiu      %[r6],      %[r6],          0x2000          \n\t"
-    "sra        %[r0],      %[r0],          14              \n\t"
-    "sra        %[r2],      %[r2],          14              \n\t"
-    "sra        %[r4],      %[r4],          14              \n\t"
-    "sra        %[r6],      %[r6],          14              \n\t"
-    "mul        %[r0],      %[r0],          %[gain_factor]  \n\t"
-    "mul        %[r2],      %[r2],          %[gain_factor]  \n\t"
-    "mul        %[r4],      %[r4],          %[gain_factor]  \n\t"
-    "mul        %[r6],      %[r6],          %[gain_factor]  \n\t"
-    "addiu      %[r0],      %[r0],          0x1000          \n\t"
-    "addiu      %[r2],      %[r2],          0x1000          \n\t"
-    "addiu      %[r4],      %[r4],          0x1000          \n\t"
-    "addiu      %[r6],      %[r6],          0x1000          \n\t"
-    "sra        %[r0],      %[r0],          13              \n\t"
-    "sra        %[r2],      %[r2],          13              \n\t"
-    "sra        %[r4],      %[r4],          13              \n\t"
-    "sra        %[r6],      %[r6],          13              \n\t"
-    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
-    "slt        %[r3],      %[r2],          %[sat_pos]      \n\t"
-    "slt        %[r5],      %[r4],          %[sat_pos]      \n\t"
-    "slt        %[r7],      %[r6],          %[sat_pos]      \n\t"
-    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
-    "movz       %[r2],      %[sat_pos],     %[r3]           \n\t"
-    "movz       %[r4],      %[sat_pos],     %[r5]           \n\t"
-    "movz       %[r6],      %[sat_pos],     %[r7]           \n\t"
-    "lh         %[r1],      0(%[synthBuf])                  \n\t"
-    "lh         %[r3],      2(%[synthBuf])                  \n\t"
-    "lh         %[r5],      4(%[synthBuf])                  \n\t"
-    "lh         %[r7],      6(%[synthBuf])                  \n\t"
-    "addu       %[r0],      %[r0],          %[r1]           \n\t"
-    "addu       %[r2],      %[r2],          %[r3]           \n\t"
-    "addu       %[r4],      %[r4],          %[r5]           \n\t"
-    "addu       %[r6],      %[r6],          %[r7]           \n\t"
-    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
-    "slt        %[r3],      %[r2],          %[sat_pos]      \n\t"
-    "slt        %[r5],      %[r4],          %[sat_pos]      \n\t"
-    "slt        %[r7],      %[r6],          %[sat_pos]      \n\t"
-    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
-    "movz       %[r2],      %[sat_pos],     %[r3]           \n\t"
-    "movz       %[r4],      %[sat_pos],     %[r5]           \n\t"
-    "movz       %[r6],      %[sat_pos],     %[r7]           \n\t"
-    "slt        %[r1],      %[r0],          %[sat_neg]      \n\t"
-    "slt        %[r3],      %[r2],          %[sat_neg]      \n\t"
-    "slt        %[r5],      %[r4],          %[sat_neg]      \n\t"
-    "slt        %[r7],      %[r6],          %[sat_neg]      \n\t"
-    "movn       %[r0],      %[sat_neg],     %[r1]           \n\t"
-    "movn       %[r2],      %[sat_neg],     %[r3]           \n\t"
-    "movn       %[r4],      %[sat_neg],     %[r5]           \n\t"
-    "movn       %[r6],      %[sat_neg],     %[r7]           \n\t"
-    "sh         %[r0],      0(%[synthBuf])                  \n\t"
-    "sh         %[r2],      2(%[synthBuf])                  \n\t"
-    "sh         %[r4],      4(%[synthBuf])                  \n\t"
-    "sh         %[r6],      6(%[synthBuf])                  \n\t"
-    "sh         %[r0],      0(%[out])                       \n\t"
-    "sh         %[r2],      2(%[out])                       \n\t"
-    "sh         %[r4],      4(%[out])                       \n\t"
-    "sh         %[r6],      6(%[out])                       \n\t"
-    "addiu      %[window],  %[window],      8               \n\t"
-    "addiu      %[real],    %[real],        8               \n\t"
-    "addiu      %[synthBuf],%[synthBuf],    8               \n\t"
-    "addiu      %[out],     %[out],         8               \n\t"
-    "b          1b                                          \n\t"
-    " addiu     %[iters],   %[iters],       -1              \n\t"
-   "2:                                                      \n\t"
-    "blez       %[after],   3f                              \n\t"
-    " subu      %[block10], %[anaLen],      %[block10]      \n\t"
-    "lh         %[r0],      0(%[window])                    \n\t"
-    "lh         %[r1],      0(%[real])                      \n\t"
-    "mul        %[r0],      %[r0],          %[r1]           \n\t"
-    "addiu      %[window],  %[window],      2               \n\t"
-    "addiu      %[real],    %[real],        2               \n\t"
-    "addiu      %[r0],      %[r0],          0x2000          \n\t"
-    "sra        %[r0],      %[r0],          14              \n\t"
-    "mul        %[r0],      %[r0],          %[gain_factor]  \n\t"
-    "addiu      %[r0],      %[r0],          0x1000          \n\t"
-    "sra        %[r0],      %[r0],          13              \n\t"
-    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
-    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
-    "lh         %[r1],      0(%[synthBuf])                  \n\t"
-    "addu       %[r0],      %[r0],          %[r1]           \n\t"
-    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
-    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
-    "slt        %[r1],      %[r0],          %[sat_neg]      \n\t"
-    "movn       %[r0],      %[sat_neg],     %[r1]           \n\t"
-    "sh         %[r0],      0(%[synthBuf])                  \n\t"
-    "sh         %[r0],      0(%[out])                       \n\t"
-    "addiu      %[synthBuf],%[synthBuf],    2               \n\t"
-    "addiu      %[out],     %[out],         2               \n\t"
-    "b          2b                                          \n\t"
-    " addiu     %[after],   %[after],       -1              \n\t"
-   "3:                                                      \n\t"
-    "sra        %[iters],   %[block10],     2               \n\t"
-   "4:                                                      \n\t"
-    "blez       %[iters],   5f                              \n\t"
-    " andi      %[after],   %[block10],     3               \n\t"
-    "lh         %[r0],      0(%[window])                    \n\t"
-    "lh         %[r1],      0(%[real])                      \n\t"
-    "lh         %[r2],      2(%[window])                    \n\t"
-    "lh         %[r3],      2(%[real])                      \n\t"
-    "lh         %[r4],      4(%[window])                    \n\t"
-    "lh         %[r5],      4(%[real])                      \n\t"
-    "lh         %[r6],      6(%[window])                    \n\t"
-    "lh         %[r7],      6(%[real])                      \n\t"
-    "mul        %[r0],      %[r0],          %[r1]           \n\t"
-    "mul        %[r2],      %[r2],          %[r3]           \n\t"
-    "mul        %[r4],      %[r4],          %[r5]           \n\t"
-    "mul        %[r6],      %[r6],          %[r7]           \n\t"
-    "addiu      %[r0],      %[r0],          0x2000          \n\t"
-    "addiu      %[r2],      %[r2],          0x2000          \n\t"
-    "addiu      %[r4],      %[r4],          0x2000          \n\t"
-    "addiu      %[r6],      %[r6],          0x2000          \n\t"
-    "sra        %[r0],      %[r0],          14              \n\t"
-    "sra        %[r2],      %[r2],          14              \n\t"
-    "sra        %[r4],      %[r4],          14              \n\t"
-    "sra        %[r6],      %[r6],          14              \n\t"
-    "mul        %[r0],      %[r0],          %[gain_factor]  \n\t"
-    "mul        %[r2],      %[r2],          %[gain_factor]  \n\t"
-    "mul        %[r4],      %[r4],          %[gain_factor]  \n\t"
-    "mul        %[r6],      %[r6],          %[gain_factor]  \n\t"
-    "addiu      %[r0],      %[r0],          0x1000          \n\t"
-    "addiu      %[r2],      %[r2],          0x1000          \n\t"
-    "addiu      %[r4],      %[r4],          0x1000          \n\t"
-    "addiu      %[r6],      %[r6],          0x1000          \n\t"
-    "sra        %[r0],      %[r0],          13              \n\t"
-    "sra        %[r2],      %[r2],          13              \n\t"
-    "sra        %[r4],      %[r4],          13              \n\t"
-    "sra        %[r6],      %[r6],          13              \n\t"
-    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
-    "slt        %[r3],      %[r2],          %[sat_pos]      \n\t"
-    "slt        %[r5],      %[r4],          %[sat_pos]      \n\t"
-    "slt        %[r7],      %[r6],          %[sat_pos]      \n\t"
-    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
-    "movz       %[r2],      %[sat_pos],     %[r3]           \n\t"
-    "movz       %[r4],      %[sat_pos],     %[r5]           \n\t"
-    "movz       %[r6],      %[sat_pos],     %[r7]           \n\t"
-    "lh         %[r1],      0(%[synthBuf])                  \n\t"
-    "lh         %[r3],      2(%[synthBuf])                  \n\t"
-    "lh         %[r5],      4(%[synthBuf])                  \n\t"
-    "lh         %[r7],      6(%[synthBuf])                  \n\t"
-    "addu       %[r0],      %[r0],          %[r1]           \n\t"
-    "addu       %[r2],      %[r2],          %[r3]           \n\t"
-    "addu       %[r4],      %[r4],          %[r5]           \n\t"
-    "addu       %[r6],      %[r6],          %[r7]           \n\t"
-    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
-    "slt        %[r3],      %[r2],          %[sat_pos]      \n\t"
-    "slt        %[r5],      %[r4],          %[sat_pos]      \n\t"
-    "slt        %[r7],      %[r6],          %[sat_pos]      \n\t"
-    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
-    "movz       %[r2],      %[sat_pos],     %[r3]           \n\t"
-    "movz       %[r4],      %[sat_pos],     %[r5]           \n\t"
-    "movz       %[r6],      %[sat_pos],     %[r7]           \n\t"
-    "slt        %[r1],      %[r0],          %[sat_neg]      \n\t"
-    "slt        %[r3],      %[r2],          %[sat_neg]      \n\t"
-    "slt        %[r5],      %[r4],          %[sat_neg]      \n\t"
-    "slt        %[r7],      %[r6],          %[sat_neg]      \n\t"
-    "movn       %[r0],      %[sat_neg],     %[r1]           \n\t"
-    "movn       %[r2],      %[sat_neg],     %[r3]           \n\t"
-    "movn       %[r4],      %[sat_neg],     %[r5]           \n\t"
-    "movn       %[r6],      %[sat_neg],     %[r7]           \n\t"
-    "sh         %[r0],      0(%[synthBuf])                  \n\t"
-    "sh         %[r2],      2(%[synthBuf])                  \n\t"
-    "sh         %[r4],      4(%[synthBuf])                  \n\t"
-    "sh         %[r6],      6(%[synthBuf])                  \n\t"
-    "addiu      %[window],  %[window],      8               \n\t"
-    "addiu      %[real],    %[real],        8               \n\t"
-    "addiu      %[synthBuf],%[synthBuf],    8               \n\t"
-    "b          4b                                          \n\t"
-    " addiu     %[iters],   %[iters],       -1              \n\t"
-   "5:                                                      \n\t"
-    "blez       %[after],   6f                              \n\t"
-    " nop                                                   \n\t"
-    "lh         %[r0],      0(%[window])                    \n\t"
-    "lh         %[r1],      0(%[real])                      \n\t"
-    "mul        %[r0],      %[r0],          %[r1]           \n\t"
-    "addiu      %[window],  %[window],      2               \n\t"
-    "addiu      %[real],    %[real],        2               \n\t"
-    "addiu      %[r0],      %[r0],          0x2000          \n\t"
-    "sra        %[r0],      %[r0],          14              \n\t"
-    "mul        %[r0],      %[r0],          %[gain_factor]  \n\t"
-    "addiu      %[r0],      %[r0],          0x1000          \n\t"
-    "sra        %[r0],      %[r0],          13              \n\t"
-    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
-    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
-    "lh         %[r1],      0(%[synthBuf])                  \n\t"
-    "addu       %[r0],      %[r0],          %[r1]           \n\t"
-    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
-    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
-    "slt        %[r1],      %[r0],          %[sat_neg]      \n\t"
-    "movn       %[r0],      %[sat_neg],     %[r1]           \n\t"
-    "sh         %[r0],      0(%[synthBuf])                  \n\t"
-    "addiu      %[synthBuf],%[synthBuf],    2               \n\t"
-    "b          2b                                          \n\t"
-    " addiu     %[after],   %[after],       -1              \n\t"
-   "6:                                                      \n\t"
-    ".set       pop                                         \n\t"
-    : [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2),
-      [r3] "=&r" (r3), [r4] "=&r" (r4), [r5] "=&r" (r5),
-      [r6] "=&r" (r6), [r7] "=&r" (r7), [iters] "+r" (iters),
-      [after] "+r" (after), [block10] "+r" (block10),
-      [window] "+r" (window), [real] "+r" (real),
-      [synthBuf] "+r" (synthBuf), [out] "+r" (out)
-    : [gain_factor] "r" (gain_factor), [sat_pos] "r" (sat_pos),
-      [sat_neg] "r" (sat_neg), [anaLen] "r" (anaLen)
-    : "memory", "hi", "lo"
-  );
-
-  // update synthesis buffer
-  memcpy(inst->synthesisBuffer, inst->synthesisBuffer + inst->blockLen10ms,
-      (inst->anaLen - inst->blockLen10ms) * sizeof(*inst->synthesisBuffer));
-  WebRtcSpl_ZerosArrayW16(inst->synthesisBuffer
-      + inst->anaLen - inst->blockLen10ms, inst->blockLen10ms);
-}
-
-// Filter the data in the frequency domain, and create spectrum.
-void WebRtcNsx_PrepareSpectrum_mips(NoiseSuppressionFixedC* inst,
-                                    int16_t* freq_buf) {
-  uint16_t *noiseSupFilter = inst->noiseSupFilter;
-  int16_t *real = inst->real;
-  int16_t *imag = inst->imag;
-  int32_t loop_count = 2;
-  int16_t tmp_1, tmp_2, tmp_3, tmp_4, tmp_5, tmp_6;
-  int16_t tmp16 = (int16_t)(inst->anaLen << 1) - 4;
-  int16_t* freq_buf_f = freq_buf;
-  int16_t* freq_buf_s = &freq_buf[tmp16];
-
-  __asm __volatile (
-    ".set       push                                                 \n\t"
-    ".set       noreorder                                            \n\t"
-    //first sample
-    "lh         %[tmp_1],           0(%[noiseSupFilter])             \n\t"
-    "lh         %[tmp_2],           0(%[real])                       \n\t"
-    "lh         %[tmp_3],           0(%[imag])                       \n\t"
-    "mul        %[tmp_2],           %[tmp_2],             %[tmp_1]   \n\t"
-    "mul        %[tmp_3],           %[tmp_3],             %[tmp_1]   \n\t"
-    "sra        %[tmp_2],           %[tmp_2],             14         \n\t"
-    "sra        %[tmp_3],           %[tmp_3],             14         \n\t"
-    "sh         %[tmp_2],           0(%[real])                       \n\t"
-    "sh         %[tmp_3],           0(%[imag])                       \n\t"
-    "negu       %[tmp_3],           %[tmp_3]                         \n\t"
-    "sh         %[tmp_2],           0(%[freq_buf_f])                 \n\t"
-    "sh         %[tmp_3],           2(%[freq_buf_f])                 \n\t"
-    "addiu      %[real],            %[real],              2          \n\t"
-    "addiu      %[imag],            %[imag],              2          \n\t"
-    "addiu      %[noiseSupFilter],  %[noiseSupFilter],    2          \n\t"
-    "addiu      %[freq_buf_f],      %[freq_buf_f],        4          \n\t"
-   "1:                                                               \n\t"
-    "lh         %[tmp_1],           0(%[noiseSupFilter])             \n\t"
-    "lh         %[tmp_2],           0(%[real])                       \n\t"
-    "lh         %[tmp_3],           0(%[imag])                       \n\t"
-    "lh         %[tmp_4],           2(%[noiseSupFilter])             \n\t"
-    "lh         %[tmp_5],           2(%[real])                       \n\t"
-    "lh         %[tmp_6],           2(%[imag])                       \n\t"
-    "mul        %[tmp_2],           %[tmp_2],             %[tmp_1]   \n\t"
-    "mul        %[tmp_3],           %[tmp_3],             %[tmp_1]   \n\t"
-    "mul        %[tmp_5],           %[tmp_5],             %[tmp_4]   \n\t"
-    "mul        %[tmp_6],           %[tmp_6],             %[tmp_4]   \n\t"
-    "addiu      %[loop_count],      %[loop_count],        2          \n\t"
-    "sra        %[tmp_2],           %[tmp_2],             14         \n\t"
-    "sra        %[tmp_3],           %[tmp_3],             14         \n\t"
-    "sra        %[tmp_5],           %[tmp_5],             14         \n\t"
-    "sra        %[tmp_6],           %[tmp_6],             14         \n\t"
-    "addiu      %[noiseSupFilter],  %[noiseSupFilter],    4          \n\t"
-    "sh         %[tmp_2],           0(%[real])                       \n\t"
-    "sh         %[tmp_2],           4(%[freq_buf_s])                 \n\t"
-    "sh         %[tmp_3],           0(%[imag])                       \n\t"
-    "sh         %[tmp_3],           6(%[freq_buf_s])                 \n\t"
-    "negu       %[tmp_3],           %[tmp_3]                         \n\t"
-    "sh         %[tmp_5],           2(%[real])                       \n\t"
-    "sh         %[tmp_5],           0(%[freq_buf_s])                 \n\t"
-    "sh         %[tmp_6],           2(%[imag])                       \n\t"
-    "sh         %[tmp_6],           2(%[freq_buf_s])                 \n\t"
-    "negu       %[tmp_6],           %[tmp_6]                         \n\t"
-    "addiu      %[freq_buf_s],      %[freq_buf_s],        -8         \n\t"
-    "addiu      %[real],            %[real],              4          \n\t"
-    "addiu      %[imag],            %[imag],              4          \n\t"
-    "sh         %[tmp_2],           0(%[freq_buf_f])                 \n\t"
-    "sh         %[tmp_3],           2(%[freq_buf_f])                 \n\t"
-    "sh         %[tmp_5],           4(%[freq_buf_f])                 \n\t"
-    "sh         %[tmp_6],           6(%[freq_buf_f])                 \n\t"
-    "blt        %[loop_count],      %[loop_size],         1b         \n\t"
-    " addiu     %[freq_buf_f],      %[freq_buf_f],        8          \n\t"
-    //last two samples:
-    "lh         %[tmp_1],           0(%[noiseSupFilter])             \n\t"
-    "lh         %[tmp_2],           0(%[real])                       \n\t"
-    "lh         %[tmp_3],           0(%[imag])                       \n\t"
-    "lh         %[tmp_4],           2(%[noiseSupFilter])             \n\t"
-    "lh         %[tmp_5],           2(%[real])                       \n\t"
-    "lh         %[tmp_6],           2(%[imag])                       \n\t"
-    "mul        %[tmp_2],           %[tmp_2],             %[tmp_1]   \n\t"
-    "mul        %[tmp_3],           %[tmp_3],             %[tmp_1]   \n\t"
-    "mul        %[tmp_5],           %[tmp_5],             %[tmp_4]   \n\t"
-    "mul        %[tmp_6],           %[tmp_6],             %[tmp_4]   \n\t"
-    "sra        %[tmp_2],           %[tmp_2],             14         \n\t"
-    "sra        %[tmp_3],           %[tmp_3],             14         \n\t"
-    "sra        %[tmp_5],           %[tmp_5],             14         \n\t"
-    "sra        %[tmp_6],           %[tmp_6],             14         \n\t"
-    "sh         %[tmp_2],           0(%[real])                       \n\t"
-    "sh         %[tmp_2],           4(%[freq_buf_s])                 \n\t"
-    "sh         %[tmp_3],           0(%[imag])                       \n\t"
-    "sh         %[tmp_3],           6(%[freq_buf_s])                 \n\t"
-    "negu       %[tmp_3],           %[tmp_3]                         \n\t"
-    "sh         %[tmp_2],           0(%[freq_buf_f])                 \n\t"
-    "sh         %[tmp_3],           2(%[freq_buf_f])                 \n\t"
-    "sh         %[tmp_5],           4(%[freq_buf_f])                 \n\t"
-    "sh         %[tmp_6],           6(%[freq_buf_f])                 \n\t"
-    "sh         %[tmp_5],           2(%[real])                       \n\t"
-    "sh         %[tmp_6],           2(%[imag])                       \n\t"
-    ".set       pop                                                  \n\t"
-    : [real] "+r" (real), [imag] "+r" (imag),
-      [freq_buf_f] "+r" (freq_buf_f), [freq_buf_s] "+r" (freq_buf_s),
-      [loop_count] "+r" (loop_count), [noiseSupFilter] "+r" (noiseSupFilter),
-      [tmp_1] "=&r" (tmp_1), [tmp_2] "=&r" (tmp_2), [tmp_3] "=&r" (tmp_3),
-      [tmp_4] "=&r" (tmp_4), [tmp_5] "=&r" (tmp_5), [tmp_6] "=&r" (tmp_6)
-    : [loop_size] "r" (inst->anaLen2)
-    : "memory", "hi", "lo"
-  );
-}
-
-#if defined(MIPS_DSP_R1_LE)
-// Denormalize the real-valued signal |in|, the output from inverse FFT.
-void WebRtcNsx_Denormalize_mips(NoiseSuppressionFixedC* inst,
-                                int16_t* in,
-                                int factor) {
-  int32_t r0, r1, r2, r3, t0;
-  int len = (int)inst->anaLen;
-  int16_t *out = &inst->real[0];
-  int shift = factor - inst->normData;
-
-  __asm __volatile (
-    ".set          push                                \n\t"
-    ".set          noreorder                           \n\t"
-    "beqz          %[len],     8f                      \n\t"
-    " nop                                              \n\t"
-    "bltz          %[shift],   4f                      \n\t"
-    " sra          %[t0],      %[len],      2          \n\t"
-    "beqz          %[t0],      2f                      \n\t"
-    " andi         %[len],     %[len],      3          \n\t"
-   "1:                                                 \n\t"
-    "lh            %[r0],      0(%[in])                \n\t"
-    "lh            %[r1],      2(%[in])                \n\t"
-    "lh            %[r2],      4(%[in])                \n\t"
-    "lh            %[r3],      6(%[in])                \n\t"
-    "shllv_s.ph    %[r0],      %[r0],       %[shift]   \n\t"
-    "shllv_s.ph    %[r1],      %[r1],       %[shift]   \n\t"
-    "shllv_s.ph    %[r2],      %[r2],       %[shift]   \n\t"
-    "shllv_s.ph    %[r3],      %[r3],       %[shift]   \n\t"
-    "addiu         %[in],      %[in],       8          \n\t"
-    "addiu         %[t0],      %[t0],       -1         \n\t"
-    "sh            %[r0],      0(%[out])               \n\t"
-    "sh            %[r1],      2(%[out])               \n\t"
-    "sh            %[r2],      4(%[out])               \n\t"
-    "sh            %[r3],      6(%[out])               \n\t"
-    "bgtz          %[t0],      1b                      \n\t"
-    " addiu        %[out],     %[out],      8          \n\t"
-   "2:                                                 \n\t"
-    "beqz          %[len],     8f                      \n\t"
-    " nop                                              \n\t"
-   "3:                                                 \n\t"
-    "lh            %[r0],      0(%[in])                \n\t"
-    "addiu         %[in],      %[in],       2          \n\t"
-    "addiu         %[len],     %[len],      -1         \n\t"
-    "shllv_s.ph    %[r0],      %[r0],       %[shift]   \n\t"
-    "addiu         %[out],     %[out],      2          \n\t"
-    "bgtz          %[len],     3b                      \n\t"
-    " sh           %[r0],      -2(%[out])              \n\t"
-    "b             8f                                  \n\t"
-   "4:                                                 \n\t"
-    "negu          %[shift],   %[shift]                \n\t"
-    "beqz          %[t0],      6f                      \n\t"
-    " andi         %[len],     %[len],      3          \n\t"
-   "5:                                                 \n\t"
-    "lh            %[r0],      0(%[in])                \n\t"
-    "lh            %[r1],      2(%[in])                \n\t"
-    "lh            %[r2],      4(%[in])                \n\t"
-    "lh            %[r3],      6(%[in])                \n\t"
-    "srav          %[r0],      %[r0],       %[shift]   \n\t"
-    "srav          %[r1],      %[r1],       %[shift]   \n\t"
-    "srav          %[r2],      %[r2],       %[shift]   \n\t"
-    "srav          %[r3],      %[r3],       %[shift]   \n\t"
-    "addiu         %[in],      %[in],       8          \n\t"
-    "addiu         %[t0],      %[t0],       -1         \n\t"
-    "sh            %[r0],      0(%[out])               \n\t"
-    "sh            %[r1],      2(%[out])               \n\t"
-    "sh            %[r2],      4(%[out])               \n\t"
-    "sh            %[r3],      6(%[out])               \n\t"
-    "bgtz          %[t0],      5b                      \n\t"
-    " addiu        %[out],     %[out],      8          \n\t"
-   "6:                                                 \n\t"
-    "beqz          %[len],     8f                      \n\t"
-    " nop                                              \n\t"
-   "7:                                                 \n\t"
-    "lh            %[r0],      0(%[in])                \n\t"
-    "addiu         %[in],      %[in],       2          \n\t"
-    "addiu         %[len],     %[len],      -1         \n\t"
-    "srav          %[r0],      %[r0],       %[shift]   \n\t"
-    "addiu         %[out],     %[out],      2          \n\t"
-    "bgtz          %[len],     7b                      \n\t"
-    " sh           %[r0],      -2(%[out])              \n\t"
-   "8:                                                 \n\t"
-    ".set          pop                                 \n\t"
-    : [t0] "=&r" (t0), [r0] "=&r" (r0), [r1] "=&r" (r1),
-      [r2] "=&r" (r2), [r3] "=&r" (r3)
-    : [len] "r" (len), [shift] "r" (shift), [in] "r" (in),
-      [out] "r" (out)
-    : "memory"
-  );
-}
-#endif
-
-// Normalize the real-valued signal |in|, the input to forward FFT.
-void WebRtcNsx_NormalizeRealBuffer_mips(NoiseSuppressionFixedC* inst,
-                                        const int16_t* in,
-                                        int16_t* out) {
-  int32_t r0, r1, r2, r3, t0;
-  int len = (int)inst->anaLen;
-  int shift = inst->normData;
-
-  __asm __volatile (
-    ".set          push                                \n\t"
-    ".set          noreorder                           \n\t"
-    "beqz          %[len],     4f                      \n\t"
-    " sra          %[t0],      %[len],      2          \n\t"
-    "beqz          %[t0],      2f                      \n\t"
-    " andi         %[len],     %[len],      3          \n\t"
-   "1:                                                 \n\t"
-    "lh            %[r0],      0(%[in])                \n\t"
-    "lh            %[r1],      2(%[in])                \n\t"
-    "lh            %[r2],      4(%[in])                \n\t"
-    "lh            %[r3],      6(%[in])                \n\t"
-    "sllv          %[r0],      %[r0],       %[shift]   \n\t"
-    "sllv          %[r1],      %[r1],       %[shift]   \n\t"
-    "sllv          %[r2],      %[r2],       %[shift]   \n\t"
-    "sllv          %[r3],      %[r3],       %[shift]   \n\t"
-    "addiu         %[in],      %[in],       8          \n\t"
-    "addiu         %[t0],      %[t0],       -1         \n\t"
-    "sh            %[r0],      0(%[out])               \n\t"
-    "sh            %[r1],      2(%[out])               \n\t"
-    "sh            %[r2],      4(%[out])               \n\t"
-    "sh            %[r3],      6(%[out])               \n\t"
-    "bgtz          %[t0],      1b                      \n\t"
-    " addiu        %[out],     %[out],      8          \n\t"
-   "2:                                                 \n\t"
-    "beqz          %[len],     4f                      \n\t"
-    " nop                                              \n\t"
-   "3:                                                 \n\t"
-    "lh            %[r0],      0(%[in])                \n\t"
-    "addiu         %[in],      %[in],       2          \n\t"
-    "addiu         %[len],     %[len],      -1         \n\t"
-    "sllv          %[r0],      %[r0],       %[shift]   \n\t"
-    "addiu         %[out],     %[out],      2          \n\t"
-    "bgtz          %[len],     3b                      \n\t"
-    " sh           %[r0],      -2(%[out])              \n\t"
-   "4:                                                 \n\t"
-    ".set          pop                                 \n\t"
-    : [t0] "=&r" (t0), [r0] "=&r" (r0), [r1] "=&r" (r1),
-      [r2] "=&r" (r2), [r3] "=&r" (r3)
-    : [len] "r" (len), [shift] "r" (shift), [in] "r" (in),
-      [out] "r" (out)
-    : "memory"
-  );
-}