vf_blend: Reduce number of arguments for kernel function
[ffmpeg.git] / libavfilter / x86 / vf_blend.asm
1 ;*****************************************************************************
2 ;* x86-optimized functions for blend filter
3 ;*
4 ;* Copyright (C) 2015 Paul B Mahol
5 ;*
6 ;* This file is part of FFmpeg.
7 ;*
8 ;* FFmpeg is free software; you can redistribute it and/or
9 ;* modify it under the terms of the GNU Lesser General Public
10 ;* License as published by the Free Software Foundation; either
11 ;* version 2.1 of the License, or (at your option) any later version.
12 ;*
13 ;* FFmpeg is distributed in the hope that it will be useful,
14 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 ;* Lesser General Public License for more details.
17 ;*
18 ;* You should have received a copy of the GNU Lesser General Public
19 ;* License along with FFmpeg; if not, write to the Free Software
20 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 ;******************************************************************************
22
23 %include "libavutil/x86/x86util.asm"
24
25 SECTION_RODATA
26
27 pw_1:   times 8 dw 1
28 pw_128: times 8 dw 128
29 pw_255: times 8 dw 255
30 pb_127: times 16 db 127
31 pb_128: times 16 db 128
32 pb_255: times 16 db 255
33
34 SECTION .text
35
36 %macro BLEND_INIT 2
37 %if ARCH_X86_64
38 cglobal blend_%1, 6, 9, %2, top, top_linesize, bottom, bottom_linesize, dst, dst_linesize, width, end, x
39     mov    widthd, dword widthm
40 %else
41 cglobal blend_%1, 5, 7, %2, top, top_linesize, bottom, bottom_linesize, dst, end, x
42 %define dst_linesizeq r5mp
43 %define widthq r6mp
44 %endif
45     mov      endd, dword r7m
46     add      topq, widthq
47     add   bottomq, widthq
48     add      dstq, widthq
49     neg    widthq
50 %endmacro
51
52 %macro BLEND_END 0
53     add          topq, top_linesizeq
54     add       bottomq, bottom_linesizeq
55     add          dstq, dst_linesizeq
56     sub          endd, 1
57     jg .nextrow
58 REP_RET
59 %endmacro
60
61 %macro BLEND_SIMPLE 2
62 BLEND_INIT %1, 2
63 .nextrow:
64     mov        xq, widthq
65
66     .loop:
67         movu            m0, [topq + xq]
68         movu            m1, [bottomq + xq]
69         p%2             m0, m1
70         mova   [dstq + xq], m0
71         add             xq, mmsize
72     jl .loop
73 BLEND_END
74 %endmacro
75
76 INIT_XMM sse2
77 BLEND_SIMPLE xor,      xor
78 BLEND_SIMPLE or,       or
79 BLEND_SIMPLE and,      and
80 BLEND_SIMPLE addition, addusb
81 BLEND_SIMPLE subtract, subusb
82 BLEND_SIMPLE darken,   minub
83 BLEND_SIMPLE lighten,  maxub
84
85 BLEND_INIT difference128, 4
86     pxor       m2, m2
87     mova       m3, [pw_128]
88 .nextrow:
89     mov        xq, widthq
90
91     .loop:
92         movh            m0, [topq + xq]
93         movh            m1, [bottomq + xq]
94         punpcklbw       m0, m2
95         punpcklbw       m1, m2
96         paddw           m0, m3
97         psubw           m0, m1
98         packuswb        m0, m0
99         movh   [dstq + xq], m0
100         add             xq, mmsize / 2
101     jl .loop
102 BLEND_END
103
104 %macro MULTIPLY 3 ; a, b, pw_1
105     pmullw          %1, %2               ; xxxxxxxx  a * b
106     paddw           %1, %3
107     mova            %2, %1
108     psrlw           %2, 8
109     paddw           %1, %2
110     psrlw           %1, 8                ; 00xx00xx  a * b / 255
111 %endmacro
112
113 %macro SCREEN 4   ; a, b, pw_1, pw_255
114     pxor            %1, %4               ; 00xx00xx  255 - a
115     pxor            %2, %4
116     MULTIPLY        %1, %2, %3
117     pxor            %1, %4               ; 00xx00xx  255 - x / 255
118 %endmacro
119
120 BLEND_INIT multiply, 4
121     pxor       m2, m2
122     mova       m3, [pw_1]
123 .nextrow:
124     mov        xq, widthq
125
126     .loop:
127                                              ;     word
128                                              ;     |--|
129         movh            m0, [topq + xq]      ; 0000xxxx
130         movh            m1, [bottomq + xq]
131         punpcklbw       m0, m2               ; 00xx00xx
132         punpcklbw       m1, m2
133
134         MULTIPLY        m0, m1, m3
135
136         packuswb        m0, m0               ; 0000xxxx
137         movh   [dstq + xq], m0
138         add             xq, mmsize / 2
139
140     jl .loop
141 BLEND_END
142
143 BLEND_INIT screen, 5
144     pxor       m2, m2
145     mova       m3, [pw_1]
146     mova       m4, [pw_255]
147 .nextrow:
148     mov        xq, widthq
149
150     .loop:
151         movh            m0, [topq + xq]      ; 0000xxxx
152         movh            m1, [bottomq + xq]
153         punpcklbw       m0, m2               ; 00xx00xx
154         punpcklbw       m1, m2
155
156         SCREEN          m0, m1, m3, m4
157
158         packuswb        m0, m0               ; 0000xxxx
159         movh   [dstq + xq], m0
160         add             xq, mmsize / 2
161
162     jl .loop
163 BLEND_END
164
165 BLEND_INIT average, 3
166     pxor       m2, m2
167 .nextrow:
168     mov        xq, widthq
169
170     .loop:
171         movh            m0, [topq + xq]
172         movh            m1, [bottomq + xq]
173         punpcklbw       m0, m2
174         punpcklbw       m1, m2
175         paddw           m0, m1
176         psrlw           m0, 1
177         packuswb        m0, m0
178         movh   [dstq + xq], m0
179         add             xq, mmsize / 2
180     jl .loop
181 BLEND_END
182
183 BLEND_INIT addition128, 4
184     pxor       m2, m2
185     mova       m3, [pw_128]
186 .nextrow:
187     mov        xq, widthq
188
189     .loop:
190         movh            m0, [topq + xq]
191         movh            m1, [bottomq + xq]
192         punpcklbw       m0, m2
193         punpcklbw       m1, m2
194         paddw           m0, m1
195         psubw           m0, m3
196         packuswb        m0, m0
197         movh   [dstq + xq], m0
198         add             xq, mmsize / 2
199     jl .loop
200 BLEND_END
201
202 BLEND_INIT hardmix, 5
203     mova       m2, [pb_255]
204     mova       m3, [pb_128]
205     mova       m4, [pb_127]
206 .nextrow:
207     mov        xq, widthq
208
209     .loop:
210         movu            m0, [topq + xq]
211         movu            m1, [bottomq + xq]
212         pxor            m1, m4
213         pxor            m0, m3
214         pcmpgtb         m1, m0
215         pxor            m1, m2
216         mova   [dstq + xq], m1
217         add             xq, mmsize
218     jl .loop
219 BLEND_END
220
221 BLEND_INIT phoenix, 4
222     mova       m3, [pb_255]
223 .nextrow:
224     mov        xq, widthq
225
226     .loop:
227         movu            m0, [topq + xq]
228         movu            m1, [bottomq + xq]
229         mova            m2, m0
230         pminub          m0, m1
231         pmaxub          m1, m2
232         mova            m2, m3
233         psubusb         m2, m1
234         paddusb         m2, m0
235         mova   [dstq + xq], m2
236         add             xq, mmsize
237     jl .loop
238 BLEND_END
239
240 %macro BLEND_ABS 0
241 BLEND_INIT difference, 3
242     pxor       m2, m2
243 .nextrow:
244     mov        xq, widthq
245
246     .loop:
247         movh            m0, [topq + xq]
248         movh            m1, [bottomq + xq]
249         punpcklbw       m0, m2
250         punpcklbw       m1, m2
251         psubw           m0, m1
252         ABS1            m0, m1
253         packuswb        m0, m0
254         movh   [dstq + xq], m0
255         add             xq, mmsize / 2
256     jl .loop
257 BLEND_END
258
259 BLEND_INIT negation, 5
260     pxor       m2, m2
261     mova       m4, [pw_255]
262 .nextrow:
263     mov        xq, widthq
264
265     .loop:
266         movh            m0, [topq + xq]
267         movh            m1, [bottomq + xq]
268         punpcklbw       m0, m2
269         punpcklbw       m1, m2
270         mova            m3, m4
271         psubw           m3, m0
272         psubw           m3, m1
273         ABS1            m3, m1
274         mova            m0, m4
275         psubw           m0, m3
276         packuswb        m0, m0
277         movh   [dstq + xq], m0
278         add             xq, mmsize / 2
279     jl .loop
280 BLEND_END
281 %endmacro
282
283 INIT_XMM sse2
284 BLEND_ABS
285 INIT_XMM ssse3
286 BLEND_ABS