]> git.sesse.net Git - ffmpeg/blob - libavfilter/x86/yadif.asm
Merge commit '200e8ac92007bc2fe30da05d3bd00ab620842a6b'
[ffmpeg] / libavfilter / x86 / yadif.asm
1 ;*****************************************************************************
2 ;* x86-optimized functions for yadif filter
3 ;*
4 ;* Copyright (C) 2006 Michael Niedermayer <michaelni@gmx.at>
5 ;* Copyright (c) 2013 Daniel Kang <daniel.d.kang@gmail.com>
6 ;*
7 ;* This file is part of FFmpeg.
8 ;*
9 ;* FFmpeg is free software; you can redistribute it and/or modify
10 ;* it under the terms of the GNU General Public License as published by
11 ;* the Free Software Foundation; either version 2 of the License, or
12 ;* (at your option) any later version.
13 ;*
14 ;* FFmpeg is distributed in the hope that it will be useful,
15 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 ;* GNU General Public License for more details.
18 ;*
19 ;* You should have received a copy of the GNU General Public License along
20 ;* with FFmpeg; if not, write to the Free Software Foundation, Inc.,
21 ;* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 ;******************************************************************************
23
24 %include "libavutil/x86/x86util.asm"
25
26 SECTION_RODATA
27
28 pb_1: times 16 db 1
29 pw_1: times  8 dw 1
30
31 SECTION .text
32
33 %macro CHECK 2
34     movu      m2, [curq+mrefsq+%1]
35     movu      m3, [curq+prefsq+%2]
36     mova      m4, m2
37     mova      m5, m2
38     pxor      m4, m3
39     pavgb     m5, m3
40     pand      m4, [pb_1]
41     psubusb   m5, m4
42 %if mmsize == 16
43     psrldq    m5, 1
44 %else
45     psrlq     m5, 8
46 %endif
47     punpcklbw m5, m7
48     mova      m4, m2
49     psubusb   m2, m3
50     psubusb   m3, m4
51     pmaxub    m2, m3
52     mova      m3, m2
53     mova      m4, m2
54 %if mmsize == 16
55     psrldq    m3, 1
56     psrldq    m4, 2
57 %else
58     psrlq     m3, 8
59     psrlq     m4, 16
60 %endif
61     punpcklbw m2, m7
62     punpcklbw m3, m7
63     punpcklbw m4, m7
64     paddw     m2, m3
65     paddw     m2, m4
66 %endmacro
67
68 %macro CHECK1 0
69     mova    m3, m0
70     pcmpgtw m3, m2
71     pminsw  m0, m2
72     mova    m6, m3
73     pand    m5, m3
74     pandn   m3, m1
75     por     m3, m5
76     mova    m1, m3
77 %endmacro
78
79 %macro CHECK2 0
80     paddw   m6, [pw_1]
81     psllw   m6, 14
82     paddsw  m2, m6
83     mova    m3, m0
84     pcmpgtw m3, m2
85     pminsw  m0, m2
86     pand    m5, m3
87     pandn   m3, m1
88     por     m3, m5
89     mova    m1, m3
90 %endmacro
91
92 %macro LOAD 2
93     movh      m%1, %2
94     punpcklbw m%1, m7
95 %endmacro
96
97 %macro FILTER 3
98 .loop%1:
99     pxor         m7, m7
100     LOAD          0, [curq+mrefsq]
101     LOAD          1, [curq+prefsq]
102     LOAD          2, [%2]
103     LOAD          3, [%3]
104     mova         m4, m3
105     paddw        m3, m2
106     psraw        m3, 1
107     mova   [rsp+ 0], m0
108     mova   [rsp+16], m3
109     mova   [rsp+32], m1
110     psubw        m2, m4
111     ABS1         m2, m4
112     LOAD          3, [prevq+mrefsq]
113     LOAD          4, [prevq+prefsq]
114     psubw        m3, m0
115     psubw        m4, m1
116     ABS1         m3, m5
117     ABS1         m4, m5
118     paddw        m3, m4
119     psrlw        m2, 1
120     psrlw        m3, 1
121     pmaxsw       m2, m3
122     LOAD          3, [nextq+mrefsq]
123     LOAD          4, [nextq+prefsq]
124     psubw        m3, m0
125     psubw        m4, m1
126     ABS1         m3, m5
127     ABS1         m4, m5
128     paddw        m3, m4
129     psrlw        m3, 1
130     pmaxsw       m2, m3
131     mova   [rsp+48], m2
132
133     paddw        m1, m0
134     paddw        m0, m0
135     psubw        m0, m1
136     psrlw        m1, 1
137     ABS1         m0, m2
138
139     movu         m2, [curq+mrefsq-1]
140     movu         m3, [curq+prefsq-1]
141     mova         m4, m2
142     psubusb      m2, m3
143     psubusb      m3, m4
144     pmaxub       m2, m3
145 %if mmsize == 16
146     mova         m3, m2
147     psrldq       m3, 2
148 %else
149     pshufw       m3, m2, q0021
150 %endif
151     punpcklbw    m2, m7
152     punpcklbw    m3, m7
153     paddw        m0, m2
154     paddw        m0, m3
155     psubw        m0, [pw_1]
156
157     CHECK -2, 0
158     CHECK1
159     CHECK -3, 1
160     CHECK2
161     CHECK 0, -2
162     CHECK1
163     CHECK 1, -3
164     CHECK2
165
166     mova         m6, [rsp+48]
167     cmp DWORD modem, 2
168     jge .end%1
169     LOAD          2, [%2+mrefsq*2]
170     LOAD          4, [%3+mrefsq*2]
171     LOAD          3, [%2+prefsq*2]
172     LOAD          5, [%3+prefsq*2]
173     paddw        m2, m4
174     paddw        m3, m5
175     psrlw        m2, 1
176     psrlw        m3, 1
177     mova         m4, [rsp+ 0]
178     mova         m5, [rsp+16]
179     mova         m7, [rsp+32]
180     psubw        m2, m4
181     psubw        m3, m7
182     mova         m0, m5
183     psubw        m5, m4
184     psubw        m0, m7
185     mova         m4, m2
186     pminsw       m2, m3
187     pmaxsw       m3, m4
188     pmaxsw       m2, m5
189     pminsw       m3, m5
190     pmaxsw       m2, m0
191     pminsw       m3, m0
192     pxor         m4, m4
193     pmaxsw       m6, m3
194     psubw        m4, m2
195     pmaxsw       m6, m4
196
197 .end%1:
198     mova         m2, [rsp+16]
199     mova         m3, m2
200     psubw        m2, m6
201     paddw        m3, m6
202     pmaxsw       m1, m2
203     pminsw       m1, m3
204     packuswb     m1, m1
205
206     movh     [dstq], m1
207     add        dstq, mmsize/2
208     add       prevq, mmsize/2
209     add        curq, mmsize/2
210     add       nextq, mmsize/2
211     sub          wd, mmsize/2
212     jg .loop%1
213 %endmacro
214
215 %macro YADIF 0
216 cglobal yadif_filter_line, 7, 7, 8, 16*5, dst, prev, cur, next, w, prefs, \
217                                           mrefs, parity, mode
218     test             wq, wq
219     jle .ret
220     movsxdifnidn prefsq, prefsd
221     movsxdifnidn mrefsq, mrefsd
222
223     cmp   DWORD paritym, 0
224     je .parity0
225     FILTER 1, prevq, curq
226     jmp .ret
227
228 .parity0:
229     FILTER 0, curq, nextq
230
231 .ret:
232     RET
233 %endmacro
234
235 INIT_XMM ssse3
236 YADIF
237 INIT_XMM sse2
238 YADIF
239 %if ARCH_X86_32
240 INIT_MMX mmxext
241 YADIF
242 %endif