x86: include x86inc.asm in x86util.asm
[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 Libav.
8 ;*
9 ;* Libav 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 ;* Libav 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 Libav; if not, write to the Free Software
21 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 ;******************************************************************************
23
24 %include "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     movd       m4, r5d
257     movd       m0, r6d
258     movd       m5, off_regd
259     movd       m6, r4d
260     pslld      m5, m6
261     psrld      m5, 1
262     punpcklbw  m4, m0
263     pshuflw    m4, m4, 0
264     pshuflw    m5, m5, 0
265     punpcklqdq m4, m4
266     punpcklqdq m5, m5
267 %endmacro
268
269 %macro BIWEIGHT_SSSE3_OP 0
270     pmaddubsw  m0, m4
271     pmaddubsw  m2, m4
272     paddsw     m0, m5
273     paddsw     m2, m5
274     psraw      m0, m6
275     psraw      m2, m6
276     packuswb   m0, m2
277 %endmacro
278
279 INIT_XMM
280 cglobal h264_biweight_16_ssse3, 7, 8, 8
281     BIWEIGHT_SSSE3_SETUP
282     movifnidn r3d, r3m
283
284 .nextrow:
285     movh       m0, [r0]
286     movh       m2, [r0+8]
287     movh       m3, [r1+8]
288     punpcklbw  m0, [r1]
289     punpcklbw  m2, m3
290     BIWEIGHT_SSSE3_OP
291     mova       [r0], m0
292     add        r0, r2
293     add        r1, r2
294     dec        r3d
295     jnz .nextrow
296     REP_RET
297
298 INIT_XMM
299 cglobal h264_biweight_8_ssse3, 7, 8, 8
300     BIWEIGHT_SSSE3_SETUP
301     movifnidn r3d, r3m
302     sar        r3, 1
303     lea        r4, [r2*2]
304
305 .nextrow:
306     movh       m0, [r0]
307     movh       m1, [r1]
308     movh       m2, [r0+r2]
309     movh       m3, [r1+r2]
310     punpcklbw  m0, m1
311     punpcklbw  m2, m3
312     BIWEIGHT_SSSE3_OP
313     movh       [r0], m0
314     movhps     [r0+r2], m0
315     add        r0, r4
316     add        r1, r4
317     dec        r3d
318     jnz .nextrow
319     REP_RET