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