Merge commit '994c4bc10751e39c7ed9f67ffd0c0dea5223daf2'
authorJames Almer <jamrial@gmail.com>
Sat, 21 Oct 2017 15:07:16 +0000 (12:07 -0300)
committerJames Almer <jamrial@gmail.com>
Sat, 21 Oct 2017 15:15:57 +0000 (12:15 -0300)
* commit '994c4bc10751e39c7ed9f67ffd0c0dea5223daf2':
  x86util: Port all macros to cpuflags

See d5f8a642f6eb1c6e305c41dabddd0fd36ffb3f77

Merged-by: James Almer <jamrial@gmail.com>
1  2 
libavcodec/x86/audiodsp.asm
libavfilter/x86/yadif-16.asm
libavutil/x86/x86util.asm
libswscale/x86/scale.asm

Simple merge
index 79d127d,0000000..9053b37
mode 100644,000000..100644
--- /dev/null
@@@ -1,317 -1,0 +1,293 @@@
- %macro PMINSD 3
- %if cpuflag(sse4)
-     pminsd %1, %2
- %else
-     mova    %3, %2
-     pcmpgtd %3, %1
-     pand    %1, %3
-     pandn   %3, %2
-     por     %1, %3
- %endif
- %endmacro
- %macro PMAXSD 3
- %if cpuflag(sse4)
-     pmaxsd %1, %2
- %else
-     mova    %3, %1
-     pcmpgtd %3, %2
-     pand    %1, %3
-     pandn   %3, %2
-     por     %1, %3
- %endif
- %endmacro
 +;*****************************************************************************
 +;* x86-optimized functions for yadif filter
 +;*
 +;* Copyright (C) 2006 Michael Niedermayer <michaelni@gmx.at>
 +;* Copyright (c) 2013 Daniel Kang <daniel.d.kang@gmail.com>
 +;* Copyright (c) 2011-2013 James Darnley <james.darnley@gmail.com>
 +;*
 +;* This file is part of FFmpeg.
 +;*
 +;* FFmpeg is free software; you can redistribute it and/or
 +;* modify it under the terms of the GNU Lesser General Public
 +;* License as published by the Free Software Foundation; either
 +;* version 2.1 of the License, or (at your option) any later version.
 +;*
 +;* FFmpeg is distributed in the hope that it will be useful,
 +;* but WITHOUT ANY WARRANTY; without even the implied warranty of
 +;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 +;* Lesser General Public License for more details.
 +;*
 +;* You should have received a copy of the GNU Lesser General Public
 +;* License along with FFmpeg; if not, write to the Free Software
 +;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 +;******************************************************************************
 +
 +%include "libavutil/x86/x86util.asm"
 +
 +SECTION_RODATA
 +
 +pw_1:    times 8 dw 1
 +pw_8000: times 8 dw 0x8000
 +pd_1:    times 4 dd 1
 +pd_8000: times 4 dd 0x8000
 +
 +SECTION .text
 +
 +%macro PABS 2
 +%if cpuflag(ssse3)
 +    pabsd %1, %1
 +%else
 +    pxor    %2, %2
 +    pcmpgtd %2, %1
 +    pxor    %1, %2
 +    psubd   %1, %2
 +%endif
 +%endmacro
 +
 +%macro PACK 1
 +%if cpuflag(sse4)
 +    packusdw %1, %1
 +%else
 +    psubd    %1, [pd_8000]
 +    packssdw %1, %1
 +    paddw    %1, [pw_8000]
 +%endif
 +%endmacro
 +
 +%macro PMAXUW 2
 +%if cpuflag(sse4)
 +    pmaxuw %1, %2
 +%else
 +    psubusw %1, %2
 +    paddusw %1, %2
 +%endif
 +%endmacro
 +
 +%macro CHECK 2
 +    movu      m2, [curq+t1+%1*2]
 +    movu      m3, [curq+t0+%2*2]
 +    mova      m4, m2
 +    mova      m5, m2
 +    pxor      m4, m3
 +    pavgw     m5, m3
 +    pand      m4, [pw_1]
 +    psubusw   m5, m4
 +    RSHIFT    m5, 2
 +    punpcklwd m5, m7
 +    mova      m4, m2
 +    psubusw   m2, m3
 +    psubusw   m3, m4
 +    PMAXUW    m2, m3
 +    mova      m3, m2
 +    mova      m4, m2
 +    RSHIFT    m3, 2
 +    RSHIFT    m4, 4
 +    punpcklwd m2, m7
 +    punpcklwd m3, m7
 +    punpcklwd m4, m7
 +    paddd     m2, m3
 +    paddd     m2, m4
 +%endmacro
 +
 +%macro CHECK1 0
 +    mova    m3, m0
 +    pcmpgtd m3, m2
 +    PMINSD  m0, m2, m6
 +    mova    m6, m3
 +    pand    m5, m3
 +    pandn   m3, m1
 +    por     m3, m5
 +    mova    m1, m3
 +%endmacro
 +
 +%macro CHECK2 0
 +    paddd   m6, [pd_1]
 +    pslld   m6, 30
 +    paddd   m2, m6
 +    mova    m3, m0
 +    pcmpgtd m3, m2
 +    PMINSD  m0, m2, m4
 +    pand    m5, m3
 +    pandn   m3, m1
 +    por     m3, m5
 +    mova    m1, m3
 +%endmacro
 +
 +; This version of CHECK2 has 3 fewer instructions on sets older than SSE4 but I
 +; am not sure whether it is any faster.  A rewrite or refactor of the filter
 +; code should make it possible to eliminate the move instruction at the end.  It
 +; exists to satisfy the expectation that the "score" values are in m1.
 +
 +; %macro CHECK2 0
 +;     mova    m3, m0
 +;     pcmpgtd m0, m2
 +;     pand    m0, m6
 +;     mova    m6, m0
 +;     pand    m5, m6
 +;     pand    m2, m0
 +;     pandn   m6, m1
 +;     pandn   m0, m3
 +;     por     m6, m5
 +;     por     m0, m2
 +;     mova    m1, m6
 +; %endmacro
 +
 +%macro LOAD 2
 +    movh      %1, %2
 +    punpcklwd %1, m7
 +%endmacro
 +
 +%macro FILTER 3
 +.loop%1:
 +    pxor         m7, m7
 +    LOAD         m0, [curq+t1]
 +    LOAD         m1, [curq+t0]
 +    LOAD         m2, [%2]
 +    LOAD         m3, [%3]
 +    mova         m4, m3
 +    paddd        m3, m2
 +    psrad        m3, 1
 +    mova   [rsp+ 0], m0
 +    mova   [rsp+16], m3
 +    mova   [rsp+32], m1
 +    psubd        m2, m4
 +    PABS         m2, m4
 +    LOAD         m3, [prevq+t1]
 +    LOAD         m4, [prevq+t0]
 +    psubd        m3, m0
 +    psubd        m4, m1
 +    PABS         m3, m5
 +    PABS         m4, m5
 +    paddd        m3, m4
 +    psrld        m2, 1
 +    psrld        m3, 1
 +    PMAXSD       m2, m3, m6
 +    LOAD         m3, [nextq+t1]
 +    LOAD         m4, [nextq+t0]
 +    psubd        m3, m0
 +    psubd        m4, m1
 +    PABS         m3, m5
 +    PABS         m4, m5
 +    paddd        m3, m4
 +    psrld        m3, 1
 +    PMAXSD       m2, m3, m6
 +    mova   [rsp+48], m2
 +
 +    paddd        m1, m0
 +    paddd        m0, m0
 +    psubd        m0, m1
 +    psrld        m1, 1
 +    PABS         m0, m2
 +
 +    movu         m2, [curq+t1-1*2]
 +    movu         m3, [curq+t0-1*2]
 +    mova         m4, m2
 +    psubusw      m2, m3
 +    psubusw      m3, m4
 +    PMAXUW       m2, m3
 +    mova         m3, m2
 +    RSHIFT       m3, 4
 +    punpcklwd    m2, m7
 +    punpcklwd    m3, m7
 +    paddd        m0, m2
 +    paddd        m0, m3
 +    psubd        m0, [pd_1]
 +
 +    CHECK -2, 0
 +    CHECK1
 +    CHECK -3, 1
 +    CHECK2
 +    CHECK 0, -2
 +    CHECK1
 +    CHECK 1, -3
 +    CHECK2
 +
 +    mova         m6, [rsp+48]
 +    cmp   DWORD r8m, 2
 +    jge .end%1
 +    LOAD         m2, [%2+t1*2]
 +    LOAD         m4, [%3+t1*2]
 +    LOAD         m3, [%2+t0*2]
 +    LOAD         m5, [%3+t0*2]
 +    paddd        m2, m4
 +    paddd        m3, m5
 +    psrld        m2, 1
 +    psrld        m3, 1
 +    mova         m4, [rsp+ 0]
 +    mova         m5, [rsp+16]
 +    mova         m7, [rsp+32]
 +    psubd        m2, m4
 +    psubd        m3, m7
 +    mova         m0, m5
 +    psubd        m5, m4
 +    psubd        m0, m7
 +    mova         m4, m2
 +    PMINSD       m2, m3, m7
 +    PMAXSD       m3, m4, m7
 +    PMAXSD       m2, m5, m7
 +    PMINSD       m3, m5, m7
 +    PMAXSD       m2, m0, m7
 +    PMINSD       m3, m0, m7
 +    pxor         m4, m4
 +    PMAXSD       m6, m3, m7
 +    psubd        m4, m2
 +    PMAXSD       m6, m4, m7
 +
 +.end%1:
 +    mova         m2, [rsp+16]
 +    mova         m3, m2
 +    psubd        m2, m6
 +    paddd        m3, m6
 +    PMAXSD       m1, m2, m7
 +    PMINSD       m1, m3, m7
 +    PACK         m1
 +
 +    movh     [dstq], m1
 +    add        dstq, mmsize/2
 +    add       prevq, mmsize/2
 +    add        curq, mmsize/2
 +    add       nextq, mmsize/2
 +    sub   DWORD r4m, mmsize/4
 +    jg .loop%1
 +%endmacro
 +
 +%macro YADIF 0
 +%if ARCH_X86_32
 +cglobal yadif_filter_line_16bit, 4, 6, 8, 80, dst, prev, cur, next, w, \
 +                                              prefs, mrefs, parity, mode
 +%else
 +cglobal yadif_filter_line_16bit, 4, 7, 8, 80, dst, prev, cur, next, w, \
 +                                              prefs, mrefs, parity, mode
 +%endif
 +%if ARCH_X86_32
 +    mov            r4, r5mp
 +    mov            r5, r6mp
 +    DECLARE_REG_TMP 4,5
 +%else
 +    movsxd         r5, DWORD r5m
 +    movsxd         r6, DWORD r6m
 +    DECLARE_REG_TMP 5,6
 +%endif
 +
 +    cmp DWORD paritym, 0
 +    je .parity0
 +    FILTER 1, prevq, curq
 +    jmp .ret
 +
 +.parity0:
 +    FILTER 0, curq, nextq
 +
 +.ret:
 +    RET
 +%endmacro
 +
 +INIT_XMM sse4
 +YADIF
 +INIT_XMM ssse3
 +YADIF
 +INIT_XMM sse2
 +YADIF
 +%if ARCH_X86_32
 +INIT_MMX mmxext
 +YADIF
 +%endif
      minps     %1, %3
      maxps     %1, %2
      cvtps2dq  %1, %1
- %endmacro
- %macro CLIPD_SSE41 3-4 ;  src/dst, min, max, unused
-     pminsd  %1, %3
-     pmaxsd  %1, %2
+ %else               ; src/dst, min, max, tmp
+     PMINSD    %1, %3, %4
+     PMAXSD    %1, %2, %4
+ %endif
  %endmacro
  
 -%macro VBROADCASTSS 2 ; dst xmm/ymm, src m32
 -%if cpuflag(avx)
 -    vbroadcastss %1, %2
 -%else ; sse
 -    movss        %1, %2
 -    shufps       %1, %1, 0
 +%macro VBROADCASTSS 2 ; dst xmm/ymm, src m32/xmm
 +%if cpuflag(avx2)
 +    vbroadcastss  %1, %2
 +%elif cpuflag(avx)
 +    %ifnum sizeof%2         ; avx1 register
 +        shufps  xmm%1, xmm%2, xmm%2, q0000
 +        %if sizeof%1 >= 32  ; mmsize>=32
 +            vinsertf128  %1, %1, xmm%1, 1
 +        %endif
 +    %else                   ; avx1 memory
 +        vbroadcastss  %1, %2
 +    %endif
 +%else
 +    %ifnum sizeof%2         ; sse register
 +        shufps  %1, %2, %2, q0000
 +    %else                   ; sse memory
 +        movss   %1, %2
 +        shufps  %1, %1, 0
 +    %endif
  %endif
  %endmacro
  
Simple merge