]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/h264_intrapred_10bit.asm
x86: Use LOCAL_ALIGNED in mpegvideo_mmx_template
[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_16
33 cextern pw_8
34 cextern pw_4
35 cextern pw_2
36 cextern pw_1
37
38 pw_m32101234: dw -3, -2, -1, 0, 1, 2, 3, 4
39 pw_m3:        times 8 dw -3
40 pw_pixel_max: times 8 dw ((1 << 10)-1)
41 pw_512:       times 8 dw 512
42 pd_17:        times 4 dd 17
43 pd_16:        times 4 dd 16
44
45 ; dest, left, right, src
46 ; output: %1 = (t[n-1] + t[n]*2 + t[n+1] + 2) >> 2
47 %macro PRED4x4_LOWPASS 4
48     paddw       %2, %3
49     psrlw       %2, 1
50     pavgw       %1, %4, %2
51 %endmacro
52
53 ;-----------------------------------------------------------------------------
54 ; void pred4x4_down_right(pixel *src, const pixel *topright, int stride)
55 ;-----------------------------------------------------------------------------
56 %macro PRED4x4_DR 1
57 cglobal pred4x4_down_right_10_%1, 3,3
58     sub       r0, r2
59     lea       r1, [r0+r2*2]
60     movhps    m1, [r1-8]
61     movhps    m2, [r0+r2*1-8]
62     movhps    m4, [r0-8]
63     punpckhwd m2, m4
64     movq      m3, [r0]
65     punpckhdq m1, m2
66     PALIGNR   m3, m1, 10, m1
67     mova      m1, m3
68     movhps    m4, [r1+r2*1-8]
69     PALIGNR   m3, m4, 14, m4
70     mova      m2, m3
71     movhps    m4, [r1+r2*2-8]
72     PALIGNR   m3, m4, 14, m4
73     PRED4x4_LOWPASS m0, m3, m1, m2
74     movq      [r1+r2*2], m0
75     psrldq    m0, 2
76     movq      [r1+r2*1], m0
77     psrldq    m0, 2
78     movq      [r0+r2*2], m0
79     psrldq    m0, 2
80     movq      [r0+r2*1], m0
81     RET
82 %endmacro
83
84 INIT_XMM
85 %define PALIGNR PALIGNR_MMX
86 PRED4x4_DR sse2
87 %define PALIGNR PALIGNR_SSSE3
88 PRED4x4_DR ssse3
89 %ifdef HAVE_AVX
90 INIT_AVX
91 PRED4x4_DR avx
92 %endif
93
94 ;-----------------------------------------------------------------------------
95 ; void pred4x4_vertical_right(pixel *src, const pixel *topright, int stride)
96 ;-----------------------------------------------------------------------------
97 %macro PRED4x4_VR 1
98 cglobal pred4x4_vertical_right_10_%1, 3,3,6
99     sub     r0, r2
100     lea     r1, [r0+r2*2]
101     movq    m5, [r0]            ; ........t3t2t1t0
102     movhps  m1, [r0-8]
103     PALIGNR m0, m5, m1, 14, m1  ; ......t3t2t1t0lt
104     pavgw   m5, m0
105     movhps  m1, [r0+r2*1-8]
106     PALIGNR m0, m1, 14, m1      ; ....t3t2t1t0ltl0
107     mova    m1, m0
108     movhps  m2, [r0+r2*2-8]
109     PALIGNR m0, m2, 14, m2      ; ..t3t2t1t0ltl0l1
110     mova    m2, m0
111     movhps  m3, [r1+r2*1-8]
112     PALIGNR m0, m3, 14, m3      ; t3t2t1t0ltl0l1l2
113     PRED4x4_LOWPASS m3, m1, m0, m2
114     pslldq  m1, m3, 12
115     psrldq  m3, 4
116     movq    [r0+r2*1], m5
117     movq    [r0+r2*2], m3
118     PALIGNR m5, m1, 14, m2
119     pslldq  m1, 2
120     movq    [r1+r2*1], m5
121     PALIGNR m3, m1, 14, m1
122     movq    [r1+r2*2], m3
123     RET
124 %endmacro
125
126 INIT_XMM
127 %define PALIGNR PALIGNR_MMX
128 PRED4x4_VR sse2
129 %define PALIGNR PALIGNR_SSSE3
130 PRED4x4_VR ssse3
131 %ifdef HAVE_AVX
132 INIT_AVX
133 PRED4x4_VR avx
134 %endif
135
136 ;-----------------------------------------------------------------------------
137 ; void pred4x4_horizontal_down(pixel *src, const pixel *topright, int stride)
138 ;-----------------------------------------------------------------------------
139 %macro PRED4x4_HD 1
140 cglobal pred4x4_horizontal_down_10_%1, 3,3
141     sub        r0, r2
142     lea        r1, [r0+r2*2]
143     movq       m0, [r0-8]      ; lt ..
144     movhps     m0, [r0]
145     pslldq     m0, 2           ; t2 t1 t0 lt .. .. .. ..
146     movq       m1, [r1+r2*2-8] ; l3
147     movq       m3, [r1+r2*1-8]
148     punpcklwd  m1, m3          ; l2 l3
149     movq       m2, [r0+r2*2-8] ; l1
150     movq       m3, [r0+r2*1-8]
151     punpcklwd  m2, m3          ; l0 l1
152     punpckhdq  m1, m2          ; l0 l1 l2 l3
153     punpckhqdq m1, m0          ; t2 t1 t0 lt l0 l1 l2 l3
154     psrldq     m0, m1, 4       ; .. .. t2 t1 t0 lt l0 l1
155     psrldq     m2, m1, 2       ; .. t2 t1 t0 lt l0 l1 l2
156     pavgw      m5, m1, m2
157     PRED4x4_LOWPASS m3, m1, m0, m2
158     punpcklwd  m5, m3
159     psrldq     m3, 8
160     PALIGNR    m3, m5, 12, m4
161     movq       [r1+r2*2], m5
162     movhps     [r0+r2*2], m5
163     psrldq     m5, 4
164     movq       [r1+r2*1], m5
165     movq       [r0+r2*1], m3
166     RET
167 %endmacro
168
169 INIT_XMM
170 %define PALIGNR PALIGNR_MMX
171 PRED4x4_HD sse2
172 %define PALIGNR PALIGNR_SSSE3
173 PRED4x4_HD ssse3
174 %ifdef HAVE_AVX
175 INIT_AVX
176 PRED4x4_HD avx
177 %endif
178
179 ;-----------------------------------------------------------------------------
180 ; void pred4x4_dc(pixel *src, const pixel *topright, int stride)
181 ;-----------------------------------------------------------------------------
182 %macro HADDD 2 ; sum junk
183 %if mmsize == 16
184     movhlps %2, %1
185     paddd   %1, %2
186     pshuflw %2, %1, 0xE
187     paddd   %1, %2
188 %else
189     pshufw  %2, %1, 0xE
190     paddd   %1, %2
191 %endif
192 %endmacro
193
194 %macro HADDW 2
195     pmaddwd %1, [pw_1]
196     HADDD   %1, %2
197 %endmacro
198
199 INIT_MMX
200 cglobal pred4x4_dc_10_mmxext, 3,3
201     sub    r0, r2
202     lea    r1, [r0+r2*2]
203     movq   m2, [r0+r2*1-8]
204     paddw  m2, [r0+r2*2-8]
205     paddw  m2, [r1+r2*1-8]
206     paddw  m2, [r1+r2*2-8]
207     psrlq  m2, 48
208     movq   m0, [r0]
209     HADDW  m0, m1
210     paddw  m0, [pw_4]
211     paddw  m0, m2
212     psrlw  m0, 3
213     SPLATW m0, m0, 0
214     movq   [r0+r2*1], m0
215     movq   [r0+r2*2], m0
216     movq   [r1+r2*1], m0
217     movq   [r1+r2*2], m0
218     RET
219
220 ;-----------------------------------------------------------------------------
221 ; void pred4x4_down_left(pixel *src, const pixel *topright, int stride)
222 ;-----------------------------------------------------------------------------
223 ;TODO: more AVX here
224 %macro PRED4x4_DL 1
225 cglobal pred4x4_down_left_10_%1, 3,3
226     sub        r0, r2
227     movq       m1, [r0]
228     movhps     m1, [r1]
229     pslldq     m5, m1, 2
230     pxor       m2, m5, m1
231     psrldq     m2, 2
232     pxor       m3, m1, m2
233     PRED4x4_LOWPASS m0, m5, m3, m1
234     lea        r1, [r0+r2*2]
235     movhps     [r1+r2*2], m0
236     psrldq     m0, 2
237     movq       [r0+r2*1], m0
238     psrldq     m0, 2
239     movq       [r0+r2*2], m0
240     psrldq     m0, 2
241     movq       [r1+r2*1], m0
242     RET
243 %endmacro
244
245 INIT_XMM
246 PRED4x4_DL sse2
247 %ifdef HAVE_AVX
248 INIT_AVX
249 PRED4x4_DL avx
250 %endif
251
252 ;-----------------------------------------------------------------------------
253 ; void pred4x4_vertical_left(pixel *src, const pixel *topright, int stride)
254 ;-----------------------------------------------------------------------------
255 %macro PRED4x4_VL 1
256 cglobal pred4x4_vertical_left_10_%1, 3,3
257     sub        r0, r2
258     movu       m1, [r0]
259     movhps     m1, [r1]
260     psrldq     m3, m1, 2
261     psrldq     m2, m1, 4
262     pavgw      m4, m3, m1
263     PRED4x4_LOWPASS m0, m1, m2, m3
264     lea        r1, [r0+r2*2]
265     movq       [r0+r2*1], m4
266     movq       [r0+r2*2], m0
267     psrldq     m4, 2
268     psrldq     m0, 2
269     movq       [r1+r2*1], m4
270     movq       [r1+r2*2], m0
271     RET
272 %endmacro
273
274 INIT_XMM
275 PRED4x4_VL sse2
276 %ifdef HAVE_AVX
277 INIT_AVX
278 PRED4x4_VL avx
279 %endif
280
281 ;-----------------------------------------------------------------------------
282 ; void pred4x4_horizontal_up(pixel *src, const pixel *topright, int stride)
283 ;-----------------------------------------------------------------------------
284 INIT_MMX
285 cglobal pred4x4_horizontal_up_10_mmxext, 3,3
286     sub       r0, r2
287     lea       r1, [r0+r2*2]
288     movq      m0, [r0+r2*1-8]
289     punpckhwd m0, [r0+r2*2-8]
290     movq      m1, [r1+r2*1-8]
291     punpckhwd m1, [r1+r2*2-8]
292     punpckhdq m0, m1
293     pshufw    m1, m1, 0xFF
294     movq      [r1+r2*2], m1
295     movd      [r1+r2*1+4], m1
296     pshufw    m2, m0, 11111001b
297     movq      m1, m2
298     pavgw     m2, m0
299
300     pshufw    m5, m0, 11111110b
301     PRED4x4_LOWPASS m3, m0, m5, m1
302     movq      m6, m2
303     punpcklwd m6, m3
304     movq      [r0+r2*1], m6
305     psrlq     m2, 16
306     psrlq     m3, 16
307     punpcklwd m2, m3
308     movq      [r0+r2*2], m2
309     psrlq     m2, 32
310     movd      [r1+r2*1], m2
311     RET
312
313
314
315 ;-----------------------------------------------------------------------------
316 ; void pred8x8_vertical(pixel *src, int stride)
317 ;-----------------------------------------------------------------------------
318 INIT_XMM
319 cglobal pred8x8_vertical_10_sse2, 2,2
320     sub  r0, r1
321     mova m0, [r0]
322 %rep 3
323     mova [r0+r1*1], m0
324     mova [r0+r1*2], m0
325     lea  r0, [r0+r1*2]
326 %endrep
327     mova [r0+r1*1], m0
328     mova [r0+r1*2], m0
329     RET
330
331 ;-----------------------------------------------------------------------------
332 ; void pred8x8_horizontal(pixel *src, int stride)
333 ;-----------------------------------------------------------------------------
334 INIT_XMM
335 cglobal pred8x8_horizontal_10_sse2, 2,3
336     mov          r2, 4
337 .loop:
338     movq         m0, [r0+r1*0-8]
339     movq         m1, [r0+r1*1-8]
340     pshuflw      m0, m0, 0xff
341     pshuflw      m1, m1, 0xff
342     punpcklqdq   m0, m0
343     punpcklqdq   m1, m1
344     mova  [r0+r1*0], m0
345     mova  [r0+r1*1], m1
346     lea          r0, [r0+r1*2]
347     dec          r2
348     jg .loop
349     REP_RET
350
351 ;-----------------------------------------------------------------------------
352 ; void predict_8x8_dc(pixel *src, int stride)
353 ;-----------------------------------------------------------------------------
354 %macro MOV8 2-3
355 ; sort of a hack, but it works
356 %if mmsize==8
357     movq    [%1+0], %2
358     movq    [%1+8], %3
359 %else
360     movdqa    [%1], %2
361 %endif
362 %endmacro
363
364 %macro PRED8x8_DC 2
365 cglobal pred8x8_dc_10_%1, 2,4
366 %ifdef ARCH_X86_64
367 %define t0 r10
368 %else
369 %define t0 r0m
370 %endif
371     sub         r0, r1
372     pxor        m4, m4
373     movq        m0, [r0+0]
374     movq        m1, [r0+8]
375     HADDW       m0, m2
376     mov         t0, r0
377     HADDW       m1, m2
378
379     movzx      r2d, word [r0+r1*1-2]
380     movzx      r3d, word [r0+r1*2-2]
381     lea         r0, [r0+r1*2]
382     add        r2d, r3d
383     movzx      r3d, word [r0+r1*1-2]
384     add        r2d, r3d
385     movzx      r3d, word [r0+r1*2-2]
386     add        r2d, r3d
387     lea         r0, [r0+r1*2]
388     movd        m2, r2d            ; s2
389
390     movzx      r2d, word [r0+r1*1-2]
391     movzx      r3d, word [r0+r1*2-2]
392     lea         r0, [r0+r1*2]
393     add        r2d, r3d
394     movzx      r3d, word [r0+r1*1-2]
395     add        r2d, r3d
396     movzx      r3d, word [r0+r1*2-2]
397     add        r2d, r3d
398     movd        m3, r2d            ; s3
399
400     punpcklwd   m0, m1
401     mov         r0, t0
402     punpcklwd   m2, m3
403     punpckldq   m0, m2            ; s0, s1, s2, s3
404     %2          m3, m0, 11110110b ; s2, s1, s3, s3
405     lea         r2, [r1+r1*2]
406     %2          m0, m0, 01110100b ; s0, s1, s3, s1
407     paddw       m0, m3
408     lea         r3, [r0+r1*4]
409     psrlw       m0, 2
410     pavgw       m0, m4            ; s0+s2, s1, s3, s1+s3
411 %ifidn %1, sse2
412     punpcklwd   m0, m0
413     pshufd      m3, m0, 11111010b
414     punpckldq   m0, m0
415     SWAP         0,1
416 %else
417     pshufw      m1, m0, 0x00
418     pshufw      m2, m0, 0x55
419     pshufw      m3, m0, 0xaa
420     pshufw      m4, m0, 0xff
421 %endif
422     MOV8   r0+r1*1, m1, m2
423     MOV8   r0+r1*2, m1, m2
424     MOV8   r0+r2*1, m1, m2
425     MOV8   r0+r1*4, m1, m2
426     MOV8   r3+r1*1, m3, m4
427     MOV8   r3+r1*2, m3, m4
428     MOV8   r3+r2*1, m3, m4
429     MOV8   r3+r1*4, m3, m4
430     RET
431 %endmacro
432
433 INIT_MMX
434 PRED8x8_DC mmxext, pshufw
435 INIT_XMM
436 PRED8x8_DC sse2  , pshuflw
437
438 ;-----------------------------------------------------------------------------
439 ; void pred8x8_top_dc(pixel *src, int stride)
440 ;-----------------------------------------------------------------------------
441 %macro PRED8x8_TOP_DC 2
442 cglobal pred8x8_top_dc_10_%1, 2,4
443     sub         r0, r1
444     movq        m0, [r0+0]
445     movq        m1, [r0+8]
446     HADDW       m0, m2
447     HADDW       m1, m3
448     lea         r2, [r1+r1*2]
449     paddw       m0, [pw_2]
450     paddw       m1, [pw_2]
451     lea         r3, [r0+r1*4]
452     psrlw       m0, 2
453     psrlw       m1, 2
454     %2          m0, m0, 0
455     %2          m1, m1, 0
456 %ifidn %1, sse2
457     punpcklqdq  m0, m1
458 %endif
459     MOV8   r0+r1*1, m0, m1
460     MOV8   r0+r1*2, m0, m1
461     MOV8   r0+r2*1, m0, m1
462     MOV8   r0+r1*4, m0, m1
463     MOV8   r3+r1*1, m0, m1
464     MOV8   r3+r1*2, m0, m1
465     MOV8   r3+r2*1, m0, m1
466     MOV8   r3+r1*4, m0, m1
467     RET
468 %endmacro
469
470 INIT_MMX
471 PRED8x8_TOP_DC mmxext, pshufw
472 INIT_XMM
473 PRED8x8_TOP_DC sse2  , pshuflw
474
475 ;-----------------------------------------------------------------------------
476 ; void pred8x8_plane(pixel *src, int stride)
477 ;-----------------------------------------------------------------------------
478 INIT_XMM
479 cglobal pred8x8_plane_10_sse2, 2,7,7
480     sub       r0, r1
481     lea       r2, [r1+r1*2]
482     lea       r3, [r0+r1*4]
483     mova      m2, [r0]
484     pmaddwd   m2, [pw_m32101234]
485     HADDD     m2, m1
486     movd      m0, [r0-4]
487     psrld     m0, 14
488     psubw     m2, m0               ; H
489     movd      m0, [r3+r1*4-4]
490     movd      m1, [r0+12]
491     paddw     m0, m1
492     psllw     m0, 4                ; 16*(src[7*stride-1] + src[-stride+7])
493     movzx    r4d, word [r3+r1*1-2] ; src[4*stride-1]
494     movzx    r5d, word [r0+r2*1-2] ; src[2*stride-1]
495     sub      r4d, r5d
496     movzx    r6d, word [r3+r1*2-2] ; src[5*stride-1]
497     movzx    r5d, word [r0+r1*2-2] ; src[1*stride-1]
498     sub      r6d, r5d
499     lea      r4d, [r4+r6*2]
500     movzx    r5d, word [r3+r2*1-2] ; src[6*stride-1]
501     movzx    r6d, word [r0+r1*1-2] ; src[0*stride-1]
502     sub      r5d, r6d
503     lea      r5d, [r5+r5*2]
504     add      r4d, r5d
505     movzx    r6d, word [r3+r1*4-2] ; src[7*stride-1]
506     movzx    r5d, word [r0+r1*0-2] ; src[ -stride-1]
507     sub      r6d, r5d
508     lea      r4d, [r4+r6*4]
509     movd      m3, r4d              ; V
510     punpckldq m2, m3
511     pmaddwd   m2, [pd_17]
512     paddd     m2, [pd_16]
513     psrad     m2, 5                ; b, c
514
515     mova      m3, [pw_pixel_max]
516     pxor      m1, m1
517     SPLATW    m0, m0, 1
518     SPLATW    m4, m2, 2
519     SPLATW    m2, m2, 0
520     pmullw    m2, [pw_m32101234]   ; b
521     pmullw    m5, m4, [pw_m3]      ; c
522     paddw     m5, [pw_16]
523     mov      r2d, 8
524     add       r0, r1
525 .loop:
526     paddsw    m6, m2, m5
527     paddsw    m6, m0
528     psraw     m6, 5
529     CLIPW     m6, m1, m3
530     mova    [r0], m6
531     paddw     m5, m4
532     add       r0, r1
533     dec r2d
534     jg .loop
535     REP_RET
536
537
538 ;-----------------------------------------------------------------------------
539 ; void pred8x8l_128_dc(pixel *src, int has_topleft, int has_topright, int stride)
540 ;-----------------------------------------------------------------------------
541 %macro PRED8x8L_128_DC 1
542 cglobal pred8x8l_128_dc_10_%1, 4,4
543     mova      m0, [pw_512]
544     lea       r1, [r3+r3*2]
545     lea       r2, [r0+r3*4]
546     MOV8 r0+r3*0, m0, m0
547     MOV8 r0+r3*1, m0, m0
548     MOV8 r0+r3*2, m0, m0
549     MOV8 r0+r1*1, m0, m0
550     MOV8 r2+r3*0, m0, m0
551     MOV8 r2+r3*1, m0, m0
552     MOV8 r2+r3*2, m0, m0
553     MOV8 r2+r1*1, m0, m0
554     RET
555 %endmacro
556
557 INIT_MMX
558 PRED8x8L_128_DC mmxext
559 INIT_XMM
560 PRED8x8L_128_DC sse2
561
562 ;-----------------------------------------------------------------------------
563 ; void pred8x8l_top_dc(pixel *src, int has_topleft, int has_topright, int stride)
564 ;-----------------------------------------------------------------------------
565 %macro PRED8x8L_TOP_DC 1
566 cglobal pred8x8l_top_dc_10_%1, 4,4,6
567     sub         r0, r3
568     pxor        m7, m7
569     mova        m0, [r0-16]
570     mova        m3, [r0]
571     mova        m1, [r0+16]
572     mova        m2, m3
573     mova        m4, m3
574     PALIGNR     m2, m0, 14, m0
575     PALIGNR     m1, m4,  2, m4
576     test        r1, r1 ; top_left
577     jz .fix_lt_2
578     test        r2, r2 ; top_right
579     jz .fix_tr_1
580     jmp .body
581 .fix_lt_2:
582     mova        m5, m3
583     pxor        m5, m2
584     pslldq      m5, 14
585     psrldq      m5, 14
586     pxor        m2, m5
587     test        r2, r2 ; top_right
588     jnz .body
589 .fix_tr_1:
590     mova        m5, m3
591     pxor        m5, m1
592     psrldq      m5, 14
593     pslldq      m5, 14
594     pxor        m1, m5
595 .body
596     lea         r1, [r3+r3*2]
597     lea         r2, [r0+r3*4]
598     PRED4x4_LOWPASS m0, m2, m1, m3
599     HADDW       m0, m1
600     paddw       m0, [pw_4]
601     psrlw       m0, 3
602     SPLATW      m0, m0, 0
603     mova [r0+r3*1], m0
604     mova [r0+r3*2], m0
605     mova [r0+r1*1], m0
606     mova [r0+r3*4], m0
607     mova [r2+r3*1], m0
608     mova [r2+r3*2], m0
609     mova [r2+r1*1], m0
610     mova [r2+r3*4], m0
611     RET
612 %endmacro
613
614 INIT_XMM
615 %define PALIGNR PALIGNR_MMX
616 PRED8x8L_TOP_DC sse2
617 %define PALIGNR PALIGNR_SSSE3
618 PRED8x8L_TOP_DC ssse3
619
620 ;-----------------------------------------------------------------------------
621 ;void pred8x8l_dc(pixel *src, int has_topleft, int has_topright, int stride)
622 ;-----------------------------------------------------------------------------
623 ;TODO: see if scalar is faster
624 %macro PRED8x8L_DC 1
625 cglobal pred8x8l_dc_10_%1, 4,5,8
626     sub         r0, r3
627     lea         r4, [r0+r3*2]
628     mova        m0, [r0+r3*1-16]
629     punpckhwd   m0, [r0+r3*0-16]
630     mova        m1, [r4+r3*1-16]
631     punpckhwd   m1, [r0+r3*2-16]
632     mov         r4, r0
633     punpckhdq   m1, m0
634     lea         r0, [r0+r3*4]
635     mova        m2, [r0+r3*1-16]
636     punpckhwd   m2, [r0+r3*0-16]
637     lea         r0, [r0+r3*2]
638     mova        m3, [r0+r3*1-16]
639     punpckhwd   m3, [r0+r3*0-16]
640     punpckhdq   m3, m2
641     punpckhqdq  m3, m1
642     lea         r0, [r0+r3*2]
643     mova        m0, [r0+r3*0-16]
644     mova        m1, [r4]
645     mov         r0, r4
646     mova        m4, m3
647     mova        m2, m3
648     PALIGNR     m4, m0, 14, m0
649     PALIGNR     m1, m2,  2, m2
650     test        r1, r1
651     jnz .do_left
652 .fix_lt_1:
653     mova        m5, m3
654     pxor        m5, m4
655     psrldq      m5, 14
656     pslldq      m5, 12
657     pxor        m1, m5
658     jmp .do_left
659 .fix_lt_2:
660     mova        m5, m3
661     pxor        m5, m2
662     pslldq      m5, 14
663     psrldq      m5, 14
664     pxor        m2, m5
665     test        r2, r2
666     jnz .body
667 .fix_tr_1:
668     mova        m5, m3
669     pxor        m5, m1
670     psrldq      m5, 14
671     pslldq      m5, 14
672     pxor        m1, m5
673     jmp .body
674 .do_left:
675     mova        m0, m4
676     PRED4x4_LOWPASS m2, m1, m4, m3
677     mova        m4, m0
678     mova        m7, m2
679     PRED4x4_LOWPASS m1, m3, m0, m4
680     pslldq      m1, 14
681     PALIGNR     m7, m1, 14, m3
682     mova        m0, [r0-16]
683     mova        m3, [r0]
684     mova        m1, [r0+16]
685     mova        m2, m3
686     mova        m4, m3
687     PALIGNR     m2, m0, 14, m0
688     PALIGNR     m1, m4,  2, m4
689     test        r1, r1
690     jz .fix_lt_2
691     test        r2, r2
692     jz .fix_tr_1
693 .body
694     lea         r1, [r3+r3*2]
695     PRED4x4_LOWPASS m6, m2, m1, m3
696     HADDW       m7, m0
697     HADDW       m6, m0
698     lea         r2, [r0+r3*4]
699     paddw       m7, [pw_8]
700     paddw       m7, m6
701     psrlw       m7, 4
702     SPLATW      m7, m7
703     mova [r0+r3*1], m7
704     mova [r0+r3*2], m7
705     mova [r0+r1*1], m7
706     mova [r0+r3*4], m7
707     mova [r2+r3*1], m7
708     mova [r2+r3*2], m7
709     mova [r2+r1*1], m7
710     mova [r2+r3*4], m7
711     RET
712 %endmacro
713
714 INIT_XMM
715 %define PALIGNR PALIGNR_MMX
716 PRED8x8L_DC sse2
717 %define PALIGNR PALIGNR_SSSE3
718 PRED8x8L_DC ssse3
719
720 ;-----------------------------------------------------------------------------
721 ; void pred8x8l_vertical(pixel *src, int has_topleft, int has_topright, int stride)
722 ;-----------------------------------------------------------------------------
723 %macro PRED8x8L_VERTICAL 1
724 cglobal pred8x8l_vertical_10_%1, 4,4,6
725     sub         r0, r3
726     mova        m0, [r0-16]
727     mova        m3, [r0]
728     mova        m1, [r0+16]
729     mova        m2, m3
730     mova        m4, m3
731     PALIGNR     m2, m0, 14, m0
732     PALIGNR     m1, m4,  2, m4
733     test        r1, r1 ; top_left
734     jz .fix_lt_2
735     test        r2, r2 ; top_right
736     jz .fix_tr_1
737     jmp .body
738 .fix_lt_2:
739     mova        m5, m3
740     pxor        m5, m2
741     pslldq      m5, 14
742     psrldq      m5, 14
743     pxor        m2, m5
744     test        r2, r2 ; top_right
745     jnz .body
746 .fix_tr_1:
747     mova        m5, m3
748     pxor        m5, m1
749     psrldq      m5, 14
750     pslldq      m5, 14
751     pxor        m1, m5
752 .body
753     lea         r1, [r3+r3*2]
754     lea         r2, [r0+r3*4]
755     PRED4x4_LOWPASS m0, m2, m1, m3
756     mova [r0+r3*1], m0
757     mova [r0+r3*2], m0
758     mova [r0+r1*1], m0
759     mova [r0+r3*4], m0
760     mova [r2+r3*1], m0
761     mova [r2+r3*2], m0
762     mova [r2+r1*1], m0
763     mova [r2+r3*4], m0
764     RET
765 %endmacro
766
767 INIT_XMM
768 %define PALIGNR PALIGNR_MMX
769 PRED8x8L_VERTICAL sse2
770 %define PALIGNR PALIGNR_SSSE3
771 PRED8x8L_VERTICAL ssse3
772
773 ;-----------------------------------------------------------------------------
774 ; void pred8x8l_horizontal(uint8_t *src, int has_topleft, int has_topright, int stride)
775 ;-----------------------------------------------------------------------------
776 %macro PRED8x8L_HORIZONTAL 1
777 cglobal pred8x8l_horizontal_10_%1, 4,4,8
778     sub         r0, r3
779     lea         r2, [r0+r3*2]
780     mova        m0, [r0+r3*1-16]
781     test        r1, r1
782     lea         r1, [r0+r3]
783     cmovnz      r1, r0
784     punpckhwd   m0, [r1+r3*0-16]
785     mova        m1, [r2+r3*1-16]
786     punpckhwd   m1, [r0+r3*2-16]
787     mov         r2, r0
788     punpckhdq   m1, m0
789     lea         r0, [r0+r3*4]
790     mova        m2, [r0+r3*1-16]
791     punpckhwd   m2, [r0+r3*0-16]
792     lea         r0, [r0+r3*2]
793     mova        m3, [r0+r3*1-16]
794     punpckhwd   m3, [r0+r3*0-16]
795     punpckhdq   m3, m2
796     punpckhqdq  m3, m1
797     lea         r0, [r0+r3*2]
798     mova        m0, [r0+r3*0-16]
799     mova        m1, [r1+r3*0-16]
800     mov         r0, r2
801     mova        m4, m3
802     mova        m2, m3
803     PALIGNR     m4, m0, 14, m0
804     PALIGNR     m1, m2,  2, m2
805     mova        m0, m4
806     PRED4x4_LOWPASS m2, m1, m4, m3
807     mova        m4, m0
808     mova        m7, m2
809     PRED4x4_LOWPASS m1, m3, m0, m4
810     pslldq      m1, 14
811     PALIGNR     m7, m1, 14, m3
812     lea         r1, [r3+r3*2]
813     punpckhwd   m3, m7, m7
814     punpcklwd   m7, m7
815     pshufd      m0, m3, 0xff
816     pshufd      m1, m3, 0xaa
817     lea         r2, [r0+r3*4]
818     pshufd      m2, m3, 0x55
819     pshufd      m3, m3, 0x00
820     pshufd      m4, m7, 0xff
821     pshufd      m5, m7, 0xaa
822     pshufd      m6, m7, 0x55
823     pshufd      m7, m7, 0x00
824     mova [r0+r3*1], m0
825     mova [r0+r3*2], m1
826     mova [r0+r1*1], m2
827     mova [r0+r3*4], m3
828     mova [r2+r3*1], m4
829     mova [r2+r3*2], m5
830     mova [r2+r1*1], m6
831     mova [r2+r3*4], m7
832     RET
833 %endmacro
834
835 INIT_XMM
836 %define PALIGNR PALIGNR_MMX
837 PRED8x8L_HORIZONTAL sse2
838 %define PALIGNR PALIGNR_SSSE3
839 PRED8x8L_HORIZONTAL ssse3
840
841 ;-----------------------------------------------------------------------------
842 ;void pred8x8l_down_left(pixel *src, int has_topleft, int has_topright, int stride)
843 ;-----------------------------------------------------------------------------
844 %macro PRED8x8L_DOWN_LEFT 1
845 cglobal pred8x8l_down_left_10_%1, 4,4,8
846     sub         r0, r3
847     mova        m0, [r0-16]
848     mova        m3, [r0]
849     mova        m1, [r0+16]
850     mova        m2, m3
851     mova        m4, m3
852     PALIGNR     m2, m0, 14, m0
853     PALIGNR     m1, m4,  2, m4
854     test        r1, r1
855     jz .fix_lt_2
856     test        r2, r2
857     jz .fix_tr_1
858     jmp .do_top
859 .fix_lt_2:
860     mova        m5, m3
861     pxor        m5, m2
862     pslldq      m5, 14
863     psrldq      m5, 14
864     pxor        m2, m5
865     test        r2, r2
866     jnz .do_top
867 .fix_tr_1:
868     mova        m5, m3
869     pxor        m5, m1
870     psrldq      m5, 14
871     pslldq      m5, 14
872     pxor        m1, m5
873     jmp .do_top
874 .fix_tr_2:
875     punpckhwd   m3, m3
876     pshufd      m1, m3, 0xFF
877     jmp .do_topright
878 .do_top:
879     PRED4x4_LOWPASS m4, m2, m1, m3
880     mova        m7, m4
881     test        r2, r2
882     jz .fix_tr_2
883     mova        m0, [r0+16]
884     mova        m5, m0
885     mova        m2, m0
886     mova        m4, m0
887     psrldq      m5, 14
888     PALIGNR     m2, m3, 14, m3
889     PALIGNR     m5, m4,  2, m4
890     PRED4x4_LOWPASS m1, m2, m5, m0
891 .do_topright:
892     lea         r1, [r3+r3*2]
893     mova        m6, m1
894     psrldq      m1, 14
895     mova        m4, m1
896     lea         r2, [r0+r3*4]
897     mova        m2, m6
898     PALIGNR     m2, m7,  2, m0
899     mova        m3, m6
900     PALIGNR     m3, m7, 14, m0
901     PALIGNR     m4, m6,  2, m0
902     mova        m5, m7
903     mova        m1, m7
904     mova        m7, m6
905     pslldq      m1, 2
906     PRED4x4_LOWPASS m0, m1, m2, m5
907     PRED4x4_LOWPASS m1, m3, m4, m7
908     mova [r2+r3*4], m1
909     mova        m2, m0
910     pslldq      m1, 2
911     psrldq      m2, 14
912     pslldq      m0, 2
913     por         m1, m2
914     mova [r2+r1*1], m1
915     mova        m2, m0
916     pslldq      m1, 2
917     psrldq      m2, 14
918     pslldq      m0, 2
919     por         m1, m2
920     mova [r2+r3*2], m1
921     mova        m2, m0
922     pslldq      m1, 2
923     psrldq      m2, 14
924     pslldq      m0, 2
925     por         m1, m2
926     mova [r2+r3*1], m1
927     mova        m2, m0
928     pslldq      m1, 2
929     psrldq      m2, 14
930     pslldq      m0, 2
931     por         m1, m2
932     mova [r0+r3*4], m1
933     mova        m2, m0
934     pslldq      m1, 2
935     psrldq      m2, 14
936     pslldq      m0, 2
937     por         m1, m2
938     mova [r0+r1*1], m1
939     mova        m2, m0
940     pslldq      m1, 2
941     psrldq      m2, 14
942     pslldq      m0, 2
943     por         m1, m2
944     mova [r0+r3*2], m1
945     pslldq      m1, 2
946     psrldq      m0, 14
947     por         m1, m0
948     mova [r0+r3*1], m1
949     RET
950 %endmacro
951
952 INIT_XMM
953 %define PALIGNR PALIGNR_MMX
954 PRED8x8L_DOWN_LEFT sse2
955 %define PALIGNR PALIGNR_SSSE3
956 PRED8x8L_DOWN_LEFT ssse3
957
958 ;-----------------------------------------------------------------------------
959 ;void pred8x8l_down_right_mxext(pixel *src, int has_topleft, int has_topright, int stride)
960 ;-----------------------------------------------------------------------------
961 %macro PRED8x8L_DOWN_RIGHT 1
962 cglobal pred8x8l_down_right_10_%1, 4,5,8
963     sub         r0, r3
964     lea         r4, [r0+r3*2]
965     mova        m0, [r0+r3*1-16]
966     punpckhwd   m0, [r0+r3*0-16]
967     mova        m1, [r4+r3*1-16]
968     punpckhwd   m1, [r0+r3*2-16]
969     mov         r4, r0
970     punpckhdq   m1, m0
971     lea         r0, [r0+r3*4]
972     mova        m2, [r0+r3*1-16]
973     punpckhwd   m2, [r0+r3*0-16]
974     lea         r0, [r0+r3*2]
975     mova        m3, [r0+r3*1-16]
976     punpckhwd   m3, [r0+r3*0-16]
977     punpckhdq   m3, m2
978     punpckhqdq  m3, m1
979     lea         r0, [r0+r3*2]
980     mova        m0, [r0+r3*0-16]
981     mova        m1, [r4]
982     mov         r0, r4
983     mova        m4, m3
984     mova        m2, m3
985     PALIGNR     m4, m0, 14, m0
986     PALIGNR     m1, m2,  2, m2
987     test        r1, r1 ; top_left
988     jz .fix_lt_1
989 .do_left:
990     mova        m0, m4
991     PRED4x4_LOWPASS m2, m1, m4, m3
992     mova        m4, m0
993     mova        m7, m2
994     mova        m6, m2
995     PRED4x4_LOWPASS m1, m3, m0, m4
996     pslldq      m1, 14
997     PALIGNR     m7, m1, 14, m3
998     mova        m0, [r0-16]
999     mova        m3, [r0]
1000     mova        m1, [r0+16]
1001     mova        m2, m3
1002     mova        m4, m3
1003     PALIGNR     m2, m0, 14, m0
1004     PALIGNR     m1, m4,  2, m4
1005     test        r1, r1 ; top_left
1006     jz .fix_lt_2
1007     test        r2, r2 ; top_right
1008     jz .fix_tr_1
1009 .do_top:
1010     PRED4x4_LOWPASS m4, m2, m1, m3
1011     mova        m5, m4
1012     jmp .body
1013 .fix_lt_1:
1014     mova        m5, m3
1015     pxor        m5, m4
1016     psrldq      m5, 14
1017     pslldq      m5, 12
1018     pxor        m1, m5
1019     jmp .do_left
1020 .fix_lt_2:
1021     mova        m5, m3
1022     pxor        m5, m2
1023     pslldq      m5, 14
1024     psrldq      m5, 14
1025     pxor        m2, m5
1026     test        r2, r2 ; top_right
1027     jnz .do_top
1028 .fix_tr_1:
1029     mova        m5, m3
1030     pxor        m5, m1
1031     psrldq      m5, 14
1032     pslldq      m5, 14
1033     pxor        m1, m5
1034     jmp .do_top
1035 .body
1036     lea         r1, [r3+r3*2]
1037     mova        m1, m7
1038     mova        m7, m5
1039     mova        m5, m6
1040     mova        m2, m7
1041     lea         r2, [r0+r3*4]
1042     PALIGNR     m2, m6,  2, m0
1043     mova        m3, m7
1044     PALIGNR     m3, m6, 14, m0
1045     mova        m4, m7
1046     psrldq      m4, 2
1047     PRED4x4_LOWPASS m0, m1, m2, m5
1048     PRED4x4_LOWPASS m1, m3, m4, m7
1049     mova [r2+r3*4], m0
1050     mova        m2, m1
1051     psrldq      m0, 2
1052     pslldq      m2, 14
1053     psrldq      m1, 2
1054     por         m0, m2
1055     mova [r2+r1*1], m0
1056     mova        m2, m1
1057     psrldq      m0, 2
1058     pslldq      m2, 14
1059     psrldq      m1, 2
1060     por         m0, m2
1061     mova [r2+r3*2], m0
1062     mova        m2, m1
1063     psrldq      m0, 2
1064     pslldq      m2, 14
1065     psrldq      m1, 2
1066     por         m0, m2
1067     mova [r2+r3*1], m0
1068     mova        m2, m1
1069     psrldq      m0, 2
1070     pslldq      m2, 14
1071     psrldq      m1, 2
1072     por         m0, m2
1073     mova [r0+r3*4], m0
1074     mova        m2, m1
1075     psrldq      m0, 2
1076     pslldq      m2, 14
1077     psrldq      m1, 2
1078     por         m0, m2
1079     mova [r0+r1*1], m0
1080     mova        m2, m1
1081     psrldq      m0, 2
1082     pslldq      m2, 14
1083     psrldq      m1, 2
1084     por         m0, m2
1085     mova [r0+r3*2], m0
1086     psrldq      m0, 2
1087     pslldq      m1, 14
1088     por         m0, m1
1089     mova [r0+r3*1], m0
1090     RET
1091 %endmacro
1092
1093 INIT_XMM
1094 %define PALIGNR PALIGNR_MMX
1095 PRED8x8L_DOWN_RIGHT sse2
1096 %define PALIGNR PALIGNR_SSSE3
1097 PRED8x8L_DOWN_RIGHT ssse3
1098
1099 ;-----------------------------------------------------------------------------
1100 ; void pred8x8l_vertical_right(pixel *src, int has_topleft, int has_topright, int stride)
1101 ;-----------------------------------------------------------------------------
1102 %macro PRED8x8L_VERTICAL_RIGHT 1
1103 cglobal pred8x8l_vertical_right_10_%1, 4,5,8
1104     sub         r0, r3
1105     lea         r4, [r0+r3*2]
1106     mova        m0, [r0+r3*1-16]
1107     punpckhwd   m0, [r0+r3*0-16]
1108     mova        m1, [r4+r3*1-16]
1109     punpckhwd   m1, [r0+r3*2-16]
1110     mov         r4, r0
1111     punpckhdq   m1, m0
1112     lea         r0, [r0+r3*4]
1113     mova        m2, [r0+r3*1-16]
1114     punpckhwd   m2, [r0+r3*0-16]
1115     lea         r0, [r0+r3*2]
1116     mova        m3, [r0+r3*1-16]
1117     punpckhwd   m3, [r0+r3*0-16]
1118     punpckhdq   m3, m2
1119     punpckhqdq  m3, m1
1120     lea         r0, [r0+r3*2]
1121     mova        m0, [r0+r3*0-16]
1122     mova        m1, [r4]
1123     mov         r0, r4
1124     mova        m4, m3
1125     mova        m2, m3
1126     PALIGNR     m4, m0, 14, m0
1127     PALIGNR     m1, m2,  2, m2
1128     test        r1, r1
1129     jz .fix_lt_1
1130     jmp .do_left
1131 .fix_lt_1:
1132     mova        m5, m3
1133     pxor        m5, m4
1134     psrldq      m5, 14
1135     pslldq      m5, 12
1136     pxor        m1, m5
1137     jmp .do_left
1138 .fix_lt_2:
1139     mova        m5, m3
1140     pxor        m5, m2
1141     pslldq      m5, 14
1142     psrldq      m5, 14
1143     pxor        m2, m5
1144     test        r2, r2
1145     jnz .do_top
1146 .fix_tr_1:
1147     mova        m5, m3
1148     pxor        m5, m1
1149     psrldq      m5, 14
1150     pslldq      m5, 14
1151     pxor        m1, m5
1152     jmp .do_top
1153 .do_left:
1154     mova        m0, m4
1155     PRED4x4_LOWPASS m2, m1, m4, m3
1156     mova        m7, m2
1157     mova        m0, [r0-16]
1158     mova        m3, [r0]
1159     mova        m1, [r0+16]
1160     mova        m2, m3
1161     mova        m4, m3
1162     PALIGNR     m2, m0, 14, m0
1163     PALIGNR     m1, m4,  2, m4
1164     test        r1, r1
1165     jz .fix_lt_2
1166     test        r2, r2
1167     jz .fix_tr_1
1168 .do_top
1169     PRED4x4_LOWPASS m6, m2, m1, m3
1170     lea         r1, [r3+r3*2]
1171     mova        m2, m6
1172     mova        m3, m6
1173     PALIGNR     m3, m7, 14, m0
1174     PALIGNR     m6, m7, 12, m1
1175     mova        m4, m3
1176     pavgw       m3, m2
1177     lea         r2, [r0+r3*4]
1178     PRED4x4_LOWPASS m0, m6, m2, m4
1179     mova [r0+r3*1], m3
1180     mova [r0+r3*2], m0
1181     mova        m5, m0
1182     mova        m6, m3
1183     mova        m1, m7
1184     mova        m2, m1
1185     pslldq      m2, 2
1186     mova        m3, m1
1187     pslldq      m3, 4
1188     PRED4x4_LOWPASS m0, m1, m3, m2
1189     PALIGNR     m6, m0, 14, m2
1190     mova [r0+r1*1], m6
1191     pslldq      m0, 2
1192     PALIGNR     m5, m0, 14, m1
1193     mova [r0+r3*4], m5
1194     pslldq      m0, 2
1195     PALIGNR     m6, m0, 14, m2
1196     mova [r2+r3*1], m6
1197     pslldq      m0, 2
1198     PALIGNR     m5, m0, 14, m1
1199     mova [r2+r3*2], m5
1200     pslldq      m0, 2
1201     PALIGNR     m6, m0, 14, m2
1202     mova [r2+r1*1], m6
1203     pslldq      m0, 2
1204     PALIGNR     m5, m0, 14, m1
1205     mova [r2+r3*4], m5
1206     RET
1207 %endmacro
1208
1209 INIT_XMM
1210 %define PALIGNR PALIGNR_MMX
1211 PRED8x8L_VERTICAL_RIGHT sse2
1212 %define PALIGNR PALIGNR_SSSE3
1213 PRED8x8L_VERTICAL_RIGHT ssse3
1214
1215 ;-----------------------------------------------------------------------------
1216 ; void pred8x8l_horizontal_up(pixel *src, int has_topleft, int has_topright, int stride)
1217 ;-----------------------------------------------------------------------------
1218 %macro PRED8x8L_HORIZONTAL_UP 1
1219 cglobal pred8x8l_horizontal_up_10_%1, 4,4,8
1220     sub         r0, r3
1221     lea         r2, [r0+r3*2]
1222     mova        m0, [r0+r3*1-16]
1223     test        r1, r1
1224     lea         r1, [r0+r3]
1225     cmovnz      r1, r0
1226     punpckhwd   m0, [r1+r3*0-16]
1227     mova        m1, [r2+r3*1-16]
1228     punpckhwd   m1, [r0+r3*2-16]
1229     mov         r2, r0
1230     punpckhdq   m1, m0
1231     lea         r0, [r0+r3*4]
1232     mova        m2, [r0+r3*1-16]
1233     punpckhwd   m2, [r0+r3*0-16]
1234     lea         r0, [r0+r3*2]
1235     mova        m3, [r0+r3*1-16]
1236     punpckhwd   m3, [r0+r3*0-16]
1237     punpckhdq   m3, m2
1238     punpckhqdq  m3, m1
1239     lea         r0, [r0+r3*2]
1240     mova        m0, [r0+r3*0-16]
1241     mova        m1, [r1+r3*0-16]
1242     mov         r0, r2
1243     mova        m4, m3
1244     mova        m2, m3
1245     PALIGNR     m4, m0, 14, m0
1246     PALIGNR     m1, m2,  2, m2
1247     mova        m0, m4
1248     PRED4x4_LOWPASS m2, m1, m4, m3
1249     mova        m4, m0
1250     mova        m7, m2
1251     PRED4x4_LOWPASS m1, m3, m0, m4
1252     pslldq      m1, 14
1253     PALIGNR     m7, m1, 14, m3
1254     lea         r1, [r3+r3*2]
1255     pshufd      m0, m7, 00011011b ; l6 l7 l4 l5 l2 l3 l0 l1
1256     pslldq      m7, 14             ; l7 .. .. .. .. .. .. ..
1257     mova        m2, m0
1258     pslld       m0, 16
1259     psrld       m2, 16
1260     por         m2, m0            ; l7 l6 l5 l4 l3 l2 l1 l0
1261     mova        m3, m2
1262     mova        m4, m2
1263     mova        m5, m2
1264     psrldq      m2, 2
1265     psrldq      m3, 4
1266     lea         r2, [r0+r3*4]
1267     por         m2, m7            ; l7 l7 l6 l5 l4 l3 l2 l1
1268     punpckhwd   m7, m7
1269     por         m3, m7            ; l7 l7 l7 l6 l5 l4 l3 l2
1270     pavgw       m4, m2
1271     PRED4x4_LOWPASS m1, m3, m5, m2
1272     mova        m5, m4
1273     punpcklwd   m4, m1            ; p4 p3 p2 p1
1274     punpckhwd   m5, m1            ; p8 p7 p6 p5
1275     mova        m6, m5
1276     mova        m7, m5
1277     mova        m0, m5
1278     PALIGNR     m5, m4, 4, m1
1279     pshufd      m1, m6, 11111001b
1280     PALIGNR     m6, m4, 8, m2
1281     pshufd      m2, m7, 11111110b
1282     PALIGNR     m7, m4, 12, m3
1283     pshufd      m3, m0, 11111111b
1284     mova [r0+r3*1], m4
1285     mova [r0+r3*2], m5
1286     mova [r0+r1*1], m6
1287     mova [r0+r3*4], m7
1288     mova [r2+r3*1], m0
1289     mova [r2+r3*2], m1
1290     mova [r2+r1*1], m2
1291     mova [r2+r3*4], m3
1292     RET
1293 %endmacro
1294
1295 INIT_XMM
1296 %define PALIGNR PALIGNR_MMX
1297 PRED8x8L_HORIZONTAL_UP sse2
1298 %define PALIGNR PALIGNR_SSSE3
1299 PRED8x8L_HORIZONTAL_UP ssse3
1300
1301
1302
1303 ;-----------------------------------------------------------------------------
1304 ; void pred16x16_vertical(pixel *src, int stride)
1305 ;-----------------------------------------------------------------------------
1306 %macro MOV16 3-5
1307     mova [%1+     0], %2
1308     mova [%1+mmsize], %3
1309 %if mmsize==8
1310     mova [%1+    16], %4
1311     mova [%1+    24], %5
1312 %endif
1313 %endmacro
1314
1315 %macro PRED16x16_VERTICAL 1
1316 cglobal pred16x16_vertical_10_%1, 2,3
1317     sub   r0, r1
1318     mov   r2, 8
1319     mova  m0, [r0+ 0]
1320     mova  m1, [r0+mmsize]
1321 %if mmsize==8
1322     mova  m2, [r0+16]
1323     mova  m3, [r0+24]
1324 %endif
1325 .loop:
1326     MOV16 r0+r1*1, m0, m1, m2, m3
1327     MOV16 r0+r1*2, m0, m1, m2, m3
1328     lea   r0, [r0+r1*2]
1329     dec   r2
1330     jg .loop
1331     REP_RET
1332 %endmacro
1333
1334 INIT_MMX
1335 PRED16x16_VERTICAL mmxext
1336 INIT_XMM
1337 PRED16x16_VERTICAL sse2
1338
1339 ;-----------------------------------------------------------------------------
1340 ; void pred16x16_horizontal(pixel *src, int stride)
1341 ;-----------------------------------------------------------------------------
1342 %macro PRED16x16_HORIZONTAL 1
1343 cglobal pred16x16_horizontal_10_%1, 2,3
1344     mov    r2, 8
1345 .vloop:
1346     movd   m0, [r0+r1*0-4]
1347     movd   m1, [r0+r1*1-4]
1348     SPLATW m0, m0, 1
1349     SPLATW m1, m1, 1
1350     MOV16  r0+r1*0, m0, m0, m0, m0
1351     MOV16  r0+r1*1, m1, m1, m1, m1
1352     lea    r0, [r0+r1*2]
1353     dec    r2
1354     jg .vloop
1355     REP_RET
1356 %endmacro
1357
1358 INIT_MMX
1359 PRED16x16_HORIZONTAL mmxext
1360 INIT_XMM
1361 PRED16x16_HORIZONTAL sse2
1362
1363 ;-----------------------------------------------------------------------------
1364 ; void pred16x16_dc(pixel *src, int stride)
1365 ;-----------------------------------------------------------------------------
1366 %macro PRED16x16_DC 1
1367 cglobal pred16x16_dc_10_%1, 2,7
1368     mov        r4, r0
1369     sub        r0, r1
1370     mova       m0, [r0+0]
1371     paddw      m0, [r0+mmsize]
1372 %if mmsize==8
1373     paddw      m0, [r0+16]
1374     paddw      m0, [r0+24]
1375 %endif
1376     HADDW      m0, m2
1377
1378     sub        r0, 2
1379     movzx     r3d, word [r0+r1*1]
1380     movzx     r5d, word [r0+r1*2]
1381 %rep 7
1382     lea        r0, [r0+r1*2]
1383     movzx     r2d, word [r0+r1*1]
1384     add       r3d, r2d
1385     movzx     r2d, word [r0+r1*2]
1386     add       r5d, r2d
1387 %endrep
1388     lea       r3d, [r3+r5+16]
1389
1390     movd       m1, r3d
1391     paddw      m0, m1
1392     psrlw      m0, 5
1393     SPLATW     m0, m0
1394     mov       r3d, 8
1395 .loop:
1396     MOV16 r4+r1*0, m0, m0, m0, m0
1397     MOV16 r4+r1*1, m0, m0, m0, m0
1398     lea        r4, [r4+r1*2]
1399     dec       r3d
1400     jg .loop
1401     REP_RET
1402 %endmacro
1403
1404 INIT_MMX
1405 PRED16x16_DC mmxext
1406 INIT_XMM
1407 PRED16x16_DC sse2
1408
1409 ;-----------------------------------------------------------------------------
1410 ; void pred16x16_top_dc(pixel *src, int stride)
1411 ;-----------------------------------------------------------------------------
1412 %macro PRED16x16_TOP_DC 1
1413 cglobal pred16x16_top_dc_10_%1, 2,3
1414     sub        r0, r1
1415     mova       m0, [r0+0]
1416     paddw      m0, [r0+mmsize]
1417 %if mmsize==8
1418     paddw      m0, [r0+16]
1419     paddw      m0, [r0+24]
1420 %endif
1421     HADDW      m0, m2
1422
1423     SPLATW     m0, m0
1424     paddw      m0, [pw_8]
1425     psrlw      m0, 4
1426     mov       r2d, 8
1427 .loop:
1428     MOV16 r0+r1*1, m0, m0, m0, m0
1429     MOV16 r0+r1*2, m0, m0, m0, m0
1430     lea        r0, [r0+r1*2]
1431     dec       r2d
1432     jg .loop
1433     REP_RET
1434 %endmacro
1435
1436 INIT_MMX
1437 PRED16x16_TOP_DC mmxext
1438 INIT_XMM
1439 PRED16x16_TOP_DC sse2
1440
1441 ;-----------------------------------------------------------------------------
1442 ; void pred16x16_left_dc(pixel *src, int stride)
1443 ;-----------------------------------------------------------------------------
1444 %macro PRED16x16_LEFT_DC 1
1445 cglobal pred16x16_left_dc_10_%1, 2,7
1446     mov        r4, r0
1447
1448     sub        r0, 2
1449     movzx     r5d, word [r0+r1*0]
1450     movzx     r6d, word [r0+r1*1]
1451 %rep 7
1452     lea        r0, [r0+r1*2]
1453     movzx     r2d, word [r0+r1*0]
1454     movzx     r3d, word [r0+r1*1]
1455     add       r5d, r2d
1456     add       r6d, r3d
1457 %endrep
1458     lea       r2d, [r5+r6+8]
1459     shr       r2d, 4
1460
1461     movd       m0, r2d
1462     SPLATW     m0, m0
1463     mov       r3d, 8
1464 .loop:
1465     MOV16 r4+r1*0, m0, m0, m0, m0
1466     MOV16 r4+r1*1, m0, m0, m0, m0
1467     lea        r4, [r4+r1*2]
1468     dec       r3d
1469     jg .loop
1470     REP_RET
1471 %endmacro
1472
1473 INIT_MMX
1474 PRED16x16_LEFT_DC mmxext
1475 INIT_XMM
1476 PRED16x16_LEFT_DC sse2
1477
1478 ;-----------------------------------------------------------------------------
1479 ; void pred16x16_128_dc(pixel *src, int stride)
1480 ;-----------------------------------------------------------------------------
1481 %macro PRED16x16_128_DC 1
1482 cglobal pred16x16_128_dc_10_%1, 2,3
1483     mova       m0, [pw_512]
1484     mov       r2d, 8
1485 .loop:
1486     MOV16 r0+r1*0, m0, m0, m0, m0
1487     MOV16 r0+r1*1, m0, m0, m0, m0
1488     lea        r0, [r0+r1*2]
1489     dec       r2d
1490     jg .loop
1491     REP_RET
1492 %endmacro
1493
1494 INIT_MMX
1495 PRED16x16_128_DC mmxext
1496 INIT_XMM
1497 PRED16x16_128_DC sse2