]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/h264_weight_10bit.asm
Merge remote-tracking branch 'qatar/master'
[ffmpeg] / libavcodec / x86 / h264_weight_10bit.asm
1 ;*****************************************************************************
2 ;* MMX/SSE2/AVX-optimized 10-bit H.264 weighted prediction code
3 ;*****************************************************************************
4 ;* Copyright (C) 2005-2011 x264 project
5 ;*
6 ;* Authors: Daniel Kang <daniel.d.kang@gmail.com>
7 ;*
8 ;* This file is part of Libav.
9 ;*
10 ;* Libav is free software; you can redistribute it and/or
11 ;* modify it under the terms of the GNU Lesser General Public
12 ;* License as published by the Free Software Foundation; either
13 ;* version 2.1 of the License, or (at your option) any later version.
14 ;*
15 ;* Libav is distributed in the hope that it will be useful,
16 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 ;* Lesser General Public License for more details.
19 ;*
20 ;* You should have received a copy of the GNU Lesser General Public
21 ;* License along with Libav; if not, write to the Free Software
22 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 ;******************************************************************************
24
25 %include "x86inc.asm"
26 %include "x86util.asm"
27
28 SECTION_RODATA 32
29
30 pw_pixel_max: times 8 dw ((1 << 10)-1)
31 sq_1: dq 1
32       dq 0
33
34 cextern pw_1
35
36 SECTION .text
37
38 ;-----------------------------------------------------------------------------
39 ; void h264_weight(uint8_t *dst, int stride, int log2_denom,
40 ;                  int weight, int offset);
41 ;-----------------------------------------------------------------------------
42 %ifdef ARCH_X86_32
43 DECLARE_REG_TMP 2
44 %else
45 DECLARE_REG_TMP 10
46 %endif
47
48 %macro WEIGHT_PROLOGUE 1
49     mov t0, %1
50 .prologue
51     PROLOGUE 0,5,8
52     movifnidn  r0, r0mp
53     movifnidn r1d, r1m
54     movifnidn r3d, r3m
55     movifnidn r4d, r4m
56 %endmacro
57
58 %macro WEIGHT_SETUP 1
59     mova       m0, [pw_1]
60     movd       m2, r2m
61     pslld      m0, m2       ; 1<<log2_denom
62     SPLATW     m0, m0
63     shl        r4, 19       ; *8, move to upper half of dword
64     lea        r4, [r4+r3*2+0x10000]
65     movd       m3, r4d      ; weight<<1 | 1+(offset<<(3))
66     pshufd     m3, m3, 0
67     mova       m4, [pw_pixel_max]
68     paddw      m2, [sq_1]   ; log2_denom+1
69 %ifnidn %1, sse4
70     pxor       m7, m7
71 %endif
72 %endmacro
73
74 %macro WEIGHT_OP 2-3
75 %if %0==2
76     mova        m5, [r0+%2]
77     punpckhwd   m6, m5, m0
78     punpcklwd   m5, m0
79 %else
80     movq        m5, [r0+%2]
81     movq        m6, [r0+%3]
82     punpcklwd   m5, m0
83     punpcklwd   m6, m0
84 %endif
85     pmaddwd     m5, m3
86     pmaddwd     m6, m3
87     psrad       m5, m2
88     psrad       m6, m2
89 %ifidn %1, sse4
90     packusdw    m5, m6
91     pminsw      m5, m4
92 %else
93     packssdw    m5, m6
94     CLIPW       m5, m7, m4
95 %endif
96 %endmacro
97
98 %macro WEIGHT_FUNC_DBL 1
99 cglobal h264_weight_16x16_10_%1
100     WEIGHT_PROLOGUE 16
101     WEIGHT_SETUP %1
102 .nextrow
103     WEIGHT_OP %1,  0
104     mova [r0   ], m5
105     WEIGHT_OP %1, 16
106     mova [r0+16], m5
107     add       r0, r1
108     dec       t0
109     jnz .nextrow
110     REP_RET
111
112 cglobal h264_weight_16x8_10_%1
113     mov t0, 8
114     jmp mangle(ff_h264_weight_16x16_10_%1.prologue)
115 %endmacro
116
117 INIT_XMM
118 WEIGHT_FUNC_DBL sse2
119 WEIGHT_FUNC_DBL sse4
120
121
122 %macro WEIGHT_FUNC_MM 1
123 cglobal h264_weight_8x16_10_%1
124     WEIGHT_PROLOGUE 16
125     WEIGHT_SETUP %1
126 .nextrow
127     WEIGHT_OP  %1, 0
128     mova     [r0], m5
129     add        r0, r1
130     dec        t0
131     jnz .nextrow
132     REP_RET
133
134 cglobal h264_weight_8x8_10_%1
135     mov t0, 8
136     jmp mangle(ff_h264_weight_8x16_10_%1.prologue)
137
138 cglobal h264_weight_8x4_10_%1
139     mov t0, 4
140     jmp mangle(ff_h264_weight_8x16_10_%1.prologue)
141 %endmacro
142
143 INIT_XMM
144 WEIGHT_FUNC_MM sse2
145 WEIGHT_FUNC_MM sse4
146
147
148 %macro WEIGHT_FUNC_HALF_MM 1
149 cglobal h264_weight_4x8_10_%1
150     WEIGHT_PROLOGUE 4
151     WEIGHT_SETUP %1
152     lea         r3, [r1*2]
153 .nextrow
154     WEIGHT_OP   %1, 0, r1
155     movh      [r0], m5
156     movhps [r0+r1], m5
157     add         r0, r3
158     dec         t0
159     jnz .nextrow
160     REP_RET
161
162 cglobal h264_weight_4x4_10_%1
163     mov t0, 2
164     jmp mangle(ff_h264_weight_4x8_10_%1.prologue)
165
166 cglobal h264_weight_4x2_10_%1
167     mov t0, 1
168     jmp mangle(ff_h264_weight_4x8_10_%1.prologue)
169 %endmacro
170
171 INIT_XMM
172 WEIGHT_FUNC_HALF_MM sse2
173 WEIGHT_FUNC_HALF_MM sse4
174
175
176 ;-----------------------------------------------------------------------------
177 ; void h264_biweight(uint8_t *dst, uint8_t *src, int stride, int log2_denom,
178 ;                    int weightd, int weights, int offset);
179 ;-----------------------------------------------------------------------------
180 %ifdef ARCH_X86_32
181 DECLARE_REG_TMP 2,3
182 %else
183 DECLARE_REG_TMP 10,2
184 %endif
185
186 %macro BIWEIGHT_PROLOGUE 1
187     mov t0, %1
188 .prologue
189     PROLOGUE 0,7,8
190     movifnidn  r0, r0mp
191     movifnidn  r1, r1mp
192     movifnidn t1d, r2m
193     movifnidn r4d, r4m
194     movifnidn r5d, r5m
195     movifnidn r6d, r6m
196 %endmacro
197
198 %macro BIWEIGHT_SETUP 1
199     lea        r6, [r6*4+1] ; (offset<<2)+1
200     or         r6, 1
201     shl        r5, 16
202     or         r4, r5
203     movd       m4, r4d      ; weightd | weights
204     movd       m5, r6d      ; (offset+1)|1
205     movd       m6, r3m      ; log2_denom
206     pslld      m5, m6       ; (((offset<<2)+1)|1)<<log2_denom
207     paddd      m6, [sq_1]
208     pshufd     m4, m4, 0
209     pshufd     m5, m5, 0
210     mova       m3, [pw_pixel_max]
211 %ifnidn %1, sse4
212     pxor       m7, m7
213 %endif
214 %endmacro
215
216 %macro BIWEIGHT 2-3
217 %if %0==2
218     mova       m0, [r0+%2]
219     mova       m1, [r1+%2]
220     punpckhwd  m2, m0, m1
221     punpcklwd  m0, m1
222 %else
223     movq       m0, [r0+%2]
224     movq       m1, [r1+%2]
225     punpcklwd  m0, m1
226     movq       m2, [r0+%3]
227     movq       m1, [r1+%3]
228     punpcklwd  m2, m1
229 %endif
230     pmaddwd    m0, m4
231     pmaddwd    m2, m4
232     paddd      m0, m5
233     paddd      m2, m5
234     psrad      m0, m6
235     psrad      m2, m6
236 %ifidn %1, sse4
237     packusdw   m0, m2
238     pminsw     m0, m3
239 %else
240     packssdw   m0, m2
241     CLIPW      m0, m7, m3
242 %endif
243 %endmacro
244
245 %macro BIWEIGHT_FUNC_DBL 1
246 cglobal h264_biweight_16x16_10_%1
247     BIWEIGHT_PROLOGUE 16
248     BIWEIGHT_SETUP %1
249 .nextrow
250     BIWEIGHT  %1,  0
251     mova [r0   ], m0
252     BIWEIGHT  %1, 16
253     mova [r0+16], m0
254     add       r0, t1
255     add       r1, t1
256     dec       t0
257     jnz .nextrow
258     REP_RET
259
260 cglobal h264_biweight_16x8_10_%1
261     mov t0, 8
262     jmp mangle(ff_h264_biweight_16x16_10_%1.prologue)
263 %endmacro
264
265 INIT_XMM
266 BIWEIGHT_FUNC_DBL sse2
267 BIWEIGHT_FUNC_DBL sse4
268
269 %macro BIWEIGHT_FUNC 1
270 cglobal h264_biweight_8x16_10_%1
271     BIWEIGHT_PROLOGUE 16
272     BIWEIGHT_SETUP %1
273 .nextrow
274     BIWEIGHT %1, 0
275     mova   [r0], m0
276     add      r0, t1
277     add      r1, t1
278     dec      t0
279     jnz .nextrow
280     REP_RET
281
282 cglobal h264_biweight_8x8_10_%1
283     mov t0, 8
284     jmp mangle(ff_h264_biweight_8x16_10_%1.prologue)
285
286 cglobal h264_biweight_8x4_10_%1
287     mov t0, 4
288     jmp mangle(ff_h264_biweight_8x16_10_%1.prologue)
289 %endmacro
290
291 INIT_XMM
292 BIWEIGHT_FUNC sse2
293 BIWEIGHT_FUNC sse4
294
295 %macro BIWEIGHT_FUNC_HALF 1
296 cglobal h264_biweight_4x8_10_%1
297     BIWEIGHT_PROLOGUE 4
298     BIWEIGHT_SETUP %1
299     lea        r4, [t1*2]
300 .nextrow
301     BIWEIGHT    %1, 0, t1
302     movh   [r0   ], m0
303     movhps [r0+t1], m0
304     add         r0, r4
305     add         r1, r4
306     dec         t0
307     jnz .nextrow
308     REP_RET
309
310 cglobal h264_biweight_4x4_10_%1
311     mov t0, 2
312     jmp mangle(ff_h264_biweight_4x8_10_%1.prologue)
313
314 cglobal h264_biweight_4x2_10_%1
315     mov t0, 1
316     jmp mangle(ff_h264_biweight_4x8_10_%1.prologue)
317 %endmacro
318
319 INIT_XMM
320 BIWEIGHT_FUNC_HALF sse2
321 BIWEIGHT_FUNC_HALF sse4