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.

151 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. function ff_rdft_calc_neon, export=1
  23. push {r4-r8,lr}
  24. ldr r6, [r0, #4] @ inverse
  25. mov r4, r0
  26. mov r5, r1
  27. lsls r6, r6, #31
  28. bne 1f
  29. add r0, r4, #20
  30. bl X(ff_fft_permute_neon)
  31. add r0, r4, #20
  32. mov r1, r5
  33. bl X(ff_fft_calc_neon)
  34. 1:
  35. ldr r12, [r4, #0] @ nbits
  36. mov r2, #1
  37. lsl r12, r2, r12
  38. add r0, r5, #8
  39. add r1, r5, r12, lsl #2
  40. lsr r12, r12, #2
  41. ldr r2, [r4, #12] @ tcos
  42. sub r12, r12, #2
  43. ldr r3, [r4, #16] @ tsin
  44. mov r7, r0
  45. sub r1, r1, #8
  46. mov lr, r1
  47. mov r8, #-8
  48. vld1.32 {d0}, [r0,:64]! @ d1[0,1]
  49. vld1.32 {d1}, [r1,:64], r8 @ d2[0,1]
  50. vld1.32 {d4}, [r2,:64]! @ tcos[i]
  51. vld1.32 {d5}, [r3,:64]! @ tsin[i]
  52. vmov.f32 d18, #0.5 @ k1
  53. vdup.32 d19, r6
  54. pld [r0, #32]
  55. veor d19, d18, d19 @ k2
  56. vmov.i32 d16, #0
  57. vmov.i32 d17, #1<<31
  58. pld [r1, #-32]
  59. vtrn.32 d16, d17
  60. pld [r2, #32]
  61. vrev64.32 d16, d16 @ d16=1,0 d17=0,1
  62. pld [r3, #32]
  63. 2:
  64. veor q1, q0, q8 @ -d1[0],d1[1], d2[0],-d2[1]
  65. vld1.32 {d24}, [r0,:64]! @ d1[0,1]
  66. vadd.f32 d0, d0, d3 @ d1[0]+d2[0], d1[1]-d2[1]
  67. vld1.32 {d25}, [r1,:64], r8 @ d2[0,1]
  68. vadd.f32 d1, d2, d1 @ -d1[0]+d2[0], d1[1]+d2[1]
  69. veor q3, q12, q8 @ -d1[0],d1[1], d2[0],-d2[1]
  70. pld [r0, #32]
  71. vmul.f32 q10, q0, q9 @ ev.re, ev.im, od.im, od.re
  72. pld [r1, #-32]
  73. vadd.f32 d0, d24, d7 @ d1[0]+d2[0], d1[1]-d2[1]
  74. vadd.f32 d1, d6, d25 @ -d1[0]+d2[0], d1[1]+d2[1]
  75. vmul.f32 q11, q0, q9 @ ev.re, ev.im, od.im, od.re
  76. veor d7, d21, d16 @ -od.im, od.re
  77. vrev64.32 d3, d21 @ od.re, od.im
  78. veor d6, d20, d17 @ ev.re,-ev.im
  79. veor d2, d3, d16 @ -od.re, od.im
  80. vmla.f32 d20, d3, d4[1]
  81. vmla.f32 d20, d7, d5[1]
  82. vmla.f32 d6, d2, d4[1]
  83. vmla.f32 d6, d21, d5[1]
  84. vld1.32 {d4}, [r2,:64]! @ tcos[i]
  85. veor d7, d23, d16 @ -od.im, od.re
  86. vld1.32 {d5}, [r3,:64]! @ tsin[i]
  87. veor d24, d22, d17 @ ev.re,-ev.im
  88. vrev64.32 d3, d23 @ od.re, od.im
  89. pld [r2, #32]
  90. veor d2, d3, d16 @ -od.re, od.im
  91. pld [r3, #32]
  92. vmla.f32 d22, d3, d4[0]
  93. vmla.f32 d22, d7, d5[0]
  94. vmla.f32 d24, d2, d4[0]
  95. vmla.f32 d24, d23, d5[0]
  96. vld1.32 {d0}, [r0,:64]! @ d1[0,1]
  97. vld1.32 {d1}, [r1,:64], r8 @ d2[0,1]
  98. vst1.32 {d20}, [r7,:64]!
  99. vst1.32 {d6}, [lr,:64], r8
  100. vst1.32 {d22}, [r7,:64]!
  101. vst1.32 {d24}, [lr,:64], r8
  102. subs r12, r12, #2
  103. bgt 2b
  104. veor q1, q0, q8 @ -d1[0],d1[1], d2[0],-d2[1]
  105. vadd.f32 d0, d0, d3 @ d1[0]+d2[0], d1[1]-d2[1]
  106. vadd.f32 d1, d2, d1 @ -d1[0]+d2[0], d1[1]+d2[1]
  107. ldr r2, [r4, #8] @ sign_convention
  108. vmul.f32 q10, q0, q9 @ ev.re, ev.im, od.im, od.re
  109. add r0, r0, #4
  110. bfc r2, #0, #31
  111. vld1.32 {d0[0]}, [r0,:32]
  112. veor d7, d21, d16 @ -od.im, od.re
  113. vrev64.32 d3, d21 @ od.re, od.im
  114. veor d6, d20, d17 @ ev.re,-ev.im
  115. vld1.32 {d22}, [r5,:64]
  116. vdup.32 d1, r2
  117. vmov d23, d22
  118. veor d2, d3, d16 @ -od.re, od.im
  119. vtrn.32 d22, d23
  120. veor d0, d0, d1
  121. veor d23, d23, d17
  122. vmla.f32 d20, d3, d4[1]
  123. vmla.f32 d20, d7, d5[1]
  124. vmla.f32 d6, d2, d4[1]
  125. vmla.f32 d6, d21, d5[1]
  126. vadd.f32 d22, d22, d23
  127. vst1.32 {d20}, [r7,:64]
  128. vst1.32 {d6}, [lr,:64]
  129. vst1.32 {d0[0]}, [r0,:32]
  130. vst1.32 {d22}, [r5,:64]
  131. cmp r6, #0
  132. it eq
  133. popeq {r4-r8,pc}
  134. vmul.f32 d22, d22, d18
  135. vst1.32 {d22}, [r5,:64]
  136. add r0, r4, #20
  137. mov r1, r5
  138. bl X(ff_fft_permute_neon)
  139. add r0, r4, #20
  140. mov r1, r5
  141. pop {r4-r8,lr}
  142. b X(ff_fft_calc_neon)
  143. endfunc