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