avcodec/imgconvert: Fix loss mask bug in avcodec_find_best_pix_fmt_of_list()
[ffmpeg.git] / 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 FFmpeg.
9 ;*
10 ;* FFmpeg 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 ;* FFmpeg 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 FFmpeg; if not, write to the Free Software
22 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 ;******************************************************************************
24
25 %include "libavutil/x86/x86util.asm"
26
27 SECTION_RODATA 32
28
29 sq_1: dq 1
30       dq 0
31
32 cextern pw_1
33 cextern pw_1023
34 %define pw_pixel_max pw_1023
35
36 SECTION .text
37
38 ;-----------------------------------------------------------------------------
39 ; void ff_h264_weight_16_10(uint8_t *dst, int stride, int height,
40 ;                           int log2_denom, int weight, int offset);
41 ;-----------------------------------------------------------------------------
42 %macro WEIGHT_PROLOGUE 0
43 .prologue:
44     PROLOGUE 0,6,8
45     movifnidn  r0, r0mp
46     movifnidn r1d, r1m
47     movifnidn r2d, r2m
48     movifnidn r4d, r4m
49     movifnidn r5d, r5m
50 %endmacro
51
52 %macro WEIGHT_SETUP 0
53     mova       m0, [pw_1]
54     movd       m2, r3m
55     pslld      m0, m2       ; 1<<log2_denom
56     SPLATW     m0, m0
57     shl        r5, 19       ; *8, move to upper half of dword
58     lea        r5, [r5+r4*2+0x10000]
59     movd       m3, r5d      ; weight<<1 | 1+(offset<<(3))
60     pshufd     m3, m3, 0
61     mova       m4, [pw_pixel_max]
62     paddw      m2, [sq_1]   ; log2_denom+1
63 %if notcpuflag(sse4)
64     pxor       m7, m7
65 %endif
66 %endmacro
67
68 %macro WEIGHT_OP 1-2
69 %if %0==1
70     mova        m5, [r0+%1]
71     punpckhwd   m6, m5, m0
72     punpcklwd   m5, m0
73 %else
74     movq        m5, [r0+%1]
75     movq        m6, [r0+%2]
76     punpcklwd   m5, m0
77     punpcklwd   m6, m0
78 %endif
79     pmaddwd     m5, m3
80     pmaddwd     m6, m3
81     psrad       m5, m2
82     psrad       m6, m2
83 %if cpuflag(sse4)
84     packusdw    m5, m6
85     pminsw      m5, m4
86 %else
87     packssdw    m5, m6
88     CLIPW       m5, m7, m4
89 %endif
90 %endmacro
91
92 %macro WEIGHT_FUNC_DBL 0
93 cglobal h264_weight_16_10
94     WEIGHT_PROLOGUE
95     WEIGHT_SETUP
96 .nextrow:
97     WEIGHT_OP  0
98     mova [r0   ], m5
99     WEIGHT_OP 16
100     mova [r0+16], m5
101     add       r0, r1
102     dec       r2d
103     jnz .nextrow
104     REP_RET
105 %endmacro
106
107 INIT_XMM sse2
108 WEIGHT_FUNC_DBL
109 INIT_XMM sse4
110 WEIGHT_FUNC_DBL
111
112
113 %macro WEIGHT_FUNC_MM 0
114 cglobal h264_weight_8_10
115     WEIGHT_PROLOGUE
116     WEIGHT_SETUP
117 .nextrow:
118     WEIGHT_OP   0
119     mova     [r0], m5
120     add        r0, r1
121     dec        r2d
122     jnz .nextrow
123     REP_RET
124 %endmacro
125
126 INIT_XMM sse2
127 WEIGHT_FUNC_MM
128 INIT_XMM sse4
129 WEIGHT_FUNC_MM
130
131
132 %macro WEIGHT_FUNC_HALF_MM 0
133 cglobal h264_weight_4_10
134     WEIGHT_PROLOGUE
135     sar         r2d, 1
136     WEIGHT_SETUP
137     lea         r3, [r1*2]
138 .nextrow:
139     WEIGHT_OP    0, r1
140     movh      [r0], m5
141     movhps [r0+r1], m5
142     add         r0, r3
143     dec         r2d
144     jnz .nextrow
145     REP_RET
146 %endmacro
147
148 INIT_XMM sse2
149 WEIGHT_FUNC_HALF_MM
150 INIT_XMM sse4
151 WEIGHT_FUNC_HALF_MM
152
153
154 ;-----------------------------------------------------------------------------
155 ; void ff_h264_biweight_16_10(uint8_t *dst, uint8_t *src, int stride,
156 ;                             int height, int log2_denom, int weightd,
157 ;                             int weights, int offset);
158 ;-----------------------------------------------------------------------------
159 %if ARCH_X86_32
160 DECLARE_REG_TMP 3
161 %else
162 DECLARE_REG_TMP 7
163 %endif
164
165 %macro BIWEIGHT_PROLOGUE 0
166 .prologue:
167     PROLOGUE 0,8,8
168     movifnidn  r0, r0mp
169     movifnidn  r1, r1mp
170     movifnidn r2d, r2m
171     movifnidn r5d, r5m
172     movifnidn r6d, r6m
173     movifnidn t0d, r7m
174 %endmacro
175
176 %macro BIWEIGHT_SETUP 0
177     lea        t0, [t0*4+1] ; (offset<<2)+1
178     or         t0, 1
179     shl        r6, 16
180     or         r5, r6
181     movd       m4, r5d      ; weightd | weights
182     movd       m5, t0d      ; (offset+1)|1
183     movd       m6, r4m      ; log2_denom
184     pslld      m5, m6       ; (((offset<<2)+1)|1)<<log2_denom
185     paddd      m6, [sq_1]
186     pshufd     m4, m4, 0
187     pshufd     m5, m5, 0
188     mova       m3, [pw_pixel_max]
189     movifnidn r3d, r3m
190 %if notcpuflag(sse4)
191     pxor       m7, m7
192 %endif
193 %endmacro
194
195 %macro BIWEIGHT 1-2
196 %if %0==1
197     mova       m0, [r0+%1]
198     mova       m1, [r1+%1]
199     punpckhwd  m2, m0, m1
200     punpcklwd  m0, m1
201 %else
202     movq       m0, [r0+%1]
203     movq       m1, [r1+%1]
204     punpcklwd  m0, m1
205     movq       m2, [r0+%2]
206     movq       m1, [r1+%2]
207     punpcklwd  m2, m1
208 %endif
209     pmaddwd    m0, m4
210     pmaddwd    m2, m4
211     paddd      m0, m5
212     paddd      m2, m5
213     psrad      m0, m6
214     psrad      m2, m6
215 %if cpuflag(sse4)
216     packusdw   m0, m2
217     pminsw     m0, m3
218 %else
219     packssdw   m0, m2
220     CLIPW      m0, m7, m3
221 %endif
222 %endmacro
223
224 %macro BIWEIGHT_FUNC_DBL 0
225 cglobal h264_biweight_16_10
226     BIWEIGHT_PROLOGUE
227     BIWEIGHT_SETUP
228 .nextrow:
229     BIWEIGHT   0
230     mova [r0   ], m0
231     BIWEIGHT  16
232     mova [r0+16], m0
233     add       r0, r2
234     add       r1, r2
235     dec       r3d
236     jnz .nextrow
237     REP_RET
238 %endmacro
239
240 INIT_XMM sse2
241 BIWEIGHT_FUNC_DBL
242 INIT_XMM sse4
243 BIWEIGHT_FUNC_DBL
244
245 %macro BIWEIGHT_FUNC 0
246 cglobal h264_biweight_8_10
247     BIWEIGHT_PROLOGUE
248     BIWEIGHT_SETUP
249 .nextrow:
250     BIWEIGHT  0
251     mova   [r0], m0
252     add      r0, r2
253     add      r1, r2
254     dec      r3d
255     jnz .nextrow
256     REP_RET
257 %endmacro
258
259 INIT_XMM sse2
260 BIWEIGHT_FUNC
261 INIT_XMM sse4
262 BIWEIGHT_FUNC
263
264 %macro BIWEIGHT_FUNC_HALF 0
265 cglobal h264_biweight_4_10
266     BIWEIGHT_PROLOGUE
267     BIWEIGHT_SETUP
268     sar        r3d, 1
269     lea        r4, [r2*2]
270 .nextrow:
271     BIWEIGHT     0, r2
272     movh   [r0   ], m0
273     movhps [r0+r2], m0
274     add         r0, r4
275     add         r1, r4
276     dec         r3d
277     jnz .nextrow
278     REP_RET
279 %endmacro
280
281 INIT_XMM sse2
282 BIWEIGHT_FUNC_HALF
283 INIT_XMM sse4
284 BIWEIGHT_FUNC_HALF