H264: change weight/biweight functions to take a height argument.
[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 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 height, int log2_denom,
40 ;                  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 r4d, r4m
48     movifnidn r5d, r5m
49 %endmacro
50
51 %macro WEIGHT_SETUP 1
52     mova       m0, [pw_1]
53     movd       m2, r3m
54     pslld      m0, m2       ; 1<<log2_denom
55     SPLATW     m0, m0
56     shl        r5, 19       ; *8, move to upper half of dword
57     lea        r5, [r5+r4*2+0x10000]
58     movd       m3, r5d      ; weight<<1 | 1+(offset<<(3))
59     pshufd     m3, m3, 0
60     mova       m4, [pw_pixel_max]
61     paddw      m2, [sq_1]   ; log2_denom+1
62 %ifnidn %1, sse4
63     pxor       m7, m7
64 %endif
65 %endmacro
66
67 %macro WEIGHT_OP 2-3
68 %if %0==2
69     mova        m5, [r0+%2]
70     punpckhwd   m6, m5, m0
71     punpcklwd   m5, m0
72 %else
73     movq        m5, [r0+%2]
74     movq        m6, [r0+%3]
75     punpcklwd   m5, m0
76     punpcklwd   m6, m0
77 %endif
78     pmaddwd     m5, m3
79     pmaddwd     m6, m3
80     psrad       m5, m2
81     psrad       m6, m2
82 %ifidn %1, sse4
83     packusdw    m5, m6
84     pminsw      m5, m4
85 %else
86     packssdw    m5, m6
87     CLIPW       m5, m7, m4
88 %endif
89 %endmacro
90
91 %macro WEIGHT_FUNC_DBL 1
92 cglobal h264_weight_16_10_%1
93     WEIGHT_PROLOGUE
94     WEIGHT_SETUP %1
95 .nextrow
96     WEIGHT_OP %1,  0
97     mova [r0   ], m5
98     WEIGHT_OP %1, 16
99     mova [r0+16], m5
100     add       r0, r1
101     dec       r2d
102     jnz .nextrow
103     REP_RET
104 %endmacro
105
106 INIT_XMM
107 WEIGHT_FUNC_DBL sse2
108 WEIGHT_FUNC_DBL sse4
109
110
111 %macro WEIGHT_FUNC_MM 1
112 cglobal h264_weight_8_10_%1
113     WEIGHT_PROLOGUE
114     WEIGHT_SETUP %1
115 .nextrow
116     WEIGHT_OP  %1, 0
117     mova     [r0], m5
118     add        r0, r1
119     dec        r2d
120     jnz .nextrow
121     REP_RET
122 %endmacro
123
124 INIT_XMM
125 WEIGHT_FUNC_MM sse2
126 WEIGHT_FUNC_MM sse4
127
128
129 %macro WEIGHT_FUNC_HALF_MM 1
130 cglobal h264_weight_4_10_%1
131     WEIGHT_PROLOGUE
132     sar         r2d, 1
133     WEIGHT_SETUP %1
134     lea         r3, [r1*2]
135 .nextrow
136     WEIGHT_OP   %1, 0, r1
137     movh      [r0], m5
138     movhps [r0+r1], m5
139     add         r0, r3
140     dec         r2d
141     jnz .nextrow
142     REP_RET
143 %endmacro
144
145 INIT_XMM
146 WEIGHT_FUNC_HALF_MM sse2
147 WEIGHT_FUNC_HALF_MM sse4
148
149
150 ;-----------------------------------------------------------------------------
151 ; void h264_biweight(uint8_t *dst, uint8_t *src, int stride, int height,
152 ;                    int log2_denom, int weightd, int weights, int offset);
153 ;-----------------------------------------------------------------------------
154 %ifdef ARCH_X86_32
155 DECLARE_REG_TMP 3
156 %else
157 DECLARE_REG_TMP 10
158 %endif
159
160 %macro BIWEIGHT_PROLOGUE 0
161 .prologue
162     PROLOGUE 0,7,8
163     movifnidn  r0, r0mp
164     movifnidn  r1, r1mp
165     movifnidn r2d, r2m
166     movifnidn r5d, r5m
167     movifnidn r6d, r6m
168     movifnidn t0d, r7m
169 %endmacro
170
171 %macro BIWEIGHT_SETUP 1
172     lea        t0, [t0*4+1] ; (offset<<2)+1
173     or         t0, 1
174     shl        r6, 16
175     or         r5, r6
176     movd       m4, r5d      ; weightd | weights
177     movd       m5, t0d      ; (offset+1)|1
178     movd       m6, r4m      ; log2_denom
179     pslld      m5, m6       ; (((offset<<2)+1)|1)<<log2_denom
180     paddd      m6, [sq_1]
181     pshufd     m4, m4, 0
182     pshufd     m5, m5, 0
183     mova       m3, [pw_pixel_max]
184     movifnidn r3d, r3m
185 %ifnidn %1, sse4
186     pxor       m7, m7
187 %endif
188 %endmacro
189
190 %macro BIWEIGHT 2-3
191 %if %0==2
192     mova       m0, [r0+%2]
193     mova       m1, [r1+%2]
194     punpckhwd  m2, m0, m1
195     punpcklwd  m0, m1
196 %else
197     movq       m0, [r0+%2]
198     movq       m1, [r1+%2]
199     punpcklwd  m0, m1
200     movq       m2, [r0+%3]
201     movq       m1, [r1+%3]
202     punpcklwd  m2, m1
203 %endif
204     pmaddwd    m0, m4
205     pmaddwd    m2, m4
206     paddd      m0, m5
207     paddd      m2, m5
208     psrad      m0, m6
209     psrad      m2, m6
210 %ifidn %1, sse4
211     packusdw   m0, m2
212     pminsw     m0, m3
213 %else
214     packssdw   m0, m2
215     CLIPW      m0, m7, m3
216 %endif
217 %endmacro
218
219 %macro BIWEIGHT_FUNC_DBL 1
220 cglobal h264_biweight_16_10_%1
221     BIWEIGHT_PROLOGUE
222     BIWEIGHT_SETUP %1
223 .nextrow
224     BIWEIGHT  %1,  0
225     mova [r0   ], m0
226     BIWEIGHT  %1, 16
227     mova [r0+16], m0
228     add       r0, r2
229     add       r1, r2
230     dec       r3d
231     jnz .nextrow
232     REP_RET
233 %endmacro
234
235 INIT_XMM
236 BIWEIGHT_FUNC_DBL sse2
237 BIWEIGHT_FUNC_DBL sse4
238
239 %macro BIWEIGHT_FUNC 1
240 cglobal h264_biweight_8_10_%1
241     BIWEIGHT_PROLOGUE
242     BIWEIGHT_SETUP %1
243 .nextrow
244     BIWEIGHT %1, 0
245     mova   [r0], m0
246     add      r0, r2
247     add      r1, r2
248     dec      r3d
249     jnz .nextrow
250     REP_RET
251 %endmacro
252
253 INIT_XMM
254 BIWEIGHT_FUNC sse2
255 BIWEIGHT_FUNC sse4
256
257 %macro BIWEIGHT_FUNC_HALF 1
258 cglobal h264_biweight_4_10_%1
259     BIWEIGHT_PROLOGUE
260     BIWEIGHT_SETUP %1
261     sar        r3d, 1
262     lea        r4, [r2*2]
263 .nextrow
264     BIWEIGHT    %1, 0, r2
265     movh   [r0   ], m0
266     movhps [r0+r2], m0
267     add         r0, r4
268     add         r1, r4
269     dec         r3d
270     jnz .nextrow
271     REP_RET
272 %endmacro
273
274 INIT_XMM
275 BIWEIGHT_FUNC_HALF sse2
276 BIWEIGHT_FUNC_HALF sse4