You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
6.4KB

  1. /*
  2. * ARM NEON optimised RDFT
  3. * Copyright (c) 2009 Mans Rullgard <mans@mansr.com>
  4. *
  5. * This file is part of Libav.
  6. *
  7. * Libav is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * Libav is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with Libav; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. #include "libavutil/arm/asm.S"
  22. preserve8
  23. function ff_rdft_calc_neon, export=1
  24. push {r4-r8,lr}
  25. ldr r6, [r0, #4] @ inverse
  26. mov r4, r0
  27. mov r5, r1
  28. lsls r6, r6, #31
  29. bne 1f
  30. add r0, r4, #20
  31. bl X(ff_fft_permute_neon)
  32. add r0, r4, #20
  33. mov r1, r5
  34. bl X(ff_fft_calc_neon)
  35. 1:
  36. ldr r12, [r4, #0] @ nbits
  37. mov r2, #1
  38. lsl r12, r2, r12
  39. add r0, r5, #8
  40. add r1, r5, r12, lsl #2
  41. lsr r12, r12, #2
  42. ldr r2, [r4, #12] @ tcos
  43. sub r12, r12, #2
  44. ldr r3, [r4, #16] @ tsin
  45. mov r7, r0
  46. sub r1, r1, #8
  47. mov lr, r1
  48. mov r8, #-8
  49. vld1.32 {d0}, [r0,:64]! @ d1[0,1]
  50. vld1.32 {d1}, [r1,:64], r8 @ d2[0,1]
  51. vld1.32 {d4}, [r2,:64]! @ tcos[i]
  52. vld1.32 {d5}, [r3,:64]! @ tsin[i]
  53. vmov.f32 d18, #0.5 @ k1
  54. vdup.32 d19, r6
  55. pld [r0, #32]
  56. veor d19, d18, d19 @ k2
  57. vmov.i32 d16, #0
  58. vmov.i32 d17, #1<<31
  59. pld [r1, #-32]
  60. vtrn.32 d16, d17
  61. pld [r2, #32]
  62. vrev64.32 d16, d16 @ d16=1,0 d17=0,1
  63. pld [r3, #32]
  64. 2:
  65. veor q1, q0, q8 @ -d1[0],d1[1], d2[0],-d2[1]
  66. vld1.32 {d24}, [r0,:64]! @ d1[0,1]
  67. vadd.f32 d0, d0, d3 @ d1[0]+d2[0], d1[1]-d2[1]
  68. vld1.32 {d25}, [r1,:64], r8 @ d2[0,1]
  69. vadd.f32 d1, d2, d1 @ -d1[0]+d2[0], d1[1]+d2[1]
  70. veor q3, q12, q8 @ -d1[0],d1[1], d2[0],-d2[1]
  71. pld [r0, #32]
  72. vmul.f32 q10, q0, q9 @ ev.re, ev.im, od.im, od.re
  73. pld [r1, #-32]
  74. vadd.f32 d0, d24, d7 @ d1[0]+d2[0], d1[1]-d2[1]
  75. vadd.f32 d1, d6, d25 @ -d1[0]+d2[0], d1[1]+d2[1]
  76. vmul.f32 q11, q0, q9 @ ev.re, ev.im, od.im, od.re
  77. veor d7, d21, d16 @ -od.im, od.re
  78. vrev64.32 d3, d21 @ od.re, od.im
  79. veor d6, d20, d17 @ ev.re,-ev.im
  80. veor d2, d3, d16 @ -od.re, od.im
  81. vmla.f32 d20, d3, d4[1]
  82. vmla.f32 d20, d7, d5[1]
  83. vmla.f32 d6, d2, d4[1]
  84. vmla.f32 d6, d21, d5[1]
  85. vld1.32 {d4}, [r2,:64]! @ tcos[i]
  86. veor d7, d23, d16 @ -od.im, od.re
  87. vld1.32 {d5}, [r3,:64]! @ tsin[i]
  88. veor d24, d22, d17 @ ev.re,-ev.im
  89. vrev64.32 d3, d23 @ od.re, od.im
  90. pld [r2, #32]
  91. veor d2, d3, d16 @ -od.re, od.im
  92. pld [r3, #32]
  93. vmla.f32 d22, d3, d4[0]
  94. vmla.f32 d22, d7, d5[0]
  95. vmla.f32 d24, d2, d4[0]
  96. vmla.f32 d24, d23, d5[0]
  97. vld1.32 {d0}, [r0,:64]! @ d1[0,1]
  98. vld1.32 {d1}, [r1,:64], r8 @ d2[0,1]
  99. vst1.32 {d20}, [r7,:64]!
  100. vst1.32 {d6}, [lr,:64], r8
  101. vst1.32 {d22}, [r7,:64]!
  102. vst1.32 {d24}, [lr,:64], r8
  103. subs r12, r12, #2
  104. bgt 2b
  105. veor q1, q0, q8 @ -d1[0],d1[1], d2[0],-d2[1]
  106. vadd.f32 d0, d0, d3 @ d1[0]+d2[0], d1[1]-d2[1]
  107. vadd.f32 d1, d2, d1 @ -d1[0]+d2[0], d1[1]+d2[1]
  108. ldr r2, [r4, #8] @ sign_convention
  109. vmul.f32 q10, q0, q9 @ ev.re, ev.im, od.im, od.re
  110. add r0, r0, #4
  111. bfc r2, #0, #31
  112. vld1.32 {d0[0]}, [r0,:32]
  113. veor d7, d21, d16 @ -od.im, od.re
  114. vrev64.32 d3, d21 @ od.re, od.im
  115. veor d6, d20, d17 @ ev.re,-ev.im
  116. vld1.32 {d22}, [r5,:64]
  117. vdup.32 d1, r2
  118. vmov d23, d22
  119. veor d2, d3, d16 @ -od.re, od.im
  120. vtrn.32 d22, d23
  121. veor d0, d0, d1
  122. veor d23, d23, d17
  123. vmla.f32 d20, d3, d4[1]
  124. vmla.f32 d20, d7, d5[1]
  125. vmla.f32 d6, d2, d4[1]
  126. vmla.f32 d6, d21, d5[1]
  127. vadd.f32 d22, d22, d23
  128. vst1.32 {d20}, [r7,:64]
  129. vst1.32 {d6}, [lr,:64]
  130. vst1.32 {d0[0]}, [r0,:32]
  131. vst1.32 {d22}, [r5,:64]
  132. cmp r6, #0
  133. it eq
  134. popeq {r4-r8,pc}
  135. vmul.f32 d22, d22, d18
  136. vst1.32 {d22}, [r5,:64]
  137. add r0, r4, #20
  138. mov r1, r5
  139. bl X(ff_fft_permute_neon)
  140. add r0, r4, #20
  141. mov r1, r5
  142. pop {r4-r8,lr}
  143. b X(ff_fft_calc_neon)
  144. endfunc