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