aacpsdsp.asm 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. ;******************************************************************************
  2. ;* SIMD optimized MPEG-4 Parametric Stereo decoding functions
  3. ;*
  4. ;* Copyright (C) 2015 James Almer
  5. ;*
  6. ;* This file is part of FFmpeg.
  7. ;*
  8. ;* FFmpeg is free software; you can redistribute it and/or
  9. ;* modify it under the terms of the GNU Lesser General Public
  10. ;* License as published by the Free Software Foundation; either
  11. ;* version 2.1 of the License, or (at your option) any later version.
  12. ;*
  13. ;* FFmpeg is distributed in the hope that it will be useful,
  14. ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. ;* Lesser General Public License for more details.
  17. ;*
  18. ;* You should have received a copy of the GNU Lesser General Public
  19. ;* License along with FFmpeg; if not, write to the Free Software
  20. ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21. ;******************************************************************************
  22. %include "libavutil/x86/x86util.asm"
  23. SECTION_RODATA
  24. ps_p1m1p1m1: dd 0, 0x80000000, 0, 0x80000000
  25. SECTION .text
  26. ;*************************************************************************
  27. ;void ff_ps_add_squares_<opt>(float *dst, const float (*src)[2], int n);
  28. ;*************************************************************************
  29. %macro PS_ADD_SQUARES 1
  30. cglobal ps_add_squares, 3, 3, %1, dst, src, n
  31. .loop:
  32. movaps m0, [srcq]
  33. movaps m1, [srcq+mmsize]
  34. mulps m0, m0
  35. mulps m1, m1
  36. %if cpuflag(sse3)
  37. haddps m0, m1
  38. %else
  39. movaps m3, m0
  40. movaps m4, m1
  41. shufps m3, m3, q0301
  42. shufps m4, m4, q0301
  43. addps m0, m3
  44. addps m1, m4
  45. shufps m0, m1, q2020
  46. %endif
  47. addps m0, [dstq]
  48. movaps [dstq], m0
  49. add dstq, mmsize
  50. add srcq, mmsize*2
  51. sub nd, mmsize/4
  52. jg .loop
  53. REP_RET
  54. %endmacro
  55. INIT_XMM sse
  56. PS_ADD_SQUARES 3
  57. INIT_XMM sse3
  58. PS_ADD_SQUARES 5
  59. ;*******************************************************************
  60. ;void ff_ps_mul_pair_single_sse(float (*dst)[2], float (*src0)[2],
  61. ; float *src1, int n);
  62. ;*******************************************************************
  63. INIT_XMM sse
  64. cglobal ps_mul_pair_single, 4, 5, 4, dst, src1, src2, n
  65. xor r4q, r4q
  66. .loop:
  67. movu m0, [src1q+r4q]
  68. movu m1, [src1q+r4q+mmsize]
  69. mova m2, [src2q]
  70. mova m3, m2
  71. unpcklps m2, m2
  72. unpckhps m3, m3
  73. mulps m0, m2
  74. mulps m1, m3
  75. mova [dstq+r4q], m0
  76. mova [dstq+r4q+mmsize], m1
  77. add src2q, mmsize
  78. add r4q, mmsize*2
  79. sub nd, mmsize/4
  80. jg .loop
  81. REP_RET
  82. ;***********************************************************************
  83. ;void ff_ps_stereo_interpolate_sse3(float (*l)[2], float (*r)[2],
  84. ; float h[2][4], float h_step[2][4],
  85. ; int len);
  86. ;***********************************************************************
  87. INIT_XMM sse3
  88. cglobal ps_stereo_interpolate, 5, 5, 6, l, r, h, h_step, n
  89. movaps m0, [hq]
  90. movaps m1, [h_stepq]
  91. cmp nd, 0
  92. jle .ret
  93. shl nd, 3
  94. add lq, nq
  95. add rq, nq
  96. neg nq
  97. align 16
  98. .loop:
  99. addps m0, m1
  100. movddup m2, [lq+nq]
  101. movddup m3, [rq+nq]
  102. movaps m4, m0
  103. movaps m5, m0
  104. unpcklps m4, m4
  105. unpckhps m5, m5
  106. mulps m2, m4
  107. mulps m3, m5
  108. addps m2, m3
  109. movsd [lq+nq], m2
  110. movhps [rq+nq], m2
  111. add nq, 8
  112. jl .loop
  113. .ret:
  114. REP_RET
  115. ;*******************************************************************
  116. ;void ff_ps_hybrid_analysis_<opt>(float (*out)[2], float (*in)[2],
  117. ; const float (*filter)[8][2],
  118. ; int stride, int n);
  119. ;*******************************************************************
  120. %macro PS_HYBRID_ANALYSIS_LOOP 3
  121. movu %1, [inq+mmsize*%3]
  122. movu m1, [inq+mmsize*(5-%3)+8]
  123. %if cpuflag(sse3)
  124. pshufd %2, %1, q2301
  125. pshufd m4, m1, q0123
  126. pshufd m1, m1, q1032
  127. pshufd m2, [filterq+nq+mmsize*%3], q2301
  128. addsubps %2, m4
  129. addsubps %1, m1
  130. %else
  131. mova m2, [filterq+nq+mmsize*%3]
  132. mova %2, %1
  133. mova m4, m1
  134. shufps %2, %2, q2301
  135. shufps m4, m4, q0123
  136. shufps m1, m1, q1032
  137. shufps m2, m2, q2301
  138. xorps m4, m7
  139. xorps m1, m7
  140. subps %2, m4
  141. subps %1, m1
  142. %endif
  143. mulps %2, m2
  144. mulps %1, m2
  145. %if %3
  146. addps m3, %2
  147. addps m0, %1
  148. %endif
  149. %endmacro
  150. %macro PS_HYBRID_ANALYSIS 0
  151. cglobal ps_hybrid_analysis, 5, 5, 8, out, in, filter, stride, n
  152. %if cpuflag(sse3)
  153. %define MOVH movsd
  154. %else
  155. %define MOVH movlps
  156. %endif
  157. shl strided, 3
  158. shl nd, 6
  159. add filterq, nq
  160. neg nq
  161. mova m7, [ps_p1m1p1m1]
  162. align 16
  163. .loop:
  164. PS_HYBRID_ANALYSIS_LOOP m0, m3, 0
  165. PS_HYBRID_ANALYSIS_LOOP m5, m6, 1
  166. PS_HYBRID_ANALYSIS_LOOP m5, m6, 2
  167. %if cpuflag(sse3)
  168. pshufd m3, m3, q2301
  169. xorps m0, m7
  170. hsubps m3, m0
  171. pshufd m1, m3, q0020
  172. pshufd m3, m3, q0031
  173. addps m1, m3
  174. movsd m2, [inq+6*8]
  175. %else
  176. mova m1, m3
  177. mova m2, m0
  178. shufps m1, m1, q2301
  179. shufps m2, m2, q2301
  180. subps m1, m3
  181. addps m2, m0
  182. unpcklps m3, m1, m2
  183. unpckhps m1, m2
  184. addps m1, m3
  185. movu m2, [inq+6*8] ; faster than movlps and no risk of overread
  186. %endif
  187. movss m3, [filterq+nq+8*6]
  188. SPLATD m3
  189. mulps m2, m3
  190. addps m1, m2
  191. MOVH [outq], m1
  192. add outq, strideq
  193. add nq, 64
  194. jl .loop
  195. REP_RET
  196. %endmacro
  197. INIT_XMM sse
  198. PS_HYBRID_ANALYSIS
  199. INIT_XMM sse3
  200. PS_HYBRID_ANALYSIS