c_fft.s.backup 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. .text
  2. .align 4
  3. .code 32
  4. .global c_fft_neon
  5. /* fft not push/pop any registers,and only use r4-r9,so call it first before any other code*/
  6. .func fft_dit_reorder
  7. fft_dit_reorder:
  8. /* Rearrange the input array in bit reversed order */
  9. /* Hard code for evrc */
  10. LDR r4, =fft_64_bit_reorder_tbl
  11. LDR r5, =fft_64_bit_reorder_tbl_end
  12. .DIT_Loop:
  13. LDRD r6,r7,[r4]
  14. LDR r8,[r0,+r6]
  15. LDR r9,[r0,+r7]
  16. STR r8,[r0,+r7]
  17. STR r9,[r0,+r6]
  18. ADD r4,#8
  19. CMP r4,r5
  20. BNE .DIT_Loop
  21. BX lr
  22. .endfunc
  23. /* Q8,Q9 is data to compute,Q0-Q7 unchanged*/
  24. .macro fft_bfly r0,i0,r1,i1,r2,i2,r3,i3
  25. PUSH { r4,r5 }
  26. MOVW r4,\r0
  27. MOVT r4,\r1
  28. MOVW r5,\r2
  29. MOVT r5,\r3
  30. VMOV D30,r4,r5
  31. MOVW r4,\i0
  32. MOVT r4,\i1
  33. MOVW r5,\i2
  34. MOVT r5,\i3
  35. VMOV D31,r4,r5
  36. MOV r4,#0x8000
  37. VDUP.32 Q14,r4
  38. POP { r4,r5 }
  39. VTRN.16 D16,D17
  40. VTRN.16 D18,D19
  41. VTRN.32 Q8,Q9
  42. VQDMULL.S16 Q12,D18,D30 @* D30 = phs_tbl[ji]
  43. VQDMULL.S16 Q13,D19,D31 @* D31 = phs_tbl[ji+1]
  44. VQSUB.S32 Q10,Q12,Q13 @* Q10 is ftmp_real
  45. VQDMULL.S16 Q12,D19,D30
  46. VQDMULL.S16 Q13,D18,D31
  47. VQADD.S32 Q11,Q12,Q13 @* Q11 is ftmp_imag
  48. //round32 real part Q10
  49. VQADD.S32 Q10,Q14 @* Q14 fill with 0x8000(s32)
  50. VSHRN.S32 D20,Q10,#16 @* D20 is tmp1
  51. //round32 imag part Q11
  52. VQADD.S32 Q11,Q14
  53. VSHRN.S32 D22,Q11,#16 @* D22 is tmp2
  54. VQSUB.S16 D21,D16,D20
  55. VSHR.S16 D18,D21,#1
  56. VQSUB.S16 D21,D17,D22
  57. VSHR.S16 D19,D21,#1
  58. VQADD.S16 D16,D20
  59. VSHR.S16 D16,#1
  60. VQADD.S16 D17,D22
  61. VSHR.S16 D17,#1
  62. VTRN.16 D16,D17
  63. VTRN.16 D18,D19
  64. VTRN.32 Q8,Q9
  65. .endm
  66. // void c_fft_stageX(short* data)
  67. .func c_fft_stage0
  68. c_fft_stage0:
  69. STMFD sp!,{r4,r5}
  70. MOV r4,r0
  71. ADD r5,r4,#256
  72. .STAGE0_LOOP:
  73. VLDMIA r4,{Q0,Q1,Q2,Q3}
  74. VMOV Q8,Q0
  75. VMOV Q9,Q1
  76. fft_bfly #32767,#0,#32767,#0,#32767,#0,#32767,#0
  77. VMOV Q0,Q8
  78. VMOV Q1,Q9
  79. VMOV Q8,Q2
  80. VMOV Q9,Q3
  81. fft_bfly #32767,#0,#32767,#0,#32767,#0,#32767,#0
  82. VMOV Q2,Q8
  83. VMOV Q3,Q9
  84. VSTMIA r4!,{Q0,Q1,Q2,Q3}
  85. CMP r4,r5
  86. BNE .STAGE0_LOOP
  87. LDMFD sp!,{r4,r5}
  88. BX lr
  89. .endfunc
  90. .func c_fft_stage1
  91. c_fft_stage1:
  92. STMFD sp!,{r4 - r11,lr}
  93. MOV r4,r0
  94. ADD r5,r4,#256
  95. .STAGE1_LOOP:
  96. VLDMIA r4,{Q0,Q1,Q2,Q3}
  97. VTRN.32 D0,D1
  98. VTRN.32 D2,D3
  99. VMOV Q8,Q0
  100. VMOV Q9,Q1
  101. fft_bfly #32767,#0,#0,#0x8000,#32767,#0,#0,#0x8000
  102. VMOV Q0,Q8
  103. VMOV Q1,Q9
  104. VTRN.32 D0,D1
  105. VTRN.32 D2,D3
  106. VTRN.32 D4,D5
  107. VTRN.32 D6,D7
  108. VMOV Q8,Q2
  109. VMOV Q9,Q3
  110. fft_bfly #32767,#0,#0,#0x8000,#32767,#0,#0,#0x8000
  111. VMOV Q2,Q8
  112. VMOV Q3,Q9
  113. VTRN.32 D4,D5
  114. VTRN.32 D6,D7
  115. VSTMIA r4!,{Q0,Q1,Q2,Q3}
  116. CMP r4,r5
  117. BNE .STAGE1_LOOP
  118. LDMFD sp!,{r4 - r11,lr}
  119. BX lr
  120. .endfunc
  121. .func c_fft_stage2
  122. c_fft_stage2:
  123. STMFD sp!,{r4 - r11,lr}
  124. MOV r4,r0
  125. ADD r5,r4,#256
  126. .STAGE2_LOOP:
  127. /*
  128. VLDMIA r4,{Q0,Q1,Q2,Q3}
  129. VTRN.32 D0,D1
  130. VTRN.32 D2,D3
  131. VTRN.32 Q0,Q1
  132. fft_bfly #0x7fff,#0,#0x5a82,#0xa57e,#0,#0x8000,#0xa57e,#0xa57e
  133. VTRN.32 Q0,Q1
  134. VTRN.32 D0,D1
  135. VTRN.32 D2,D3
  136. VSWP Q0,Q2
  137. VSWP Q1,Q3
  138. VTRN.32 D0,D1
  139. VTRN.32 D2,D3
  140. VTRN.32 Q0,Q1
  141. fft_bfly #0x7fff,#0,#0x5a82,#0xa57e,#0,#0x8000,#0xa57e,#0xa57e
  142. VTRN.32 Q0,Q1
  143. VTRN.32 D0,D1
  144. VTRN.32 D2,D3
  145. VSWP Q0,Q2
  146. VSWP Q1,Q3
  147. VSTMIA r4!,{Q0,Q1,Q2,Q3}
  148. */
  149. VLD4.32 {D16,D17,D18,D19}, [r4]
  150. fft_bfly #0x7fff,#0,#0x5a82,#0xa57e,#0,#0x8000,#0xa57e,#0xa57e
  151. VST4.32 {D16,D17,D18,D19}, [r4]!
  152. CMP r4,r5
  153. BNE .STAGE2_LOOP
  154. LDMFD sp!,{r4 - r11,lr}
  155. BX lr
  156. .endfunc
  157. .func c_fft_stage3
  158. c_fft_stage3:
  159. STMFD sp!,{r4 - r11,lr}
  160. MOV r4,r0
  161. ADD r5,r4,#256
  162. .STAGE3_LOOP:
  163. VLDMIA r4,{Q0,Q1,Q2,Q3}
  164. VZIP.32 Q0,Q2
  165. VZIP.32 Q1,Q3
  166. VMOV Q8,Q0
  167. VMOV Q9,Q1
  168. fft_bfly #0x7fff,#0,#0x7642,#0xcf04,#0,#0x8000,#0xcf04,#0x89be
  169. VMOV Q0,Q8
  170. VMOV Q1,Q9
  171. VMOV Q8,Q2
  172. VMOV Q9,Q3
  173. fft_bfly #0x5a82,#0xa57e,#0x30fc,#0x89be,#0xa57e,#0xa57e,#0x89be,#0xcf04
  174. VMOV Q2,Q8
  175. VMOV Q3,Q9
  176. VUZP.32 Q0,Q2
  177. VUZP.32 Q1,Q3
  178. VSTMIA r4!,{Q0,Q1,Q2,Q3}
  179. CMP r4,r5
  180. BNE .STAGE3_LOOP
  181. LDMFD sp!,{r4 - r11,lr}
  182. BX lr
  183. .endfunc
  184. .func c_fft_stage4
  185. c_fft_stage4:
  186. STMFD sp!,{r4 - r11,lr}
  187. MOV r4,r0
  188. ADD r5,r4,#256
  189. ADD r6,r4,#64
  190. .STAGE4_LOOP:
  191. VLDMIA r4,{Q0,Q1,Q2,Q3}
  192. VLDMIA r6,{Q4,Q5,Q6,Q7}
  193. VZIP.32 Q0,Q4
  194. VMOV Q8,Q0
  195. VMOV Q9,Q4
  196. fft_bfly #0x7fff,#0,#0x7d8a,#0xe707,#0x7642,#0xcf04,#0x6a6e,#0xb8e3
  197. VMOV Q0,Q8
  198. VMOV Q4,Q9
  199. VUZP.32 Q0,Q4
  200. VZIP.32 Q1,Q5
  201. VMOV Q8,Q1
  202. VMOV Q9,Q5
  203. fft_bfly #0x5a82,#0xa57e,#0x471d,#0x9592,#0x30fc,#0x89be,#0x18f9,#0x8276
  204. VMOV Q1,Q8
  205. VMOV Q5,Q9
  206. VUZP.32 Q1,Q5
  207. VZIP.32 Q2,Q6
  208. VMOV Q8,Q2
  209. VMOV Q9,Q6
  210. fft_bfly #0x0,#0x8000,#0xe707,#0x8276,#0xcf04,#0x89be,#0xb8e3,#0x9592
  211. VMOV Q2,Q8
  212. VMOV Q6,Q9
  213. VUZP.32 Q2,Q6
  214. VZIP.32 Q3,Q7
  215. VMOV Q8,Q3
  216. VMOV Q9,Q7
  217. fft_bfly #0xa57e,#0xa57e,#0x9592,#0xb8e3,#0x89be,#0xcf04,#0x8276,#0xe707
  218. VMOV Q3,Q8
  219. VMOV Q7,Q9
  220. VUZP.32 Q3,Q7
  221. VSTMIA r4!,{Q0,Q1,Q2,Q3}
  222. VSTMIA r6!,{Q4,Q5,Q6,Q7}
  223. CMP r6,r5
  224. ADDNE r4,#64
  225. ADDNE r6,#64
  226. BNE .STAGE4_LOOP
  227. LDMFD sp!,{r4 - r11,lr}
  228. BX lr
  229. .endfunc
  230. .func c_fft_neon
  231. c_fft_neon:
  232. STMFD sp!,{r4 - r11,lr}
  233. BL fft_dit_reorder
  234. CMP r1,#1
  235. BNE .IFFT_PART
  236. .FFT_PART:
  237. BL c_fft_stage0
  238. BL c_fft_stage1
  239. BL c_fft_stage2
  240. BL c_fft_stage3
  241. BL c_fft_stage4
  242. B .END
  243. .IFFT_PART:
  244. .END:
  245. LDMFD sp!,{r4 - r11,lr}
  246. BX lr
  247. .endfunc