]> git.sesse.net Git - ffmpeg/blob - libswscale/x86/yuv2yuvX.asm
521880dabebcbac5b41ca397f39ce9444b5db840
[ffmpeg] / libswscale / x86 / yuv2yuvX.asm
1 ;******************************************************************************
2 ;* x86-optimized yuv2yuvX
3 ;* Copyright 2020 Google LLC
4 ;* Copyright (C) 2001-2011 Michael Niedermayer <michaelni@gmx.at>
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 .text
26
27 ;-----------------------------------------------------------------------------
28 ; yuv2yuvX
29 ;
30 ; void ff_yuv2yuvX_<opt>(const int16_t *filter, int filterSize,
31 ;                        int srcOffset, uint8_t *dest, int dstW,
32 ;                        const uint8_t *dither, int offset);
33 ;
34 ;-----------------------------------------------------------------------------
35
36 %macro YUV2YUVX_FUNC 0
37 cglobal yuv2yuvX, 7, 7, 8, filter, filterSize, src, dest, dstW, dither, offset
38 %if notcpuflag(sse3)
39 %define movr mova
40 %else
41 %define movr movdqu
42 %endif
43     movsxdifnidn         dstWq, dstWd
44     movsxdifnidn         offsetq, offsetd
45     movsxdifnidn         srcq, srcd
46 %if cpuflag(avx2)
47     vpbroadcastq         m3, [ditherq]
48 %else
49     movq                 xm3, [ditherq]
50 %endif ; avx2
51     cmp                  offsetd, 0
52     jz                   .offset
53
54     ; offset != 0 path.
55     psrlq                m5, m3, $18
56     psllq                m3, m3, $28
57     por                  m3, m3, m5
58
59 .offset:
60     add offsetq, srcq
61     movd                 xm1, filterSized
62     SPLATW               m1, xm1, 0
63     pxor                 m0, m0, m0
64     mov                  filterSizeq, filterq
65     mov                  srcq, [filterSizeq]
66     punpcklbw            m3, m0
67     psllw                m1, m1, 3
68     paddw                m3, m3, m1
69     psraw                m7, m3, 4
70 .outerloop:
71     mova                 m4, m7
72     mova                 m3, m7
73     mova                 m6, m7
74     mova                 m1, m7
75 .loop:
76 %if cpuflag(avx2)
77     vpbroadcastq         m0, [filterSizeq + 8]
78 %elif cpuflag(sse3)
79     movddup              m0, [filterSizeq + 8]
80 %else
81     mova                 m0, [filterSizeq + 8]
82 %endif
83     pmulhw               m2, m0, [srcq + offsetq * 2]
84     pmulhw               m5, m0, [srcq + offsetq * 2 + mmsize]
85     paddw                m3, m3, m2
86     paddw                m4, m4, m5
87     pmulhw               m2, m0, [srcq + offsetq * 2 + 2 * mmsize]
88     pmulhw               m5, m0, [srcq + offsetq * 2 + 3 * mmsize]
89     paddw                m6, m6, m2
90     paddw                m1, m1, m5
91     add                  filterSizeq, $10
92     mov                  srcq, [filterSizeq]
93     test                 srcq, srcq
94     jnz                  .loop
95     psraw                m3, m3, 3
96     psraw                m4, m4, 3
97     psraw                m6, m6, 3
98     psraw                m1, m1, 3
99     packuswb             m3, m3, m4
100     packuswb             m6, m6, m1
101     mov                  srcq, [filterq]
102 %if cpuflag(avx2)
103     vpermq               m3, m3, 216
104     vpermq               m6, m6, 216
105 %endif
106     movr                 [destq + offsetq], m3
107     movr                 [destq + offsetq + mmsize], m6
108     add                  offsetq, mmsize * 2
109     mov                  filterSizeq, filterq
110     cmp                  offsetq, dstWq
111     jb                  .outerloop
112     REP_RET
113 %endmacro
114
115 INIT_MMX mmx
116 YUV2YUVX_FUNC
117 INIT_MMX mmxext
118 YUV2YUVX_FUNC
119 INIT_XMM sse3
120 YUV2YUVX_FUNC
121 %if HAVE_AVX2_EXTERNAL
122 INIT_YMM avx2
123 YUV2YUVX_FUNC
124 %endif