]> git.sesse.net Git - ffmpeg/blob - libavfilter/x86/vf_blend.asm
Merge commit '5b6f42da98c26a8aee8d2c2edfcbd0633ad1c607'
[ffmpeg] / 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_128: times 8 dw 128
28 pw_255: times 8 dw 255
29 pb_127: times 16 db 127
30 pb_128: times 16 db 128
31 pb_255: times 16 db 255
32
33 SECTION .text
34
35 %macro BLEND_INIT 2
36 %if ARCH_X86_64
37 cglobal blend_%1, 6, 9, %2, top, top_linesize, bottom, bottom_linesize, dst, dst_linesize, width, end, x
38     mov    widthd, dword widthm
39 %else
40 cglobal blend_%1, 5, 7, %2, top, top_linesize, bottom, bottom_linesize, dst, end, x
41 %define dst_linesizeq r5mp
42 %define widthq r6mp
43 %endif
44     mov      endd, dword r8m
45     add      topq, widthq
46     add   bottomq, widthq
47     add      dstq, widthq
48     sub      endd, dword r7m ; start
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 BLEND_INIT average, 3
105     pxor       m2, m2
106 .nextrow:
107     mov        xq, widthq
108
109     .loop:
110         movh            m0, [topq + xq]
111         movh            m1, [bottomq + xq]
112         punpcklbw       m0, m2
113         punpcklbw       m1, m2
114         paddw           m0, m1
115         psrlw           m0, 1
116         packuswb        m0, m0
117         movh   [dstq + xq], m0
118         add             xq, mmsize / 2
119     jl .loop
120 BLEND_END
121
122 BLEND_INIT addition128, 4
123     pxor       m2, m2
124     mova       m3, [pw_128]
125 .nextrow:
126     mov        xq, widthq
127
128     .loop:
129         movh            m0, [topq + xq]
130         movh            m1, [bottomq + xq]
131         punpcklbw       m0, m2
132         punpcklbw       m1, m2
133         paddw           m0, m1
134         psubw           m0, m3
135         packuswb        m0, m0
136         movh   [dstq + xq], m0
137         add             xq, mmsize / 2
138     jl .loop
139 BLEND_END
140
141 BLEND_INIT hardmix, 5
142     mova       m2, [pb_255]
143     mova       m3, [pb_128]
144     mova       m4, [pb_127]
145 .nextrow:
146     mov        xq, widthq
147
148     .loop:
149         movu            m0, [topq + xq]
150         movu            m1, [bottomq + xq]
151         pxor            m1, m4
152         pxor            m0, m3
153         pcmpgtb         m1, m0
154         pxor            m1, m2
155         mova   [dstq + xq], m1
156         add             xq, mmsize
157     jl .loop
158 BLEND_END
159
160 BLEND_INIT phoenix, 4
161     mova       m3, [pb_255]
162 .nextrow:
163     mov        xq, widthq
164
165     .loop:
166         movu            m0, [topq + xq]
167         movu            m1, [bottomq + xq]
168         mova            m2, m0
169         pminub          m0, m1
170         pmaxub          m1, m2
171         mova            m2, m3
172         psubusb         m2, m1
173         paddusb         m2, m0
174         mova   [dstq + xq], m2
175         add             xq, mmsize
176     jl .loop
177 BLEND_END
178
179 %macro BLEND_ABS 0
180 BLEND_INIT difference, 3
181     pxor       m2, m2
182 .nextrow:
183     mov        xq, widthq
184
185     .loop:
186         movh            m0, [topq + xq]
187         movh            m1, [bottomq + xq]
188         punpcklbw       m0, m2
189         punpcklbw       m1, m2
190         psubw           m0, m1
191         ABS1            m0, m1
192         packuswb        m0, m0
193         movh   [dstq + xq], m0
194         add             xq, 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        xq, widthq
203
204     .loop:
205         movh            m0, [topq + xq]
206         movh            m1, [bottomq + xq]
207         punpcklbw       m0, m2
208         punpcklbw       m1, m2
209         mova            m3, m4
210         psubw           m3, m0
211         psubw           m3, m1
212         ABS1            m3, m1
213         mova            m0, m4
214         psubw           m0, m3
215         packuswb        m0, m0
216         movh   [dstq + xq], m0
217         add             xq, mmsize / 2
218     jl .loop
219 BLEND_END
220 %endmacro
221
222 INIT_XMM sse2
223 BLEND_ABS
224 INIT_XMM ssse3
225 BLEND_ABS