avcodec/adpcm: Clip predictor for APC
[ffmpeg.git] / libavfilter / x86 / vf_bwdif.asm
1 ;*****************************************************************************
2 ;* x86-optimized functions for bwdif filter
3 ;*
4 ;* Copyright (C) 2016 Thomas Mundt <loudmax@yahoo.de>
5 ;*
6 ;* Based on yadif simd code
7 ;* Copyright (C) 2006 Michael Niedermayer <michaelni@gmx.at>
8 ;*               2013 Daniel Kang <daniel.d.kang@gmail.com>
9 ;*
10 ;* This file is part of FFmpeg.
11 ;*
12 ;* FFmpeg is free software; you can redistribute it and/or
13 ;* modify it under the terms of the GNU Lesser General Public
14 ;* License as published by the Free Software Foundation; either
15 ;* version 2.1 of the License, or (at your option) any later version.
16 ;*
17 ;* FFmpeg is distributed in the hope that it will be useful,
18 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20 ;* Lesser General Public License for more details.
21 ;*
22 ;* You should have received a copy of the GNU Lesser General Public
23 ;* License along with FFmpeg; if not, write to the Free Software
24 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 ;******************************************************************************
26
27 %include "libavutil/x86/x86util.asm"
28
29 SECTION_RODATA
30
31 pw_coefhf:  times 4 dw  1016, 5570
32 pw_coefhf1: times 8 dw -3801
33 pw_coefsp:  times 4 dw  5077, -981
34 pw_splfdif: times 4 dw  -768,  768
35
36 SECTION .text
37
38 %macro LOAD8 2
39     movh         %1, %2
40     punpcklbw    %1, m7
41 %endmacro
42
43 %macro LOAD12 2
44     movu         %1, %2
45 %endmacro
46
47 %macro DISP8 0
48     packuswb     m2, m2
49     movh     [dstq], m2
50 %endmacro
51
52 %macro DISP12 0
53     CLIPW        m2, m7, m12
54     movu     [dstq], m2
55 %endmacro
56
57 %macro FILTER 5
58     pxor         m7, m7
59 .loop%1:
60     LOAD%4       m0, [curq+t0*%5]
61     LOAD%4       m1, [curq+t1*%5]
62     LOAD%4       m2, [%2]
63     LOAD%4       m3, [%3]
64     mova         m4, m3
65     paddw        m3, m2
66     psubw        m2, m4
67     ABS1         m2, m4
68     mova         m8, m3
69     mova         m9, m2
70     LOAD%4       m3, [prevq+t0*%5]
71     LOAD%4       m4, [prevq+t1*%5]
72     psubw        m3, m0
73     psubw        m4, m1
74     ABS2         m3, m4, m5, m6
75     paddw        m3, m4
76     psrlw        m2, 1
77     psrlw        m3, 1
78     pmaxsw       m2, m3
79     LOAD%4       m3, [nextq+t0*%5]
80     LOAD%4       m4, [nextq+t1*%5]
81     psubw        m3, m0
82     psubw        m4, m1
83     ABS2         m3, m4, m5, m6
84     paddw        m3, m4
85     psrlw        m3, 1
86     pmaxsw       m2, m3
87
88     LOAD%4       m3, [%2+t0*2*%5]
89     LOAD%4       m4, [%3+t0*2*%5]
90     LOAD%4       m5, [%2+t1*2*%5]
91     LOAD%4       m6, [%3+t1*2*%5]
92     paddw        m3, m4
93     paddw        m5, m6
94     mova         m6, m3
95     paddw        m6, m5
96     mova        m10, m6
97     psrlw        m3, 1
98     psrlw        m5, 1
99     psubw        m3, m0
100     psubw        m5, m1
101     mova         m6, m3
102     pminsw       m3, m5
103     pmaxsw       m5, m6
104     mova         m4, m8
105     psraw        m4, 1
106     mova         m6, m4
107     psubw        m6, m0
108     psubw        m4, m1
109     pmaxsw       m3, m6
110     pminsw       m5, m6
111     pmaxsw       m3, m4
112     pminsw       m5, m4
113     mova         m6, m7
114     psubw        m6, m3
115     pmaxsw       m6, m5
116     mova         m3, m2
117     pcmpgtw      m3, m7
118     pand         m6, m3
119     pmaxsw       m2, m6
120     mova        m11, m2
121
122     LOAD%4       m2, [%2+t0*4*%5]
123     LOAD%4       m3, [%3+t0*4*%5]
124     LOAD%4       m4, [%2+t1*4*%5]
125     LOAD%4       m5, [%3+t1*4*%5]
126     paddw        m2, m3
127     paddw        m4, m5
128     paddw        m2, m4
129     mova         m3, m2
130     punpcklwd    m2, m8
131     punpckhwd    m3, m8
132     pmaddwd      m2, [pw_coefhf]
133     pmaddwd      m3, [pw_coefhf]
134     mova         m4, m10
135     mova         m6, m4
136     pmullw       m4, [pw_coefhf1]
137     pmulhw       m6, [pw_coefhf1]
138     mova         m5, m4
139     punpcklwd    m4, m6
140     punpckhwd    m5, m6
141     paddd        m2, m4
142     paddd        m3, m5
143     psrad        m2, 2
144     psrad        m3, 2
145
146     mova         m4, m0
147     paddw        m0, m1
148 %if ARCH_X86_64
149     LOAD%4       m5, [curq+t2*%5]
150     LOAD%4       m6, [curq+t3*%5]
151 %else
152     mov          r4, prefs3mp
153     mov          r5, mrefs3mp
154     LOAD%4       m5, [curq+t0*%5]
155     LOAD%4       m6, [curq+t1*%5]
156     mov          r4, prefsmp
157     mov          r5, mrefsmp
158 %endif
159     paddw        m6, m5
160     psubw        m1, m4
161     ABS1         m1, m4
162     pcmpgtw      m1, m9
163     mova         m4, m1
164     punpcklwd    m1, m4
165     punpckhwd    m4, m4
166     pand         m2, m1
167     pand         m3, m4
168     mova         m5, [pw_splfdif]
169     mova         m7, m5
170     pand         m5, m1
171     pand         m7, m4
172     paddw        m5, [pw_coefsp]
173     paddw        m7, [pw_coefsp]
174     mova         m4, m0
175     punpcklwd    m0, m6
176     punpckhwd    m4, m6
177     pmaddwd      m0, m5
178     pmaddwd      m4, m7
179     paddd        m2, m0
180     paddd        m3, m4
181     psrad        m2, 13
182     psrad        m3, 13
183     packssdw     m2, m3
184
185     mova         m4, m8
186     psraw        m4, 1
187     mova         m0, m11
188     mova         m3, m4
189     psubw        m4, m0
190     paddw        m3, m0
191     CLIPW        m2, m4, m3
192     pxor         m7, m7
193     DISP%4
194
195     add        dstq, STEP
196     add       prevq, STEP
197     add        curq, STEP
198     add       nextq, STEP
199     sub    DWORD wm, mmsize/2
200     jg .loop%1
201 %endmacro
202
203 %macro PROC 2
204 %if ARCH_X86_64
205     movsxd       r5, DWORD prefsm
206     movsxd       r6, DWORD mrefsm
207     movsxd       r7, DWORD prefs3m
208     movsxd       r8, DWORD mrefs3m
209     DECLARE_REG_TMP 5, 6, 7, 8
210 %else
211     %define m8  [rsp+ 0]
212     %define m9  [rsp+16]
213     %define m10 [rsp+32]
214     %define m11 [rsp+48]
215     mov          r4, prefsmp
216     mov          r5, mrefsmp
217     DECLARE_REG_TMP 4, 5
218 %endif
219     cmp DWORD paritym, 0
220     je .parity0
221     FILTER 1, prevq, curq, %1, %2
222     jmp .ret
223 .parity0:
224     FILTER 0, curq, nextq, %1, %2
225 .ret:
226     RET
227 %endmacro
228
229 %macro BWDIF 0
230 %if ARCH_X86_64
231 cglobal bwdif_filter_line, 4, 9, 12, 0, dst, prev, cur, next, w, prefs, \
232                                         mrefs, prefs2, mrefs2, prefs3, mrefs3, \
233                                         prefs4, mrefs4, parity, clip_max
234 %else
235 cglobal bwdif_filter_line, 4, 6, 8, 64, dst, prev, cur, next, w, prefs, \
236                                         mrefs, prefs2, mrefs2, prefs3, mrefs3, \
237                                         prefs4, mrefs4, parity, clip_max
238 %endif
239     %define STEP mmsize/2
240     PROC 8, 1
241
242 %if ARCH_X86_64
243 cglobal bwdif_filter_line_12bit, 4, 9, 13, 0, dst, prev, cur, next, w, \
244                                               prefs, mrefs, prefs2, mrefs2, \
245                                               prefs3, mrefs3, prefs4, \
246                                               mrefs4, parity, clip_max
247     movd        m12, DWORD clip_maxm
248     SPLATW      m12, m12, 0
249 %else
250 cglobal bwdif_filter_line_12bit, 4, 6, 8, 80, dst, prev, cur, next, w, \
251                                               prefs, mrefs, prefs2, mrefs2, \
252                                               prefs3, mrefs3, prefs4, \
253                                               mrefs4, parity, clip_max
254     %define m12 [rsp+64]
255     movd         m0, DWORD clip_maxm
256     SPLATW       m0, m0, 0
257     mova        m12, m0
258 %endif
259     %define STEP mmsize
260     PROC 12, 2
261 %endmacro
262
263 INIT_XMM ssse3
264 BWDIF
265 INIT_XMM sse2
266 BWDIF
267 %if ARCH_X86_32
268 INIT_MMX mmxext
269 BWDIF
270 %endif