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