1 | ;/* ----------------------------------------------------------------------
|
---|
2 | ; * Project: CMSIS DSP Library
|
---|
3 | ; * Title: arm_bitreversal2.S
|
---|
4 | ; * Description: arm_bitreversal_32 function done in assembly for maximum speed.
|
---|
5 | ; * Called after doing an fft to reorder the output.
|
---|
6 | ; * The function is loop unrolled by 2. arm_bitreversal_16 as well.
|
---|
7 | ; *
|
---|
8 | ; * $Date: 27. January 2017
|
---|
9 | ; * $Revision: V.1.5.1
|
---|
10 | ; *
|
---|
11 | ; * Target Processor: Cortex-M cores
|
---|
12 | ; * -------------------------------------------------------------------- */
|
---|
13 | ;/*
|
---|
14 | ; * Copyright (C) 2010-2017 ARM Limited or its affiliates. All rights reserved.
|
---|
15 | ; *
|
---|
16 | ; * SPDX-License-Identifier: Apache-2.0
|
---|
17 | ; *
|
---|
18 | ; * Licensed under the Apache License, Version 2.0 (the License); you may
|
---|
19 | ; * not use this file except in compliance with the License.
|
---|
20 | ; * You may obtain a copy of the License at
|
---|
21 | ; *
|
---|
22 | ; * www.apache.org/licenses/LICENSE-2.0
|
---|
23 | ; *
|
---|
24 | ; * Unless required by applicable law or agreed to in writing, software
|
---|
25 | ; * distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
---|
26 | ; * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
---|
27 | ; * See the License for the specific language governing permissions and
|
---|
28 | ; * limitations under the License.
|
---|
29 | ; */
|
---|
30 |
|
---|
31 | #if defined ( __CC_ARM ) /* Keil */
|
---|
32 | #define CODESECT AREA ||.text||, CODE, READONLY, ALIGN=2
|
---|
33 | #define LABEL
|
---|
34 | #elif defined ( __IASMARM__ ) /* IAR */
|
---|
35 | #define CODESECT SECTION `.text`:CODE
|
---|
36 | #define PROC
|
---|
37 | #define LABEL
|
---|
38 | #define ENDP
|
---|
39 | #define EXPORT PUBLIC
|
---|
40 | #elif defined ( __CSMC__ ) /* Cosmic */
|
---|
41 | #define CODESECT switch .text
|
---|
42 | #define THUMB
|
---|
43 | #define EXPORT xdef
|
---|
44 | #define PROC :
|
---|
45 | #define LABEL :
|
---|
46 | #define ENDP
|
---|
47 | #define arm_bitreversal_32 _arm_bitreversal_32
|
---|
48 | #elif defined ( __TI_ARM__ ) /* TI ARM */
|
---|
49 | #define THUMB .thumb
|
---|
50 | #define CODESECT .text
|
---|
51 | #define EXPORT .global
|
---|
52 | #define PROC : .asmfunc
|
---|
53 | #define LABEL :
|
---|
54 | #define ENDP .endasmfunc
|
---|
55 | #define END
|
---|
56 | #elif defined ( __GNUC__ ) /* GCC */
|
---|
57 | #define THUMB .thumb
|
---|
58 | #define CODESECT .section .text
|
---|
59 | #define EXPORT .global
|
---|
60 | #define PROC :
|
---|
61 | #define LABEL :
|
---|
62 | #define ENDP
|
---|
63 | #define END
|
---|
64 |
|
---|
65 | .syntax unified
|
---|
66 | #endif
|
---|
67 |
|
---|
68 | CODESECT
|
---|
69 | THUMB
|
---|
70 |
|
---|
71 | ;/*
|
---|
72 | ;* @brief In-place bit reversal function.
|
---|
73 | ;* @param[in, out] *pSrc points to the in-place buffer of unknown 32-bit data type.
|
---|
74 | ;* @param[in] bitRevLen bit reversal table length
|
---|
75 | ;* @param[in] *pBitRevTab points to bit reversal table.
|
---|
76 | ;* @return none.
|
---|
77 | ;*/
|
---|
78 | EXPORT arm_bitreversal_32
|
---|
79 | EXPORT arm_bitreversal_16
|
---|
80 |
|
---|
81 | #if defined ( __CC_ARM ) /* Keil */
|
---|
82 | #elif defined ( __IASMARM__ ) /* IAR */
|
---|
83 | #elif defined ( __CSMC__ ) /* Cosmic */
|
---|
84 | #elif defined ( __TI_ARM__ ) /* TI ARM */
|
---|
85 | #elif defined ( __GNUC__ ) /* GCC */
|
---|
86 | .type arm_bitreversal_16, %function
|
---|
87 | .type arm_bitreversal_32, %function
|
---|
88 | #endif
|
---|
89 |
|
---|
90 | #if defined(ARM_MATH_CM0) || defined(ARM_MATH_CM0PLUS) || defined(ARM_MATH_ARMV8MBL)
|
---|
91 |
|
---|
92 | arm_bitreversal_32 PROC
|
---|
93 | ADDS r3,r1,#1
|
---|
94 | PUSH {r4-r6}
|
---|
95 | ADDS r1,r2,#0
|
---|
96 | LSRS r3,r3,#1
|
---|
97 | arm_bitreversal_32_0 LABEL
|
---|
98 | LDRH r2,[r1,#2]
|
---|
99 | LDRH r6,[r1,#0]
|
---|
100 | ADD r2,r0,r2
|
---|
101 | ADD r6,r0,r6
|
---|
102 | LDR r5,[r2,#0]
|
---|
103 | LDR r4,[r6,#0]
|
---|
104 | STR r5,[r6,#0]
|
---|
105 | STR r4,[r2,#0]
|
---|
106 | LDR r5,[r2,#4]
|
---|
107 | LDR r4,[r6,#4]
|
---|
108 | STR r5,[r6,#4]
|
---|
109 | STR r4,[r2,#4]
|
---|
110 | ADDS r1,r1,#4
|
---|
111 | SUBS r3,r3,#1
|
---|
112 | BNE arm_bitreversal_32_0
|
---|
113 | POP {r4-r6}
|
---|
114 | BX lr
|
---|
115 | ENDP
|
---|
116 |
|
---|
117 | arm_bitreversal_16 PROC
|
---|
118 | ADDS r3,r1,#1
|
---|
119 | PUSH {r4-r6}
|
---|
120 | ADDS r1,r2,#0
|
---|
121 | LSRS r3,r3,#1
|
---|
122 | arm_bitreversal_16_0 LABEL
|
---|
123 | LDRH r2,[r1,#2]
|
---|
124 | LDRH r6,[r1,#0]
|
---|
125 | LSRS r2,r2,#1
|
---|
126 | LSRS r6,r6,#1
|
---|
127 | ADD r2,r0,r2
|
---|
128 | ADD r6,r0,r6
|
---|
129 | LDR r5,[r2,#0]
|
---|
130 | LDR r4,[r6,#0]
|
---|
131 | STR r5,[r6,#0]
|
---|
132 | STR r4,[r2,#0]
|
---|
133 | ADDS r1,r1,#4
|
---|
134 | SUBS r3,r3,#1
|
---|
135 | BNE arm_bitreversal_16_0
|
---|
136 | POP {r4-r6}
|
---|
137 | BX lr
|
---|
138 | ENDP
|
---|
139 |
|
---|
140 | #else
|
---|
141 |
|
---|
142 | arm_bitreversal_32 PROC
|
---|
143 | ADDS r3,r1,#1
|
---|
144 | CMP r3,#1
|
---|
145 | IT LS
|
---|
146 | BXLS lr
|
---|
147 | PUSH {r4-r9}
|
---|
148 | ADDS r1,r2,#2
|
---|
149 | LSRS r3,r3,#2
|
---|
150 | arm_bitreversal_32_0 LABEL ;/* loop unrolled by 2 */
|
---|
151 | LDRH r8,[r1,#4]
|
---|
152 | LDRH r9,[r1,#2]
|
---|
153 | LDRH r2,[r1,#0]
|
---|
154 | LDRH r12,[r1,#-2]
|
---|
155 | ADD r8,r0,r8
|
---|
156 | ADD r9,r0,r9
|
---|
157 | ADD r2,r0,r2
|
---|
158 | ADD r12,r0,r12
|
---|
159 | LDR r7,[r9,#0]
|
---|
160 | LDR r6,[r8,#0]
|
---|
161 | LDR r5,[r2,#0]
|
---|
162 | LDR r4,[r12,#0]
|
---|
163 | STR r6,[r9,#0]
|
---|
164 | STR r7,[r8,#0]
|
---|
165 | STR r5,[r12,#0]
|
---|
166 | STR r4,[r2,#0]
|
---|
167 | LDR r7,[r9,#4]
|
---|
168 | LDR r6,[r8,#4]
|
---|
169 | LDR r5,[r2,#4]
|
---|
170 | LDR r4,[r12,#4]
|
---|
171 | STR r6,[r9,#4]
|
---|
172 | STR r7,[r8,#4]
|
---|
173 | STR r5,[r12,#4]
|
---|
174 | STR r4,[r2,#4]
|
---|
175 | ADDS r1,r1,#8
|
---|
176 | SUBS r3,r3,#1
|
---|
177 | BNE arm_bitreversal_32_0
|
---|
178 | POP {r4-r9}
|
---|
179 | BX lr
|
---|
180 | ENDP
|
---|
181 |
|
---|
182 | arm_bitreversal_16 PROC
|
---|
183 | ADDS r3,r1,#1
|
---|
184 | CMP r3,#1
|
---|
185 | IT LS
|
---|
186 | BXLS lr
|
---|
187 | PUSH {r4-r9}
|
---|
188 | ADDS r1,r2,#2
|
---|
189 | LSRS r3,r3,#2
|
---|
190 | arm_bitreversal_16_0 LABEL ;/* loop unrolled by 2 */
|
---|
191 | LDRH r8,[r1,#4]
|
---|
192 | LDRH r9,[r1,#2]
|
---|
193 | LDRH r2,[r1,#0]
|
---|
194 | LDRH r12,[r1,#-2]
|
---|
195 | ADD r8,r0,r8,LSR #1
|
---|
196 | ADD r9,r0,r9,LSR #1
|
---|
197 | ADD r2,r0,r2,LSR #1
|
---|
198 | ADD r12,r0,r12,LSR #1
|
---|
199 | LDR r7,[r9,#0]
|
---|
200 | LDR r6,[r8,#0]
|
---|
201 | LDR r5,[r2,#0]
|
---|
202 | LDR r4,[r12,#0]
|
---|
203 | STR r6,[r9,#0]
|
---|
204 | STR r7,[r8,#0]
|
---|
205 | STR r5,[r12,#0]
|
---|
206 | STR r4,[r2,#0]
|
---|
207 | ADDS r1,r1,#8
|
---|
208 | SUBS r3,r3,#1
|
---|
209 | BNE arm_bitreversal_16_0
|
---|
210 | POP {r4-r9}
|
---|
211 | BX lr
|
---|
212 | ENDP
|
---|
213 |
|
---|
214 | #endif
|
---|
215 |
|
---|
216 | END
|
---|