]> git.sesse.net Git - ffmpeg/blob - libavfilter/x86/yadif.asm
Drop DCTELEM typedef
[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 Libav.
8 ;*
9 ;* Libav 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 ;* Libav 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 Libav; 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+t1+%1]
35     movu      m3, [curq+t0+%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+t1]
101     LOAD          1, [curq+t0]
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+t1]
113     LOAD          4, [prevq+t0]
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+t1]
123     LOAD          4, [nextq+t0]
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+t1-1]
140     movu         m3, [curq+t0-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 r8m, 2
168     jge .end%1
169     LOAD          2, [%2+t1*2]
170     LOAD          4, [%3+t1*2]
171     LOAD          3, [%2+t0*2]
172     LOAD          5, [%3+t0*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   DWORD r4m, mmsize/2
212     jg .loop%1
213 %endmacro
214
215 %macro YADIF 0
216 %if ARCH_X86_32
217 cglobal yadif_filter_line, 4, 6, 8, 80, dst, prev, cur, next, w, prefs, \
218                                         mrefs, parity, mode
219 %else
220 cglobal yadif_filter_line, 4, 7, 8, 80, dst, prev, cur, next, w, prefs, \
221                                         mrefs, parity, mode
222 %endif
223     cmp      DWORD wm, 0
224     jle .ret
225 %if ARCH_X86_32
226     mov            r4, r5mp
227     mov            r5, r6mp
228     DECLARE_REG_TMP 4,5
229 %else
230     movsxd         r5, DWORD r5m
231     movsxd         r6, DWORD r6m
232     DECLARE_REG_TMP 5,6
233 %endif
234
235     cmp DWORD paritym, 0
236     je .parity0
237     FILTER 1, prevq, curq
238     jmp .ret
239
240 .parity0:
241     FILTER 0, curq, nextq
242
243 .ret:
244     RET
245 %endmacro
246
247 INIT_XMM ssse3
248 YADIF
249 INIT_XMM sse2
250 YADIF
251 %if ARCH_X86_32
252 INIT_MMX mmxext
253 YADIF
254 %endif