119 lines
4.0 KiB
C++
119 lines
4.0 KiB
C++
/*Copyright (c) 2013, Xiph.Org Foundation and contributors.
|
|
|
|
All rights reserved.
|
|
|
|
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.
|
|
|
|
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 KISS_FFT_ARMv5E_H
|
|
#define KISS_FFT_ARMv5E_H
|
|
|
|
#if !defined(KISS_FFT_GUTS_H)
|
|
#error "This file should only be included from _kiss_fft_guts.h"
|
|
#endif
|
|
|
|
#ifdef OPUS_FIXED_POINT
|
|
|
|
#if defined(__thumb__)||defined(__thumb2__)
|
|
#define LDRD_CONS "Q"
|
|
#else
|
|
#define LDRD_CONS "Uq"
|
|
#endif
|
|
|
|
#undef C_MUL
|
|
#define C_MUL(m,a,b) \
|
|
do{ \
|
|
int mr1__; \
|
|
int mr2__; \
|
|
int mi__; \
|
|
long long aval__; \
|
|
int bval__; \
|
|
__asm__( \
|
|
"#C_MUL\n\t" \
|
|
"ldrd %[aval], %H[aval], %[ap]\n\t" \
|
|
"ldr %[bval], %[bp]\n\t" \
|
|
"smulwb %[mi], %H[aval], %[bval]\n\t" \
|
|
"smulwb %[mr1], %[aval], %[bval]\n\t" \
|
|
"smulwt %[mr2], %H[aval], %[bval]\n\t" \
|
|
"smlawt %[mi], %[aval], %[bval], %[mi]\n\t" \
|
|
: [mr1]"=r"(mr1__), [mr2]"=r"(mr2__), [mi]"=r"(mi__), \
|
|
[aval]"=&r"(aval__), [bval]"=r"(bval__) \
|
|
: [ap]LDRD_CONS(a), [bp]"m"(b) \
|
|
); \
|
|
(m).r = SHL32(SUB32(mr1__, mr2__), 1); \
|
|
(m).i = SHL32(mi__, 1); \
|
|
} \
|
|
while(0)
|
|
|
|
#undef C_MUL4
|
|
#define C_MUL4(m,a,b) \
|
|
do{ \
|
|
int mr1__; \
|
|
int mr2__; \
|
|
int mi__; \
|
|
long long aval__; \
|
|
int bval__; \
|
|
__asm__( \
|
|
"#C_MUL4\n\t" \
|
|
"ldrd %[aval], %H[aval], %[ap]\n\t" \
|
|
"ldr %[bval], %[bp]\n\t" \
|
|
"smulwb %[mi], %H[aval], %[bval]\n\t" \
|
|
"smulwb %[mr1], %[aval], %[bval]\n\t" \
|
|
"smulwt %[mr2], %H[aval], %[bval]\n\t" \
|
|
"smlawt %[mi], %[aval], %[bval], %[mi]\n\t" \
|
|
: [mr1]"=r"(mr1__), [mr2]"=r"(mr2__), [mi]"=r"(mi__), \
|
|
[aval]"=&r"(aval__), [bval]"=r"(bval__) \
|
|
: [ap]LDRD_CONS(a), [bp]"m"(b) \
|
|
); \
|
|
(m).r = SHR32(SUB32(mr1__, mr2__), 1); \
|
|
(m).i = SHR32(mi__, 1); \
|
|
} \
|
|
while(0)
|
|
|
|
#undef C_MULC
|
|
#define C_MULC(m,a,b) \
|
|
do{ \
|
|
int mr__; \
|
|
int mi1__; \
|
|
int mi2__; \
|
|
long long aval__; \
|
|
int bval__; \
|
|
__asm__( \
|
|
"#C_MULC\n\t" \
|
|
"ldrd %[aval], %H[aval], %[ap]\n\t" \
|
|
"ldr %[bval], %[bp]\n\t" \
|
|
"smulwb %[mr], %[aval], %[bval]\n\t" \
|
|
"smulwb %[mi1], %H[aval], %[bval]\n\t" \
|
|
"smulwt %[mi2], %[aval], %[bval]\n\t" \
|
|
"smlawt %[mr], %H[aval], %[bval], %[mr]\n\t" \
|
|
: [mr]"=r"(mr__), [mi1]"=r"(mi1__), [mi2]"=r"(mi2__), \
|
|
[aval]"=&r"(aval__), [bval]"=r"(bval__) \
|
|
: [ap]LDRD_CONS(a), [bp]"m"(b) \
|
|
); \
|
|
(m).r = SHL32(mr__, 1); \
|
|
(m).i = SHL32(SUB32(mi1__, mi2__), 1); \
|
|
} \
|
|
while(0)
|
|
|
|
#endif /* FIXED_POINT */
|
|
|
|
#endif /* KISS_FFT_GUTS_H */
|