Home | History | Annotate | Download | only in armv7
      1 .text
      2 .p2align 2
      3 .global DSP_fft32x16_dit
      4 
      5 DSP_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"
     42 COND_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 
     49 COND_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 
     56 COND_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 
     63 COND_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
     69 COND_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 
     79 RADIX_8_FIRST_START:
     80 
     81 
     82     LSR             r9 , r1, #5         @ LOOP count for first stage
     83     LSL             r1, r1, #1
     84 
     85 RADIX_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 
    474 RADIX_8_FIRST_ENDS:
    475 
    476 
    477 
    478 
    479 @************************************RADIX 4 FIRST STAGE**********************************
    480 
    481 RADIX_4_FIRST_START:
    482 
    483 
    484     LSR             r9 , r1, #4         @ LOOP count for first stage
    485     LSL             r1, r1, #1
    486 
    487 RADIX_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 
    627 RADIX_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 
    654 OUTER_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
    663 MIDDLE_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 
    698 INNER_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 @****************************************
    805 BYPASS_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
    855 END_LOOPS:
    856     POP             {r3}
    857     VPOP            {D8-D15}
    858     LDMFD           sp!, {r4-r12, r15}
    859 
    860 
    861