filterbanks_mips.c revision 919914d71becdf4ef3a322d0af0d997c7f458e7c
1c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca/*
2c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca *
4c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca *  Use of this source code is governed by a BSD-style license
5c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca *  that can be found in the LICENSE file in the root of the source
6c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca *  tree. An additional intellectual property rights grant can be found
7c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca *  in the file PATENTS.  All contributing project authors may
8c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca *  be found in the AUTHORS file in the root of the source tree.
9c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca */
10c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca
11c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca#include "webrtc/modules/audio_coding/codecs/isac/fix/source/filterbank_internal.h"
12c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca
13c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca// WebRtcIsacfix_AllpassFilter2FixDec16 function optimized for MIPSDSP platform
14c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca// Bit-exact with WebRtcIsacfix_AllpassFilter2FixDec16C from filterbanks.c
15c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonsecavoid WebRtcIsacfix_AllpassFilter2FixDec16MIPS(
16c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca    int16_t *data_ch1,  // Input and output in channel 1, in Q0
17c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca    int16_t *data_ch2,  // Input and output in channel 2, in Q0
18c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca    const int16_t *factor_ch1,  // Scaling factor for channel 1, in Q15
19c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca    const int16_t *factor_ch2,  // Scaling factor for channel 2, in Q15
20c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca    const int length,  // Length of the data buffers
21c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca    int32_t *filter_state_ch1,  // Filter state for channel 1, in Q16
22c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca    int32_t *filter_state_ch2) {  // Filter state for channel 2, in Q16
23c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca
24c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca  int32_t st0_ch1, st1_ch1; // channel1 state variables
25c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca  int32_t st0_ch2, st1_ch2; // channel2 state variables
26c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca  int32_t f_ch10, f_ch11, f_ch20, f_ch21; // factor variables
27c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca  int32_t r0, r1, r2, r3, r4, r5; // temporary ragister variables
28c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca
29c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca  __asm __volatile (
30c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca    ".set           push                                                  \n\t"
31c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca    ".set           noreorder                                             \n\t"
32c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca    // Load all the state and factor variables
33c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca    "lh             %[f_ch10],      0(%[factor_ch1])                      \n\t"
34c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca    "lh             %[f_ch20],      0(%[factor_ch2])                      \n\t"
3531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca    "lh             %[f_ch11],      2(%[factor_ch1])                      \n\t"
3631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca    "lh             %[f_ch21],      2(%[factor_ch2])                      \n\t"
3731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca    "lw             %[st0_ch1],     0(%[filter_state_ch1])                \n\t"
38f71508ae793aaea999d3aa5bdd5f4cf157f016c6Brian Paul    "lw             %[st1_ch1],     4(%[filter_state_ch1])                \n\t"
39f71508ae793aaea999d3aa5bdd5f4cf157f016c6Brian Paul    "lw             %[st0_ch2],     0(%[filter_state_ch2])                \n\t"
4031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca    "lw             %[st1_ch2],     4(%[filter_state_ch2])                \n\t"
4131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca    // Allpass filtering loop
4231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   "1:                                                                    \n\t"
4331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca    "lh             %[r0],          0(%[data_ch1])                        \n\t"
44c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca    "lh             %[r1],          0(%[data_ch2])                        \n\t"
459fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "addiu          %[length],      %[length],              -1            \n\t"
469fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "mul            %[r2],          %[r0],                  %[f_ch10]     \n\t"
479fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "mul            %[r3],          %[r1],                  %[f_ch20]     \n\t"
489fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "sll            %[r0],          %[r0],                  16            \n\t"
499fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "sll            %[r1],          %[r1],                  16            \n\t"
509fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "sll            %[r2],          %[r2],                  1             \n\t"
519fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "addq_s.w       %[r2],          %[r2],                  %[st0_ch1]    \n\t"
529fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "sll            %[r3],          %[r3],                  1             \n\t"
539fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "addq_s.w       %[r3],          %[r3],                  %[st0_ch2]    \n\t"
549fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "sra            %[r2],          %[r2],                  16            \n\t"
559fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "mul            %[st0_ch1],     %[f_ch10],              %[r2]         \n\t"
569fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "sra            %[r3],          %[r3],                  16            \n\t"
579fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "mul            %[st0_ch2],     %[f_ch20],              %[r3]         \n\t"
589fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "mul            %[r4],          %[r2],                  %[f_ch11]     \n\t"
599fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "mul            %[r5],          %[r3],                  %[f_ch21]     \n\t"
609fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "sll            %[st0_ch1],     %[st0_ch1],             1             \n\t"
619fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "subq_s.w       %[st0_ch1],     %[r0],                  %[st0_ch1]    \n\t"
629fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "sll            %[st0_ch2],     %[st0_ch2],             1             \n\t"
639fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "subq_s.w       %[st0_ch2],     %[r1],                  %[st0_ch2]    \n\t"
649fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "sll            %[r4],          %[r4],                  1             \n\t"
659fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "addq_s.w       %[r4],          %[r4],                  %[st1_ch1]    \n\t"
669fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "sll            %[r5],          %[r5],                  1             \n\t"
679fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "addq_s.w       %[r5],          %[r5],                  %[st1_ch2]    \n\t"
689fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    "sra            %[r4],          %[r4],                  16            \n\t"
69c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca    "mul            %[r0],          %[r4],                  %[f_ch11]     \n\t"
709646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca    "sra            %[r5],          %[r5],                  16            \n\t"
71c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca    "mul            %[r1],          %[r5],                  %[f_ch21]     \n\t"
72c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca    "sh             %[r4],          0(%[data_ch1])                        \n\t"
73c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca    "sh             %[r5],          0(%[data_ch2])                        \n\t"
74c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca    "addiu          %[data_ch1],    %[data_ch1],            2             \n\t"
75c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca    "sll            %[r2],          %[r2],                  16            \n\t"
7631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca    "sll            %[r0],          %[r0],                  1             \n\t"
7731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca    "subq_s.w       %[st1_ch1],     %[r2],                  %[r0]         \n\t"
7831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca    "sll            %[r3],          %[r3],                  16            \n\t"
7931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca    "sll            %[r1],          %[r1],                  1             \n\t"
8031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca    "subq_s.w       %[st1_ch2],     %[r3],                  %[r1]         \n\t"
81f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca    "bgtz           %[length],      1b                                    \n\t"
82f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca    " addiu         %[data_ch2],    %[data_ch2],            2             \n\t"
83f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca    // Store channel states
8431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca    "sw             %[st0_ch1],     0(%[filter_state_ch1])                \n\t"
8531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca    "sw             %[st1_ch1],     4(%[filter_state_ch1])                \n\t"
869646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca    "sw             %[st0_ch2],     0(%[filter_state_ch2])                \n\t"
879646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca    "sw             %[st1_ch2],     4(%[filter_state_ch2])                \n\t"
889646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca    ".set           pop                                                   \n\t"
89e832b5b7fa196853bc61895869bd20c8b85f0ea9Brian Paul    : [f_ch10] "=&r" (f_ch10), [f_ch20] "=&r" (f_ch20),
90e832b5b7fa196853bc61895869bd20c8b85f0ea9Brian Paul      [f_ch11] "=&r" (f_ch11), [f_ch21] "=&r" (f_ch21),
91e832b5b7fa196853bc61895869bd20c8b85f0ea9Brian Paul      [st0_ch1] "=&r" (st0_ch1), [st1_ch1] "=&r" (st1_ch1),
9231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      [st0_ch2] "=&r" (st0_ch2), [st1_ch2] "=&r" (st1_ch2),
939ffc8ea8f4cfa15115a93039cc7099f0fd597fe3José Fonseca      [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2),
9431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      [r3] "=&r" (r3), [r4] "=&r" (r4), [r5] "=&r" (r5)
9531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca    : [factor_ch1] "r" (factor_ch1), [factor_ch2] "r" (factor_ch2),
9631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      [filter_state_ch1] "r" (filter_state_ch1),
9731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      [filter_state_ch2] "r" (filter_state_ch2),
9831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      [data_ch1] "r" (data_ch1), [data_ch2] "r" (data_ch2),
9931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      [length] "r" (length)
10031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca    : "memory", "hi", "lo"
10131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca  );
10231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca}
10331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca