]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/h264_weight.asm
x86: sbrdsp: Implement SSE neg_odd_64
[ffmpeg] / 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 "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 mmxext
74 cglobal h264_weight_16, 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 2
87 cglobal h264_weight_%1, 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 mmxext
99 WEIGHT_FUNC_MM  8, 0
100 INIT_XMM sse2
101 WEIGHT_FUNC_MM 16, 8
102
103 %macro WEIGHT_FUNC_HALF_MM 2
104 cglobal h264_weight_%1, 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 mmxext
124 WEIGHT_FUNC_HALF_MM 4, 0
125 INIT_XMM sse2
126 WEIGHT_FUNC_HALF_MM 8, 8
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 %if cpuflag(ssse3)
139     movd       m4, r5d
140     movd       m0, r6d
141 %else
142     movd       m3, r5d
143     movd       m4, r6d
144 %endif
145     movd       m5, off_regd
146     movd       m6, r4d
147     pslld      m5, m6
148     psrld      m5, 1
149 %if cpuflag(ssse3)
150     punpcklbw  m4, m0
151     pshuflw    m4, m4, 0
152     pshuflw    m5, m5, 0
153     punpcklqdq m4, m4
154     punpcklqdq m5, m5
155
156 %else
157 %if mmsize == 16
158     pshuflw    m3, m3, 0
159     pshuflw    m4, m4, 0
160     pshuflw    m5, m5, 0
161     punpcklqdq m3, m3
162     punpcklqdq m4, m4
163     punpcklqdq m5, m5
164 %else
165     pshufw     m3, m3, 0
166     pshufw     m4, m4, 0
167     pshufw     m5, m5, 0
168 %endif
169     pxor       m7, m7
170 %endif
171 %endmacro
172
173 %macro BIWEIGHT_STEPA 3
174     movh       m%1, [r0+%3]
175     movh       m%2, [r1+%3]
176     punpcklbw  m%1, m7
177     punpcklbw  m%2, m7
178     pmullw     m%1, m3
179     pmullw     m%2, m4
180     paddsw     m%1, m%2
181 %endmacro
182
183 %macro BIWEIGHT_STEPB 0
184     paddsw     m0, m5
185     paddsw     m1, m5
186     psraw      m0, m6
187     psraw      m1, m6
188     packuswb   m0, m1
189 %endmacro
190
191 INIT_MMX mmxext
192 cglobal h264_biweight_16, 7, 8, 0
193     BIWEIGHT_SETUP
194     movifnidn r3d, r3m
195 .nextrow:
196     BIWEIGHT_STEPA 0, 1, 0
197     BIWEIGHT_STEPA 1, 2, 4
198     BIWEIGHT_STEPB
199     mova       [r0], m0
200     BIWEIGHT_STEPA 0, 1, 8
201     BIWEIGHT_STEPA 1, 2, 12
202     BIWEIGHT_STEPB
203     mova     [r0+8], m0
204     add        r0, r2
205     add        r1, r2
206     dec        r3d
207     jnz .nextrow
208     REP_RET
209
210 %macro BIWEIGHT_FUNC_MM 2
211 cglobal h264_biweight_%1, 7, 8, %2
212     BIWEIGHT_SETUP
213     movifnidn r3d, r3m
214 .nextrow:
215     BIWEIGHT_STEPA 0, 1, 0
216     BIWEIGHT_STEPA 1, 2, mmsize/2
217     BIWEIGHT_STEPB
218     mova       [r0], m0
219     add        r0, r2
220     add        r1, r2
221     dec        r3d
222     jnz .nextrow
223     REP_RET
224 %endmacro
225
226 INIT_MMX mmxext
227 BIWEIGHT_FUNC_MM  8, 0
228 INIT_XMM sse2
229 BIWEIGHT_FUNC_MM 16, 8
230
231 %macro BIWEIGHT_FUNC_HALF_MM 2
232 cglobal h264_biweight_%1, 7, 8, %2
233     BIWEIGHT_SETUP
234     movifnidn r3d, r3m
235     sar        r3, 1
236     lea        r4, [r2*2]
237 .nextrow:
238     BIWEIGHT_STEPA 0, 1, 0
239     BIWEIGHT_STEPA 1, 2, r2
240     BIWEIGHT_STEPB
241     movh       [r0], m0
242 %if mmsize == 16
243     movhps     [r0+r2], m0
244 %else
245     psrlq      m0, 32
246     movh       [r0+r2], m0
247 %endif
248     add        r0, r4
249     add        r1, r4
250     dec        r3d
251     jnz .nextrow
252     REP_RET
253 %endmacro
254
255 INIT_MMX mmxext
256 BIWEIGHT_FUNC_HALF_MM 4, 0
257 INIT_XMM sse2
258 BIWEIGHT_FUNC_HALF_MM 8, 8
259
260 %macro BIWEIGHT_SSSE3_OP 0
261     pmaddubsw  m0, m4
262     pmaddubsw  m2, m4
263     paddsw     m0, m5
264     paddsw     m2, m5
265     psraw      m0, m6
266     psraw      m2, m6
267     packuswb   m0, m2
268 %endmacro
269
270 INIT_XMM ssse3
271 cglobal h264_biweight_16, 7, 8, 8
272     BIWEIGHT_SETUP
273     movifnidn r3d, r3m
274
275 .nextrow:
276     movh       m0, [r0]
277     movh       m2, [r0+8]
278     movh       m3, [r1+8]
279     punpcklbw  m0, [r1]
280     punpcklbw  m2, m3
281     BIWEIGHT_SSSE3_OP
282     mova       [r0], m0
283     add        r0, r2
284     add        r1, r2
285     dec        r3d
286     jnz .nextrow
287     REP_RET
288
289 INIT_XMM ssse3
290 cglobal h264_biweight_8, 7, 8, 8
291     BIWEIGHT_SETUP
292     movifnidn r3d, r3m
293     sar        r3, 1
294     lea        r4, [r2*2]
295
296 .nextrow:
297     movh       m0, [r0]
298     movh       m1, [r1]
299     movh       m2, [r0+r2]
300     movh       m3, [r1+r2]
301     punpcklbw  m0, m1
302     punpcklbw  m2, m3
303     BIWEIGHT_SSSE3_OP
304     movh       [r0], m0
305     movhps     [r0+r2], m0
306     add        r0, r4
307     add        r1, r4
308     dec        r3d
309     jnz .nextrow
310     REP_RET