1919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org/* 2919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 3919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org * 4919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org * Use of this source code is governed by a BSD-style license 5919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org * in the file PATENTS. All contributing project authors may 8919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org */ 10919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org 11919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org#include "webrtc/modules/audio_coding/codecs/isac/fix/source/filterbank_internal.h" 12919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org 13ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org// WebRtcIsacfix_AllpassFilter2FixDec16 function optimized for MIPSDSP platform. 14ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org// Bit-exact with WebRtcIsacfix_AllpassFilter2FixDec16C from filterbanks.c. 15919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.orgvoid WebRtcIsacfix_AllpassFilter2FixDec16MIPS( 16ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org int16_t* data_ch1, // Input and output in channel 1, in Q0. 17ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org int16_t* data_ch2, // Input and output in channel 2, in Q0. 18ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org const int16_t* factor_ch1, // Scaling factor for channel 1, in Q15. 19ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org const int16_t* factor_ch2, // Scaling factor for channel 2, in Q15. 20ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org const int length, // Length of the data buffers. 21ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org int32_t* filter_state_ch1, // Filter state for channel 1, in Q16. 22ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org int32_t* filter_state_ch2) { // Filter state for channel 2, in Q16. 23919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org 24ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org int32_t st0_ch1, st1_ch1; // channel1 state variables. 25ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org int32_t st0_ch2, st1_ch2; // channel2 state variables. 26ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org int32_t f_ch10, f_ch11, f_ch20, f_ch21; // factor variables. 27ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org int32_t r0, r1, r2, r3, r4, r5; // temporary register variables. 28919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org 29919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org __asm __volatile ( 30919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org ".set push \n\t" 31919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org ".set noreorder \n\t" 32ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org // Load all the state and factor variables. 33919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "lh %[f_ch10], 0(%[factor_ch1]) \n\t" 34919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "lh %[f_ch20], 0(%[factor_ch2]) \n\t" 35919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "lh %[f_ch11], 2(%[factor_ch1]) \n\t" 36919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "lh %[f_ch21], 2(%[factor_ch2]) \n\t" 37919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "lw %[st0_ch1], 0(%[filter_state_ch1]) \n\t" 38919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "lw %[st1_ch1], 4(%[filter_state_ch1]) \n\t" 39919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "lw %[st0_ch2], 0(%[filter_state_ch2]) \n\t" 40919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "lw %[st1_ch2], 4(%[filter_state_ch2]) \n\t" 41ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org // Allpass filtering loop. 42919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "1: \n\t" 43919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "lh %[r0], 0(%[data_ch1]) \n\t" 44919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "lh %[r1], 0(%[data_ch2]) \n\t" 45919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "addiu %[length], %[length], -1 \n\t" 46919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "mul %[r2], %[r0], %[f_ch10] \n\t" 47919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "mul %[r3], %[r1], %[f_ch20] \n\t" 48919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sll %[r0], %[r0], 16 \n\t" 49919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sll %[r1], %[r1], 16 \n\t" 50919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sll %[r2], %[r2], 1 \n\t" 51919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "addq_s.w %[r2], %[r2], %[st0_ch1] \n\t" 52919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sll %[r3], %[r3], 1 \n\t" 53919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "addq_s.w %[r3], %[r3], %[st0_ch2] \n\t" 54919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sra %[r2], %[r2], 16 \n\t" 55919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "mul %[st0_ch1], %[f_ch10], %[r2] \n\t" 56919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sra %[r3], %[r3], 16 \n\t" 57919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "mul %[st0_ch2], %[f_ch20], %[r3] \n\t" 58919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "mul %[r4], %[r2], %[f_ch11] \n\t" 59919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "mul %[r5], %[r3], %[f_ch21] \n\t" 60919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sll %[st0_ch1], %[st0_ch1], 1 \n\t" 61919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "subq_s.w %[st0_ch1], %[r0], %[st0_ch1] \n\t" 62919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sll %[st0_ch2], %[st0_ch2], 1 \n\t" 63919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "subq_s.w %[st0_ch2], %[r1], %[st0_ch2] \n\t" 64919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sll %[r4], %[r4], 1 \n\t" 65919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "addq_s.w %[r4], %[r4], %[st1_ch1] \n\t" 66919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sll %[r5], %[r5], 1 \n\t" 67919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "addq_s.w %[r5], %[r5], %[st1_ch2] \n\t" 68919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sra %[r4], %[r4], 16 \n\t" 69919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "mul %[r0], %[r4], %[f_ch11] \n\t" 70919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sra %[r5], %[r5], 16 \n\t" 71919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "mul %[r1], %[r5], %[f_ch21] \n\t" 72919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sh %[r4], 0(%[data_ch1]) \n\t" 73919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sh %[r5], 0(%[data_ch2]) \n\t" 74919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "addiu %[data_ch1], %[data_ch1], 2 \n\t" 75919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sll %[r2], %[r2], 16 \n\t" 76919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sll %[r0], %[r0], 1 \n\t" 77919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "subq_s.w %[st1_ch1], %[r2], %[r0] \n\t" 78919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sll %[r3], %[r3], 16 \n\t" 79919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sll %[r1], %[r1], 1 \n\t" 80919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "subq_s.w %[st1_ch2], %[r3], %[r1] \n\t" 81919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "bgtz %[length], 1b \n\t" 82919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org " addiu %[data_ch2], %[data_ch2], 2 \n\t" 83ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org // Store channel states. 84919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sw %[st0_ch1], 0(%[filter_state_ch1]) \n\t" 85919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sw %[st1_ch1], 4(%[filter_state_ch1]) \n\t" 86919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sw %[st0_ch2], 0(%[filter_state_ch2]) \n\t" 87919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org "sw %[st1_ch2], 4(%[filter_state_ch2]) \n\t" 88919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org ".set pop \n\t" 89919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org : [f_ch10] "=&r" (f_ch10), [f_ch20] "=&r" (f_ch20), 90919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org [f_ch11] "=&r" (f_ch11), [f_ch21] "=&r" (f_ch21), 91919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org [st0_ch1] "=&r" (st0_ch1), [st1_ch1] "=&r" (st1_ch1), 92919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org [st0_ch2] "=&r" (st0_ch2), [st1_ch2] "=&r" (st1_ch2), 93919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2), 94919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org [r3] "=&r" (r3), [r4] "=&r" (r4), [r5] "=&r" (r5) 95919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org : [factor_ch1] "r" (factor_ch1), [factor_ch2] "r" (factor_ch2), 96919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org [filter_state_ch1] "r" (filter_state_ch1), 97919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org [filter_state_ch2] "r" (filter_state_ch2), 98919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org [data_ch1] "r" (data_ch1), [data_ch2] "r" (data_ch2), 99919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org [length] "r" (length) 100919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org : "memory", "hi", "lo" 101919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org ); 102919914d71becdf4ef3a322d0af0d997c7f458e7candrew@webrtc.org} 103ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org 104ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org// WebRtcIsacfix_HighpassFilterFixDec32 function optimized for MIPSDSP platform. 105ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org// Bit-exact with WebRtcIsacfix_HighpassFilterFixDec32C from filterbanks.c. 106ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.orgvoid WebRtcIsacfix_HighpassFilterFixDec32MIPS(int16_t* io, 107ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org int16_t len, 108ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org const int16_t* coefficient, 109ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org int32_t* state) { 110ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org int k; 111ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org int32_t a1, a2, b1, b2, in; 112ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org int32_t state0 = state[0]; 113ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org int32_t state1 = state[1]; 114ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org 115ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org int32_t c0, c1, c2, c3; 116ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org int32_t c4, c5, c6, c7; 117ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org int32_t state0_lo, state0_hi; 118ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org int32_t state1_lo, state1_hi; 119ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org int32_t t0, t1, t2, t3, t4, t5; 120ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org 121ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org __asm __volatile ( 122ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "lh %[c0], 0(%[coeff_ptr]) \n\t" 123ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "lh %[c1], 2(%[coeff_ptr]) \n\t" 124ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "lh %[c2], 4(%[coeff_ptr]) \n\t" 125ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "lh %[c3], 6(%[coeff_ptr]) \n\t" 126ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sra %[state0_hi], %[state0], 16 \n\t" 127ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sra %[state1_hi], %[state1], 16 \n\t" 128ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "andi %[state0_lo], %[state0], 0xFFFF \n\t" 129ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "andi %[state1_lo], %[state1], 0xFFFF \n\t" 130ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "lh %[c4], 8(%[coeff_ptr]) \n\t" 131ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "lh %[c5], 10(%[coeff_ptr]) \n\t" 132ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "lh %[c6], 12(%[coeff_ptr]) \n\t" 133ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "lh %[c7], 14(%[coeff_ptr]) \n\t" 134ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sra %[state0_lo], %[state0_lo], 1 \n\t" 135ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sra %[state1_lo], %[state1_lo], 1 \n\t" 136ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org : [c0] "=&r" (c0), [c1] "=&r" (c1), [c2] "=&r" (c2), [c3] "=&r" (c3), 137ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org [c4] "=&r" (c4), [c5] "=&r" (c5), [c6] "=&r" (c6), [c7] "=&r" (c7), 138ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org [state0_hi] "=&r" (state0_hi), [state0_lo] "=&r" (state0_lo), 139ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org [state1_hi] "=&r" (state1_hi), [state1_lo] "=&r" (state1_lo) 140ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org : [coeff_ptr] "r" (coefficient), [state0] "r" (state0), 141ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org [state1] "r" (state1) 142ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org : "memory" 143ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org ); 144ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org 145ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org for (k = 0; k < len; k++) { 146ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org in = (int32_t)io[k]; 147ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org 148ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org __asm __volatile ( 149ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org ".set push \n\t" 150ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org ".set noreorder \n\t" 151ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "mul %[t2], %[c4], %[state0_lo] \n\t" 152ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "mul %[t0], %[c5], %[state0_lo] \n\t" 153ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "mul %[t1], %[c4], %[state0_hi] \n\t" 154ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "mul %[a1], %[c5], %[state0_hi] \n\t" 155ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "mul %[t5], %[c6], %[state1_lo] \n\t" 156ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "mul %[t3], %[c7], %[state1_lo] \n\t" 157ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "mul %[t4], %[c6], %[state1_hi] \n\t" 158ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "mul %[b1], %[c7], %[state1_hi] \n\t" 159ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "shra_r.w %[t2], %[t2], 15 \n\t" 160ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "shra_r.w %[t0], %[t0], 15 \n\t" 161ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "addu %[t1], %[t1], %[t2] \n\t" 162ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "addu %[a1], %[a1], %[t0] \n\t" 163ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sra %[t1], %[t1], 16 \n\t" 164ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "addu %[a1], %[a1], %[t1] \n\t" 165ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "shra_r.w %[t5], %[t5], 15 \n\t" 166ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "shra_r.w %[t3], %[t3], 15 \n\t" 167ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "addu %[t4], %[t4], %[t5] \n\t" 168ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "addu %[b1], %[b1], %[t3] \n\t" 169ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sra %[t4], %[t4], 16 \n\t" 170ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "addu %[b1], %[b1], %[t4] \n\t" 171ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "mul %[t2], %[c0], %[state0_lo] \n\t" 172ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "mul %[t0], %[c1], %[state0_lo] \n\t" 173ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "mul %[t1], %[c0], %[state0_hi] \n\t" 174ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "mul %[a2], %[c1], %[state0_hi] \n\t" 175ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "mul %[t5], %[c2], %[state1_lo] \n\t" 176ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "mul %[t3], %[c3], %[state1_lo] \n\t" 177ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "mul %[t4], %[c2], %[state1_hi] \n\t" 178ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "mul %[b2], %[c3], %[state1_hi] \n\t" 179ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "shra_r.w %[t2], %[t2], 15 \n\t" 180ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "shra_r.w %[t0], %[t0], 15 \n\t" 181ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "addu %[t1], %[t1], %[t2] \n\t" 182ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "addu %[a2], %[a2], %[t0] \n\t" 183ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sra %[t1], %[t1], 16 \n\t" 184ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "addu %[a2], %[a2], %[t1] \n\t" 185ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "shra_r.w %[t5], %[t5], 15 \n\t" 186ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "shra_r.w %[t3], %[t3], 15 \n\t" 187ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "addu %[t4], %[t4], %[t5] \n\t" 188ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "addu %[b2], %[b2], %[t3] \n\t" 189ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sra %[t4], %[t4], 16 \n\t" 190ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "addu %[b2], %[b2], %[t4] \n\t" 191ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "addu %[a1], %[a1], %[b1] \n\t" 192ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sra %[a1], %[a1], 7 \n\t" 193ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "addu %[a1], %[a1], %[in] \n\t" 194ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sll %[t0], %[in], 2 \n\t" 195ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "addu %[a2], %[a2], %[b2] \n\t" 196ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "subu %[t0], %[t0], %[a2] \n\t" 197ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "shll_s.w %[a1], %[a1], 16 \n\t" 198ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "shll_s.w %[t0], %[t0], 2 \n\t" 199ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sra %[a1], %[a1], 16 \n\t" 200ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "addu %[state1_hi], %[state0_hi], $0 \n\t" 201ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "addu %[state1_lo], %[state0_lo], $0 \n\t" 202ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sra %[state0_hi], %[t0], 16 \n\t" 203ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "andi %[state0_lo], %[t0], 0xFFFF \n\t" 204ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sra %[state0_lo], %[state0_lo], 1 \n\t" 205ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org ".set pop \n\t" 206ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org : [a1] "=&r" (a1), [b1] "=&r" (b1), [a2] "=&r" (a2), [b2] "=&r" (b2), 207ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org [state0_hi] "+r" (state0_hi), [state0_lo] "+r" (state0_lo), 208ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org [state1_hi] "+r" (state1_hi), [state1_lo] "+r" (state1_lo), 209ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org [t0] "=&r" (t0), [t1] "=&r" (t1), [t2] "=&r" (t2), 210ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org [t3] "=&r" (t3), [t4] "=&r" (t4), [t5] "=&r" (t5) 211ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org : [c0] "r" (c0), [c1] "r" (c1), [c2] "r" (c2), [c3] "r" (c3), 212ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org [c4] "r" (c4), [c5] "r" (c5), [c6] "r" (c6), [c7] "r" (c7), 213ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org [in] "r" (in) 214ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org : "hi", "lo" 215ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org ); 216ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org io[k] = (int16_t)a1; 217ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org } 218ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org __asm __volatile ( 219ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org ".set push \n\t" 220ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org ".set noreorder \n\t" 221ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org#if !defined(MIPS_DSP_R2_LE) 222ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sll %[state0_hi], %[state0_hi], 16 \n\t" 223ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sll %[state0_lo], %[state0_lo], 1 \n\t" 224ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sll %[state1_hi], %[state1_hi], 16 \n\t" 225ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sll %[state1_lo], %[state1_lo], 1 \n\t" 226ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "or %[state0_hi], %[state0_hi], %[state0_lo] \n\t" 227ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "or %[state1_hi], %[state1_hi], %[state1_lo] \n\t" 228ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org#else 229ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sll %[state0_lo], %[state0_lo], 1 \n\t" 230ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sll %[state1_lo], %[state1_lo], 1 \n\t" 231ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "precr_sra.ph.w %[state0_hi], %[state0_lo], 0 \n\t" 232ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "precr_sra.ph.w %[state1_hi], %[state1_lo], 0 \n\t" 233ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org#endif 234ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sw %[state0_hi], 0(%[state]) \n\t" 235ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org "sw %[state1_hi], 4(%[state]) \n\t" 236ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org ".set pop \n\t" 237ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org : [state0_hi] "+r" (state0_hi), [state0_lo] "+r" (state0_lo), 238ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org [state1_hi] "+r" (state1_hi), [state1_lo] "+r" (state1_lo) 239ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org : [state] "r" (state) 240ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org : "memory" 241ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org ); 242ceafa8cce9554b0777aa3cbdf70236e1fbabb414andrew@webrtc.org} 243