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