]> git.sesse.net Git - ffmpeg/blob - libavfilter/x86/vf_v360.asm
avfilter/vf_v360: x86 SIMD for interpolations
[ffmpeg] / libavfilter / x86 / vf_v360.asm
1 ;*****************************************************************************
2 ;* x86-optimized functions for v360 filter
3 ;*
4 ;* This file is part of FFmpeg.
5 ;*
6 ;* FFmpeg is free software; you can redistribute it and/or
7 ;* modify it under the terms of the GNU Lesser General Public
8 ;* License as published by the Free Software Foundation; either
9 ;* version 2.1 of the License, or (at your option) any later version.
10 ;*
11 ;* FFmpeg is distributed in the hope that it will be useful,
12 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 ;* Lesser General Public License for more details.
15 ;*
16 ;* You should have received a copy of the GNU Lesser General Public
17 ;* License along with FFmpeg; if not, write to the Free Software
18 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 ;******************************************************************************
20
21 %if HAVE_AVX2_EXTERNAL && ARCH_X86_64
22
23 %include "libavutil/x86/x86util.asm"
24
25 SECTION_RODATA
26
27 pb_mask: db 0,4,8,12,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
28 pd_255: times 4 dd 255
29
30 SECTION .text
31
32 ; void ff_remap2_8bit_line_avx2(uint8_t *dst, int width, const uint8_t *src, ptrdiff_t in_linesize,
33 ;                               const uint16_t *u, const uint16_t *v, const int16_t *ker);
34
35 INIT_YMM avx2
36 cglobal remap1_8bit_line, 6, 7, 6, dst, width, src, in_linesize, u, v, x
37     movsxdifnidn widthq, widthd
38     xor             xq, xq
39     movd           xm0, in_linesized
40     pcmpeqw         m4, m4
41     VBROADCASTI128  m3, [pb_mask]
42     vpbroadcastd    m0, xm0
43
44     .loop:
45         pmovsxwd   m1, [vq + xq * 2]
46         pmovsxwd   m2, [uq + xq * 2]
47
48         pmulld           m1, m0
49         paddd            m1, m2
50         mova             m2, m4
51         vpgatherdd       m5, [srcq + m1], m2
52         pshufb           m1, m5, m3
53         vextracti128    xm2, m1, 1
54         movd      [dstq+xq], xm1
55         movd    [dstq+xq+4], xm2
56
57         add   xq, mmsize / 4
58         cmp   xq, widthq
59         jl .loop
60     RET
61
62 INIT_YMM avx2
63 cglobal remap2_8bit_line, 7, 8, 8, dst, width, src, in_linesize, u, v, ker, x
64     movsxdifnidn widthq, widthd
65     xor             xq, xq
66     movd           xm0, in_linesized
67     pcmpeqw         m7, m7
68     vpbroadcastd    m0, xm0
69     vpbroadcastd    m6, [pd_255]
70
71     .loop:
72         pmovsxwd   m1, [kerq + xq * 8]
73         pmovsxwd   m2, [vq + xq * 8]
74         pmovsxwd   m3, [uq + xq * 8]
75
76         pmulld          m4, m2, m0
77         paddd           m4, m3
78         mova            m3, m7
79         vpgatherdd      m2, [srcq + m4], m3
80         pand            m2, m6
81         pmulld          m2, m1
82         phaddd          m2, m2
83         phaddd          m1, m2, m2
84         psrld           m1, m1, 0xe
85         vextracti128   xm2, m1, 1
86
87         pextrb   [dstq+xq], xm1, 0
88         pextrb [dstq+xq+1], xm2, 0
89
90         add   xq, mmsize / 16
91         cmp   xq, widthq
92         jl .loop
93     RET
94
95 INIT_YMM avx2
96 cglobal remap4_8bit_line, 7, 9, 11, dst, width, src, in_linesize, u, v, ker, x, y
97     movsxdifnidn widthq, widthd
98     xor             yq, yq
99     xor             xq, xq
100     movd           xm0, in_linesized
101     pcmpeqw         m7, m7
102     vpbroadcastd    m0, xm0
103     vpbroadcastd    m6, [pd_255]
104
105     .loop:
106         pmovsxwd   m1, [kerq + yq]
107         pmovsxwd   m5, [kerq + yq + 16]
108         pmovsxwd   m2, [vq + yq]
109         pmovsxwd   m8, [vq + yq + 16]
110         pmovsxwd   m3, [uq + yq]
111         pmovsxwd   m9, [uq + yq + 16]
112
113         pmulld          m4, m2, m0
114         pmulld         m10, m8, m0
115         paddd           m4, m3
116         paddd           m10, m9
117         mova            m3, m7
118         vpgatherdd      m2, [srcq + m4], m3
119         mova            m3, m7
120         vpgatherdd      m4, [srcq + m10], m3
121         pand            m2, m6
122         pand            m4, m6
123         pmulld          m2, m1
124         pmulld          m4, m5
125
126         paddd           m2, m4
127         vextracti128   xm1, m2, 1
128         paddd           m1, m2
129         phaddd          m1, m1
130         phaddd          m1, m1
131         psrld           m1, m1, 0xe
132         packuswb        m1, m1
133
134         pextrb   [dstq+xq], xm1, 0
135
136         add   xq, 1
137         add   yq, 32
138         cmp   xq, widthq
139         jl .loop
140     RET
141
142 %endif