From 516f7fbd6c60eb153a0ba9d82e9b911e2f9732ab Mon Sep 17 00:00:00 2001 From: Nils Wallménius Date: Sat, 31 Aug 2013 17:01:07 +0200 Subject: Add cf asm inline for multiplication commonly used in silk. Speeds up decoding a 16kbps test file by 4.9MHz on h300. Change-Id: I8c25431c98dfa9a1c3806a84055e0847eb77a9f1 --- lib/rbcodec/codecs/libopus/silk/cf/macros_cf.h | 50 ++++++++++++++++++++++++++ lib/rbcodec/codecs/libopus/silk/macros.h | 4 +++ 2 files changed, 54 insertions(+) create mode 100644 lib/rbcodec/codecs/libopus/silk/cf/macros_cf.h diff --git a/lib/rbcodec/codecs/libopus/silk/cf/macros_cf.h b/lib/rbcodec/codecs/libopus/silk/cf/macros_cf.h new file mode 100644 index 0000000000..157e1aebc5 --- /dev/null +++ b/lib/rbcodec/codecs/libopus/silk/cf/macros_cf.h @@ -0,0 +1,50 @@ +/*********************************************************************** +Copyright (C) 2013 Xiph.Org Foundation and contributors. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifndef SILK_MACROS_CF_H +#define SILK_MACROS_CF_H + +/* (a32 * (opus_int32)((opus_int16)(b32))) >> 16 output have to be 32bit int */ +#undef silk_SMULWB +static inline int32_t silk_SMULWB_cf(int32_t a, int16_t b) +{ + int32_t r; + asm volatile ("mac.l %[a], %[b], %%acc0;" + "movclr.l %%acc0, %[r];" + : [r] "=r" (r) + : [a] "r" (a), [b] "r" (b<<15) + : "cc"); + return r; +} + +#define silk_SMULWB(a, b) (silk_SMULWB_cf(a, b)) + +/* a32 + (b32 * (opus_int32)((opus_int16)(c32))) >> 16 output have to be 32bit int */ +#undef silk_SMLAWB +#define silk_SMLAWB(a, b, c) ((a) + silk_SMULWB(b, c)) + +#endif /* SILK_MACROS_CF_H */ diff --git a/lib/rbcodec/codecs/libopus/silk/macros.h b/lib/rbcodec/codecs/libopus/silk/macros.h index 8aba9bb85f..97f03c886a 100644 --- a/lib/rbcodec/codecs/libopus/silk/macros.h +++ b/lib/rbcodec/codecs/libopus/silk/macros.h @@ -108,5 +108,9 @@ static inline opus_int32 silk_CLZ32(opus_int32 in32) #include "arm/macros_armv5e.h" #endif +#ifdef CF_ASM +#include "cf/macros_cf.h" +#endif + #endif /* SILK_MACROS_H */ -- cgit v1.2.3