xref: /aosp_15_r20/external/libopus/celt/arm/kiss_fft_armv4.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_ARMv4_H
27*a58d3d2aSXin Li #define KISS_FFT_ARMv4_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 #undef C_MUL
36*a58d3d2aSXin Li #define C_MUL(m,a,b) \
37*a58d3d2aSXin Li     do{ \
38*a58d3d2aSXin Li        int br__; \
39*a58d3d2aSXin Li        int bi__; \
40*a58d3d2aSXin Li        int tt__; \
41*a58d3d2aSXin Li         __asm__ __volatile__( \
42*a58d3d2aSXin Li             "#C_MUL\n\t" \
43*a58d3d2aSXin Li             "ldrsh %[br], [%[bp], #0]\n\t" \
44*a58d3d2aSXin Li             "ldm %[ap], {r0,r1}\n\t" \
45*a58d3d2aSXin Li             "ldrsh %[bi], [%[bp], #2]\n\t" \
46*a58d3d2aSXin Li             "smull %[tt], %[mi], r1, %[br]\n\t" \
47*a58d3d2aSXin Li             "smlal %[tt], %[mi], r0, %[bi]\n\t" \
48*a58d3d2aSXin Li             "rsb %[bi], %[bi], #0\n\t" \
49*a58d3d2aSXin Li             "smull %[br], %[mr], r0, %[br]\n\t" \
50*a58d3d2aSXin Li             "mov %[tt], %[tt], lsr #15\n\t" \
51*a58d3d2aSXin Li             "smlal %[br], %[mr], r1, %[bi]\n\t" \
52*a58d3d2aSXin Li             "orr %[mi], %[tt], %[mi], lsl #17\n\t" \
53*a58d3d2aSXin Li             "mov %[br], %[br], lsr #15\n\t" \
54*a58d3d2aSXin Li             "orr %[mr], %[br], %[mr], lsl #17\n\t" \
55*a58d3d2aSXin Li             : [mr]"=r"((m).r), [mi]"=r"((m).i), \
56*a58d3d2aSXin Li               [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \
57*a58d3d2aSXin Li             : [ap]"r"(&(a)), [bp]"r"(&(b)) \
58*a58d3d2aSXin Li             : "r0", "r1" \
59*a58d3d2aSXin Li         ); \
60*a58d3d2aSXin Li     } \
61*a58d3d2aSXin Li     while(0)
62*a58d3d2aSXin Li 
63*a58d3d2aSXin Li #undef C_MUL4
64*a58d3d2aSXin Li #define C_MUL4(m,a,b) \
65*a58d3d2aSXin Li     do{ \
66*a58d3d2aSXin Li        int br__; \
67*a58d3d2aSXin Li        int bi__; \
68*a58d3d2aSXin Li        int tt__; \
69*a58d3d2aSXin Li         __asm__ __volatile__( \
70*a58d3d2aSXin Li             "#C_MUL4\n\t" \
71*a58d3d2aSXin Li             "ldrsh %[br], [%[bp], #0]\n\t" \
72*a58d3d2aSXin Li             "ldm %[ap], {r0,r1}\n\t" \
73*a58d3d2aSXin Li             "ldrsh %[bi], [%[bp], #2]\n\t" \
74*a58d3d2aSXin Li             "smull %[tt], %[mi], r1, %[br]\n\t" \
75*a58d3d2aSXin Li             "smlal %[tt], %[mi], r0, %[bi]\n\t" \
76*a58d3d2aSXin Li             "rsb %[bi], %[bi], #0\n\t" \
77*a58d3d2aSXin Li             "smull %[br], %[mr], r0, %[br]\n\t" \
78*a58d3d2aSXin Li             "mov %[tt], %[tt], lsr #17\n\t" \
79*a58d3d2aSXin Li             "smlal %[br], %[mr], r1, %[bi]\n\t" \
80*a58d3d2aSXin Li             "orr %[mi], %[tt], %[mi], lsl #15\n\t" \
81*a58d3d2aSXin Li             "mov %[br], %[br], lsr #17\n\t" \
82*a58d3d2aSXin Li             "orr %[mr], %[br], %[mr], lsl #15\n\t" \
83*a58d3d2aSXin Li             : [mr]"=r"((m).r), [mi]"=r"((m).i), \
84*a58d3d2aSXin Li               [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \
85*a58d3d2aSXin Li             : [ap]"r"(&(a)), [bp]"r"(&(b)) \
86*a58d3d2aSXin Li             : "r0", "r1" \
87*a58d3d2aSXin Li         ); \
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 br__; \
95*a58d3d2aSXin Li        int bi__; \
96*a58d3d2aSXin Li        int tt__; \
97*a58d3d2aSXin Li         __asm__ __volatile__( \
98*a58d3d2aSXin Li             "#C_MULC\n\t" \
99*a58d3d2aSXin Li             "ldrsh %[br], [%[bp], #0]\n\t" \
100*a58d3d2aSXin Li             "ldm %[ap], {r0,r1}\n\t" \
101*a58d3d2aSXin Li             "ldrsh %[bi], [%[bp], #2]\n\t" \
102*a58d3d2aSXin Li             "smull %[tt], %[mr], r0, %[br]\n\t" \
103*a58d3d2aSXin Li             "smlal %[tt], %[mr], r1, %[bi]\n\t" \
104*a58d3d2aSXin Li             "rsb %[bi], %[bi], #0\n\t" \
105*a58d3d2aSXin Li             "smull %[br], %[mi], r1, %[br]\n\t" \
106*a58d3d2aSXin Li             "mov %[tt], %[tt], lsr #15\n\t" \
107*a58d3d2aSXin Li             "smlal %[br], %[mi], r0, %[bi]\n\t" \
108*a58d3d2aSXin Li             "orr %[mr], %[tt], %[mr], lsl #17\n\t" \
109*a58d3d2aSXin Li             "mov %[br], %[br], lsr #15\n\t" \
110*a58d3d2aSXin Li             "orr %[mi], %[br], %[mi], lsl #17\n\t" \
111*a58d3d2aSXin Li             : [mr]"=r"((m).r), [mi]"=r"((m).i), \
112*a58d3d2aSXin Li               [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \
113*a58d3d2aSXin Li             : [ap]"r"(&(a)), [bp]"r"(&(b)) \
114*a58d3d2aSXin Li             : "r0", "r1" \
115*a58d3d2aSXin Li         ); \
116*a58d3d2aSXin Li     } \
117*a58d3d2aSXin Li     while(0)
118*a58d3d2aSXin Li 
119*a58d3d2aSXin Li #endif /* FIXED_POINT */
120*a58d3d2aSXin Li 
121*a58d3d2aSXin Li #endif /* KISS_FFT_ARMv4_H */
122