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