]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/h264_intrapred_10bit.asm
Add x86 assembly for some 10-bit H.264 intra predict functions.
[ffmpeg] / libavcodec / x86 / h264_intrapred_10bit.asm
1 ;*****************************************************************************
2 ;* MMX/SSE2/AVX-optimized 10-bit H.264 intra 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
29
30 SECTION .text
31
32 cextern pw_4
33 cextern pw_1
34
35 %macro PRED4x4_LOWPASS 4
36     paddw       %2, %3
37     psrlw       %2, 1
38     pavgw       %1, %4, %2
39 %endmacro
40
41 ;-----------------------------------------------------------------------------
42 ; void pred4x4_down_right(pixel *src, const pixel *topright, int stride)
43 ;-----------------------------------------------------------------------------
44 %macro PRED4x4_DR 1
45 cglobal pred4x4_down_right_10_%1, 3,3
46     sub       r0, r2
47     lea       r1, [r0+r2*2]
48     movhps    m1, [r1-8]
49     movhps    m2, [r0+r2*1-8]
50     movhps    m4, [r0-8]
51     punpckhwd m2, m4
52     movq      m3, [r0]
53     punpckhdq m1, m2
54     PALIGNR   m3, m1, 10, m1
55     mova      m1, m3
56     movhps    m4, [r1+r2*1-8]
57     PALIGNR   m3, m4, 14, m4
58     mova      m2, m3
59     movhps    m4, [r1+r2*2-8]
60     PALIGNR   m3, m4, 14, m4
61     PRED4x4_LOWPASS m0, m3, m1, m2
62     movq      [r1+r2*2], m0
63     psrldq    m0, 2
64     movq      [r1+r2*1], m0
65     psrldq    m0, 2
66     movq      [r0+r2*2], m0
67     psrldq    m0, 2
68     movq      [r0+r2*1], m0
69     RET
70 %endmacro
71
72 INIT_XMM
73 %define PALIGNR PALIGNR_MMX
74 PRED4x4_DR sse2
75 %define PALIGNR PALIGNR_SSSE3
76 PRED4x4_DR ssse3
77 %ifdef HAVE_AVX
78 INIT_AVX
79 PRED4x4_DR avx
80 %endif
81
82 ;-----------------------------------------------------------------------------
83 ; void pred4x4_vertical_right(pixel *src, const pixel *topright, int stride)
84 ;-----------------------------------------------------------------------------
85 %macro PRED4x4_VR 1
86 cglobal pred4x4_vertical_right_10_%1, 3,3,6
87     sub     r0, r2
88     lea     r1, [r0+r2*2]
89     movq    m5, [r0]            ; ........t3t2t1t0
90     movhps  m1, [r0-8]
91     PALIGNR m0, m5, m1, 14, m1  ; ......t3t2t1t0lt
92     pavgw   m5, m0
93     movhps  m1, [r0+r2*1-8]
94     PALIGNR m0, m1, 14, m1      ; ....t3t2t1t0ltl0
95     mova    m1, m0
96     movhps  m2, [r0+r2*2-8]
97     PALIGNR m0, m2, 14, m2      ; ..t3t2t1t0ltl0l1
98     mova    m2, m0
99     movhps  m3, [r1+r2*1-8]
100     PALIGNR m0, m3, 14, m3      ; t3t2t1t0ltl0l1l2
101     PRED4x4_LOWPASS m3, m1, m0, m2
102     pslldq  m1, m3, 12
103     psrldq  m3, 4
104     movq    [r0+r2*1], m5
105     movq    [r0+r2*2], m3
106     PALIGNR m5, m1, 14, m2
107     pslldq  m1, 2
108     movq    [r1+r2*1], m5
109     PALIGNR m3, m1, 14, m1
110     movq    [r1+r2*2], m3
111     RET
112 %endmacro
113
114 INIT_XMM
115 %define PALIGNR PALIGNR_MMX
116 PRED4x4_VR sse2
117 %define PALIGNR PALIGNR_SSSE3
118 PRED4x4_VR ssse3
119 %ifdef HAVE_AVX
120 INIT_AVX
121 PRED4x4_VR avx
122 %endif
123
124 ;-----------------------------------------------------------------------------
125 ; void pred4x4_horizontal_down(pixel *src, const pixel *topright, int stride)
126 ;-----------------------------------------------------------------------------
127 %macro PRED4x4_HD 1
128 cglobal pred4x4_horizontal_down_10_%1, 3,3
129     sub        r0, r2
130     lea        r1, [r0+r2*2]
131     movq       m0, [r0-8]      ; lt ..
132     movhps     m0, [r0]
133     pslldq     m0, 2           ; t2 t1 t0 lt .. .. .. ..
134     movq       m1, [r1+r2*2-8] ; l3
135     movq       m3, [r1+r2*1-8]
136     punpcklwd  m1, m3          ; l2 l3
137     movq       m2, [r0+r2*2-8] ; l1
138     movq       m3, [r0+r2*1-8]
139     punpcklwd  m2, m3          ; l0 l1
140     punpckhdq  m1, m2          ; l0 l1 l2 l3
141     punpckhqdq m1, m0          ; t2 t1 t0 lt l0 l1 l2 l3
142     psrldq     m0, m1, 4       ; .. .. t2 t1 t0 lt l0 l1
143     psrldq     m2, m1, 2       ; .. t2 t1 t0 lt l0 l1 l2
144     pavgw      m5, m1, m2
145     PRED4x4_LOWPASS m3, m1, m0, m2
146     punpcklwd  m5, m3
147     psrldq     m3, 8
148     PALIGNR    m3, m5, 12, m4
149     movq       [r1+r2*2], m5
150     movhps     [r0+r2*2], m5
151     psrldq     m5, 4
152     movq       [r1+r2*1], m5
153     movq       [r0+r2*1], m3
154     RET
155 %endmacro
156
157 INIT_XMM
158 %define PALIGNR PALIGNR_MMX
159 PRED4x4_HD sse2
160 %define PALIGNR PALIGNR_SSSE3
161 PRED4x4_HD ssse3
162 %ifdef HAVE_AVX
163 INIT_AVX
164 PRED4x4_HD avx
165 %endif
166
167 ;-----------------------------------------------------------------------------
168 ; void pred4x4_dc(pixel *src, const pixel *topright, int stride)
169 ;-----------------------------------------------------------------------------
170 %macro HADDD 2 ; sum junk
171 %if mmsize == 16
172     movhlps %2, %1
173     paddd   %1, %2
174     pshuflw %2, %1, 0xE
175     paddd   %1, %2
176 %else
177     pshufw  %2, %1, 0xE
178     paddd   %1, %2
179 %endif
180 %endmacro
181
182 %macro HADDW 2
183     pmaddwd %1, [pw_1]
184     HADDD   %1, %2
185 %endmacro
186
187 INIT_MMX
188 cglobal pred4x4_dc_10_mmxext, 3,3
189     sub    r0, r2
190     lea    r1, [r0+r2*2]
191     movq   m2, [r0+r2*1-8]
192     paddw  m2, [r0+r2*2-8]
193     paddw  m2, [r1+r2*1-8]
194     paddw  m2, [r1+r2*2-8]
195     psrlq  m2, 48
196     movq   m0, [r0]
197     HADDW  m0, m1
198     paddw  m0, [pw_4]
199     paddw  m0, m2
200     psrlw  m0, 3
201     SPLATW m0, m0, 0
202     movq   [r0+r2*1], m0
203     movq   [r0+r2*2], m0
204     movq   [r1+r2*1], m0
205     movq   [r1+r2*2], m0
206     RET
207
208 ;-----------------------------------------------------------------------------
209 ; void pred4x4_down_left(pixel *src, const pixel *topright, int stride)
210 ;-----------------------------------------------------------------------------
211 ;TODO: more AVX here
212 %macro PRED4x4_DL 1
213 cglobal pred4x4_down_left_10_%1, 3,3
214     sub        r0, r2
215     movq       m1, [r0]
216     movhps     m1, [r1]
217     pslldq     m5, m1, 2
218     pxor       m2, m5, m1
219     psrldq     m2, 2
220     pxor       m3, m1, m2
221     PRED4x4_LOWPASS m0, m5, m3, m1
222     lea        r1, [r0+r2*2]
223     movhps     [r1+r2*2], m0
224     psrldq     m0, 2
225     movq       [r0+r2*1], m0
226     psrldq     m0, 2
227     movq       [r0+r2*2], m0
228     psrldq     m0, 2
229     movq       [r1+r2*1], m0
230     RET
231 %endmacro
232
233 INIT_XMM
234 PRED4x4_DL sse2
235 %ifdef HAVE_AVX
236 INIT_AVX
237 PRED4x4_DL avx
238 %endif
239
240 ;-----------------------------------------------------------------------------
241 ; void pred4x4_vertical_left(pixel *src, const pixel *topright, int stride)
242 ;-----------------------------------------------------------------------------
243 %macro PRED4x4_VL 1
244 cglobal pred4x4_vertical_left_10_%1, 3,3
245     sub        r0, r2
246     movu       m1, [r0]
247     movhps     m1, [r1]
248     psrldq     m3, m1, 2
249     psrldq     m2, m1, 4
250     pavgw      m4, m3, m1
251     PRED4x4_LOWPASS m0, m1, m2, m3
252     lea        r1, [r0+r2*2]
253     movq       [r0+r2*1], m4
254     movq       [r0+r2*2], m0
255     psrldq     m4, 2
256     psrldq     m0, 2
257     movq       [r1+r2*1], m4
258     movq       [r1+r2*2], m0
259     RET
260 %endmacro
261
262 INIT_XMM
263 PRED4x4_VL sse2
264 %ifdef HAVE_AVX
265 INIT_AVX
266 PRED4x4_VL avx
267 %endif
268
269 ;-----------------------------------------------------------------------------
270 ; void pred4x4_horizontal_up(pixel *src, const pixel *topright, int stride)
271 ;-----------------------------------------------------------------------------
272 INIT_MMX
273 cglobal pred4x4_horizontal_up_10_mmxext, 3,3
274     sub       r0, r2
275     lea       r1, [r0+r2*2]
276     movq      m0, [r0+r2*1-8]
277     punpckhwd m0, [r0+r2*2-8]
278     movq      m1, [r1+r2*1-8]
279     punpckhwd m1, [r1+r2*2-8]
280     punpckhdq m0, m1
281     pshufw    m1, m1, 0xFF
282     movq      [r1+r2*2], m1
283     movd      [r1+r2*1+4], m1
284     pshufw    m2, m0, 11111001b
285     movq      m1, m2
286     pavgw     m2, m0
287
288     pshufw    m5, m0, 11111110b
289     PRED4x4_LOWPASS m3, m0, m5, m1
290     movq      m6, m2
291     punpcklwd m6, m3
292     movq      [r0+r2*1], m6
293     psrlq     m2, 16
294     psrlq     m3, 16
295     punpcklwd m2, m3
296     movq      [r0+r2*2], m2
297     psrlq     m2, 32
298     movd      [r1+r2*1], m2
299     RET
300
301
302
303 ;-----------------------------------------------------------------------------
304 ; void pred8x8_vertical(pixel *src, int stride)
305 ;-----------------------------------------------------------------------------
306 INIT_XMM
307 cglobal pred8x8_vertical_10_sse2, 2,2
308     sub  r0, r1
309     mova m0, [r0]
310 %rep 3
311     mova [r0+r1*1], m0
312     mova [r0+r1*2], m0
313     lea  r0, [r0+r1*2]
314 %endrep
315     mova [r0+r1*1], m0
316     mova [r0+r1*2], m0
317     RET
318
319 ;-----------------------------------------------------------------------------
320 ; void pred8x8_horizontal(pixel *src, int stride)
321 ;-----------------------------------------------------------------------------
322 INIT_XMM
323 cglobal pred8x8_horizontal_10_sse2, 2,3
324     mov          r2, 4
325 .loop:
326     movq         m0, [r0+r1*0-8]
327     movq         m1, [r0+r1*1-8]
328     pshuflw      m0, m0, 0xff
329     pshuflw      m1, m1, 0xff
330     punpcklqdq   m0, m0
331     punpcklqdq   m1, m1
332     mova  [r0+r1*0], m0
333     mova  [r0+r1*1], m1
334     lea          r0, [r0+r1*2]
335     dec          r2
336     jg .loop
337     REP_RET