blob: 8826a80f67cb944ac66aad80d2462e1efffd31f8 [file] [log] [blame]
.text
.p2align 2
.global DSP_fft32x16_dit
DSP_fft32x16_dit:
STMFD sp!, {r4-r12, r14}
VPUSH {D8-D15}
@**************Variables Vs Registers*************************
@ r0 = *ptr_w
@ r1 = npoints
@ r2 = ptr_x and
@ r3 = ptr_y
@ r4 = pbit_rev_1024 and pdigRevTable
@ r5 = pbit_rev_512 and p_data1
@ r6 = pbit_rev_128 and p_data2
@ r7 = pbit_rev_32 and p_data3
@ r8 = power and nstages_4
@ r9 = stage_1_count
@ r10 = first_stage (8 or 4)
@ r11 = p_data4
@ r12 = bit reverse value
@ LDR r4,[sp,#0x68]
LDR r5, [sp, #0x68]
LDR r6, [sp, #0x68+4]
LDR r7, [sp, #0x68+8]
@ These conditions can be optimised to lesser number
@************************************************************************************
@COND_1 CMP r1, #0x400 @1024
@ BNE COND_2
@ @MOV r10, #4 @ because radix 8 first stage is by default
@ MOV r8, #4
@ B RADIX_4_FIRST_START
@line 59 "../../algo/aacdec/src/neon_asm/fft32x16ch_neon.s"
COND_2: CMP r1, #0x200 @512
BNE COND_3
@MOV r10, #8
MOV r8, #3
MOV r4, r5
B RADIX_8_FIRST_START
COND_3: CMP r1, #0x100
BNE COND_4
@MOV r10, #4
MOV r8, #3
MOV r4, r5
B RADIX_4_FIRST_START
COND_4: CMP r1, #0x80 @128
BNE COND_5
@MOV r10, #8
MOV r8, #2
MOV r4, r6
B RADIX_8_FIRST_START
COND_5: CMP r1, #0x40
BNE COND_6
@MOV r10, #4
MOV r8, #2
MOV r4, r6
B RADIX_4_FIRST_START
COND_6:
@MOV r10, #8
MOV r8, #1
MOV r4, r7
@**********************************************************************************
@CMP r10,#4
@BEQ RADIX_4_FIRST_START
RADIX_8_FIRST_START:
LSR r9 , r1, #5 @ LOOP count for first stage
LSL r1, r1, #1
RADIX_8_FIRST_LOOP:
MOV r5 , r2
MOV r6 , r2
MOV r7 , r2
MOV r11 , r2
@*************** Register mapping to data ****************************************
@ a_data0_r=q0
@ a_data0_i=q1
@ a_data2_r=q2
@ a_data2_i=q3
@ a_data4_r=q4
@ a_data4_i=q5
@ a_data6_r=q6
@ a_data6_i=q7
@ b_data0_r=q8
@ b_data0_i=q9
@ b_data2_r=q10
@ b_data2_i=q11
@ b_data4_r=q12
@ b_data4_i=q13
@ b_data6_r=q14
@ b_data6_i=q15
@*********************************************************************************
LDRB r12, [r4, #0]
ADD r5, r5, r12, LSL #3
VLD2.32 {d0[0], d2[0]}, [r5] , r1
ADD r5, r5, r1
VLD2.32 {d8[0], d10[0]}, [r5] , r1
SUB r5, r5, r1, LSL #1
VLD2.32 {d4[0], d6[0]}, [r5] , r1
ADD r5, r5, r1
VLD2.32 {d12[0], d14[0]}, [r5], r1
SUB r5, r5, r1, LSL #2
LDRB r12, [r4, #1]
ADD r6, r6, r12, LSL #3
VLD2.32 {d0[1], d2[1]}, [r6] , r1
ADD r6, r6, r1
VLD2.32 {d8[1], d10[1]}, [r6] , r1
SUB r6, r6, r1, LSL #1
VLD2.32 {d4[1], d6[1]}, [r6] , r1
ADD r6, r6, r1
VLD2.32 {d12[1], d14[1]}, [r6], r1
SUB r6, r6, r1, LSL #2
LDRB r12, [r4, #2]
ADD r7, r7, r12 , LSL #3
VLD2.32 {d1[0], d3[0]}, [r7] , r1
ADD r7, r7, r1
VLD2.32 {d9[0], d11[0]}, [r7] , r1
SUB r7, r7, r1, LSL #1
LDRB r12, [r4, #3]
ADD r11, r11, r12 , LSL #3
VLD2.32 {d1[1], d3[1]}, [r11] , r1
ADD r11, r11, r1
VLD2.32 {d9[1], d11[1]}, [r11] , r1
SUB r11, r11, r1, LSL #1
@VHADD.S32 q8, q0, q4 @b_data0_r=vhaddq_s32(a_data0_r_i.val[0],a_data4_r_i.val[0])@
VADD.I32 q8, q0, q4 @b_data0_r=vhaddq_s32(a_data0_r_i.val[0],a_data4_r_i.val[0])@
VLD2.32 {d5[0], d7[0]}, [r7] , r1
ADD r7, r7, r1
@VHSUB.S32 q9, q0, q4 @b_data4_r=vhsubq_s32(a_data0_r_i.val[0],a_data4_r_i.val[0])@
VSUB.I32 q9, q0, q4 @b_data4_r=vhsubq_s32(a_data0_r_i.val[0],a_data4_r_i.val[0])@
VLD2.32 {d13[0], d15[0]}, [r7], r1
SUB r7, r7, r1, LSL #2
@VHADD.S32 q0, q1, q5 @b_data0_i=vhaddq_s32(a_data0_r_i.val[1],a_data4_r_i.val[1])@
VADD.I32 q0, q1, q5 @b_data0_i=vhaddq_s32(a_data0_r_i.val[1],a_data4_r_i.val[1])@
VLD2.32 {d5[1], d7[1]}, [r11] , r1
ADD r11, r11, r1
@VHSUB.S32 q4, q1, q5 @b_data4_i=vhsubq_s32(a_data0_r_i.val[1],a_data4_r_i.val[1])@
VSUB.I32 q4, q1, q5 @b_data4_i=vhsubq_s32(a_data0_r_i.val[1],a_data4_r_i.val[1])@
VLD2.32 {d13[1], d15[1]}, [r11], r1
SUB r11, r11, r1, LSL #2
ADD r4, r4, #4
ADD r5, r5, r1, LSR #1
ADD r6, r6, r1, LSR #1
ADD r7, r7, r1, LSR #1
ADD r11, r11, r1, LSR #1
@VHADD.S32 q1, q2, q6 @b_data2_r=vhaddq_s32(a_data2_r_i.val[0],a_data6_r_i.val[0])@
VADD.I32 q1, q2, q6 @b_data2_r=vhaddq_s32(a_data2_r_i.val[0],a_data6_r_i.val[0])@
VLD2.32 {d28[0], d30[0]}, [r5] , r1 @a_data1_r_i=vld2q_lane_s32(__transfersize(2) p_data1,a_data1_r_i,0)@
@VHSUB.S32 q5, q2, q6 @b_data6_r=vhsubq_s32(a_data2_r_i.val[0],a_data6_r_i.val[0])@
VSUB.I32 q5, q2, q6 @b_data6_r=vhsubq_s32(a_data2_r_i.val[0],a_data6_r_i.val[0])@
VLD2.32 {d20[0], d22[0]}, [r5] , r1 @a_data3_r_i=vld2q_lane_s32(__transfersize(2) p_data1,a_data3_r_i,0)
@VHADD.S32 q2, q3, q7 @b_data2_i=vhaddq_s32(a_data2_r_i.val[1],a_data6_r_i.val[1])@
VADD.I32 q2, q3, q7 @b_data2_i=vhaddq_s32(a_data2_r_i.val[1],a_data6_r_i.val[1])@
VLD2.32 {d24[0], d26[0]}, [r5] , r1 @a_data5_r_i=vld2q_lane_s32(__transfersize(2) p_data1,a_data5_r_i,0)
@VHSUB.S32 q6, q3, q7 @b_data6_i=vhsubq_s32(a_data2_r_i.val[1],a_data6_r_i.val[1])@
VSUB.I32 q6, q3, q7 @b_data6_i=vhsubq_s32(a_data2_r_i.val[1],a_data6_r_i.val[1])@
VLD2.32 {d28[1], d30[1]}, [r6] , r1
VADD.S32 q3, q9, q6 @c_data4_r=vaddq_s32(b_data4_r,b_data6_i)@
VLD2.32 {d20[1], d22[1]}, [r6] , r1
VSUB.S32 q7, q9, q6 @c_data6_r=vsubq_s32(b_data4_r,b_data6_i)@
VLD2.32 {d24[1], d26[1]}, [r6] , r1
VSUB.S32 q6, q4, q5 @c_data4_i=vsubq_s32(b_data4_i,b_data6_r)@
VLD2.32 {d29[0], d31[0]}, [r7] , r1
VADD.S32 q9, q4, q5 @c_data6_i=vaddq_s32(b_data4_i,b_data6_r)@
VLD2.32 {d21[0], d23[0]}, [r7] , r1
VADD.S32 q4, q8, q1 @c_data0_r=vaddq_s32(b_data0_r,b_data2_r)@
VLD2.32 {d25[0], d27[0]}, [r7] , r1
VSUB.S32 q5, q8, q1 @c_data2_r=vsubq_s32(b_data0_r,b_data2_r)@
VLD2.32 {d29[1], d31[1]}, [r11] , r1
VADD.S32 q8, q0, q2 @c_data0_i=vaddq_s32(b_data0_i,b_data2_i)@
VLD2.32 {d21[1], d23[1]}, [r11] , r1
VSUB.S32 q0, q0, q2 @c_data2_i=vsubq_s32(b_data0_i,b_data2_i)@
VLD2.32 {d25[1], d27[1]}, [r11] , r1
VPUSH {q3} @ VPUSH(c_data4_r, c_data6_r)
VPUSH {q7}
VLD2.32 {d2[0], d4[0]}, [r5], r1 @a_data7_r_i=vld2q_lane_s32(__transfersize(2) p_data1,a_data7_r_i,0)
@VHADD.S32 q7, q14, q12 @b_data1_r=vhaddq_s32(a_data1_r,a_data5_r)@
VADD.I32 q7, q14, q12 @b_data1_r=vhaddq_s32(a_data1_r,a_data5_r)@
VLD2.32 {d2[1], d4[1]}, [r6] , r1
@VHSUB.S32 q3, q14, q12 @b_data5_r=vhsubq_s32(a_data1_r,a_data5_r)@
VSUB.I32 q3, q14, q12 @b_data5_r=vhsubq_s32(a_data1_r,a_data5_r)@
VLD2.32 {d3[0], d5[0]}, [r7] , r1
@VHADD.S32 q14, q15, q13 @b_data1_i=vhaddq_s32(a_data1_i,a_data5_i)@
VADD.I32 q14, q15, q13 @b_data1_i=vhaddq_s32(a_data1_i,a_data5_i)@
VLD2.32 {d3[1], d5[1]}, [r11] , r1
@VHSUB.S32 q12, q15, q13 @b_data5_i=vhsubq_s32(a_data1_i,a_data5_i)@
VSUB.I32 q12, q15, q13 @b_data5_i=vhsubq_s32(a_data1_i,a_data5_i)@
@VHADD.S32 q15, q10,q1 @b_data3_r=vhaddq_s32(a_data3_r,a_data7_r)@
@VHSUB.S32 q13, q10,q1 @b_data7_r=vhsubq_s32(a_data3_r,a_data7_r)@
@VHADD.S32 q10, q11, q2 @b_data3_i=vhaddq_s32(a_data3_i,a_data7_i)@
@VHSUB.S32 q1, q11, q2 @b_data7_i=vhsubq_s32(a_data3_i,a_data7_i)@
VADD.I32 q15, q10, q1 @b_data3_r=vhaddq_s32(a_data3_r,a_data7_r)@
VSUB.I32 q13, q10, q1 @b_data7_r=vhsubq_s32(a_data3_r,a_data7_r)@
VADD.I32 q10, q11, q2 @b_data3_i=vhaddq_s32(a_data3_i,a_data7_i)@
VSUB.I32 q1, q11, q2 @b_data7_i=vhsubq_s32(a_data3_i,a_data7_i)@
VADD.S32 q11, q7, q15 @c_data1_r=vaddq_s32(b_data1_r,b_data3_r)@
VSUB.S32 q2, q7, q15 @c_data3_r=vsubq_s32(b_data1_r,b_data3_r)@
VADD.S32 q7, q14, q10 @c_data1_i=vaddq_s32(b_data1_i,b_data3_i)@
VSUB.S32 q15, q14, q10 @c_data3_i=vsubq_s32(b_data1_i,b_data3_i)@
VADD.S32 q14, q3, q12 @c_data5_r=vaddq_s32(b_data5_r,b_data5_i)@
VSUB.S32 q10, q3, q12 @c_data5_i=vsubq_s32(b_data5_r,b_data5_i)@
VADD.S32 q3, q13, q1 @c_data7_r=vaddq_s32(b_data7_r,b_data7_i)@
VSUB.S32 q12, q13, q1 @c_data7_i=vsubq_s32(b_data7_r,b_data7_i)@
VADD.S32 q1 , q14, q12 @b_data5_r=vaddq_s32(c_data7_i,c_data5_r)@
VSUB.S32 q13, q14, q12 @b_data7_i=vsubq_s32(c_data5_r,c_data7_i)@
VSUB.S32 q12, q3, q10 @b_data5_i=vsubq_s32(c_data7_r,c_data5_i)@
VUZP.16 d2, d3 @ D0 = b_data5_r_low, D1= b_data5_r_high
VADD.S32 q14, q3, q10 @b_data7_r=vaddq_s32(c_data5_i,c_data7_r)@
VUZP.16 d26, d27
VADD.S32 q3, q4, q11 @b_data0_r=vaddq_s32(c_data0_r,c_data1_r)@
VUZP.16 d24, d25
VSUB.S32 q10, q4, q11 @b_data1_r=vsubq_s32(c_data0_r,c_data1_r)@
VUZP.16 d28, d29
VADD.S32 q4, q8, q7 @b_data0_i=vaddq_s32(c_data0_i,c_data1_i)@
LDR r14, = 0x5a82
VSUB.S32 q11, q8, q7 @b_data1_i=vsubq_s32(c_data0_i,c_data1_i)@
VADD.S32 q8, q5, q15 @b_data2_r=vaddq_s32(c_data2_r,c_data3_i)@
VSUB.S32 q7, q5, q15 @b_data3_r=vsubq_s32(c_data2_r,c_data3_i)@
VSUB.S32 q5, q0, q2 @b_data2_i=vsubq_s32(c_data2_i,c_data3_r)@
VADD.S32 q15, q0, q2 @b_data3_i=vaddq_s32(c_data2_i,c_data3_r)@
VPOP {q0}
VPOP {q2}
VPUSH {q3-q4}
VPUSH {q10}
@********************************************************************
@ b_data5_r = q1 free regs = q3,q4,q5,q7,q8,q10,q11
@ b_data5_i = q12
@ b_data7_r = q14
@ b_data7_i = q13
@ c_data4_r = q2
@ c_data4_i = q6
@ c_data6_r = q0
@ c_data6_i = q9
@********************************************************************
VDUP.16 d20, r14
VMULL.u16 q4, d26, d20
VMULL.u16 q3, d28, d20
VPUSH {q7-q8}
VPUSH {q5}
VSHR.S32 q4, q4, #15
VSHR.S32 q3, q3, #15
VQDMLAL.S16 q4, d27, d20
VQDMLAL.S16 q3, d29, d20
VPUSH {q11}
VMULL.u16 q13, d24, d20
VMULL.u16 q14, d2, d20
VADD.S32 q5, q2, q4 @q5=b_data7_i
VSUB.S32 q7, q2, q4 @q7=b_data4_r
VADD.S32 q8, q6, q3 @q10 = b_data4_i
VSUB.S32 q6, q6, q3 @q11 = b_data7_r
VSHR.S32 q13, q13, #15
VSHR.S32 q14, q14, #15
VQDMLAL.S16 q13, d25, d20
VQDMLAL.S16 q14, d3, d20
VPOP {q1}
VPOP {q10}
VADD.S32 q2, q0, q13 @q2 = b_data5_i
VSUB.S32 q4, q0, q13 @q4 = b_data6_r
VADD.S32 q11, q9, q14 @q6 = b_data6_i
VSUB.S32 q3, q9, q14 @q8 = b_data5_r
VPOP {q14}
VPOP {q9}
VPOP {q0}
VPOP {q12, q13}
@**************regs maping************
@b_data0_r = q12
@b_data0_i = q13
@b_data1_r = q0
@b_data1_i = q1
@b_data2_r = q9
@b_data2_i = q10
@b_data3_r = q14
@b_data3_i = q15
@b_data4_r = q7
@b_data4_i = q8
@b_data5_r = q3
@b_data5_i = q2
@b_data6_r = q4
@b_data6_i = q11
@b_data7_r = q6
@b_data7_i = q5
@******************************************
@shifts added (as dual simd instrn)
VTRN.32 q12, q5
@line 455 "../../algo/aacdec/src/neon_asm/fft32x16ch_neon.s"
VSHL.S32 q12, q12, #3 @ch
VTRN.32 q9, q2
VSHL.S32 q5, q5, #3 @ch
VSHL.S32 q9, q9, #3 @ch
VTRN.32 q0, q7
VSHL.S32 q2, q2, #3 @ch
VSHL.S32 q0, q0, #3 @ch
VTRN.32 q14, q4
VSHL.S32 q7, q7, #3 @ch
VSHL.S32 q14, q14, #3 @ch
VTRN.32 q13, q6
VSHL.S32 q4, q4, #3 @ch
VSHL.S32 q13, q13, #3 @ch
VTRN.32 q10, q3
VSHL.S32 q6, q6, #3 @ch
VSHL.S32 q10, q10, #3 @ch
VTRN.32 q1, q8
VSHL.S32 q3, q3, #3 @ch
VSHL.S32 q1, q1, #3 @ch
VTRN.32 q15, q11
VSHL.S32 q8, q8, #3 @ch
VSHL.S32 q15, q15, #3 @ch
VSWP d18, d25
VSHL.S32 q11, q11, #3 @ch
VSWP d4, d11
VSWP d1, d28
VSWP d15, d8
VSWP d20, d27
VSWP d6, d13
VSWP d30, d3
VSWP d22, d17
VST2.32 {q12, q13}, [r3]!
VST2.32 {q0, q1}, [r3]!
VST2.32 {q5, q6}, [r3]!
VST2.32 {q7, q8}, [r3]!
VMOV q5, q11
VST2.32 {q9, q10}, [r3]!
VST2.32 {q14, q15}, [r3]!
VST2.32 {q2, q3}, [r3]!
VST2.32 {q4, q5}, [r3]!
SUBS r9, r9, #1
BNE RADIX_8_FIRST_LOOP
LSR r1, r1, #1
SUB r3, r1, LSL #3
MOV r5, #8
MOV r4, #32
LSR r6, r1, #5
B RADIX_4_FIRST_ENDS
RADIX_8_FIRST_ENDS:
@************************************RADIX 4 FIRST STAGE**********************************
RADIX_4_FIRST_START:
LSR r9 , r1, #4 @ LOOP count for first stage
LSL r1, r1, #1
RADIX_4_LOOP:
MOV r5 , r2
MOV r6 , r2
MOV r7 , r2
MOV r11 , r2
@*************** Register mapping to data ****************************************
@ a_data0_r=q0
@ a_data0_i=q1
@ a_data1_r=q2
@ a_data1_i=q3
@ a_data2_r=q4
@ a_data2_i=q5
@ a_data3_r=q6
@ a_data4_i=q7
@*********************************************************************************
LDRB r12, [r4, #0]
ADD r5, r5, r12, LSL #3
VLD2.32 {d0[0], d2[0]}, [r5] , r1
ADD r5, r5, r1
VLD2.32 {d8[0], d10[0]}, [r5] , r1
SUB r5, r5, r1, LSL #1
VLD2.32 {d4[0], d6[0]}, [r5] , r1
ADD r5, r5, r1
VLD2.32 {d12[0], d14[0]}, [r5], r1
LDRB r12, [r4, #1]
ADD r6, r6, r12, LSL #3
VLD2.32 {d0[1], d2[1]}, [r6] , r1
ADD r6, r6, r1
VLD2.32 {d8[1], d10[1]}, [r6] , r1
SUB r6, r6, r1, LSL #1
VLD2.32 {d4[1], d6[1]}, [r6] , r1
ADD r6, r6, r1
VLD2.32 {d12[1], d14[1]}, [r6], r1
LDRB r12, [r4, #2]
ADD r7, r7, r12, LSL #3
VLD2.32 {d1[0], d3[0]}, [r7] , r1
ADD r7, r7, r1
VLD2.32 {d9[0], d11[0]}, [r7] , r1
LDRB r12, [r4, #3]
ADD r11, r11, r12 , LSL #3
VLD2.32 {d1[1], d3[1]}, [r11] , r1
ADD r11, r11, r1
VLD2.32 {d9[1], d11[1]}, [r11] , r1
SUB r7, r7, r1, LSL #1
VADD.S32 q8, q0, q4 @b_data0_r=vaddq_s32(a_data0_r,a_data2_r)@
VLD2.32 {d5[0], d7[0]}, [r7] , r1
ADD r7, r7, r1
VADD.S32 q9, q1, q5 @b_data0_i=vaddq_s32(a_data0_i,a_data2_i)@
VLD2.32 {d13[0], d15[0]}, [r7], r1
SUB r11, r11, r1, LSL #1
VSUB.S32 q10, q0, q4 @b_data2_r=vsubq_s32(a_data0_r,a_data2_r)@
VLD2.32 {d5[1], d7[1]}, [r11] , r1
ADD r11, r11, r1
VSUB.S32 q11, q1, q5 @b_data2_i=vsubq_s32(a_data0_i,a_data2_i)@
VLD2.32 {d13[1], d15[1]}, [r11], r1
ADD r4, r4, #4
VADD.S32 q12, q2, q6 @b_data1_r=vaddq_s32(a_data1_r,a_data3_r)@
VADD.S32 q13, q3, q7 @b_data1_i=vaddq_s32(a_data1_i,a_data3_i)@
VSUB.S32 q14, q2, q6 @b_data3_r=vsubq_s32(a_data1_r,a_data3_r)@
VSUB.S32 q15, q3, q7 @b_data3_i=vsubq_s32(a_data1_i,a_data3_i)@
VADD.S32 q0, q8, q12 @a_data0_r=vaddq_s32(b_data0_r,b_data1_r)@
VADD.S32 q1, q9, q13 @a_data0_i=vaddq_s32(b_data0_i,b_data1_i)@
VSUB.S32 q2, q8, q12 @a_data1_r=vsubq_s32(b_data0_r,b_data1_r)@
VSUB.S32 q3, q9, q13 @a_data1_i=vsubq_s32(b_data0_i,b_data1_i)@
VADD.S32 q4, q10, q15 @a_data2_r=vaddq_s32(b_data2_r,b_data3_i)@
VSUB.S32 q5, q11, q14 @a_data2_i=vsubq_s32(b_data2_i,b_data3_r)@
VADD.S32 q7, q11, q14 @a_data3_r=vaddq_s32(b_data2_i,b_data3_r)@
VSUB.S32 q6, q10, q15 @a_data3_i=vsubq_s32(b_data2_r,b_data3_i)@
@shifts added
VTRN.32 q0, q4
VSHL.S32 q0, q0, #2 @ch
VTRN.32 q2, q6
VSHL.S32 q4, q4, #2 @ch
VSHL.S32 q2, q2, #2 @ch
VTRN.32 q1, q5 @ch
VSHL.S32 q6, q6, #2 @ch
VSHL.S32 q1, q1, #2 @ch
VTRN.32 q3, q7 @ch
VSHL.S32 q5, q5, #2 @ch
VSHL.S32 q3, q3, #2 @ch
VSWP d4, d1
VSHL.S32 q7, q7, #2 @ch
VSWP d12, d9
@VTRN.32 q1, q5
@VTRN.32 q3, q7
VSWP d6, d3
VSWP d14, d11
VST2.32 {q0, q1}, [r3]!
VST2.32 {q4, q5}, [r3]!
VST2.32 {q2, q3}, [r3]!
VST2.32 {q6, q7}, [r3]!
SUBS r9, r9, #1
BNE RADIX_4_LOOP
LSR r1, r1, #1
SUB r3, r1, LSL #3
MOV r5, #4
MOV r4, #64
LSR r6, r1, #4
RADIX_4_FIRST_ENDS:
@********************************END OF RADIX 4 FIRST STAGE*******************************
@*************** register assignment after first radix 8 stage****************************
@ r1 = npoints
@ r0 = *ptr_w
@ r3 = *ptr_y
@ r8 = nstages_4
@ free regs r2, r4,r5,r6,r7,r9,r10,r11,r12
@ r2 = j
@ r4 = node_spacing
@ r5 = del
@ r6 = in_loop_count
@ r7 = middle_loop_count (del*node_spacing)
@ r9 = p_twiddle_factors
@ r10= p_twiddle_factors and inner loop counter
@ r11=
@ r12=
@ r14= *data
PUSH {r3}
LSR r5, r5, #2
OUTER_LOOP_R4:
LDR r14, [sp]
@MOV r14,r3
@LSR r7,r5,#0 @,#2
MOV r7, r5
MOV r2, #0
MOV r9, r0
LSL r12 , r5, #5
MIDDLE_LOOP_R4:
VLD2.16 {d0[0], d1[0]}, [r9], r2 @cos_1 = d0 , sin_1=d1
VLD2.16 {d2[0], d3[0]}, [r9], r2 @cos_2 = d2 , sin_2=d3
ADD r11, r2, r4, LSL #2
VLD2.16 {d4[0], d5[0]}, [r9] @cos_3 = d4 , sin_3=d5
ADD r10, r0, r11
VLD2.16 {d0[1], d1[1]}, [r10], r11
VLD2.16 {d2[1], d3[1]}, [r10], r11
ADD r2, r11, r4, LSL #2
VLD2.16 {d4[1], d5[1]}, [r10]
ADD r9, r0, r2
VLD2.16 {d0[2], d1[2]}, [r9], r2
VLD2.16 {d2[2], d3[2]}, [r9], r2
ADD r11, r2, r4, LSL #2
VLD2.16 {d4[2], d5[2]}, [r9]
ADD r10, r0, r11
VLD2.16 {d0[3], d1[3]}, [r10], r11
VLD2.16 {d2[3], d3[3]}, [r10], r11
ADD r2, r11, r4, LSL #2
VLD2.16 {d4[3], d5[3]}, [r10]
ADD r9, r0, r2
MOV r10, r6
INNER_LOOP_R4:
VLD2.32 {q3, q4}, [r14], r12
VSHR.S32 q3, q3, #1
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
VSHR.S32 q4, q4, #1
VSHR.U16 d10, d10, #1 @a_data1.val[0]= vreinterpret_s16_u16(vshr_n_u16(vreinterpret_u16_s16(a_data1.val[0]), 1))@
VLD4.16 {q7, q8}, [r14], r12
VSHR.U16 d12, d12, #1 @a_data1.val[2]= vreinterpret_s16_u16(vshr_n_u16(vreinterpret_u16_s16(a_data1.val[2]), 1))@
VMULL.S16 q11, d10, d0 @prod_1r=vmull_s16(a_data1.val[0], cos_1)@
VMLSL.S16 q11, d12, d1 @prod_1r=vmlsl_s16(prod_1r, a_data1.val[2], sin_1)@
VLD4.16 {q9, q10}, [r14], r12
VMULL.S16 q12, d10, d1 @prod_1i=vmull_s16(a_data1.val[0], sin_1)@
VMLAL.S16 q12, d12, d0 @prod_1i=vmlal_s16(prod_1i, a_data1.val[2], cos_1)@
VSHR.U16 d14, d14, #1 @a_data2.val[0]=vreinterpret_s16_u16(vshr_n_u16(vreinterpret_u16_s16(a_data2.val[0]), 1))@
VSHR.U16 d16, d16, #1 @a_data2.val[2]=vreinterpret_s16_u16(vshr_n_u16(vreinterpret_u16_s16(a_data2.val[2]), 1))@
SUB r14, r14, r12, LSL #2
VSHR.U16 d18, d18, #1 @a_data3.val[0]= vreinterpret_s16_u16(vshr_n_u16(vreinterpret_u16_s16(a_data3.val[0]), 1))@
VSHR.U16 d20, d20, #1 @a_data3.val[2]= vreinterpret_s16_u16(vshr_n_u16(vreinterpret_u16_s16(a_data3.val[2]), 1))@
VMULL.S16 q13, d14, d2 @prod_2r=vmull_s16(a_data2.val[0], cos_2)@
VMLSL.S16 q13, d16, d3 @prod_2r=vmlsl_s16(prod_2r, a_data2.val[2], sin_2)@
VSHR.S32 q11, q11, #15 @a_data1_r=vshrq_n_s32(prod_1r,15)@
VMULL.S16 q14, d14, d3 @prod_2i=vmull_s16(a_data2.val[0], sin_2)@
VMLAL.S16 q14, d16, d2 @prod_2i=vmlal_s16(prod_2i, a_data2.val[2], cos_2)@
VMULL.S16 q15, d18, d4 @prod_3r=vmull_s16(a_data3.val[0], cos_3)@
VMLSL.S16 q15, d20, d5 @prod_3r=vmlsl_s16(prod_3r, a_data3.val[2], sin_3)@
VMLAL.S16 q11, d11, d0 @a_data1_r=vmlal_s16(a_data1_r, a_data1.val[1], cos_1)@
VMLSL.S16 q11, d13, d1 @a_data1_r=vmlsl_s16(a_data1_r, a_data1.val[3], sin_1)@
VSHR.S32 q12, q12, #15 @a_data1_i=vshrq_n_s32(prod_1i,15)@
VSHR.S32 q13, q13, #15 @a_data2_r=vshrq_n_s32(prod_2r,15)@
VSHR.S32 q14, q14, #15 @a_data2_i=vshrq_n_s32(prod_2i,15)@
VSHR.S32 q15, q15, #15 @a_data3_r=vshrq_n_s32(prod_3r,15)@
VMLAL.S16 q12, d11, d1 @a_data1_i=vmlal_s16(a_data1_i, a_data1.val[1], sin_1)@
VMLAL.S16 q12, d13, d0 @a_data1_i=vmlal_s16(a_data1_i, a_data1.val[3], cos_1)@
VMULL.S16 q5, d18, d5 @prod_3i=vmull_s16(a_data3.val[0], sin_3)@
VMLAL.S16 q5, d20, d4 @prod_3i=vmlal_s16(prod_3i, a_data3.val[2], cos_3)@
VMLAL.S16 q13, d15, d2 @a_data2_r=vmlal_s16(a_data2_r, a_data2.val[1], cos_2)@
VMLSL.S16 q13, d17, d3 @a_data2_r=vmlsl_s16(a_data2_r, a_data2.val[3], sin_2)@
VMLAL.S16 q14, d15, d3 @a_data2_i=vmlal_s16(a_data2_i, a_data2.val[1], sin_2)@
VMLAL.S16 q14, d17, d2 @a_data2_i=vmlal_s16(a_data2_i, a_data2.val[3], cos_2)@
VMLAL.S16 q15, d19, d4 @a_data3_r=vmlal_s16(a_data3_r, a_data3.val[1], cos_3)@
VMLSL.S16 q15, d21, d5 @a_data3_r=vmlsl_s16(a_data3_r, a_data3.val[3], sin_3)@
VSHR.S32 q5, q5, #15 @a_data3_i=vshrq_n_s32(prod_3i,15)@
VMLAL.S16 q5, d19, d5 @a_data3_i=vmlal_s16(a_data3_i, a_data3.val[1], sin_3)@
VMLAL.S16 q5, d21, d4 @a_data3_i=vmlal_s16(a_data3_i, a_data3.val[3], cos_3)@
@**********if condition******************
CMP r7, r5
BNE BYPASS_IF
ADD r14, r14, r12
LDR r3, [r14], r12
ASR r3, r3, #1
VMOV.32 d22[0], r3
LDR r3, [r14], r12
ASR r3, r3, #1
VMOV.32 d26[0], r3
LDR r3, [r14]
ASR r3, r3, #1
VMOV.32 d30[0], r3
SUB r14, r14, r12, LSL #1
ADD r14, r14, #4
LDR r3, [r14], r12
ASR r3, r3, #1
VMOV.32 d24[0], r3
LDR r3, [r14], r12
ASR r3, r3, #1
VMOV.32 d28[0], r3
LDR r3, [r14], r12
ASR r3, r3, #1
VMOV.32 d10[0], r3
SUB r14, r14, #4
SUB r14, r14, r12, LSL #2
@****************************************
BYPASS_IF:
VADD.S32 q6, q3, q13 @b_data0_r=vaddq_s32(a_data0_r,a_data2_r)@
VADD.S32 q7, q4, q14 @b_data0_i=vaddq_s32(a_data0_i,a_data2_i)@
VSUB.S32 q3, q3, q13 @b_data2_r=vsubq_s32(a_data0_r,a_data2_r)@
VSUB.S32 q4, q4, q14 @b_data2_i=vsubq_s32(a_data0_i,a_data2_i)@
VADD.S32 q8, q11, q15 @b_data1_r=vaddq_s32(a_data1_r,a_data3_r)@
VADD.S32 q9, q12, q5 @b_data1_i=vaddq_s32(a_data1_i,a_data3_i)@
VSUB.S32 q15, q11, q15 @b_data3_r=vsubq_s32(a_data1_r,a_data3_r)@
VSUB.S32 q14, q12, q5 @b_data3_i=vsubq_s32(a_data1_i,a_data3_i)@
@line 882 "../../algo/aacdec/src/neon_asm/fft32x16ch_neon.s"
VADD.S32 q10, q6, q8 @c_data0_r=vaddq_s32(b_data0_r,b_data1_r)@
VADD.S32 q11, q7, q9 @c_data0_i=vaddq_s32(b_data0_i,b_data1_i)@
VADD.S32 q12, q3, q14 @c_data2_r=vaddq_s32(b_data2_r,b_data3_i)@
VSUB.S32 q13, q4, q15 @c_data2_i=vsubq_s32(b_data2_i,b_data3_r)@
VSUB.S32 q6, q6, q8 @c_data1_r=vsubq_s32(b_data0_r,b_data1_r)@
VST2.32 {q10, q11}, [r14], r12 @ storing (c_data0_r,c_data0_i)
VSUB.S32 q7, q7, q9 @c_data1_i=vsubq_s32(b_data0_i,b_data1_i)@
VSUB.S32 q8, q3, q14 @c_data3_i=vsubq_s32(b_data2_r,b_data3_i)@
VST2.32 {q12, q13}, [r14], r12 @ storing (c_data2_r,c_data2_i)
VADD.S32 q9, q4, q15 @c_data3_r=vaddq_s32(b_data2_i,b_data3_r)@
VST2.32 {q6, q7}, [r14], r12 @ storing (c_data1_r,c_data1_i)
VST2.32 {q8, q9}, [r14], r12 @ storing (c_data3_i,c_data3_r)
SUBS r10, r10, #1
BNE INNER_LOOP_R4
SUB r14, r14, r1, LSL #3
ADD r14, r14, #32
SUBS r7, r7, #1
BNE MIDDLE_LOOP_R4
LSR r4, r4, #2
LSL r5, r5, #2
LSR r6, r6, #2
SUBS r8, r8, #1
BNE OUTER_LOOP_R4
END_LOOPS:
POP {r3}
VPOP {D8-D15}
LDMFD sp!, {r4-r12, r15}