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