x86util: add and use RSHIFT/LSHIFT macros
[ffmpeg.git] / 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
11 ;* modify it under the terms of the GNU Lesser General Public
12 ;* License as published by the Free Software Foundation; either
13 ;* version 2.1 of the License, or (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 GNU
18 ;* Lesser General Public License for more details.
19 ;*
20 ;* You should have received a copy of the GNU Lesser General Public
21 ;* License along with FFmpeg; if not, write to the Free Software
22 ;* Foundation, Inc., 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     RSHIFT    m5, 2
63     mova      m4, m2
64     psubusw   m2, m3
65     psubusw   m3, m4
66     PMAXUW    m2, m3
67     mova      m3, m2
68     mova      m4, m2
69     RSHIFT    m3, 2
70     RSHIFT    m4, 4
71     paddw     m2, m3
72     paddw     m2, m4
73 %endmacro
74
75 %macro CHECK1 0
76     mova    m3, m0
77     pcmpgtw m3, m2
78     pminsw  m0, m2
79     mova    m6, m3
80     pand    m5, m3
81     pandn   m3, m1
82     por     m3, m5
83     mova    m1, m3
84 %endmacro
85
86 ; %macro CHECK2 0
87 ;     paddw   m6, [pw_1]
88 ;     psllw   m6, 14
89 ;     paddsw  m2, m6
90 ;     mova    m3, m0
91 ;     pcmpgtw m3, m2
92 ;     pminsw  m0, m2
93 ;     pand    m5, m3
94 ;     pandn   m3, m1
95 ;     por     m3, m5
96 ;     mova    m1, m3
97 ; %endmacro
98
99 ; This version of CHECK2 is required for 14-bit samples.  The left-shift trick
100 ; in the old code is not large enough to correctly select pixels or scores.
101
102 %macro CHECK2 0
103     mova    m3, m0
104     pcmpgtw m0, m2
105     pand    m0, m6
106     mova    m6, m0
107     pand    m5, m6
108     pand    m2, m0
109     pandn   m6, m1
110     pandn   m0, m3
111     por     m6, m5
112     por     m0, m2
113     mova    m1, m6
114 %endmacro
115
116 %macro LOAD 2
117     movu      %1, %2
118 %endmacro
119
120 %macro FILTER 3
121 .loop%1:
122     pxor         m7, m7
123     LOAD         m0, [curq+t1]
124     LOAD         m1, [curq+t0]
125     LOAD         m2, [%2]
126     LOAD         m3, [%3]
127     mova         m4, m3
128     paddw        m3, m2
129     psraw        m3, 1
130     mova   [rsp+ 0], m0
131     mova   [rsp+16], m3
132     mova   [rsp+32], m1
133     psubw        m2, m4
134     PABS         m2, m4
135     LOAD         m3, [prevq+t1]
136     LOAD         m4, [prevq+t0]
137     psubw        m3, m0
138     psubw        m4, m1
139     PABS         m3, m5
140     PABS         m4, m5
141     paddw        m3, m4
142     psrlw        m2, 1
143     psrlw        m3, 1
144     pmaxsw       m2, m3
145     LOAD         m3, [nextq+t1]
146     LOAD         m4, [nextq+t0]
147     psubw        m3, m0
148     psubw        m4, m1
149     PABS         m3, m5
150     PABS         m4, m5
151     paddw        m3, m4
152     psrlw        m3, 1
153     pmaxsw       m2, m3
154     mova   [rsp+48], m2
155
156     paddw        m1, m0
157     paddw        m0, m0
158     psubw        m0, m1
159     psrlw        m1, 1
160     PABS         m0, m2
161
162     movu         m2, [curq+t1-1*2]
163     movu         m3, [curq+t0-1*2]
164     mova         m4, m2
165     psubusw      m2, m3
166     psubusw      m3, m4
167     PMAXUW       m2, m3
168     mova         m3, m2
169     RSHIFT       m3, 4
170     paddw        m0, m2
171     paddw        m0, m3
172     psubw        m0, [pw_1]
173
174     CHECK -2, 0
175     CHECK1
176     CHECK -3, 1
177     CHECK2
178     CHECK 0, -2
179     CHECK1
180     CHECK 1, -3
181     CHECK2
182
183     mova         m6, [rsp+48]
184     cmp   DWORD r8m, 2
185     jge .end%1
186     LOAD         m2, [%2+t1*2]
187     LOAD         m4, [%3+t1*2]
188     LOAD         m3, [%2+t0*2]
189     LOAD         m5, [%3+t0*2]
190     paddw        m2, m4
191     paddw        m3, m5
192     psrlw        m2, 1
193     psrlw        m3, 1
194     mova         m4, [rsp+ 0]
195     mova         m5, [rsp+16]
196     mova         m7, [rsp+32]
197     psubw        m2, m4
198     psubw        m3, m7
199     mova         m0, m5
200     psubw        m5, m4
201     psubw        m0, m7
202     mova         m4, m2
203     pminsw       m2, m3
204     pmaxsw       m3, m4
205     pmaxsw       m2, m5
206     pminsw       m3, m5
207     pmaxsw       m2, m0
208     pminsw       m3, m0
209     pxor         m4, m4
210     pmaxsw       m6, m3
211     psubw        m4, m2
212     pmaxsw       m6, m4
213
214 .end%1:
215     mova         m2, [rsp+16]
216     mova         m3, m2
217     psubw        m2, m6
218     paddw        m3, m6
219     pmaxsw       m1, m2
220     pminsw       m1, m3
221
222     movu     [dstq], m1
223     add        dstq, mmsize-4
224     add       prevq, mmsize-4
225     add        curq, mmsize-4
226     add       nextq, mmsize-4
227     sub   DWORD r4m, mmsize/2-2
228     jg .loop%1
229 %endmacro
230
231 %macro YADIF 0
232 %if ARCH_X86_32
233 cglobal yadif_filter_line_10bit, 4, 6, 8, 80, dst, prev, cur, next, w, \
234                                               prefs, mrefs, parity, mode
235 %else
236 cglobal yadif_filter_line_10bit, 4, 7, 8, 80, dst, prev, cur, next, w, \
237                                               prefs, mrefs, parity, mode
238 %endif
239 %if ARCH_X86_32
240     mov            r4, r5mp
241     mov            r5, r6mp
242     DECLARE_REG_TMP 4,5
243 %else
244     movsxd         r5, DWORD r5m
245     movsxd         r6, DWORD r6m
246     DECLARE_REG_TMP 5,6
247 %endif
248
249     cmp DWORD paritym, 0
250     je .parity0
251     FILTER 1, prevq, curq
252     jmp .ret
253
254 .parity0:
255     FILTER 0, curq, nextq
256
257 .ret:
258     RET
259 %endmacro
260
261 INIT_XMM ssse3
262 YADIF
263 INIT_XMM sse2
264 YADIF
265 %if ARCH_X86_32
266 INIT_MMX mmxext
267 YADIF
268 %endif