x86/vf_blend: simplify using macros
[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 %if ARCH_X86_64
26 SECTION_RODATA
27
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 cglobal blend_%1, 9, 11, %2, top, top_linesize, bottom, bottom_linesize, dst, dst_linesize, width, start, end
38     add      topq, widthq
39     add   bottomq, widthq
40     add      dstq, widthq
41     sub      endq, startq
42     neg    widthq
43 %endmacro
44
45 %macro BLEND_END 0
46     add          topq, top_linesizeq
47     add       bottomq, bottom_linesizeq
48     add          dstq, dst_linesizeq
49     sub          endd, 1
50     jg .nextrow
51 REP_RET
52 %endmacro
53
54 %macro BLEND_SIMPLE 2
55 BLEND_INIT %1, 2
56 .nextrow:
57     mov       r10q, widthq
58     %define      x  r10q
59
60     .loop:
61         movu            m0, [topq + x]
62         movu            m1, [bottomq + x]
63         p%2             m0, m1
64         mova    [dstq + x], m0
65         add           r10q, mmsize
66     jl .loop
67 BLEND_END
68 %endmacro
69
70 INIT_XMM sse2
71 BLEND_SIMPLE xor,      xor
72 BLEND_SIMPLE or,       or
73 BLEND_SIMPLE and,      and
74 BLEND_SIMPLE addition, addusb
75 BLEND_SIMPLE subtract, subusb
76 BLEND_SIMPLE darken,   minub
77 BLEND_SIMPLE lighten,  maxub
78
79 BLEND_INIT difference128, 4
80     pxor       m2, m2
81     mova       m3, [pw_128]
82 .nextrow:
83     mov       r10q, widthq
84     %define      x  r10q
85
86     .loop:
87         movh            m0, [topq + x]
88         movh            m1, [bottomq + x]
89         punpcklbw       m0, m2
90         punpcklbw       m1, m2
91         paddw           m0, m3
92         psubw           m0, m1
93         packuswb        m0, m0
94         movh    [dstq + x], m0
95         add           r10q, mmsize / 2
96     jl .loop
97 BLEND_END
98
99 BLEND_INIT average, 3
100     pxor       m2, m2
101 .nextrow:
102     mov       r10q, widthq
103     %define      x  r10q
104
105     .loop:
106         movh            m0, [topq + x]
107         movh            m1, [bottomq + x]
108         punpcklbw       m0, m2
109         punpcklbw       m1, m2
110         paddw           m0, m1
111         psrlw           m0, 1
112         packuswb        m0, m0
113         movh    [dstq + x], m0
114         add           r10q, mmsize / 2
115     jl .loop
116 BLEND_END
117
118 BLEND_INIT addition128, 4
119     pxor       m2, m2
120     mova       m3, [pw_128]
121 .nextrow:
122     mov       r10q, widthq
123     %define      x  r10q
124
125     .loop:
126         movh            m0, [topq + x]
127         movh            m1, [bottomq + x]
128         punpcklbw       m0, m2
129         punpcklbw       m1, m2
130         paddw           m0, m1
131         psubw           m0, m3
132         packuswb        m0, m0
133         movh    [dstq + x], m0
134         add           r10q, mmsize / 2
135     jl .loop
136 BLEND_END
137
138 BLEND_INIT hardmix, 5
139     mova       m2, [pb_255]
140     mova       m3, [pb_128]
141     mova       m4, [pb_127]
142 .nextrow:
143     mov       r10q, widthq
144     %define      x  r10q
145
146     .loop:
147         movu            m0, [topq + x]
148         movu            m1, [bottomq + x]
149         pxor            m1, m4
150         pxor            m0, m3
151         pcmpgtb         m1, m0
152         pxor            m1, m2
153         mova    [dstq + x], m1
154         add           r10q, mmsize
155     jl .loop
156 BLEND_END
157
158 BLEND_INIT phoenix, 4
159     mova       m3, [pb_255]
160 .nextrow:
161     mov       r10q, widthq
162     %define      x  r10q
163
164     .loop:
165         movu            m0, [topq + x]
166         movu            m1, [bottomq + x]
167         mova            m2, m0
168         pminub          m0, m1
169         pmaxub          m1, m2
170         mova            m2, m3
171         psubusb         m2, m1
172         paddusb         m2, m0
173         mova    [dstq + x], m2
174         add           r10q, mmsize
175     jl .loop
176 BLEND_END
177
178 INIT_XMM ssse3
179 BLEND_INIT difference, 3
180     pxor       m2, m2
181 .nextrow:
182     mov       r10q, widthq
183     %define      x  r10q
184
185     .loop:
186         movh            m0, [topq + x]
187         movh            m1, [bottomq + x]
188         punpcklbw       m0, m2
189         punpcklbw       m1, m2
190         psubw           m0, m1
191         pabsw           m0, m0
192         packuswb        m0, m0
193         movh    [dstq + x], m0
194         add           r10q, mmsize / 2
195     jl .loop
196 BLEND_END
197
198 BLEND_INIT negation, 5
199     pxor       m2, m2
200     mova       m4, [pw_255]
201 .nextrow:
202     mov       r10q, widthq
203     %define      x  r10q
204
205     .loop:
206         movh            m0, [topq + x]
207         movh            m1, [bottomq + x]
208         punpcklbw       m0, m2
209         punpcklbw       m1, m2
210         mova            m3, m4
211         psubw           m3, m0
212         psubw           m3, m1
213         pabsw           m3, m3
214         mova            m0, m4
215         psubw           m0, m3
216         packuswb        m0, m0
217         movh    [dstq + x], m0
218         add           r10q, mmsize / 2
219     jl .loop
220 BLEND_END
221
222 %endif