xref: /aosp_15_r20/external/libopus/celt/arm/kiss_fft_armv5e.h (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
1*a58d3d2aSXin Li /*Copyright (c) 2013, Xiph.Org Foundation and contributors.
2*a58d3d2aSXin Li 
3*a58d3d2aSXin Li   All rights reserved.
4*a58d3d2aSXin Li 
5*a58d3d2aSXin Li   Redistribution and use in source and binary forms, with or without
6*a58d3d2aSXin Li    modification, are permitted provided that the following conditions are met:
7*a58d3d2aSXin Li 
8*a58d3d2aSXin Li     * Redistributions of source code must retain the above copyright notice,
9*a58d3d2aSXin Li        this list of conditions and the following disclaimer.
10*a58d3d2aSXin Li     * Redistributions in binary form must reproduce the above copyright notice,
11*a58d3d2aSXin Li        this list of conditions and the following disclaimer in the
12*a58d3d2aSXin Li        documentation and/or other materials provided with the distribution.
13*a58d3d2aSXin Li 
14*a58d3d2aSXin Li   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15*a58d3d2aSXin Li   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*a58d3d2aSXin Li   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*a58d3d2aSXin Li   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
18*a58d3d2aSXin Li   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19*a58d3d2aSXin Li   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20*a58d3d2aSXin Li   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21*a58d3d2aSXin Li   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22*a58d3d2aSXin Li   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23*a58d3d2aSXin Li   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24*a58d3d2aSXin Li   POSSIBILITY OF SUCH DAMAGE.*/
25*a58d3d2aSXin Li 
26*a58d3d2aSXin Li #ifndef KISS_FFT_ARMv5E_H
27*a58d3d2aSXin Li #define KISS_FFT_ARMv5E_H
28*a58d3d2aSXin Li 
29*a58d3d2aSXin Li #if !defined(KISS_FFT_GUTS_H)
30*a58d3d2aSXin Li #error "This file should only be included from _kiss_fft_guts.h"
31*a58d3d2aSXin Li #endif
32*a58d3d2aSXin Li 
33*a58d3d2aSXin Li #ifdef FIXED_POINT
34*a58d3d2aSXin Li 
35*a58d3d2aSXin Li #if defined(__thumb__)||defined(__thumb2__)
36*a58d3d2aSXin Li #define LDRD_CONS "Q"
37*a58d3d2aSXin Li #else
38*a58d3d2aSXin Li #define LDRD_CONS "Uq"
39*a58d3d2aSXin Li #endif
40*a58d3d2aSXin Li 
41*a58d3d2aSXin Li #undef C_MUL
42*a58d3d2aSXin Li #define C_MUL(m,a,b) \
43*a58d3d2aSXin Li     do{ \
44*a58d3d2aSXin Li         int mr1__; \
45*a58d3d2aSXin Li         int mr2__; \
46*a58d3d2aSXin Li         int mi__; \
47*a58d3d2aSXin Li         long long aval__; \
48*a58d3d2aSXin Li         int bval__; \
49*a58d3d2aSXin Li         __asm__( \
50*a58d3d2aSXin Li             "#C_MUL\n\t" \
51*a58d3d2aSXin Li             "ldrd %[aval], %H[aval], %[ap]\n\t" \
52*a58d3d2aSXin Li             "ldr %[bval], %[bp]\n\t" \
53*a58d3d2aSXin Li             "smulwb %[mi], %H[aval], %[bval]\n\t" \
54*a58d3d2aSXin Li             "smulwb %[mr1], %[aval], %[bval]\n\t" \
55*a58d3d2aSXin Li             "smulwt %[mr2], %H[aval], %[bval]\n\t" \
56*a58d3d2aSXin Li             "smlawt %[mi], %[aval], %[bval], %[mi]\n\t" \
57*a58d3d2aSXin Li             : [mr1]"=r"(mr1__), [mr2]"=r"(mr2__), [mi]"=r"(mi__), \
58*a58d3d2aSXin Li               [aval]"=&r"(aval__), [bval]"=r"(bval__) \
59*a58d3d2aSXin Li             : [ap]LDRD_CONS(a), [bp]"m"(b) \
60*a58d3d2aSXin Li         ); \
61*a58d3d2aSXin Li         (m).r = SHL32(SUB32(mr1__, mr2__), 1); \
62*a58d3d2aSXin Li         (m).i = SHL32(mi__, 1); \
63*a58d3d2aSXin Li     } \
64*a58d3d2aSXin Li     while(0)
65*a58d3d2aSXin Li 
66*a58d3d2aSXin Li #undef C_MUL4
67*a58d3d2aSXin Li #define C_MUL4(m,a,b) \
68*a58d3d2aSXin Li     do{ \
69*a58d3d2aSXin Li         int mr1__; \
70*a58d3d2aSXin Li         int mr2__; \
71*a58d3d2aSXin Li         int mi__; \
72*a58d3d2aSXin Li         long long aval__; \
73*a58d3d2aSXin Li         int bval__; \
74*a58d3d2aSXin Li         __asm__( \
75*a58d3d2aSXin Li             "#C_MUL4\n\t" \
76*a58d3d2aSXin Li             "ldrd %[aval], %H[aval], %[ap]\n\t" \
77*a58d3d2aSXin Li             "ldr %[bval], %[bp]\n\t" \
78*a58d3d2aSXin Li             "smulwb %[mi], %H[aval], %[bval]\n\t" \
79*a58d3d2aSXin Li             "smulwb %[mr1], %[aval], %[bval]\n\t" \
80*a58d3d2aSXin Li             "smulwt %[mr2], %H[aval], %[bval]\n\t" \
81*a58d3d2aSXin Li             "smlawt %[mi], %[aval], %[bval], %[mi]\n\t" \
82*a58d3d2aSXin Li             : [mr1]"=r"(mr1__), [mr2]"=r"(mr2__), [mi]"=r"(mi__), \
83*a58d3d2aSXin Li               [aval]"=&r"(aval__), [bval]"=r"(bval__) \
84*a58d3d2aSXin Li             : [ap]LDRD_CONS(a), [bp]"m"(b) \
85*a58d3d2aSXin Li         ); \
86*a58d3d2aSXin Li         (m).r = SHR32(SUB32(mr1__, mr2__), 1); \
87*a58d3d2aSXin Li         (m).i = SHR32(mi__, 1); \
88*a58d3d2aSXin Li     } \
89*a58d3d2aSXin Li     while(0)
90*a58d3d2aSXin Li 
91*a58d3d2aSXin Li #undef C_MULC
92*a58d3d2aSXin Li #define C_MULC(m,a,b) \
93*a58d3d2aSXin Li     do{ \
94*a58d3d2aSXin Li         int mr__; \
95*a58d3d2aSXin Li         int mi1__; \
96*a58d3d2aSXin Li         int mi2__; \
97*a58d3d2aSXin Li         long long aval__; \
98*a58d3d2aSXin Li         int bval__; \
99*a58d3d2aSXin Li         __asm__( \
100*a58d3d2aSXin Li             "#C_MULC\n\t" \
101*a58d3d2aSXin Li             "ldrd %[aval], %H[aval], %[ap]\n\t" \
102*a58d3d2aSXin Li             "ldr %[bval], %[bp]\n\t" \
103*a58d3d2aSXin Li             "smulwb %[mr], %[aval], %[bval]\n\t" \
104*a58d3d2aSXin Li             "smulwb %[mi1], %H[aval], %[bval]\n\t" \
105*a58d3d2aSXin Li             "smulwt %[mi2], %[aval], %[bval]\n\t" \
106*a58d3d2aSXin Li             "smlawt %[mr], %H[aval], %[bval], %[mr]\n\t" \
107*a58d3d2aSXin Li             : [mr]"=r"(mr__), [mi1]"=r"(mi1__), [mi2]"=r"(mi2__), \
108*a58d3d2aSXin Li               [aval]"=&r"(aval__), [bval]"=r"(bval__) \
109*a58d3d2aSXin Li             : [ap]LDRD_CONS(a), [bp]"m"(b) \
110*a58d3d2aSXin Li         ); \
111*a58d3d2aSXin Li         (m).r = SHL32(mr__, 1); \
112*a58d3d2aSXin Li         (m).i = SHL32(SUB32(mi1__, mi2__), 1); \
113*a58d3d2aSXin Li     } \
114*a58d3d2aSXin Li     while(0)
115*a58d3d2aSXin Li 
116*a58d3d2aSXin Li #endif /* FIXED_POINT */
117*a58d3d2aSXin Li 
118*a58d3d2aSXin Li #endif /* KISS_FFT_GUTS_H */
119