Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. ;*****************************************************************************
  2. ;* x86-optimized functions for volume filter
  3. ;* Copyright (c) 2012 Justin Ruggles <justin.ruggles@gmail.com>
  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.  
  22. %include "libavutil/x86/x86util.asm"
  23.  
  24. SECTION_RODATA 32
  25.  
  26. pd_1_256:     times 4 dq 0x3F70000000000000
  27. pd_int32_max: times 4 dq 0x41DFFFFFFFC00000
  28. pw_1:         times 8 dw 1
  29. pw_128:       times 8 dw 128
  30. pq_128:       times 2 dq 128
  31.  
  32. SECTION_TEXT
  33.  
  34. ;------------------------------------------------------------------------------
  35. ; void ff_scale_samples_s16(uint8_t *dst, const uint8_t *src, int len,
  36. ;                           int volume)
  37. ;------------------------------------------------------------------------------
  38.  
  39. INIT_XMM sse2
  40. cglobal scale_samples_s16, 4,4,4, dst, src, len, volume
  41.     movd        m0, volumem
  42.     pshuflw     m0, m0, 0
  43.     punpcklwd   m0, [pw_1]
  44.     mova        m1, [pw_128]
  45.     lea       lenq, [lend*2-mmsize]
  46. .loop:
  47.     ; dst[i] = av_clip_int16((src[i] * volume + 128) >> 8);
  48.     mova        m2, [srcq+lenq]
  49.     punpcklwd   m3, m2, m1
  50.     punpckhwd   m2, m1
  51.     pmaddwd     m3, m0
  52.     pmaddwd     m2, m0
  53.     psrad       m3, 8
  54.     psrad       m2, 8
  55.     packssdw    m3, m2
  56.     mova  [dstq+lenq], m3
  57.     sub       lenq, mmsize
  58.     jge .loop
  59.     REP_RET
  60.  
  61. ;------------------------------------------------------------------------------
  62. ; void ff_scale_samples_s32(uint8_t *dst, const uint8_t *src, int len,
  63. ;                           int volume)
  64. ;------------------------------------------------------------------------------
  65.  
  66. %macro SCALE_SAMPLES_S32 0
  67. cglobal scale_samples_s32, 4,4,4, dst, src, len, volume
  68. %if ARCH_X86_32 && cpuflag(avx)
  69.     vbroadcastss   xmm2, volumem
  70. %else
  71.     movd           xmm2, volumed
  72.     pshufd         xmm2, xmm2, 0
  73. %endif
  74.     CVTDQ2PD         m2, xmm2
  75.     mulpd            m2, m2, [pd_1_256]
  76.     mova             m3, [pd_int32_max]
  77.     lea            lenq, [lend*4-mmsize]
  78. .loop:
  79.     CVTDQ2PD         m0, [srcq+lenq         ]
  80.     CVTDQ2PD         m1, [srcq+lenq+mmsize/2]
  81.     mulpd            m0, m0, m2
  82.     mulpd            m1, m1, m2
  83.     minpd            m0, m0, m3
  84.     minpd            m1, m1, m3
  85.     cvtpd2dq       xmm0, m0
  86.     cvtpd2dq       xmm1, m1
  87. %if cpuflag(avx)
  88.     vmovdqa [dstq+lenq         ], xmm0
  89.     vmovdqa [dstq+lenq+mmsize/2], xmm1
  90. %else
  91.     movq    [dstq+lenq         ], xmm0
  92.     movq    [dstq+lenq+mmsize/2], xmm1
  93. %endif
  94.     sub            lenq, mmsize
  95.     jge .loop
  96.     REP_RET
  97. %endmacro
  98.  
  99. INIT_XMM sse2
  100. %define CVTDQ2PD cvtdq2pd
  101. SCALE_SAMPLES_S32
  102. %if HAVE_AVX_EXTERNAL
  103. %define CVTDQ2PD vcvtdq2pd
  104. INIT_YMM avx
  105. SCALE_SAMPLES_S32
  106. %endif
  107. %undef CVTDQ2PD
  108.  
  109. ; NOTE: This is not bit-identical with the C version because it clips to
  110. ;       [-INT_MAX, INT_MAX] instead of [INT_MIN, INT_MAX]
  111.  
  112. INIT_XMM ssse3, atom
  113. cglobal scale_samples_s32, 4,4,8, dst, src, len, volume
  114.     movd        m4, volumem
  115.     pshufd      m4, m4, 0
  116.     mova        m5, [pq_128]
  117.     pxor        m6, m6
  118.     lea       lenq, [lend*4-mmsize]
  119. .loop:
  120.     ; src[i] = av_clipl_int32((src[i] * volume + 128) >> 8);
  121.     mova        m7, [srcq+lenq]
  122.     pabsd       m3, m7
  123.     pshufd      m0, m3, q0100
  124.     pshufd      m1, m3, q0302
  125.     pmuludq     m0, m4
  126.     pmuludq     m1, m4
  127.     paddq       m0, m5
  128.     paddq       m1, m5
  129.     psrlq       m0, 7
  130.     psrlq       m1, 7
  131.     shufps      m2, m0, m1, q3131
  132.     shufps      m0, m0, m1, q2020
  133.     pcmpgtd     m2, m6
  134.     por         m0, m2
  135.     psrld       m0, 1
  136.     psignd      m0, m7
  137.     mova  [dstq+lenq], m0
  138.     sub       lenq, mmsize
  139.     jge .loop
  140.     REP_RET
  141.