2013-02-21 20:12:21 +00:00
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
|
|
|
|
|
*
|
|
|
|
|
* Use of this source code is governed by a BSD-style license
|
|
|
|
|
* that can be found in the LICENSE file in the root of the source
|
|
|
|
|
* tree. An additional intellectual property rights grant can be found
|
|
|
|
|
* in the file PATENTS. All contributing project authors may
|
|
|
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* This file contains the resampling by two functions.
|
|
|
|
|
* The description header can be found in signal_processing_library.h
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#if defined(MIPS32_LE)
|
|
|
|
|
|
2017-09-15 06:47:31 +02:00
|
|
|
#include "common_audio/signal_processing/include/signal_processing_library.h"
|
2013-02-21 20:12:21 +00:00
|
|
|
|
2017-07-18 11:41:53 +02:00
|
|
|
#if !defined(MIPS_DSP_R2_LE)
|
2013-02-21 20:12:21 +00:00
|
|
|
// allpass filter coefficients.
|
2013-04-09 16:40:28 +00:00
|
|
|
static const uint16_t kResampleAllpass1[3] = {3284, 24441, 49528};
|
|
|
|
|
static const uint16_t kResampleAllpass2[3] = {12199, 37471, 60255};
|
2017-07-18 11:41:53 +02:00
|
|
|
#endif
|
2013-02-21 20:12:21 +00:00
|
|
|
|
|
|
|
|
// Multiply a 32-bit value with a 16-bit value and accumulate to another input:
|
|
|
|
|
#define MUL_ACCUM_1(a, b, c) WEBRTC_SPL_SCALEDIFF32(a, b, c)
|
|
|
|
|
#define MUL_ACCUM_2(a, b, c) WEBRTC_SPL_SCALEDIFF32(a, b, c)
|
|
|
|
|
|
|
|
|
|
// decimator
|
2013-04-09 16:40:28 +00:00
|
|
|
void WebRtcSpl_DownsampleBy2(const int16_t* in,
|
Update a ton of audio code to use size_t more correctly and in general reduce
use of int16_t/uint16_t.
This is the upshot of a recommendation by henrik.lundin and kwiberg on an original small change ( https://webrtc-codereview.appspot.com/42569004/#ps1 ) to stop using int16_t just because values could fit in it, and is similar in nature to a previous "mass change to use size_t more" ( https://webrtc-codereview.appspot.com/23129004/ ) which also needed to be split up for review but to land all at once, since, like adding "const", such changes tend to cause a lot of transitive effects.
This was be reviewed and approved in pieces:
https://codereview.webrtc.org/1224093003
https://codereview.webrtc.org/1224123002
https://codereview.webrtc.org/1224163002
https://codereview.webrtc.org/1225133003
https://codereview.webrtc.org/1225173002
https://codereview.webrtc.org/1227163003
https://codereview.webrtc.org/1227203003
https://codereview.webrtc.org/1227213002
https://codereview.webrtc.org/1227893002
https://codereview.webrtc.org/1228793004
https://codereview.webrtc.org/1228803003
https://codereview.webrtc.org/1228823002
https://codereview.webrtc.org/1228823003
https://codereview.webrtc.org/1228843002
https://codereview.webrtc.org/1230693002
https://codereview.webrtc.org/1231713002
The change is being landed as TBR to all the folks who reviewed the above.
BUG=chromium:81439
TEST=none
R=andrew@webrtc.org, pbos@webrtc.org
TBR=aluebs, andrew, asapersson, henrika, hlundin, jan.skoglund, kwiberg, minyue, pbos, pthatcher
Review URL: https://codereview.webrtc.org/1230503003 .
Cr-Commit-Position: refs/heads/master@{#9768}
2015-08-24 14:52:23 -07:00
|
|
|
size_t len,
|
2013-04-09 16:40:28 +00:00
|
|
|
int16_t* out,
|
|
|
|
|
int32_t* filtState) {
|
|
|
|
|
int32_t out32;
|
Update a ton of audio code to use size_t more correctly and in general reduce
use of int16_t/uint16_t.
This is the upshot of a recommendation by henrik.lundin and kwiberg on an original small change ( https://webrtc-codereview.appspot.com/42569004/#ps1 ) to stop using int16_t just because values could fit in it, and is similar in nature to a previous "mass change to use size_t more" ( https://webrtc-codereview.appspot.com/23129004/ ) which also needed to be split up for review but to land all at once, since, like adding "const", such changes tend to cause a lot of transitive effects.
This was be reviewed and approved in pieces:
https://codereview.webrtc.org/1224093003
https://codereview.webrtc.org/1224123002
https://codereview.webrtc.org/1224163002
https://codereview.webrtc.org/1225133003
https://codereview.webrtc.org/1225173002
https://codereview.webrtc.org/1227163003
https://codereview.webrtc.org/1227203003
https://codereview.webrtc.org/1227213002
https://codereview.webrtc.org/1227893002
https://codereview.webrtc.org/1228793004
https://codereview.webrtc.org/1228803003
https://codereview.webrtc.org/1228823002
https://codereview.webrtc.org/1228823003
https://codereview.webrtc.org/1228843002
https://codereview.webrtc.org/1230693002
https://codereview.webrtc.org/1231713002
The change is being landed as TBR to all the folks who reviewed the above.
BUG=chromium:81439
TEST=none
R=andrew@webrtc.org, pbos@webrtc.org
TBR=aluebs, andrew, asapersson, henrika, hlundin, jan.skoglund, kwiberg, minyue, pbos, pthatcher
Review URL: https://codereview.webrtc.org/1230503003 .
Cr-Commit-Position: refs/heads/master@{#9768}
2015-08-24 14:52:23 -07:00
|
|
|
size_t i, len1;
|
2013-04-09 16:40:28 +00:00
|
|
|
|
|
|
|
|
register int32_t state0 = filtState[0];
|
|
|
|
|
register int32_t state1 = filtState[1];
|
|
|
|
|
register int32_t state2 = filtState[2];
|
|
|
|
|
register int32_t state3 = filtState[3];
|
|
|
|
|
register int32_t state4 = filtState[4];
|
|
|
|
|
register int32_t state5 = filtState[5];
|
|
|
|
|
register int32_t state6 = filtState[6];
|
|
|
|
|
register int32_t state7 = filtState[7];
|
2013-02-21 20:12:21 +00:00
|
|
|
|
|
|
|
|
#if defined(MIPS_DSP_R2_LE)
|
2013-04-09 16:40:28 +00:00
|
|
|
int32_t k1Res0, k1Res1, k1Res2, k2Res0, k2Res1, k2Res2;
|
2013-02-21 20:12:21 +00:00
|
|
|
|
2025-01-09 02:11:09 -08:00
|
|
|
k1Res0 = 3284;
|
|
|
|
|
k1Res1 = 24441;
|
|
|
|
|
k1Res2 = 49528;
|
|
|
|
|
k2Res0 = 12199;
|
|
|
|
|
k2Res1 = 37471;
|
|
|
|
|
k2Res2 = 60255;
|
2013-02-21 20:12:21 +00:00
|
|
|
len1 = (len >> 1);
|
|
|
|
|
|
2013-04-09 16:40:28 +00:00
|
|
|
const int32_t* inw = (int32_t*)in;
|
|
|
|
|
int32_t tmp11, tmp12, tmp21, tmp22;
|
|
|
|
|
int32_t in322, in321;
|
|
|
|
|
int32_t diff1, diff2;
|
2013-02-21 20:12:21 +00:00
|
|
|
for (i = len1; i > 0; i--) {
|
2025-01-09 02:11:09 -08:00
|
|
|
__asm__ volatile(
|
|
|
|
|
"lh %[in321], 0(%[inw]) \n\t"
|
|
|
|
|
"lh %[in322], 2(%[inw]) \n\t"
|
2013-02-21 20:12:21 +00:00
|
|
|
|
2025-01-09 02:11:09 -08:00
|
|
|
"sll %[in321], %[in321], 10 \n\t"
|
|
|
|
|
"sll %[in322], %[in322], 10 \n\t"
|
2013-02-21 20:12:21 +00:00
|
|
|
|
2025-01-09 02:11:09 -08:00
|
|
|
"addiu %[inw], %[inw], 4 \n\t"
|
2013-02-21 20:12:21 +00:00
|
|
|
|
2025-01-09 02:11:09 -08:00
|
|
|
"subu %[diff1], %[in321], %[state1] \n\t"
|
|
|
|
|
"subu %[diff2], %[in322], %[state5] \n\t"
|
2013-02-21 20:12:21 +00:00
|
|
|
|
2025-01-09 02:11:09 -08:00
|
|
|
: [in322] "=&r"(in322), [in321] "=&r"(in321), [diff1] "=&r"(diff1),
|
|
|
|
|
[diff2] "=r"(diff2), [inw] "+r"(inw)
|
|
|
|
|
: [state1] "r"(state1), [state5] "r"(state5)
|
|
|
|
|
: "memory");
|
2013-02-21 20:12:21 +00:00
|
|
|
|
2025-01-09 02:11:09 -08:00
|
|
|
__asm__ volatile(
|
|
|
|
|
"mult $ac0, %[diff1], %[k2Res0] \n\t"
|
|
|
|
|
"mult $ac1, %[diff2], %[k1Res0] \n\t"
|
2013-02-21 20:12:21 +00:00
|
|
|
|
2025-01-09 02:11:09 -08:00
|
|
|
"extr.w %[tmp11], $ac0, 16 \n\t"
|
|
|
|
|
"extr.w %[tmp12], $ac1, 16 \n\t"
|
2013-02-21 20:12:21 +00:00
|
|
|
|
2025-01-09 02:11:09 -08:00
|
|
|
"addu %[tmp11], %[state0], %[tmp11] \n\t"
|
|
|
|
|
"addu %[tmp12], %[state4], %[tmp12] \n\t"
|
2013-02-21 20:12:21 +00:00
|
|
|
|
2025-01-09 02:11:09 -08:00
|
|
|
"addiu %[state0], %[in321], 0 \n\t"
|
|
|
|
|
"addiu %[state4], %[in322], 0 \n\t"
|
2013-02-21 20:12:21 +00:00
|
|
|
|
2025-01-09 02:11:09 -08:00
|
|
|
"subu %[diff1], %[tmp11], %[state2] \n\t"
|
|
|
|
|
"subu %[diff2], %[tmp12], %[state6] \n\t"
|
2013-02-21 20:12:21 +00:00
|
|
|
|
2025-01-09 02:11:09 -08:00
|
|
|
"mult $ac0, %[diff1], %[k2Res1] \n\t"
|
|
|
|
|
"mult $ac1, %[diff2], %[k1Res1] \n\t"
|
2013-02-21 20:12:21 +00:00
|
|
|
|
2025-01-09 02:11:09 -08:00
|
|
|
"extr.w %[tmp21], $ac0, 16 \n\t"
|
|
|
|
|
"extr.w %[tmp22], $ac1, 16 \n\t"
|
2013-02-21 20:12:21 +00:00
|
|
|
|
2025-01-09 02:11:09 -08:00
|
|
|
"addu %[tmp21], %[state1], %[tmp21] \n\t"
|
|
|
|
|
"addu %[tmp22], %[state5], %[tmp22] \n\t"
|
2013-02-21 20:12:21 +00:00
|
|
|
|
2025-01-09 02:11:09 -08:00
|
|
|
"addiu %[state1], %[tmp11], 0 \n\t"
|
|
|
|
|
"addiu %[state5], %[tmp12], 0 \n\t"
|
|
|
|
|
: [tmp22] "=r"(tmp22), [tmp21] "=&r"(tmp21), [tmp11] "=&r"(tmp11),
|
|
|
|
|
[state0] "+r"(state0), [state1] "+r"(state1), [state2] "+r"(state2),
|
|
|
|
|
[state4] "+r"(state4), [tmp12] "=&r"(tmp12), [state6] "+r"(state6),
|
|
|
|
|
[state5] "+r"(state5)
|
|
|
|
|
: [k1Res1] "r"(k1Res1), [k2Res1] "r"(k2Res1), [k2Res0] "r"(k2Res0),
|
|
|
|
|
[diff2] "r"(diff2), [diff1] "r"(diff1), [in322] "r"(in322),
|
|
|
|
|
[in321] "r"(in321), [k1Res0] "r"(k1Res0)
|
|
|
|
|
: "hi", "lo", "$ac1hi", "$ac1lo");
|
2013-02-21 20:12:21 +00:00
|
|
|
|
|
|
|
|
// upper allpass filter
|
2025-01-09 02:11:09 -08:00
|
|
|
__asm__ volatile(
|
|
|
|
|
"subu %[diff1], %[tmp21], %[state3] \n\t"
|
|
|
|
|
"subu %[diff2], %[tmp22], %[state7] \n\t"
|
|
|
|
|
|
|
|
|
|
"mult $ac0, %[diff1], %[k2Res2] \n\t"
|
|
|
|
|
"mult $ac1, %[diff2], %[k1Res2] \n\t"
|
|
|
|
|
"extr.w %[state3], $ac0, 16 \n\t"
|
|
|
|
|
"extr.w %[state7], $ac1, 16 \n\t"
|
|
|
|
|
"addu %[state3], %[state2], %[state3] \n\t"
|
|
|
|
|
"addu %[state7], %[state6], %[state7] \n\t"
|
|
|
|
|
|
|
|
|
|
"addiu %[state2], %[tmp21], 0 \n\t"
|
|
|
|
|
"addiu %[state6], %[tmp22], 0 \n\t"
|
|
|
|
|
|
|
|
|
|
// add two allpass outputs, divide by two and round
|
|
|
|
|
"addu %[out32], %[state3], %[state7] \n\t"
|
|
|
|
|
"addiu %[out32], %[out32], 1024 \n\t"
|
|
|
|
|
"sra %[out32], %[out32], 11 \n\t"
|
|
|
|
|
: [state3] "+r"(state3), [state6] "+r"(state6), [state2] "+r"(state2),
|
|
|
|
|
[diff2] "=&r"(diff2), [out32] "=r"(out32), [diff1] "=&r"(diff1),
|
|
|
|
|
[state7] "+r"(state7)
|
|
|
|
|
: [tmp22] "r"(tmp22), [tmp21] "r"(tmp21), [k1Res2] "r"(k1Res2),
|
|
|
|
|
[k2Res2] "r"(k2Res2)
|
|
|
|
|
: "hi", "lo", "$ac1hi", "$ac1lo");
|
2013-02-21 20:12:21 +00:00
|
|
|
|
|
|
|
|
// limit amplitude to prevent wrap-around, and write to output array
|
|
|
|
|
*out++ = WebRtcSpl_SatW32ToW16(out32);
|
|
|
|
|
}
|
2025-01-09 02:11:09 -08:00
|
|
|
#else // #if defined(MIPS_DSP_R2_LE)
|
2013-04-09 16:40:28 +00:00
|
|
|
int32_t tmp1, tmp2, diff;
|
|
|
|
|
int32_t in32;
|
2025-01-09 02:11:09 -08:00
|
|
|
len1 = (len >> 1) / 4;
|
2013-02-21 20:12:21 +00:00
|
|
|
for (i = len1; i > 0; i--) {
|
|
|
|
|
// lower allpass filter
|
2013-04-09 16:40:28 +00:00
|
|
|
in32 = (int32_t)(*in++) << 10;
|
2013-02-21 20:12:21 +00:00
|
|
|
diff = in32 - state1;
|
|
|
|
|
tmp1 = MUL_ACCUM_1(kResampleAllpass2[0], diff, state0);
|
|
|
|
|
state0 = in32;
|
|
|
|
|
diff = tmp1 - state2;
|
|
|
|
|
tmp2 = MUL_ACCUM_2(kResampleAllpass2[1], diff, state1);
|
|
|
|
|
state1 = tmp1;
|
|
|
|
|
diff = tmp2 - state3;
|
|
|
|
|
state3 = MUL_ACCUM_2(kResampleAllpass2[2], diff, state2);
|
|
|
|
|
state2 = tmp2;
|
|
|
|
|
|
|
|
|
|
// upper allpass filter
|
2013-04-09 16:40:28 +00:00
|
|
|
in32 = (int32_t)(*in++) << 10;
|
2013-02-21 20:12:21 +00:00
|
|
|
diff = in32 - state5;
|
|
|
|
|
tmp1 = MUL_ACCUM_1(kResampleAllpass1[0], diff, state4);
|
|
|
|
|
state4 = in32;
|
|
|
|
|
diff = tmp1 - state6;
|
|
|
|
|
tmp2 = MUL_ACCUM_1(kResampleAllpass1[1], diff, state5);
|
|
|
|
|
state5 = tmp1;
|
|
|
|
|
diff = tmp2 - state7;
|
|
|
|
|
state7 = MUL_ACCUM_2(kResampleAllpass1[2], diff, state6);
|
|
|
|
|
state6 = tmp2;
|
|
|
|
|
|
|
|
|
|
// add two allpass outputs, divide by two and round
|
|
|
|
|
out32 = (state3 + state7 + 1024) >> 11;
|
|
|
|
|
|
|
|
|
|
// limit amplitude to prevent wrap-around, and write to output array
|
|
|
|
|
*out++ = WebRtcSpl_SatW32ToW16(out32);
|
|
|
|
|
// lower allpass filter
|
2013-04-09 16:40:28 +00:00
|
|
|
in32 = (int32_t)(*in++) << 10;
|
2013-02-21 20:12:21 +00:00
|
|
|
diff = in32 - state1;
|
|
|
|
|
tmp1 = MUL_ACCUM_1(kResampleAllpass2[0], diff, state0);
|
|
|
|
|
state0 = in32;
|
|
|
|
|
diff = tmp1 - state2;
|
|
|
|
|
tmp2 = MUL_ACCUM_2(kResampleAllpass2[1], diff, state1);
|
|
|
|
|
state1 = tmp1;
|
|
|
|
|
diff = tmp2 - state3;
|
|
|
|
|
state3 = MUL_ACCUM_2(kResampleAllpass2[2], diff, state2);
|
|
|
|
|
state2 = tmp2;
|
|
|
|
|
|
|
|
|
|
// upper allpass filter
|
2013-04-09 16:40:28 +00:00
|
|
|
in32 = (int32_t)(*in++) << 10;
|
2013-02-21 20:12:21 +00:00
|
|
|
diff = in32 - state5;
|
|
|
|
|
tmp1 = MUL_ACCUM_1(kResampleAllpass1[0], diff, state4);
|
|
|
|
|
state4 = in32;
|
|
|
|
|
diff = tmp1 - state6;
|
|
|
|
|
tmp2 = MUL_ACCUM_1(kResampleAllpass1[1], diff, state5);
|
|
|
|
|
state5 = tmp1;
|
|
|
|
|
diff = tmp2 - state7;
|
|
|
|
|
state7 = MUL_ACCUM_2(kResampleAllpass1[2], diff, state6);
|
|
|
|
|
state6 = tmp2;
|
|
|
|
|
|
|
|
|
|
// add two allpass outputs, divide by two and round
|
|
|
|
|
out32 = (state3 + state7 + 1024) >> 11;
|
|
|
|
|
|
|
|
|
|
// limit amplitude to prevent wrap-around, and write to output array
|
|
|
|
|
*out++ = WebRtcSpl_SatW32ToW16(out32);
|
|
|
|
|
// lower allpass filter
|
2013-04-09 16:40:28 +00:00
|
|
|
in32 = (int32_t)(*in++) << 10;
|
2013-02-21 20:12:21 +00:00
|
|
|
diff = in32 - state1;
|
|
|
|
|
tmp1 = MUL_ACCUM_1(kResampleAllpass2[0], diff, state0);
|
|
|
|
|
state0 = in32;
|
|
|
|
|
diff = tmp1 - state2;
|
|
|
|
|
tmp2 = MUL_ACCUM_2(kResampleAllpass2[1], diff, state1);
|
|
|
|
|
state1 = tmp1;
|
|
|
|
|
diff = tmp2 - state3;
|
|
|
|
|
state3 = MUL_ACCUM_2(kResampleAllpass2[2], diff, state2);
|
|
|
|
|
state2 = tmp2;
|
|
|
|
|
|
|
|
|
|
// upper allpass filter
|
2013-04-09 16:40:28 +00:00
|
|
|
in32 = (int32_t)(*in++) << 10;
|
2013-02-21 20:12:21 +00:00
|
|
|
diff = in32 - state5;
|
|
|
|
|
tmp1 = MUL_ACCUM_1(kResampleAllpass1[0], diff, state4);
|
|
|
|
|
state4 = in32;
|
|
|
|
|
diff = tmp1 - state6;
|
|
|
|
|
tmp2 = MUL_ACCUM_1(kResampleAllpass1[1], diff, state5);
|
|
|
|
|
state5 = tmp1;
|
|
|
|
|
diff = tmp2 - state7;
|
|
|
|
|
state7 = MUL_ACCUM_2(kResampleAllpass1[2], diff, state6);
|
|
|
|
|
state6 = tmp2;
|
|
|
|
|
|
|
|
|
|
// add two allpass outputs, divide by two and round
|
|
|
|
|
out32 = (state3 + state7 + 1024) >> 11;
|
|
|
|
|
|
|
|
|
|
// limit amplitude to prevent wrap-around, and write to output array
|
|
|
|
|
*out++ = WebRtcSpl_SatW32ToW16(out32);
|
|
|
|
|
// lower allpass filter
|
2013-04-09 16:40:28 +00:00
|
|
|
in32 = (int32_t)(*in++) << 10;
|
2013-02-21 20:12:21 +00:00
|
|
|
diff = in32 - state1;
|
|
|
|
|
tmp1 = MUL_ACCUM_1(kResampleAllpass2[0], diff, state0);
|
|
|
|
|
state0 = in32;
|
|
|
|
|
diff = tmp1 - state2;
|
|
|
|
|
tmp2 = MUL_ACCUM_2(kResampleAllpass2[1], diff, state1);
|
|
|
|
|
state1 = tmp1;
|
|
|
|
|
diff = tmp2 - state3;
|
|
|
|
|
state3 = MUL_ACCUM_2(kResampleAllpass2[2], diff, state2);
|
|
|
|
|
state2 = tmp2;
|
|
|
|
|
|
|
|
|
|
// upper allpass filter
|
2013-04-09 16:40:28 +00:00
|
|
|
in32 = (int32_t)(*in++) << 10;
|
2013-02-21 20:12:21 +00:00
|
|
|
diff = in32 - state5;
|
|
|
|
|
tmp1 = MUL_ACCUM_1(kResampleAllpass1[0], diff, state4);
|
|
|
|
|
state4 = in32;
|
|
|
|
|
diff = tmp1 - state6;
|
|
|
|
|
tmp2 = MUL_ACCUM_1(kResampleAllpass1[1], diff, state5);
|
|
|
|
|
state5 = tmp1;
|
|
|
|
|
diff = tmp2 - state7;
|
|
|
|
|
state7 = MUL_ACCUM_2(kResampleAllpass1[2], diff, state6);
|
|
|
|
|
state6 = tmp2;
|
|
|
|
|
|
|
|
|
|
// add two allpass outputs, divide by two and round
|
|
|
|
|
out32 = (state3 + state7 + 1024) >> 11;
|
|
|
|
|
|
|
|
|
|
// limit amplitude to prevent wrap-around, and write to output array
|
|
|
|
|
*out++ = WebRtcSpl_SatW32ToW16(out32);
|
|
|
|
|
}
|
|
|
|
|
#endif // #if defined(MIPS_DSP_R2_LE)
|
2025-01-09 02:11:09 -08:00
|
|
|
__asm__ volatile(
|
|
|
|
|
"sw %[state0], 0(%[filtState]) \n\t"
|
|
|
|
|
"sw %[state1], 4(%[filtState]) \n\t"
|
|
|
|
|
"sw %[state2], 8(%[filtState]) \n\t"
|
|
|
|
|
"sw %[state3], 12(%[filtState]) \n\t"
|
|
|
|
|
"sw %[state4], 16(%[filtState]) \n\t"
|
|
|
|
|
"sw %[state5], 20(%[filtState]) \n\t"
|
|
|
|
|
"sw %[state6], 24(%[filtState]) \n\t"
|
|
|
|
|
"sw %[state7], 28(%[filtState]) \n\t"
|
|
|
|
|
:
|
|
|
|
|
: [state0] "r"(state0), [state1] "r"(state1), [state2] "r"(state2),
|
|
|
|
|
[state3] "r"(state3), [state4] "r"(state4), [state5] "r"(state5),
|
|
|
|
|
[state6] "r"(state6), [state7] "r"(state7), [filtState] "r"(filtState)
|
|
|
|
|
: "memory");
|
2013-02-21 20:12:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif // #if defined(MIPS32_LE)
|