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.

226 lines
5.7KB

  1. ;******************************************************************************
  2. ;* x86 optimized Format Conversion Utils
  3. ;* Copyright (c) 2008 Loren Merritt
  4. ;*
  5. ;* This file is part of FFmpeg.
  6. ;*
  7. ;* FFmpeg 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. ;* FFmpeg 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 FFmpeg; if not, write to the Free Software
  19. ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. ;******************************************************************************
  21. %include "x86inc.asm"
  22. %include "x86util.asm"
  23. SECTION_TEXT
  24. %macro PSWAPD_SSE 2
  25. pshufw %1, %2, 0x4e
  26. %endmacro
  27. %macro PSWAPD_3DN1 2
  28. movq %1, %2
  29. psrlq %1, 32
  30. punpckldq %1, %2
  31. %endmacro
  32. %macro FLOAT_TO_INT16_INTERLEAVE6 1
  33. ; void float_to_int16_interleave6_sse(int16_t *dst, const float **src, int len)
  34. cglobal float_to_int16_interleave6_%1, 2,7,0, dst, src, src1, src2, src3, src4, src5
  35. %ifdef ARCH_X86_64
  36. %define lend r10d
  37. mov lend, r2d
  38. %else
  39. %define lend dword r2m
  40. %endif
  41. mov src1q, [srcq+1*gprsize]
  42. mov src2q, [srcq+2*gprsize]
  43. mov src3q, [srcq+3*gprsize]
  44. mov src4q, [srcq+4*gprsize]
  45. mov src5q, [srcq+5*gprsize]
  46. mov srcq, [srcq]
  47. sub src1q, srcq
  48. sub src2q, srcq
  49. sub src3q, srcq
  50. sub src4q, srcq
  51. sub src5q, srcq
  52. .loop:
  53. cvtps2pi mm0, [srcq]
  54. cvtps2pi mm1, [srcq+src1q]
  55. cvtps2pi mm2, [srcq+src2q]
  56. cvtps2pi mm3, [srcq+src3q]
  57. cvtps2pi mm4, [srcq+src4q]
  58. cvtps2pi mm5, [srcq+src5q]
  59. packssdw mm0, mm3
  60. packssdw mm1, mm4
  61. packssdw mm2, mm5
  62. pswapd mm3, mm0
  63. punpcklwd mm0, mm1
  64. punpckhwd mm1, mm2
  65. punpcklwd mm2, mm3
  66. pswapd mm3, mm0
  67. punpckldq mm0, mm2
  68. punpckhdq mm2, mm1
  69. punpckldq mm1, mm3
  70. movq [dstq ], mm0
  71. movq [dstq+16], mm2
  72. movq [dstq+ 8], mm1
  73. add srcq, 8
  74. add dstq, 24
  75. sub lend, 2
  76. jg .loop
  77. emms
  78. RET
  79. %endmacro ; FLOAT_TO_INT16_INTERLEAVE6
  80. %define pswapd PSWAPD_SSE
  81. FLOAT_TO_INT16_INTERLEAVE6 sse
  82. %define cvtps2pi pf2id
  83. %define pswapd PSWAPD_3DN1
  84. FLOAT_TO_INT16_INTERLEAVE6 3dnow
  85. %undef pswapd
  86. FLOAT_TO_INT16_INTERLEAVE6 3dn2
  87. %undef cvtps2pi
  88. ;-----------------------------------------------------------------------------
  89. ; void ff_float_interleave6(float *dst, const float **src, unsigned int len);
  90. ;-----------------------------------------------------------------------------
  91. %macro FLOAT_INTERLEAVE6 2
  92. cglobal float_interleave6_%1, 2,7,%2, dst, src, src1, src2, src3, src4, src5
  93. %ifdef ARCH_X86_64
  94. %define lend r10d
  95. mov lend, r2d
  96. %else
  97. %define lend dword r2m
  98. %endif
  99. mov src1q, [srcq+1*gprsize]
  100. mov src2q, [srcq+2*gprsize]
  101. mov src3q, [srcq+3*gprsize]
  102. mov src4q, [srcq+4*gprsize]
  103. mov src5q, [srcq+5*gprsize]
  104. mov srcq, [srcq]
  105. sub src1q, srcq
  106. sub src2q, srcq
  107. sub src3q, srcq
  108. sub src4q, srcq
  109. sub src5q, srcq
  110. .loop:
  111. %ifidn %1, sse
  112. movaps m0, [srcq]
  113. movaps m1, [srcq+src1q]
  114. movaps m2, [srcq+src2q]
  115. movaps m3, [srcq+src3q]
  116. movaps m4, [srcq+src4q]
  117. movaps m5, [srcq+src5q]
  118. SBUTTERFLYPS 0, 1, 6
  119. SBUTTERFLYPS 2, 3, 6
  120. SBUTTERFLYPS 4, 5, 6
  121. movaps m6, m4
  122. shufps m4, m0, 0xe4
  123. movlhps m0, m2
  124. movhlps m6, m2
  125. movaps [dstq ], m0
  126. movaps [dstq+16], m4
  127. movaps [dstq+32], m6
  128. movaps m6, m5
  129. shufps m5, m1, 0xe4
  130. movlhps m1, m3
  131. movhlps m6, m3
  132. movaps [dstq+48], m1
  133. movaps [dstq+64], m5
  134. movaps [dstq+80], m6
  135. %else ; mmx
  136. movq m0, [srcq]
  137. movq m1, [srcq+src1q]
  138. movq m2, [srcq+src2q]
  139. movq m3, [srcq+src3q]
  140. movq m4, [srcq+src4q]
  141. movq m5, [srcq+src5q]
  142. SBUTTERFLY dq, 0, 1, 6
  143. SBUTTERFLY dq, 2, 3, 6
  144. SBUTTERFLY dq, 4, 5, 6
  145. movq [dstq ], m0
  146. movq [dstq+ 8], m2
  147. movq [dstq+16], m4
  148. movq [dstq+24], m1
  149. movq [dstq+32], m3
  150. movq [dstq+40], m5
  151. %endif
  152. add srcq, mmsize
  153. add dstq, mmsize*6
  154. sub lend, mmsize/4
  155. jg .loop
  156. %ifidn %1, mmx
  157. emms
  158. %endif
  159. REP_RET
  160. %endmacro
  161. INIT_MMX
  162. FLOAT_INTERLEAVE6 mmx, 0
  163. INIT_XMM
  164. FLOAT_INTERLEAVE6 sse, 7
  165. ;-----------------------------------------------------------------------------
  166. ; void ff_float_interleave2(float *dst, const float **src, unsigned int len);
  167. ;-----------------------------------------------------------------------------
  168. %macro FLOAT_INTERLEAVE2 2
  169. cglobal float_interleave2_%1, 3,4,%2, dst, src, len, src1
  170. mov src1q, [srcq+gprsize]
  171. mov srcq, [srcq ]
  172. sub src1q, srcq
  173. .loop
  174. MOVPS m0, [srcq ]
  175. MOVPS m1, [srcq+src1q ]
  176. MOVPS m3, [srcq +mmsize]
  177. MOVPS m4, [srcq+src1q+mmsize]
  178. MOVPS m2, m0
  179. PUNPCKLDQ m0, m1
  180. PUNPCKHDQ m2, m1
  181. MOVPS m1, m3
  182. PUNPCKLDQ m3, m4
  183. PUNPCKHDQ m1, m4
  184. MOVPS [dstq ], m0
  185. MOVPS [dstq+1*mmsize], m2
  186. MOVPS [dstq+2*mmsize], m3
  187. MOVPS [dstq+3*mmsize], m1
  188. add srcq, mmsize*2
  189. add dstq, mmsize*4
  190. sub lend, mmsize/2
  191. jg .loop
  192. %ifidn %1, mmx
  193. emms
  194. %endif
  195. REP_RET
  196. %endmacro
  197. INIT_MMX
  198. %define MOVPS movq
  199. %define PUNPCKLDQ punpckldq
  200. %define PUNPCKHDQ punpckhdq
  201. FLOAT_INTERLEAVE2 mmx, 0
  202. INIT_XMM
  203. %define MOVPS movaps
  204. %define PUNPCKLDQ unpcklps
  205. %define PUNPCKHDQ unpckhps
  206. FLOAT_INTERLEAVE2 sse, 5