]> git.sesse.net Git - ffmpeg/blob - libavfilter/x86/yadif-10.asm
yadif: remove an 'm' from the LOAD macro definition
[ffmpeg] / libavfilter / x86 / yadif-10.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 ;* Copyright (c) 2011-2013 James Darnley <james.darnley@gmail.com>
7 ;*
8 ;* This file is part of FFmpeg.
9 ;*
10 ;* FFmpeg is free software; you can redistribute it and/or modify
11 ;* it under the terms of the GNU General Public License as published by
12 ;* the Free Software Foundation; either version 2 of the License, or
13 ;* (at your option) any later version.
14 ;*
15 ;* FFmpeg is distributed in the hope that it will be useful,
16 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 ;* GNU General Public License for more details.
19 ;*
20 ;* You should have received a copy of the GNU General Public License along
21 ;* with FFmpeg; if not, write to the Free Software Foundation, Inc.,
22 ;* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23 ;******************************************************************************
24
25 %include "libavutil/x86/x86util.asm"
26
27 SECTION_RODATA
28
29 pw_1: times 8 dw 1
30
31 SECTION .text
32
33 %macro PABS 2
34 %if cpuflag(ssse3)
35     pabsw %1, %1
36 %else
37     pxor    %2, %2
38     pcmpgtw %2, %1
39     pxor    %1, %2
40     psubw   %1, %2
41 %endif
42 %endmacro
43
44 %macro PMAXUW 2
45 %if cpuflag(sse4)
46     pmaxuw %1, %2
47 %else
48     psubusw %1, %2
49     paddusw %1, %2
50 %endif
51 %endmacro
52
53 %macro CHECK 2
54     movu      m2, [curq+t1+%1*2]
55     movu      m3, [curq+t0+%2*2]
56     mova      m4, m2
57     mova      m5, m2
58     pxor      m4, m3
59     pavgw     m5, m3
60     pand      m4, [pw_1]
61     psubusw   m5, m4
62 %if mmsize == 16
63     psrldq    m5, 2
64 %else
65     psrlq     m5, 16
66 %endif
67     mova      m4, m2
68     psubusw   m2, m3
69     psubusw   m3, m4
70     PMAXUW    m2, m3
71     mova      m3, m2
72     mova      m4, m2
73 %if mmsize == 16
74     psrldq    m3, 2
75     psrldq    m4, 4
76 %else
77     psrlq     m3, 16
78     psrlq     m4, 32
79 %endif
80     paddw     m2, m3
81     paddw     m2, m4
82 %endmacro
83
84 %macro CHECK1 0
85     mova    m3, m0
86     pcmpgtw m3, m2
87     pminsw  m0, m2
88     mova    m6, m3
89     pand    m5, m3
90     pandn   m3, m1
91     por     m3, m5
92     mova    m1, m3
93 %endmacro
94
95 ; %macro CHECK2 0
96 ;     paddw   m6, [pw_1]
97 ;     psllw   m6, 14
98 ;     paddsw  m2, m6
99 ;     mova    m3, m0
100 ;     pcmpgtw m3, m2
101 ;     pminsw  m0, m2
102 ;     pand    m5, m3
103 ;     pandn   m3, m1
104 ;     por     m3, m5
105 ;     mova    m1, m3
106 ; %endmacro
107
108 ; This version of CHECK2 is required for 14-bit samples.  The left-shift trick
109 ; in the old code is not large enough to correctly select pixels or scores.
110
111 %macro CHECK2 0
112     mova    m3, m0
113     pcmpgtw m0, m2
114     pand    m0, m6
115     mova    m6, m0
116     pand    m5, m6
117     pand    m2, m0
118     pandn   m6, m1
119     pandn   m0, m3
120     por     m6, m5
121     por     m0, m2
122     mova    m1, m6
123 %endmacro
124
125 %macro LOAD 2
126     movu      %1, %2
127 %endmacro
128
129 %macro FILTER 3
130 .loop%1:
131     pxor         m7, m7
132     LOAD         m0, [curq+t1]
133     LOAD         m1, [curq+t0]
134     LOAD         m2, [%2]
135     LOAD         m3, [%3]
136     mova         m4, m3
137     paddw        m3, m2
138     psraw        m3, 1
139     mova   [rsp+ 0], m0
140     mova   [rsp+16], m3
141     mova   [rsp+32], m1
142     psubw        m2, m4
143     PABS         m2, m4
144     LOAD         m3, [prevq+t1]
145     LOAD         m4, [prevq+t0]
146     psubw        m3, m0
147     psubw        m4, m1
148     PABS         m3, m5
149     PABS         m4, m5
150     paddw        m3, m4
151     psrlw        m2, 1
152     psrlw        m3, 1
153     pmaxsw       m2, m3
154     LOAD         m3, [nextq+t1]
155     LOAD         m4, [nextq+t0]
156     psubw        m3, m0
157     psubw        m4, m1
158     PABS         m3, m5
159     PABS         m4, m5
160     paddw        m3, m4
161     psrlw        m3, 1
162     pmaxsw       m2, m3
163     mova   [rsp+48], m2
164
165     paddw        m1, m0
166     paddw        m0, m0
167     psubw        m0, m1
168     psrlw        m1, 1
169     PABS         m0, m2
170
171     movu         m2, [curq+t1-1*2]
172     movu         m3, [curq+t0-1*2]
173     mova         m4, m2
174     psubusw      m2, m3
175     psubusw      m3, m4
176     PMAXUW       m2, m3
177 %if mmsize == 16
178     mova         m3, m2
179     psrldq       m3, 4
180 %else
181     mova         m3, m2
182     psrlq        m3, 32
183 %endif
184     paddw        m0, m2
185     paddw        m0, m3
186     psubw        m0, [pw_1]
187
188     CHECK -2, 0
189     CHECK1
190     CHECK -3, 1
191     CHECK2
192     CHECK 0, -2
193     CHECK1
194     CHECK 1, -3
195     CHECK2
196
197     mova         m6, [rsp+48]
198     cmp   DWORD r8m, 2
199     jge .end%1
200     LOAD         m2, [%2+t1*2]
201     LOAD         m4, [%3+t1*2]
202     LOAD         m3, [%2+t0*2]
203     LOAD         m5, [%3+t0*2]
204     paddw        m2, m4
205     paddw        m3, m5
206     psrlw        m2, 1
207     psrlw        m3, 1
208     mova         m4, [rsp+ 0]
209     mova         m5, [rsp+16]
210     mova         m7, [rsp+32]
211     psubw        m2, m4
212     psubw        m3, m7
213     mova         m0, m5
214     psubw        m5, m4
215     psubw        m0, m7
216     mova         m4, m2
217     pminsw       m2, m3
218     pmaxsw       m3, m4
219     pmaxsw       m2, m5
220     pminsw       m3, m5
221     pmaxsw       m2, m0
222     pminsw       m3, m0
223     pxor         m4, m4
224     pmaxsw       m6, m3
225     psubw        m4, m2
226     pmaxsw       m6, m4
227
228 .end%1:
229     mova         m2, [rsp+16]
230     mova         m3, m2
231     psubw        m2, m6
232     paddw        m3, m6
233     pmaxsw       m1, m2
234     pminsw       m1, m3
235
236     movu     [dstq], m1
237     add        dstq, mmsize-4
238     add       prevq, mmsize-4
239     add        curq, mmsize-4
240     add       nextq, mmsize-4
241     sub   DWORD r4m, mmsize/2-2
242     jg .loop%1
243 %endmacro
244
245 %macro YADIF 0
246 %if ARCH_X86_32
247 cglobal yadif_filter_line_10bit, 4, 6, 8, 80, dst, prev, cur, next, w, \
248                                               prefs, mrefs, parity, mode
249 %else
250 cglobal yadif_filter_line_10bit, 4, 7, 8, 80, dst, prev, cur, next, w, \
251                                               prefs, mrefs, parity, mode
252 %endif
253 %if ARCH_X86_32
254     mov            r4, r5mp
255     mov            r5, r6mp
256     DECLARE_REG_TMP 4,5
257 %else
258     movsxd         r5, DWORD r5m
259     movsxd         r6, DWORD r6m
260     DECLARE_REG_TMP 5,6
261 %endif
262
263     cmp DWORD paritym, 0
264     je .parity0
265     FILTER 1, prevq, curq
266     jmp .ret
267
268 .parity0:
269     FILTER 0, curq, nextq
270
271 .ret:
272     RET
273 %endmacro
274
275 INIT_XMM ssse3
276 YADIF
277 INIT_XMM sse2
278 YADIF
279 %if ARCH_X86_32
280 INIT_MMX mmxext
281 YADIF
282 %endif