Merge remote-tracking branch 'qatar/master'
[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/x86inc.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 WEIGHT_FUNC_HALF_MM 4, 0, mmx2
126 WEIGHT_FUNC_HALF_MM 4, 0, mmx2
127 INIT_XMM
128 WEIGHT_FUNC_HALF_MM 8, 8, sse2
129 WEIGHT_FUNC_HALF_MM 8, 8, sse2
130 WEIGHT_FUNC_HALF_MM 8, 8, sse2
131
132 %macro BIWEIGHT_SETUP 0
133 %ifdef ARCH_X86_64
134 %define off_regd r11d
135 %else
136 %define off_regd r3d
137 %endif
138     mov  off_regd, r7m
139     add  off_regd, 1
140     or   off_regd, 1
141     add        r4, 1
142     movd       m3, r5d
143     movd       m4, r6d
144     movd       m5, off_regd
145     movd       m6, r4d
146     pslld      m5, m6
147     psrld      m5, 1
148 %if mmsize == 16
149     pshuflw    m3, m3, 0
150     pshuflw    m4, m4, 0
151     pshuflw    m5, m5, 0
152     punpcklqdq m3, m3
153     punpcklqdq m4, m4
154     punpcklqdq m5, m5
155 %else
156     pshufw     m3, m3, 0
157     pshufw     m4, m4, 0
158     pshufw     m5, m5, 0
159 %endif
160     pxor       m7, m7
161 %endmacro
162
163 %macro BIWEIGHT_STEPA 3
164     movh       m%1, [r0+%3]
165     movh       m%2, [r1+%3]
166     punpcklbw  m%1, m7
167     punpcklbw  m%2, m7
168     pmullw     m%1, m3
169     pmullw     m%2, m4
170     paddsw     m%1, m%2
171 %endmacro
172
173 %macro BIWEIGHT_STEPB 0
174     paddsw     m0, m5
175     paddsw     m1, m5
176     psraw      m0, m6
177     psraw      m1, m6
178     packuswb   m0, m1
179 %endmacro
180
181 INIT_MMX
182 cglobal h264_biweight_16_mmx2, 7, 7, 0
183     BIWEIGHT_SETUP
184     movifnidn r3d, r3m
185 .nextrow
186     BIWEIGHT_STEPA 0, 1, 0
187     BIWEIGHT_STEPA 1, 2, 4
188     BIWEIGHT_STEPB
189     mova       [r0], m0
190     BIWEIGHT_STEPA 0, 1, 8
191     BIWEIGHT_STEPA 1, 2, 12
192     BIWEIGHT_STEPB
193     mova     [r0+8], m0
194     add        r0, r2
195     add        r1, r2
196     dec        r3d
197     jnz .nextrow
198     REP_RET
199
200 %macro BIWEIGHT_FUNC_MM 3
201 cglobal h264_biweight_%1_%3, 7, 7, %2
202     BIWEIGHT_SETUP
203     movifnidn r3d, r3m
204 .nextrow
205     BIWEIGHT_STEPA 0, 1, 0
206     BIWEIGHT_STEPA 1, 2, mmsize/2
207     BIWEIGHT_STEPB
208     mova       [r0], m0
209     add        r0, r2
210     add        r1, r2
211     dec        r3d
212     jnz .nextrow
213     REP_RET
214 %endmacro
215
216 INIT_MMX
217 BIWEIGHT_FUNC_MM  8, 0, mmx2
218 INIT_XMM
219 BIWEIGHT_FUNC_MM 16, 8, sse2
220
221 %macro BIWEIGHT_FUNC_HALF_MM 3
222 cglobal h264_biweight_%1_%3, 7, 7, %2
223     BIWEIGHT_SETUP
224     movifnidn r3d, r3m
225     sar        r3, 1
226     lea        r4, [r2*2]
227 .nextrow
228     BIWEIGHT_STEPA 0, 1, 0
229     BIWEIGHT_STEPA 1, 2, r2
230     BIWEIGHT_STEPB
231     movh       [r0], m0
232 %if mmsize == 16
233     movhps     [r0+r2], m0
234 %else
235     psrlq      m0, 32
236     movh       [r0+r2], m0
237 %endif
238     add        r0, r4
239     add        r1, r4
240     dec        r3d
241     jnz .nextrow
242     REP_RET
243 %endmacro
244
245 INIT_MMX
246 BIWEIGHT_FUNC_HALF_MM 4, 0, mmx2
247 INIT_XMM
248 BIWEIGHT_FUNC_HALF_MM 8, 8, sse2
249
250 %macro BIWEIGHT_SSSE3_SETUP 0
251 %ifdef ARCH_X86_64
252 %define off_regd r11d
253 %else
254 %define off_regd r3d
255 %endif
256     mov  off_regd, r7m
257     add  off_regd, 1
258     or   off_regd, 1
259     add        r4, 1
260     movd       m4, r5d
261     movd       m0, r6d
262     movd       m5, off_regd
263     movd       m6, r4d
264     pslld      m5, m6
265     psrld      m5, 1
266     punpcklbw  m4, m0
267     pshuflw    m4, m4, 0
268     pshuflw    m5, m5, 0
269     punpcklqdq m4, m4
270     punpcklqdq m5, m5
271 %endmacro
272
273 %macro BIWEIGHT_SSSE3_OP 0
274     pmaddubsw  m0, m4
275     pmaddubsw  m2, m4
276     paddsw     m0, m5
277     paddsw     m2, m5
278     psraw      m0, m6
279     psraw      m2, m6
280     packuswb   m0, m2
281 %endmacro
282
283 INIT_XMM
284 cglobal h264_biweight_16_ssse3, 7, 7, 8
285     BIWEIGHT_SSSE3_SETUP
286     movifnidn r3d, r3m
287
288 .nextrow
289     movh       m0, [r0]
290     movh       m2, [r0+8]
291     movh       m3, [r1+8]
292     punpcklbw  m0, [r1]
293     punpcklbw  m2, m3
294     BIWEIGHT_SSSE3_OP
295     mova       [r0], m0
296     add        r0, r2
297     add        r1, r2
298     dec        r3d
299     jnz .nextrow
300     REP_RET
301
302 INIT_XMM
303 cglobal h264_biweight_8_ssse3, 7, 7, 8
304     BIWEIGHT_SSSE3_SETUP
305     movifnidn r3d, r3m
306     sar        r3, 1
307     lea        r4, [r2*2]
308
309 .nextrow
310     movh       m0, [r0]
311     movh       m1, [r1]
312     movh       m2, [r0+r2]
313     movh       m3, [r1+r2]
314     punpcklbw  m0, m1
315     punpcklbw  m2, m3
316     BIWEIGHT_SSSE3_OP
317     movh       [r0], m0
318     movhps     [r0+r2], m0
319     add        r0, r4
320     add        r1, r4
321     dec        r3d
322     jnz .nextrow
323     REP_RET