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.

89 lines
2.4KB

  1. ;******************************************************************************
  2. ;* V210 SIMD unpack
  3. ;* Copyright (c) 2011 Loren Merritt <lorenm@u.washington.edu>
  4. ;* Copyright (c) 2011 Kieran Kunhya <kieran@kunhya.com>
  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. v210_mask: times 4 dd 0x3ff
  25. v210_mult: dw 64,4,64,4,64,4,64,4
  26. v210_luma_shuf: db 8,9,0,1,2,3,12,13,4,5,6,7,-1,-1,-1,-1
  27. v210_chroma_shuf: db 0,1,8,9,6,7,-1,-1,2,3,4,5,12,13,-1,-1
  28. SECTION .text
  29. %macro v210_planar_unpack 2
  30. ; v210_planar_unpack(const uint32_t *src, uint16_t *y, uint16_t *u, uint16_t *v, int width)
  31. cglobal v210_planar_unpack_%1_%2, 5, 5, 7
  32. movsxdifnidn r4, r4d
  33. lea r1, [r1+2*r4]
  34. add r2, r4
  35. add r3, r4
  36. neg r4
  37. mova m3, [v210_mult]
  38. mova m4, [v210_mask]
  39. mova m5, [v210_luma_shuf]
  40. mova m6, [v210_chroma_shuf]
  41. .loop
  42. %ifidn %1, unaligned
  43. movu m0, [r0]
  44. %else
  45. mova m0, [r0]
  46. %endif
  47. pmullw m1, m0, m3
  48. psrld m0, 10
  49. psrlw m1, 6 ; u0 v0 y1 y2 v1 u2 y4 y5
  50. pand m0, m4 ; y0 __ u1 __ y3 __ v2 __
  51. shufps m2, m1, m0, 0x8d ; y1 y2 y4 y5 y0 __ y3 __
  52. pshufb m2, m5 ; y0 y1 y2 y3 y4 y5 __ __
  53. movu [r1+2*r4], m2
  54. shufps m1, m0, 0xd8 ; u0 v0 v1 u2 u1 __ v2 __
  55. pshufb m1, m6 ; u0 u1 u2 __ v0 v1 v2 __
  56. movq [r2+r4], m1
  57. movhps [r3+r4], m1
  58. add r0, mmsize
  59. add r4, 6
  60. jl .loop
  61. REP_RET
  62. %endmacro
  63. INIT_XMM
  64. v210_planar_unpack unaligned, ssse3
  65. %if HAVE_AVX_EXTERNAL
  66. INIT_AVX
  67. v210_planar_unpack unaligned, avx
  68. %endif
  69. INIT_XMM
  70. v210_planar_unpack aligned, ssse3
  71. %if HAVE_AVX_EXTERNAL
  72. INIT_AVX
  73. v210_planar_unpack aligned, avx
  74. %endif