]> git.sesse.net Git - ffmpeg/blob - libavfilter/x86/vf_interlace.asm
Merge commit 'c6558e8840fbb2386bf8742e4d68dd6e067d262e'
[ffmpeg] / libavfilter / x86 / vf_interlace.asm
1 ;*****************************************************************************
2 ;* x86-optimized functions for interlace filter
3 ;*
4 ;* Copyright (C) 2014 Kieran Kunhya <kierank@obe.tv>
5 ;* Copyright (c) 2014 Michael Niedermayer <michaelni@gmx.at>
6 ;* Copyright (c) 2017 Thomas Mundt <tmundt75@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_4: times 8 dw 4
30
31 SECTION .text
32
33 %macro LOWPASS 1
34     add dstq, hq
35     add srcq, hq
36     add mrefq, srcq
37     add prefq, srcq
38     neg hq
39
40     pcmpeq%1 m6, m6
41
42 .loop:
43     movu m0, [mrefq+hq]
44     movu m1, [mrefq+hq+mmsize]
45     pavg%1 m0, [prefq+hq]
46     pavg%1 m1, [prefq+hq+mmsize]
47     pxor m0, m6
48     pxor m1, m6
49     pxor m2, m6, [srcq+hq]
50     pxor m3, m6, [srcq+hq+mmsize]
51     pavg%1 m0, m2
52     pavg%1 m1, m3
53     pxor m0, m6
54     pxor m1, m6
55     mova [dstq+hq], m0
56     mova [dstq+hq+mmsize], m1
57
58     add hq, 2*mmsize
59     jl .loop
60 REP_RET
61 %endmacro
62
63 %macro LOWPASS_LINE 0
64 cglobal lowpass_line, 5, 5, 7, dst, h, src, mref, pref
65     LOWPASS b
66
67 cglobal lowpass_line_16, 5, 5, 7, dst, h, src, mref, pref
68     shl hq, 1
69     LOWPASS w
70 %endmacro
71
72 %macro LOWPASS_LINE_COMPLEX 0
73 cglobal lowpass_line_complex, 5, 5, 8, dst, h, src, mref, pref
74     pxor m7, m7
75 .loop:
76     movu m0, [srcq+mrefq]
77     movu m2, [srcq+prefq]
78     mova m1, m0
79     mova m3, m2
80     punpcklbw m0, m7
81     punpcklbw m2, m7
82     punpckhbw m1, m7
83     punpckhbw m3, m7
84     paddw m0, m2
85     paddw m1, m3
86     mova m6, m0
87     mova m5, m1
88     movu m2, [srcq]
89     mova m3, m2
90     punpcklbw m2, m7
91     punpckhbw m3, m7
92     paddw m0, m2
93     paddw m1, m3
94     psllw m2, 1
95     psllw m3, 1
96     paddw m0, m2
97     paddw m1, m3
98     psllw m0, 1
99     psllw m1, 1
100     pcmpgtw m6, m2
101     pcmpgtw m5, m3
102     packsswb m6, m5
103     movu m2, [srcq+mrefq*2]
104     movu m4, [srcq+prefq*2]
105     mova m3, m2
106     mova m5, m4
107     punpcklbw m2, m7
108     punpcklbw m4, m7
109     punpckhbw m3, m7
110     punpckhbw m5, m7
111     paddw m2, m4
112     paddw m3, m5
113     paddw m0, [pw_4]
114     paddw m1, [pw_4]
115     psubusw m0, m2
116     psubusw m1, m3
117     psrlw m0, 3
118     psrlw m1, 3
119     packuswb m0, m1
120     mova m1, m0
121     movu m2, [srcq]
122     pmaxub m0, m2
123     pminub m1, m2
124     pand m0, m6
125     pandn m6, m1
126     por m0, m6
127     mova [dstq], m0
128
129     add dstq, mmsize
130     add srcq, mmsize
131     sub hd, mmsize
132     jg .loop
133 REP_RET
134
135 cglobal lowpass_line_complex_12, 5, 5, 8, 16, dst, h, src, mref, pref, clip_max
136     movd m7, DWORD clip_maxm
137     SPLATW m7, m7, 0
138     movu [rsp], m7
139 .loop:
140     movu m0, [srcq+mrefq]
141     movu m1, [srcq+mrefq+mmsize]
142     movu m2, [srcq+prefq]
143     movu m3, [srcq+prefq+mmsize]
144     paddw m0, m2
145     paddw m1, m3
146     mova m6, m0
147     mova m7, m1
148     movu m2, [srcq]
149     movu m3, [srcq+mmsize]
150     paddw m0, m2
151     paddw m1, m3
152     psllw m2, 1
153     psllw m3, 1
154     paddw m0, m2
155     paddw m1, m3
156     psllw m0, 1
157     psllw m1, 1
158     pcmpgtw m6, m2
159     pcmpgtw m7, m3
160     movu m2, [srcq+2*mrefq]
161     movu m3, [srcq+2*mrefq+mmsize]
162     movu m4, [srcq+2*prefq]
163     movu m5, [srcq+2*prefq+mmsize]
164     paddw m2, m4
165     paddw m3, m5
166     paddw m0, [pw_4]
167     paddw m1, [pw_4]
168     psubusw m0, m2
169     psubusw m1, m3
170     psrlw m0, 3
171     psrlw m1, 3
172     pminsw m0, [rsp]
173     pminsw m1, [rsp]
174     mova m2, m0
175     mova m3, m1
176     movu m4, [srcq]
177     pmaxsw m0, m4
178     pminsw m2, m4
179     movu m4, [srcq + mmsize]
180     pmaxsw m1, m4
181     pminsw m3, m4
182     pand m0, m6
183     pand m1, m7
184     pandn m6, m2
185     pandn m7, m3
186     por m0, m6
187     por m1, m7
188     mova [dstq], m0
189     mova [dstq+mmsize], m1
190
191     add dstq, 2*mmsize
192     add srcq, 2*mmsize
193     sub hd, mmsize
194     jg .loop
195 REP_RET
196 %endmacro
197
198 INIT_XMM sse2
199 LOWPASS_LINE
200
201 INIT_XMM avx
202 LOWPASS_LINE
203
204 INIT_XMM sse2
205 LOWPASS_LINE_COMPLEX