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.

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