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