Merge commit '6860b4081d046558c44b1b42f22022ea341a2a73'
[ffmpeg.git] / libavcodec / x86 / h264_weight.asm
1 ;*****************************************************************************
2 ;* SSE2-optimized weighted prediction code
3 ;*****************************************************************************
4 ;* Copyright (c) 2004-2005 Michael Niedermayer, Loren Merritt
5 ;* Copyright (C) 2010 Eli Friedman <eli.friedman@gmail.com>
6 ;*
7 ;* This file is part of FFmpeg.
8 ;*
9 ;* FFmpeg is free software; you can redistribute it and/or
10 ;* modify it under the terms of the GNU Lesser General Public
11 ;* License as published by the Free Software Foundation; either
12 ;* version 2.1 of the License, or (at your option) any later version.
13 ;*
14 ;* FFmpeg is distributed in the hope that it will be useful,
15 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 ;* Lesser General Public License for more details.
18 ;*
19 ;* You should have received a copy of the GNU Lesser General Public
20 ;* License along with FFmpeg; if not, write to the Free Software
21 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 ;******************************************************************************
23
24 %include "libavutil/x86/x86util.asm"
25
26 SECTION .text
27
28 ;-----------------------------------------------------------------------------
29 ; biweight pred:
30 ;
31 ; void h264_biweight_16_sse2(uint8_t *dst, uint8_t *src, int stride,
32 ;                            int height, int log2_denom, int weightd,
33 ;                            int weights, int offset);
34 ; and
35 ; void h264_weight_16_sse2(uint8_t *dst, int stride, int height,
36 ;                          int log2_denom, int weight, int offset);
37 ;-----------------------------------------------------------------------------
38
39 %macro WEIGHT_SETUP 0
40     add        r5, r5
41     inc        r5
42     movd       m3, r4d
43     movd       m5, r5d
44     movd       m6, r3d
45     pslld      m5, m6
46     psrld      m5, 1
47 %if mmsize == 16
48     pshuflw    m3, m3, 0
49     pshuflw    m5, m5, 0
50     punpcklqdq m3, m3
51     punpcklqdq m5, m5
52 %else
53     pshufw     m3, m3, 0
54     pshufw     m5, m5, 0
55 %endif
56     pxor       m7, m7
57 %endmacro
58
59 %macro WEIGHT_OP 2
60     movh          m0, [r0+%1]
61     movh          m1, [r0+%2]
62     punpcklbw     m0, m7
63     punpcklbw     m1, m7
64     pmullw        m0, m3
65     pmullw        m1, m3
66     paddsw        m0, m5
67     paddsw        m1, m5
68     psraw         m0, m6
69     psraw         m1, m6
70     packuswb      m0, m1
71 %endmacro
72
73 INIT_MMX
74 cglobal h264_weight_16_mmx2, 6, 6, 0
75     WEIGHT_SETUP
76 .nextrow:
77     WEIGHT_OP 0,  4
78     mova     [r0  ], m0
79     WEIGHT_OP 8, 12
80     mova     [r0+8], m0
81     add        r0, r1
82     dec        r2d
83     jnz .nextrow
84     REP_RET
85
86 %macro WEIGHT_FUNC_MM 3
87 cglobal h264_weight_%1_%3, 6, 6, %2
88     WEIGHT_SETUP
89 .nextrow:
90     WEIGHT_OP 0, mmsize/2
91     mova     [r0], m0
92     add        r0, r1
93     dec        r2d
94     jnz .nextrow
95     REP_RET
96 %endmacro
97
98 INIT_MMX
99 WEIGHT_FUNC_MM  8, 0, mmx2
100 INIT_XMM
101 WEIGHT_FUNC_MM 16, 8, sse2
102
103 %macro WEIGHT_FUNC_HALF_MM 3
104 cglobal h264_weight_%1_%3, 6, 6, %2
105     WEIGHT_SETUP
106     sar       r2d, 1
107     lea        r3, [r1*2]
108 .nextrow:
109     WEIGHT_OP 0, r1
110     movh     [r0], m0
111 %if mmsize == 16
112     movhps   [r0+r1], m0
113 %else
114     psrlq      m0, 32
115     movh     [r0+r1], m0
116 %endif
117     add        r0, r3
118     dec        r2d
119     jnz .nextrow
120     REP_RET
121 %endmacro
122
123 INIT_MMX
124 WEIGHT_FUNC_HALF_MM 4, 0, mmx2
125 INIT_XMM
126 WEIGHT_FUNC_HALF_MM 8, 8, sse2
127
128 %macro BIWEIGHT_SETUP 0
129 %if ARCH_X86_64
130 %define off_regd r7d
131 %else
132 %define off_regd r3d
133 %endif
134     mov  off_regd, r7m
135     add  off_regd, 1
136     or   off_regd, 1
137     add        r4, 1
138     movd       m3, r5d
139     movd       m4, r6d
140     movd       m5, off_regd
141     movd       m6, r4d
142     pslld      m5, m6
143     psrld      m5, 1
144 %if mmsize == 16
145     pshuflw    m3, m3, 0
146     pshuflw    m4, m4, 0
147     pshuflw    m5, m5, 0
148     punpcklqdq m3, m3
149     punpcklqdq m4, m4
150     punpcklqdq m5, m5
151 %else
152     pshufw     m3, m3, 0
153     pshufw     m4, m4, 0
154     pshufw     m5, m5, 0
155 %endif
156     pxor       m7, m7
157 %endmacro
158
159 %macro BIWEIGHT_STEPA 3
160     movh       m%1, [r0+%3]
161     movh       m%2, [r1+%3]
162     punpcklbw  m%1, m7
163     punpcklbw  m%2, m7
164     pmullw     m%1, m3
165     pmullw     m%2, m4
166     paddsw     m%1, m%2
167 %endmacro
168
169 %macro BIWEIGHT_STEPB 0
170     paddsw     m0, m5
171     paddsw     m1, m5
172     psraw      m0, m6
173     psraw      m1, m6
174     packuswb   m0, m1
175 %endmacro
176
177 INIT_MMX
178 cglobal h264_biweight_16_mmx2, 7, 8, 0
179     BIWEIGHT_SETUP
180     movifnidn r3d, r3m
181 .nextrow:
182     BIWEIGHT_STEPA 0, 1, 0
183     BIWEIGHT_STEPA 1, 2, 4
184     BIWEIGHT_STEPB
185     mova       [r0], m0
186     BIWEIGHT_STEPA 0, 1, 8
187     BIWEIGHT_STEPA 1, 2, 12
188     BIWEIGHT_STEPB
189     mova     [r0+8], m0
190     add        r0, r2
191     add        r1, r2
192     dec        r3d
193     jnz .nextrow
194     REP_RET
195
196 %macro BIWEIGHT_FUNC_MM 3
197 cglobal h264_biweight_%1_%3, 7, 8, %2
198     BIWEIGHT_SETUP
199     movifnidn r3d, r3m
200 .nextrow:
201     BIWEIGHT_STEPA 0, 1, 0
202     BIWEIGHT_STEPA 1, 2, mmsize/2
203     BIWEIGHT_STEPB
204     mova       [r0], m0
205     add        r0, r2
206     add        r1, r2
207     dec        r3d
208     jnz .nextrow
209     REP_RET
210 %endmacro
211
212 INIT_MMX
213 BIWEIGHT_FUNC_MM  8, 0, mmx2
214 INIT_XMM
215 BIWEIGHT_FUNC_MM 16, 8, sse2
216
217 %macro BIWEIGHT_FUNC_HALF_MM 3
218 cglobal h264_biweight_%1_%3, 7, 8, %2
219     BIWEIGHT_SETUP
220     movifnidn r3d, r3m
221     sar        r3, 1
222     lea        r4, [r2*2]
223 .nextrow:
224     BIWEIGHT_STEPA 0, 1, 0
225     BIWEIGHT_STEPA 1, 2, r2
226     BIWEIGHT_STEPB
227     movh       [r0], m0
228 %if mmsize == 16
229     movhps     [r0+r2], m0
230 %else
231     psrlq      m0, 32
232     movh       [r0+r2], m0
233 %endif
234     add        r0, r4
235     add        r1, r4
236     dec        r3d
237     jnz .nextrow
238     REP_RET
239 %endmacro
240
241 INIT_MMX
242 BIWEIGHT_FUNC_HALF_MM 4, 0, mmx2
243 INIT_XMM
244 BIWEIGHT_FUNC_HALF_MM 8, 8, sse2
245
246 %macro BIWEIGHT_SSSE3_SETUP 0
247 %if ARCH_X86_64
248 %define off_regd r7d
249 %else
250 %define off_regd r3d
251 %endif
252     mov  off_regd, r7m
253     add  off_regd, 1
254     or   off_regd, 1
255     add        r4, 1
256     cmp        r5, 128
257      jne .normal
258     sar        r5, 1
259     sar        r6, 1
260     sar  off_regd, 1
261     sub        r4, 1
262 .normal
263     movd       m4, r5d
264     movd       m0, r6d
265     movd       m5, off_regd
266     movd       m6, r4d
267     pslld      m5, m6
268     psrld      m5, 1
269     punpcklbw  m4, m0
270     pshuflw    m4, m4, 0
271     pshuflw    m5, m5, 0
272     punpcklqdq m4, m4
273     punpcklqdq m5, m5
274 %endmacro
275
276 %macro BIWEIGHT_SSSE3_OP 0
277     pmaddubsw  m0, m4
278     pmaddubsw  m2, m4
279     paddsw     m0, m5
280     paddsw     m2, m5
281     psraw      m0, m6
282     psraw      m2, m6
283     packuswb   m0, m2
284 %endmacro
285
286 INIT_XMM
287 cglobal h264_biweight_16_ssse3, 7, 8, 8
288     BIWEIGHT_SSSE3_SETUP
289     movifnidn r3d, r3m
290
291 .nextrow:
292     movh       m0, [r0]
293     movh       m2, [r0+8]
294     movh       m3, [r1+8]
295     punpcklbw  m0, [r1]
296     punpcklbw  m2, m3
297     BIWEIGHT_SSSE3_OP
298     mova       [r0], m0
299     add        r0, r2
300     add        r1, r2
301     dec        r3d
302     jnz .nextrow
303     REP_RET
304
305 INIT_XMM
306 cglobal h264_biweight_8_ssse3, 7, 8, 8
307     BIWEIGHT_SSSE3_SETUP
308     movifnidn r3d, r3m
309     sar        r3, 1
310     lea        r4, [r2*2]
311
312 .nextrow:
313     movh       m0, [r0]
314     movh       m1, [r1]
315     movh       m2, [r0+r2]
316     movh       m3, [r1+r2]
317     punpcklbw  m0, m1
318     punpcklbw  m2, m3
319     BIWEIGHT_SSSE3_OP
320     movh       [r0], m0
321     movhps     [r0+r2], m0
322     add        r0, r4
323     add        r1, r4
324     dec        r3d
325     jnz .nextrow
326     REP_RET