xref: /aosp_15_r20/external/libxaac/decoder/armv7/ixheaacd_fft32x32_ld.s (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1.text
2.p2align 2
3.global DSP_fft32x16_dit
4
5DSP_fft32x16_dit:
6
7    STMFD           sp!, {r4-r12, r14}
8    VPUSH           {D8-D15}
9
10@**************Variables Vs Registers*************************
11@   r0 = *ptr_w
12@   r1 = npoints
13@   r2 = ptr_x  and
14@   r3 = ptr_y
15@   r4 = pbit_rev_1024  and pdigRevTable
16@   r5 = pbit_rev_512   and p_data1
17@   r6 = pbit_rev_128   and p_data2
18@   r7 = pbit_rev_32   and p_data3
19@   r8 = power    and nstages_4
20@   r9 = stage_1_count
21@   r10 = first_stage (8 or 4)
22@   r11 = p_data4
23@   r12 = bit reverse value
24
25
26@        LDR      r4,[sp,#0x68]
27    LDR             r5, [sp, #0x68]
28    LDR             r6, [sp, #0x68+4]
29    LDR             r7, [sp, #0x68+8]
30
31
32@ These conditions can be optimised to lesser number
33@************************************************************************************
34
35@COND_1 CMP r1, #0x400      @1024
36@   BNE COND_2
37@   @MOV    r10, #4         @ because radix 8 first stage is by default
38@        MOV    r8, #4
39@        B  RADIX_4_FIRST_START
40
41@line 59 "../../algo/aacdec/src/neon_asm/fft32x16ch_neon.s"
42COND_2: CMP         r1, #0x200          @512
43    BNE             COND_3
44    @MOV    r10, #8
45    MOV             r8, #3
46    MOV             r4, r5
47    B               RADIX_8_FIRST_START
48
49COND_3: CMP         r1, #0x100
50    BNE             COND_4
51    @MOV    r10, #4
52    MOV             r8, #3
53    MOV             r4, r5
54    B               RADIX_4_FIRST_START
55
56COND_4: CMP         r1, #0x80           @128
57    BNE             COND_5
58    @MOV    r10, #8
59    MOV             r8, #2
60    MOV             r4, r6
61    B               RADIX_8_FIRST_START
62
63COND_5: CMP         r1, #0x40
64    BNE             COND_6
65    @MOV    r10, #4
66    MOV             r8, #2
67    MOV             r4, r6
68    B               RADIX_4_FIRST_START
69COND_6:
70    @MOV    r10, #8
71    MOV             r8, #1
72    MOV             r4, r7
73@**********************************************************************************
74
75
76    @CMP    r10,#4
77    @BEQ    RADIX_4_FIRST_START
78
79RADIX_8_FIRST_START:
80
81
82    LSR             r9 , r1, #5         @ LOOP count for first stage
83    LSL             r1, r1, #1
84
85RADIX_8_FIRST_LOOP:
86
87    MOV             r5 , r2
88    MOV             r6 , r2
89    MOV             r7 , r2
90    MOV             r11 , r2
91
92@*************** Register mapping to data ****************************************
93@ a_data0_r=q0
94@ a_data0_i=q1
95@ a_data2_r=q2
96@ a_data2_i=q3
97@ a_data4_r=q4
98@ a_data4_i=q5
99@ a_data6_r=q6
100@ a_data6_i=q7
101
102@ b_data0_r=q8
103@ b_data0_i=q9
104@ b_data2_r=q10
105@ b_data2_i=q11
106@ b_data4_r=q12
107@ b_data4_i=q13
108@ b_data6_r=q14
109@ b_data6_i=q15
110
111@*********************************************************************************
112
113
114    LDRB            r12, [r4, #0]
115    ADD             r5, r5, r12, LSL #3
116    VLD2.32         {d0[0], d2[0]}, [r5] , r1
117    ADD             r5, r5, r1
118    VLD2.32         {d8[0], d10[0]}, [r5] , r1
119    SUB             r5, r5, r1, LSL #1
120    VLD2.32         {d4[0], d6[0]}, [r5] , r1
121    ADD             r5, r5, r1
122    VLD2.32         {d12[0], d14[0]}, [r5], r1
123    SUB             r5, r5, r1, LSL #2
124
125    LDRB            r12, [r4, #1]
126    ADD             r6, r6, r12, LSL #3
127    VLD2.32         {d0[1], d2[1]}, [r6] , r1
128    ADD             r6, r6, r1
129    VLD2.32         {d8[1], d10[1]}, [r6] , r1
130    SUB             r6, r6, r1, LSL #1
131    VLD2.32         {d4[1], d6[1]}, [r6] , r1
132    ADD             r6, r6, r1
133    VLD2.32         {d12[1], d14[1]}, [r6], r1
134    SUB             r6, r6, r1, LSL #2
135
136
137    LDRB            r12, [r4, #2]
138    ADD             r7, r7, r12 , LSL #3
139    VLD2.32         {d1[0], d3[0]}, [r7] , r1
140    ADD             r7, r7, r1
141    VLD2.32         {d9[0], d11[0]}, [r7] , r1
142    SUB             r7, r7, r1, LSL #1
143
144    LDRB            r12, [r4, #3]
145    ADD             r11, r11, r12 , LSL #3
146    VLD2.32         {d1[1], d3[1]}, [r11] , r1
147    ADD             r11, r11, r1
148    VLD2.32         {d9[1], d11[1]}, [r11] , r1
149    SUB             r11, r11, r1, LSL #1
150
151
152    @VHADD.S32  q8, q0, q4              @b_data0_r=vhaddq_s32(a_data0_r_i.val[0],a_data4_r_i.val[0])@
153    VADD.I32        q8, q0, q4          @b_data0_r=vhaddq_s32(a_data0_r_i.val[0],a_data4_r_i.val[0])@
154    VLD2.32         {d5[0], d7[0]}, [r7] , r1
155    ADD             r7, r7, r1
156    @VHSUB.S32  q9, q0, q4              @b_data4_r=vhsubq_s32(a_data0_r_i.val[0],a_data4_r_i.val[0])@
157    VSUB.I32        q9, q0, q4          @b_data4_r=vhsubq_s32(a_data0_r_i.val[0],a_data4_r_i.val[0])@
158    VLD2.32         {d13[0], d15[0]}, [r7], r1
159    SUB             r7, r7, r1, LSL #2
160
161
162
163    @VHADD.S32  q0, q1, q5              @b_data0_i=vhaddq_s32(a_data0_r_i.val[1],a_data4_r_i.val[1])@
164    VADD.I32        q0, q1, q5          @b_data0_i=vhaddq_s32(a_data0_r_i.val[1],a_data4_r_i.val[1])@
165    VLD2.32         {d5[1], d7[1]}, [r11] , r1
166    ADD             r11, r11, r1
167    @VHSUB.S32  q4, q1, q5              @b_data4_i=vhsubq_s32(a_data0_r_i.val[1],a_data4_r_i.val[1])@
168    VSUB.I32        q4, q1, q5          @b_data4_i=vhsubq_s32(a_data0_r_i.val[1],a_data4_r_i.val[1])@
169    VLD2.32         {d13[1], d15[1]}, [r11], r1
170    SUB             r11, r11, r1, LSL #2
171
172
173
174    ADD             r4, r4, #4
175
176    ADD             r5, r5, r1, LSR #1
177    ADD             r6, r6, r1, LSR #1
178    ADD             r7, r7, r1, LSR #1
179    ADD             r11, r11, r1, LSR #1
180
181    @VHADD.S32  q1, q2, q6              @b_data2_r=vhaddq_s32(a_data2_r_i.val[0],a_data6_r_i.val[0])@
182    VADD.I32        q1, q2, q6          @b_data2_r=vhaddq_s32(a_data2_r_i.val[0],a_data6_r_i.val[0])@
183    VLD2.32         {d28[0], d30[0]}, [r5] , r1 @a_data1_r_i=vld2q_lane_s32(__transfersize(2) p_data1,a_data1_r_i,0)@
184
185    @VHSUB.S32  q5, q2, q6              @b_data6_r=vhsubq_s32(a_data2_r_i.val[0],a_data6_r_i.val[0])@
186    VSUB.I32        q5, q2, q6          @b_data6_r=vhsubq_s32(a_data2_r_i.val[0],a_data6_r_i.val[0])@
187    VLD2.32         {d20[0], d22[0]}, [r5] , r1 @a_data3_r_i=vld2q_lane_s32(__transfersize(2) p_data1,a_data3_r_i,0)
188
189    @VHADD.S32  q2, q3, q7              @b_data2_i=vhaddq_s32(a_data2_r_i.val[1],a_data6_r_i.val[1])@
190    VADD.I32        q2, q3, q7          @b_data2_i=vhaddq_s32(a_data2_r_i.val[1],a_data6_r_i.val[1])@
191    VLD2.32         {d24[0], d26[0]}, [r5] , r1 @a_data5_r_i=vld2q_lane_s32(__transfersize(2) p_data1,a_data5_r_i,0)
192
193    @VHSUB.S32  q6, q3, q7              @b_data6_i=vhsubq_s32(a_data2_r_i.val[1],a_data6_r_i.val[1])@
194    VSUB.I32        q6, q3, q7          @b_data6_i=vhsubq_s32(a_data2_r_i.val[1],a_data6_r_i.val[1])@
195    VLD2.32         {d28[1], d30[1]}, [r6] , r1
196
197    VADD.S32        q3, q9, q6          @c_data4_r=vaddq_s32(b_data4_r,b_data6_i)@
198    VLD2.32         {d20[1], d22[1]}, [r6] , r1
199
200    VSUB.S32        q7, q9, q6          @c_data6_r=vsubq_s32(b_data4_r,b_data6_i)@
201    VLD2.32         {d24[1], d26[1]}, [r6] , r1
202
203    VSUB.S32        q6, q4, q5          @c_data4_i=vsubq_s32(b_data4_i,b_data6_r)@
204    VLD2.32         {d29[0], d31[0]}, [r7] , r1
205
206    VADD.S32        q9, q4, q5          @c_data6_i=vaddq_s32(b_data4_i,b_data6_r)@
207    VLD2.32         {d21[0], d23[0]}, [r7] , r1
208
209    VADD.S32        q4, q8, q1          @c_data0_r=vaddq_s32(b_data0_r,b_data2_r)@
210    VLD2.32         {d25[0], d27[0]}, [r7] , r1
211
212    VSUB.S32        q5, q8, q1          @c_data2_r=vsubq_s32(b_data0_r,b_data2_r)@
213    VLD2.32         {d29[1], d31[1]}, [r11] , r1
214
215    VADD.S32        q8, q0, q2          @c_data0_i=vaddq_s32(b_data0_i,b_data2_i)@
216    VLD2.32         {d21[1], d23[1]}, [r11] , r1
217
218    VSUB.S32        q0, q0, q2          @c_data2_i=vsubq_s32(b_data0_i,b_data2_i)@
219    VLD2.32         {d25[1], d27[1]}, [r11] , r1
220
221
222    VPUSH           {q3}                @ VPUSH(c_data4_r, c_data6_r)
223    VPUSH           {q7}
224
225
226
227
228
229
230
231
232    VLD2.32         {d2[0], d4[0]}, [r5], r1 @a_data7_r_i=vld2q_lane_s32(__transfersize(2) p_data1,a_data7_r_i,0)
233    @VHADD.S32  q7, q14, q12                @b_data1_r=vhaddq_s32(a_data1_r,a_data5_r)@
234    VADD.I32        q7, q14, q12        @b_data1_r=vhaddq_s32(a_data1_r,a_data5_r)@
235
236    VLD2.32         {d2[1], d4[1]}, [r6] , r1
237    @VHSUB.S32  q3, q14, q12                @b_data5_r=vhsubq_s32(a_data1_r,a_data5_r)@
238    VSUB.I32        q3, q14, q12        @b_data5_r=vhsubq_s32(a_data1_r,a_data5_r)@
239
240    VLD2.32         {d3[0], d5[0]}, [r7] , r1
241    @VHADD.S32  q14, q15, q13               @b_data1_i=vhaddq_s32(a_data1_i,a_data5_i)@
242    VADD.I32        q14, q15, q13       @b_data1_i=vhaddq_s32(a_data1_i,a_data5_i)@
243
244    VLD2.32         {d3[1], d5[1]}, [r11] , r1
245    @VHSUB.S32  q12, q15, q13               @b_data5_i=vhsubq_s32(a_data1_i,a_data5_i)@
246    VSUB.I32        q12, q15, q13       @b_data5_i=vhsubq_s32(a_data1_i,a_data5_i)@
247
248
249
250
251    @VHADD.S32  q15, q10,q1             @b_data3_r=vhaddq_s32(a_data3_r,a_data7_r)@
252    @VHSUB.S32  q13, q10,q1             @b_data7_r=vhsubq_s32(a_data3_r,a_data7_r)@
253    @VHADD.S32  q10, q11, q2                @b_data3_i=vhaddq_s32(a_data3_i,a_data7_i)@
254    @VHSUB.S32  q1, q11, q2             @b_data7_i=vhsubq_s32(a_data3_i,a_data7_i)@
255
256    VADD.I32        q15, q10, q1        @b_data3_r=vhaddq_s32(a_data3_r,a_data7_r)@
257    VSUB.I32        q13, q10, q1        @b_data7_r=vhsubq_s32(a_data3_r,a_data7_r)@
258    VADD.I32        q10, q11, q2        @b_data3_i=vhaddq_s32(a_data3_i,a_data7_i)@
259    VSUB.I32        q1, q11, q2         @b_data7_i=vhsubq_s32(a_data3_i,a_data7_i)@
260
261
262
263    VADD.S32        q11, q7, q15        @c_data1_r=vaddq_s32(b_data1_r,b_data3_r)@
264    VSUB.S32        q2, q7, q15         @c_data3_r=vsubq_s32(b_data1_r,b_data3_r)@
265    VADD.S32        q7, q14, q10        @c_data1_i=vaddq_s32(b_data1_i,b_data3_i)@
266    VSUB.S32        q15, q14, q10       @c_data3_i=vsubq_s32(b_data1_i,b_data3_i)@
267
268    VADD.S32        q14, q3, q12        @c_data5_r=vaddq_s32(b_data5_r,b_data5_i)@
269    VSUB.S32        q10, q3, q12        @c_data5_i=vsubq_s32(b_data5_r,b_data5_i)@
270    VADD.S32        q3, q13, q1         @c_data7_r=vaddq_s32(b_data7_r,b_data7_i)@
271    VSUB.S32        q12, q13, q1        @c_data7_i=vsubq_s32(b_data7_r,b_data7_i)@
272
273    VADD.S32        q1 , q14, q12       @b_data5_r=vaddq_s32(c_data7_i,c_data5_r)@
274    VSUB.S32        q13, q14, q12       @b_data7_i=vsubq_s32(c_data5_r,c_data7_i)@
275    VSUB.S32        q12, q3, q10        @b_data5_i=vsubq_s32(c_data7_r,c_data5_i)@
276
277    VUZP.16         d2, d3              @ D0 = b_data5_r_low, D1= b_data5_r_high
278    VADD.S32        q14, q3, q10        @b_data7_r=vaddq_s32(c_data5_i,c_data7_r)@
279
280    VUZP.16         d26, d27
281    VADD.S32        q3, q4, q11         @b_data0_r=vaddq_s32(c_data0_r,c_data1_r)@
282
283    VUZP.16         d24, d25
284    VSUB.S32        q10, q4, q11        @b_data1_r=vsubq_s32(c_data0_r,c_data1_r)@
285
286    VUZP.16         d28, d29
287    VADD.S32        q4, q8, q7          @b_data0_i=vaddq_s32(c_data0_i,c_data1_i)@
288
289    LDR             r14, = 0x5a82
290
291    VSUB.S32        q11, q8, q7         @b_data1_i=vsubq_s32(c_data0_i,c_data1_i)@
292
293    VADD.S32        q8, q5, q15         @b_data2_r=vaddq_s32(c_data2_r,c_data3_i)@
294    VSUB.S32        q7, q5, q15         @b_data3_r=vsubq_s32(c_data2_r,c_data3_i)@
295    VSUB.S32        q5, q0, q2          @b_data2_i=vsubq_s32(c_data2_i,c_data3_r)@
296    VADD.S32        q15, q0, q2         @b_data3_i=vaddq_s32(c_data2_i,c_data3_r)@
297
298    VPOP            {q0}
299    VPOP            {q2}
300    VPUSH           {q3-q4}
301    VPUSH           {q10}
302
303
304
305
306@********************************************************************
307@ b_data5_r = q1       free regs = q3,q4,q5,q7,q8,q10,q11
308@ b_data5_i = q12
309@ b_data7_r = q14
310@ b_data7_i = q13
311
312@ c_data4_r = q2
313@ c_data4_i = q6
314@ c_data6_r = q0
315@ c_data6_i = q9
316@********************************************************************
317
318
319    VDUP.16         d20, r14
320
321
322    VMULL.u16       q4, d26, d20
323    VMULL.u16       q3, d28, d20
324
325    VPUSH           {q7-q8}
326    VPUSH           {q5}
327
328    VSHR.S32        q4, q4, #15
329    VSHR.S32        q3, q3, #15
330
331    VQDMLAL.S16     q4, d27, d20
332    VQDMLAL.S16     q3, d29, d20
333
334
335    VPUSH           {q11}
336
337    VMULL.u16       q13, d24, d20
338    VMULL.u16       q14, d2, d20
339
340    VADD.S32        q5, q2, q4          @q5=b_data7_i
341    VSUB.S32        q7, q2, q4          @q7=b_data4_r
342
343    VADD.S32        q8, q6, q3          @q10 = b_data4_i
344    VSUB.S32        q6, q6, q3          @q11 = b_data7_r
345
346
347
348
349
350
351    VSHR.S32        q13, q13, #15
352    VSHR.S32        q14, q14, #15
353
354    VQDMLAL.S16     q13, d25, d20
355    VQDMLAL.S16     q14, d3, d20
356
357    VPOP            {q1}
358    VPOP            {q10}
359
360    VADD.S32        q2, q0, q13         @q2 = b_data5_i
361    VSUB.S32        q4, q0, q13         @q4 = b_data6_r
362
363    VADD.S32        q11, q9, q14        @q6 = b_data6_i
364    VSUB.S32        q3, q9, q14         @q8 = b_data5_r
365
366
367
368
369    VPOP            {q14}
370    VPOP            {q9}
371    VPOP            {q0}
372    VPOP            {q12, q13}
373
374
375
376
377
378@**************regs maping************
379@b_data0_r = q12
380@b_data0_i = q13
381@b_data1_r = q0
382@b_data1_i = q1
383
384@b_data2_r = q9
385@b_data2_i = q10
386@b_data3_r = q14
387@b_data3_i = q15
388
389@b_data4_r = q7
390@b_data4_i = q8
391@b_data5_r = q3
392@b_data5_i = q2
393
394@b_data6_r = q4
395@b_data6_i = q11
396@b_data7_r = q6
397@b_data7_i = q5
398@******************************************
399
400@shifts added (as dual simd instrn)
401
402    VTRN.32         q12, q5
403@line 455 "../../algo/aacdec/src/neon_asm/fft32x16ch_neon.s"
404    VSHL.S32        q12, q12, #3        @ch
405    VTRN.32         q9, q2
406    VSHL.S32        q5, q5, #3          @ch
407
408    VSHL.S32        q9, q9, #3          @ch
409    VTRN.32         q0, q7
410    VSHL.S32        q2, q2, #3          @ch
411
412    VSHL.S32        q0, q0, #3          @ch
413    VTRN.32         q14, q4
414    VSHL.S32        q7, q7, #3          @ch
415
416    VSHL.S32        q14, q14, #3        @ch
417    VTRN.32         q13, q6
418    VSHL.S32        q4, q4, #3          @ch
419
420    VSHL.S32        q13, q13, #3        @ch
421    VTRN.32         q10, q3
422    VSHL.S32        q6, q6, #3          @ch
423
424    VSHL.S32        q10, q10, #3        @ch
425    VTRN.32         q1, q8
426    VSHL.S32        q3, q3, #3          @ch
427
428    VSHL.S32        q1, q1, #3          @ch
429    VTRN.32         q15, q11
430    VSHL.S32        q8, q8, #3          @ch
431
432    VSHL.S32        q15, q15, #3        @ch
433    VSWP            d18, d25
434
435    VSHL.S32        q11, q11, #3        @ch
436    VSWP            d4, d11
437
438    VSWP            d1, d28
439    VSWP            d15, d8
440
441    VSWP            d20, d27
442    VSWP            d6, d13
443
444    VSWP            d30, d3
445    VSWP            d22, d17
446
447    VST2.32         {q12, q13}, [r3]!
448    VST2.32         {q0, q1}, [r3]!
449
450    VST2.32         {q5, q6}, [r3]!
451    VST2.32         {q7, q8}, [r3]!
452
453    VMOV            q5, q11
454
455    VST2.32         {q9, q10}, [r3]!
456    VST2.32         {q14, q15}, [r3]!
457
458    VST2.32         {q2, q3}, [r3]!
459    VST2.32         {q4, q5}, [r3]!
460
461
462    SUBS            r9, r9, #1
463    BNE             RADIX_8_FIRST_LOOP
464
465    LSR             r1, r1, #1
466    SUB             r3, r1, LSL #3
467
468    MOV             r5, #8
469    MOV             r4, #32
470    LSR             r6, r1, #5
471
472    B               RADIX_4_FIRST_ENDS
473
474RADIX_8_FIRST_ENDS:
475
476
477
478
479@************************************RADIX 4 FIRST STAGE**********************************
480
481RADIX_4_FIRST_START:
482
483
484    LSR             r9 , r1, #4         @ LOOP count for first stage
485    LSL             r1, r1, #1
486
487RADIX_4_LOOP:
488
489    MOV             r5 , r2
490    MOV             r6 , r2
491    MOV             r7 , r2
492    MOV             r11 , r2
493
494@*************** Register mapping to data ****************************************
495@ a_data0_r=q0
496@ a_data0_i=q1
497@ a_data1_r=q2
498@ a_data1_i=q3
499@ a_data2_r=q4
500@ a_data2_i=q5
501@ a_data3_r=q6
502@ a_data4_i=q7
503
504
505@*********************************************************************************
506
507
508    LDRB            r12, [r4, #0]
509    ADD             r5, r5, r12, LSL #3
510
511    VLD2.32         {d0[0], d2[0]}, [r5] , r1
512    ADD             r5, r5, r1
513    VLD2.32         {d8[0], d10[0]}, [r5] , r1
514    SUB             r5, r5, r1, LSL #1
515    VLD2.32         {d4[0], d6[0]}, [r5] , r1
516    ADD             r5, r5, r1
517    VLD2.32         {d12[0], d14[0]}, [r5], r1
518
519    LDRB            r12, [r4, #1]
520    ADD             r6, r6, r12, LSL #3
521
522    VLD2.32         {d0[1], d2[1]}, [r6] , r1
523    ADD             r6, r6, r1
524    VLD2.32         {d8[1], d10[1]}, [r6] , r1
525    SUB             r6, r6, r1, LSL #1
526    VLD2.32         {d4[1], d6[1]}, [r6] , r1
527    ADD             r6, r6, r1
528    VLD2.32         {d12[1], d14[1]}, [r6], r1
529
530
531    LDRB            r12, [r4, #2]
532    ADD             r7, r7, r12, LSL #3
533
534    VLD2.32         {d1[0], d3[0]}, [r7] , r1
535    ADD             r7, r7, r1
536    VLD2.32         {d9[0], d11[0]}, [r7] , r1
537
538    LDRB            r12, [r4, #3]
539    ADD             r11, r11, r12 , LSL #3
540
541    VLD2.32         {d1[1], d3[1]}, [r11] , r1
542    ADD             r11, r11, r1
543    VLD2.32         {d9[1], d11[1]}, [r11] , r1
544
545
546    SUB             r7, r7, r1, LSL #1
547    VADD.S32        q8, q0, q4          @b_data0_r=vaddq_s32(a_data0_r,a_data2_r)@
548    VLD2.32         {d5[0], d7[0]}, [r7] , r1
549    ADD             r7, r7, r1
550    VADD.S32        q9, q1, q5          @b_data0_i=vaddq_s32(a_data0_i,a_data2_i)@
551    VLD2.32         {d13[0], d15[0]}, [r7], r1
552
553
554
555    SUB             r11, r11, r1, LSL #1
556    VSUB.S32        q10, q0, q4         @b_data2_r=vsubq_s32(a_data0_r,a_data2_r)@
557    VLD2.32         {d5[1], d7[1]}, [r11] , r1
558    ADD             r11, r11, r1
559    VSUB.S32        q11, q1, q5         @b_data2_i=vsubq_s32(a_data0_i,a_data2_i)@
560    VLD2.32         {d13[1], d15[1]}, [r11], r1
561
562
563    ADD             r4, r4, #4
564
565    VADD.S32        q12, q2, q6         @b_data1_r=vaddq_s32(a_data1_r,a_data3_r)@
566    VADD.S32        q13, q3, q7         @b_data1_i=vaddq_s32(a_data1_i,a_data3_i)@
567    VSUB.S32        q14, q2, q6         @b_data3_r=vsubq_s32(a_data1_r,a_data3_r)@
568    VSUB.S32        q15, q3, q7         @b_data3_i=vsubq_s32(a_data1_i,a_data3_i)@
569
570    VADD.S32        q0, q8, q12         @a_data0_r=vaddq_s32(b_data0_r,b_data1_r)@
571    VADD.S32        q1, q9, q13         @a_data0_i=vaddq_s32(b_data0_i,b_data1_i)@
572    VSUB.S32        q2, q8, q12         @a_data1_r=vsubq_s32(b_data0_r,b_data1_r)@
573    VSUB.S32        q3, q9, q13         @a_data1_i=vsubq_s32(b_data0_i,b_data1_i)@
574
575    VADD.S32        q4, q10, q15        @a_data2_r=vaddq_s32(b_data2_r,b_data3_i)@
576    VSUB.S32        q5, q11, q14        @a_data2_i=vsubq_s32(b_data2_i,b_data3_r)@
577    VADD.S32        q7, q11, q14        @a_data3_r=vaddq_s32(b_data2_i,b_data3_r)@
578    VSUB.S32        q6, q10, q15        @a_data3_i=vsubq_s32(b_data2_r,b_data3_i)@
579
580
581@shifts added
582
583    VTRN.32         q0, q4
584
585    VSHL.S32        q0, q0, #2          @ch
586    VTRN.32         q2, q6
587    VSHL.S32        q4, q4, #2          @ch
588
589    VSHL.S32        q2, q2, #2          @ch
590    VTRN.32         q1, q5              @ch
591    VSHL.S32        q6, q6, #2          @ch
592
593    VSHL.S32        q1, q1, #2          @ch
594    VTRN.32         q3, q7              @ch
595    VSHL.S32        q5, q5, #2          @ch
596
597    VSHL.S32        q3, q3, #2          @ch
598    VSWP            d4, d1
599
600    VSHL.S32        q7, q7, #2          @ch
601    VSWP            d12, d9
602
603    @VTRN.32        q1, q5
604    @VTRN.32        q3, q7
605    VSWP            d6, d3
606    VSWP            d14, d11
607
608
609    VST2.32         {q0, q1}, [r3]!
610    VST2.32         {q4, q5}, [r3]!
611
612    VST2.32         {q2, q3}, [r3]!
613    VST2.32         {q6, q7}, [r3]!
614
615
616
617    SUBS            r9, r9, #1
618    BNE             RADIX_4_LOOP
619
620    LSR             r1, r1, #1
621    SUB             r3, r1, LSL #3
622    MOV             r5, #4
623    MOV             r4, #64
624    LSR             r6, r1, #4
625
626
627RADIX_4_FIRST_ENDS:
628
629
630
631@********************************END OF RADIX 4 FIRST STAGE*******************************
632
633@*************** register assignment after first radix 8 stage****************************
634@ r1 = npoints
635@ r0 = *ptr_w
636@ r3 = *ptr_y
637@ r8 = nstages_4
638@ free regs r2, r4,r5,r6,r7,r9,r10,r11,r12
639@ r2 = j
640@ r4 = node_spacing
641@ r5 = del
642@ r6 = in_loop_count
643@ r7 = middle_loop_count (del*node_spacing)
644@ r9 = p_twiddle_factors
645@ r10= p_twiddle_factors  and inner loop counter
646@ r11=
647@ r12=
648@ r14= *data
649
650    PUSH            {r3}
651
652    LSR             r5, r5, #2
653
654OUTER_LOOP_R4:
655
656    LDR             r14, [sp]
657    @MOV    r14,r3
658    @LSR    r7,r5,#0    @,#2
659    MOV             r7, r5
660    MOV             r2, #0
661    MOV             r9, r0
662    LSL             r12 , r5, #5
663MIDDLE_LOOP_R4:
664
665
666    VLD2.16         {d0[0], d1[0]}, [r9], r2 @cos_1 = d0 , sin_1=d1
667    VLD2.16         {d2[0], d3[0]}, [r9], r2 @cos_2 = d2 , sin_2=d3
668    ADD             r11, r2, r4, LSL #2
669    VLD2.16         {d4[0], d5[0]}, [r9] @cos_3 = d4 , sin_3=d5
670    ADD             r10, r0, r11
671
672
673    VLD2.16         {d0[1], d1[1]}, [r10], r11
674    VLD2.16         {d2[1], d3[1]}, [r10], r11
675    ADD             r2, r11, r4, LSL #2
676    VLD2.16         {d4[1], d5[1]}, [r10]
677    ADD             r9, r0, r2
678
679
680    VLD2.16         {d0[2], d1[2]}, [r9], r2
681    VLD2.16         {d2[2], d3[2]}, [r9], r2
682    ADD             r11, r2, r4, LSL #2
683    VLD2.16         {d4[2], d5[2]}, [r9]
684    ADD             r10, r0, r11
685
686
687
688    VLD2.16         {d0[3], d1[3]}, [r10], r11
689    VLD2.16         {d2[3], d3[3]}, [r10], r11
690    ADD             r2, r11, r4, LSL #2
691    VLD2.16         {d4[3], d5[3]}, [r10]
692    ADD             r9, r0, r2
693
694    MOV             r10, r6
695
696
697
698INNER_LOOP_R4:
699
700    VLD2.32         {q3, q4}, [r14], r12
701
702    VSHR.S32        q3, q3, #1
703    VLD4.16         {q5, q6}, [r14], r12 @a_data1_r_l=d10 , a_data1_r_h=d11, a_data1_i_l=d12, a_data1_i_h=d13
704    VSHR.S32        q4, q4, #1
705
706    VSHR.U16        d10, d10, #1        @a_data1.val[0]= vreinterpret_s16_u16(vshr_n_u16(vreinterpret_u16_s16(a_data1.val[0]), 1))@
707    VLD4.16         {q7, q8}, [r14], r12
708    VSHR.U16        d12, d12, #1        @a_data1.val[2]= vreinterpret_s16_u16(vshr_n_u16(vreinterpret_u16_s16(a_data1.val[2]), 1))@
709
710    VMULL.S16       q11, d10, d0        @prod_1r=vmull_s16(a_data1.val[0], cos_1)@
711    VMLSL.S16       q11, d12, d1        @prod_1r=vmlsl_s16(prod_1r, a_data1.val[2], sin_1)@
712    VLD4.16         {q9, q10}, [r14], r12
713    VMULL.S16       q12, d10, d1        @prod_1i=vmull_s16(a_data1.val[0], sin_1)@
714    VMLAL.S16       q12, d12, d0        @prod_1i=vmlal_s16(prod_1i, a_data1.val[2], cos_1)@
715
716    VSHR.U16        d14, d14, #1        @a_data2.val[0]=vreinterpret_s16_u16(vshr_n_u16(vreinterpret_u16_s16(a_data2.val[0]), 1))@
717    VSHR.U16        d16, d16, #1        @a_data2.val[2]=vreinterpret_s16_u16(vshr_n_u16(vreinterpret_u16_s16(a_data2.val[2]), 1))@
718
719    SUB             r14, r14, r12, LSL #2
720
721    VSHR.U16        d18, d18, #1        @a_data3.val[0]= vreinterpret_s16_u16(vshr_n_u16(vreinterpret_u16_s16(a_data3.val[0]), 1))@
722    VSHR.U16        d20, d20, #1        @a_data3.val[2]= vreinterpret_s16_u16(vshr_n_u16(vreinterpret_u16_s16(a_data3.val[2]), 1))@
723
724    VMULL.S16       q13, d14, d2        @prod_2r=vmull_s16(a_data2.val[0], cos_2)@
725    VMLSL.S16       q13, d16, d3        @prod_2r=vmlsl_s16(prod_2r, a_data2.val[2], sin_2)@
726
727    VSHR.S32        q11, q11, #15       @a_data1_r=vshrq_n_s32(prod_1r,15)@
728
729    VMULL.S16       q14, d14, d3        @prod_2i=vmull_s16(a_data2.val[0], sin_2)@
730    VMLAL.S16       q14, d16, d2        @prod_2i=vmlal_s16(prod_2i, a_data2.val[2], cos_2)@
731
732    VMULL.S16       q15, d18, d4        @prod_3r=vmull_s16(a_data3.val[0], cos_3)@
733    VMLSL.S16       q15, d20, d5        @prod_3r=vmlsl_s16(prod_3r, a_data3.val[2], sin_3)@
734
735    VMLAL.S16       q11, d11, d0        @a_data1_r=vmlal_s16(a_data1_r, a_data1.val[1], cos_1)@
736    VMLSL.S16       q11, d13, d1        @a_data1_r=vmlsl_s16(a_data1_r, a_data1.val[3], sin_1)@
737
738    VSHR.S32        q12, q12, #15       @a_data1_i=vshrq_n_s32(prod_1i,15)@
739    VSHR.S32        q13, q13, #15       @a_data2_r=vshrq_n_s32(prod_2r,15)@
740    VSHR.S32        q14, q14, #15       @a_data2_i=vshrq_n_s32(prod_2i,15)@
741    VSHR.S32        q15, q15, #15       @a_data3_r=vshrq_n_s32(prod_3r,15)@
742
743
744    VMLAL.S16       q12, d11, d1        @a_data1_i=vmlal_s16(a_data1_i, a_data1.val[1], sin_1)@
745    VMLAL.S16       q12, d13, d0        @a_data1_i=vmlal_s16(a_data1_i, a_data1.val[3], cos_1)@
746
747
748    VMULL.S16       q5, d18, d5         @prod_3i=vmull_s16(a_data3.val[0], sin_3)@
749    VMLAL.S16       q5, d20, d4         @prod_3i=vmlal_s16(prod_3i, a_data3.val[2], cos_3)@
750
751
752    VMLAL.S16       q13, d15, d2        @a_data2_r=vmlal_s16(a_data2_r, a_data2.val[1], cos_2)@
753    VMLSL.S16       q13, d17, d3        @a_data2_r=vmlsl_s16(a_data2_r, a_data2.val[3], sin_2)@
754
755    VMLAL.S16       q14, d15, d3        @a_data2_i=vmlal_s16(a_data2_i, a_data2.val[1], sin_2)@
756    VMLAL.S16       q14, d17, d2        @a_data2_i=vmlal_s16(a_data2_i, a_data2.val[3], cos_2)@
757
758
759    VMLAL.S16       q15, d19, d4        @a_data3_r=vmlal_s16(a_data3_r, a_data3.val[1], cos_3)@
760    VMLSL.S16       q15, d21, d5        @a_data3_r=vmlsl_s16(a_data3_r, a_data3.val[3], sin_3)@
761
762    VSHR.S32        q5, q5, #15         @a_data3_i=vshrq_n_s32(prod_3i,15)@
763
764    VMLAL.S16       q5, d19, d5         @a_data3_i=vmlal_s16(a_data3_i, a_data3.val[1], sin_3)@
765    VMLAL.S16       q5, d21, d4         @a_data3_i=vmlal_s16(a_data3_i, a_data3.val[3], cos_3)@
766
767@**********if condition******************
768
769    CMP             r7, r5
770    BNE             BYPASS_IF
771
772    ADD             r14, r14, r12
773
774    LDR             r3, [r14], r12
775    ASR             r3, r3, #1
776    VMOV.32         d22[0], r3
777
778    LDR             r3, [r14], r12
779    ASR             r3, r3, #1
780    VMOV.32         d26[0], r3
781
782    LDR             r3, [r14]
783    ASR             r3, r3, #1
784    VMOV.32         d30[0], r3
785
786    SUB             r14, r14, r12, LSL #1
787    ADD             r14, r14, #4
788
789    LDR             r3, [r14], r12
790    ASR             r3, r3, #1
791    VMOV.32         d24[0], r3
792
793    LDR             r3, [r14], r12
794    ASR             r3, r3, #1
795    VMOV.32         d28[0], r3
796
797    LDR             r3, [r14], r12
798    ASR             r3, r3, #1
799    VMOV.32         d10[0], r3
800
801    SUB             r14, r14, #4
802
803    SUB             r14, r14, r12, LSL #2
804@****************************************
805BYPASS_IF:
806
807    VADD.S32        q6, q3, q13         @b_data0_r=vaddq_s32(a_data0_r,a_data2_r)@
808    VADD.S32        q7, q4, q14         @b_data0_i=vaddq_s32(a_data0_i,a_data2_i)@
809    VSUB.S32        q3, q3, q13         @b_data2_r=vsubq_s32(a_data0_r,a_data2_r)@
810    VSUB.S32        q4, q4, q14         @b_data2_i=vsubq_s32(a_data0_i,a_data2_i)@
811    VADD.S32        q8, q11, q15        @b_data1_r=vaddq_s32(a_data1_r,a_data3_r)@
812    VADD.S32        q9, q12, q5         @b_data1_i=vaddq_s32(a_data1_i,a_data3_i)@
813
814    VSUB.S32        q15, q11, q15       @b_data3_r=vsubq_s32(a_data1_r,a_data3_r)@
815    VSUB.S32        q14, q12, q5        @b_data3_i=vsubq_s32(a_data1_i,a_data3_i)@
816
817@line 882 "../../algo/aacdec/src/neon_asm/fft32x16ch_neon.s"
818    VADD.S32        q10, q6, q8         @c_data0_r=vaddq_s32(b_data0_r,b_data1_r)@
819    VADD.S32        q11, q7, q9         @c_data0_i=vaddq_s32(b_data0_i,b_data1_i)@
820    VADD.S32        q12, q3, q14        @c_data2_r=vaddq_s32(b_data2_r,b_data3_i)@
821    VSUB.S32        q13, q4, q15        @c_data2_i=vsubq_s32(b_data2_i,b_data3_r)@
822
823    VSUB.S32        q6, q6, q8          @c_data1_r=vsubq_s32(b_data0_r,b_data1_r)@
824    VST2.32         {q10, q11}, [r14], r12 @ storing (c_data0_r,c_data0_i)
825    VSUB.S32        q7, q7, q9          @c_data1_i=vsubq_s32(b_data0_i,b_data1_i)@
826
827    VSUB.S32        q8, q3, q14         @c_data3_i=vsubq_s32(b_data2_r,b_data3_i)@
828    VST2.32         {q12, q13}, [r14], r12 @ storing (c_data2_r,c_data2_i)
829    VADD.S32        q9, q4, q15         @c_data3_r=vaddq_s32(b_data2_i,b_data3_r)@
830
831
832    VST2.32         {q6, q7}, [r14], r12 @ storing (c_data1_r,c_data1_i)
833    VST2.32         {q8, q9}, [r14], r12 @ storing (c_data3_i,c_data3_r)
834
835
836
837
838    SUBS            r10, r10, #1
839    BNE             INNER_LOOP_R4
840
841    SUB             r14, r14, r1, LSL #3
842    ADD             r14, r14, #32
843
844    SUBS            r7, r7, #1
845    BNE             MIDDLE_LOOP_R4
846
847
848
849
850    LSR             r4, r4, #2
851    LSL             r5, r5, #2
852    LSR             r6, r6, #2
853    SUBS            r8, r8, #1
854    BNE             OUTER_LOOP_R4
855END_LOOPS:
856    POP             {r3}
857    VPOP            {D8-D15}
858    LDMFD           sp!, {r4-r12, r15}
859
860
861