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