]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/h264_intrapred.asm
7c6aa12dce2c2dace07b3bae2b1504a64eca1236
[ffmpeg] / libavcodec / x86 / h264_intrapred.asm
1 ;******************************************************************************
2 ;* H.264 intra prediction asm optimizations
3 ;* Copyright (c) 2010 Jason Garrett-Glaser
4 ;* Copyright (c) 2010 Holger Lubitz
5 ;* Copyright (c) 2010 Loren Merritt
6 ;* Copyright (c) 2010 Ronald S. Bultje
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 tm_shuf: times 8 db 0x03, 0x80
31 pw_ff00: times 8 dw 0xff00
32 plane_shuf:  db -8, -7, -6, -5, -4, -3, -2, -1
33              db  1,  2,  3,  4,  5,  6,  7,  8
34 plane8_shuf: db -4, -3, -2, -1,  0,  0,  0,  0
35              db  1,  2,  3,  4,  0,  0,  0,  0
36 pw_0to7:     dw  0,  1,  2,  3,  4,  5,  6,  7
37 pw_1to8:     dw  1,  2,  3,  4,  5,  6,  7,  8
38 pw_m8tom1:   dw -8, -7, -6, -5, -4, -3, -2, -1
39 pw_m4to4:    dw -4, -3, -2, -1,  1,  2,  3,  4
40
41 SECTION .text
42
43 cextern pb_1
44 cextern pb_3
45 cextern pw_4
46 cextern pw_5
47 cextern pw_8
48 cextern pw_16
49 cextern pw_17
50 cextern pw_32
51
52 ;-----------------------------------------------------------------------------
53 ; void pred16x16_vertical(uint8_t *src, int stride)
54 ;-----------------------------------------------------------------------------
55
56 cglobal pred16x16_vertical_8_mmx, 2,3
57     sub   r0, r1
58     mov   r2, 8
59     movq mm0, [r0+0]
60     movq mm1, [r0+8]
61 .loop:
62     movq [r0+r1*1+0], mm0
63     movq [r0+r1*1+8], mm1
64     movq [r0+r1*2+0], mm0
65     movq [r0+r1*2+8], mm1
66     lea   r0, [r0+r1*2]
67     dec   r2
68     jg .loop
69     REP_RET
70
71 cglobal pred16x16_vertical_8_sse, 2,3
72     sub   r0, r1
73     mov   r2, 4
74     movaps xmm0, [r0]
75 .loop:
76     movaps [r0+r1*1], xmm0
77     movaps [r0+r1*2], xmm0
78     lea   r0, [r0+r1*2]
79     movaps [r0+r1*1], xmm0
80     movaps [r0+r1*2], xmm0
81     lea   r0, [r0+r1*2]
82     dec   r2
83     jg .loop
84     REP_RET
85
86 ;-----------------------------------------------------------------------------
87 ; void pred16x16_horizontal(uint8_t *src, int stride)
88 ;-----------------------------------------------------------------------------
89
90 %macro PRED16x16_H 0
91 cglobal pred16x16_horizontal_8, 2,3
92     mov       r2, 8
93 %if cpuflag(ssse3)
94     mova      m2, [pb_3]
95 %endif
96 .loop:
97     movd      m0, [r0+r1*0-4]
98     movd      m1, [r0+r1*1-4]
99
100 %if cpuflag(ssse3)
101     pshufb    m0, m2
102     pshufb    m1, m2
103 %else
104     punpcklbw m0, m0
105     punpcklbw m1, m1
106     SPLATW    m0, m0, 3
107     SPLATW    m1, m1, 3
108     mova [r0+r1*0+8], m0
109     mova [r0+r1*1+8], m1
110 %endif
111
112     mova [r0+r1*0], m0
113     mova [r0+r1*1], m1
114     lea       r0, [r0+r1*2]
115     dec       r2
116     jg .loop
117     REP_RET
118 %endmacro
119
120 INIT_MMX mmx
121 PRED16x16_H
122 INIT_MMX mmx2
123 PRED16x16_H
124 INIT_XMM ssse3
125 PRED16x16_H
126 INIT_XMM
127
128 ;-----------------------------------------------------------------------------
129 ; void pred16x16_dc(uint8_t *src, int stride)
130 ;-----------------------------------------------------------------------------
131
132 %macro PRED16x16_DC 0
133 cglobal pred16x16_dc_8, 2,7
134     mov       r4, r0
135     sub       r0, r1
136     pxor      mm0, mm0
137     pxor      mm1, mm1
138     psadbw    mm0, [r0+0]
139     psadbw    mm1, [r0+8]
140     dec        r0
141     movzx     r5d, byte [r0+r1*1]
142     paddw     mm0, mm1
143     movd      r6d, mm0
144     lea        r0, [r0+r1*2]
145 %rep 7
146     movzx     r2d, byte [r0+r1*0]
147     movzx     r3d, byte [r0+r1*1]
148     add       r5d, r2d
149     add       r6d, r3d
150     lea        r0, [r0+r1*2]
151 %endrep
152     movzx     r2d, byte [r0+r1*0]
153     add       r5d, r6d
154     lea       r2d, [r2+r5+16]
155     shr       r2d, 5
156 %if cpuflag(ssse3)
157     pxor       m1, m1
158 %endif
159     SPLATB_REG m0, r2, m1
160
161 %if mmsize==8
162     mov       r3d, 8
163 .loop:
164     mova [r4+r1*0+0], m0
165     mova [r4+r1*0+8], m0
166     mova [r4+r1*1+0], m0
167     mova [r4+r1*1+8], m0
168 %else
169     mov       r3d, 4
170 .loop:
171     mova [r4+r1*0], m0
172     mova [r4+r1*1], m0
173     lea   r4, [r4+r1*2]
174     mova [r4+r1*0], m0
175     mova [r4+r1*1], m0
176 %endif
177     lea   r4, [r4+r1*2]
178     dec   r3d
179     jg .loop
180     REP_RET
181 %endmacro
182
183 INIT_MMX mmx2
184 PRED16x16_DC
185 INIT_XMM sse2
186 PRED16x16_DC
187 INIT_XMM ssse3
188 PRED16x16_DC
189 INIT_XMM
190
191 ;-----------------------------------------------------------------------------
192 ; void pred16x16_tm_vp8(uint8_t *src, int stride)
193 ;-----------------------------------------------------------------------------
194
195 %macro PRED16x16_TM_MMX 0
196 cglobal pred16x16_tm_vp8_8, 2,5
197     sub        r0, r1
198     pxor      mm7, mm7
199     movq      mm0, [r0+0]
200     movq      mm2, [r0+8]
201     movq      mm1, mm0
202     movq      mm3, mm2
203     punpcklbw mm0, mm7
204     punpckhbw mm1, mm7
205     punpcklbw mm2, mm7
206     punpckhbw mm3, mm7
207     movzx     r3d, byte [r0-1]
208     mov       r4d, 16
209 .loop:
210     movzx     r2d, byte [r0+r1-1]
211     sub       r2d, r3d
212     movd      mm4, r2d
213     SPLATW    mm4, mm4, 0
214     movq      mm5, mm4
215     movq      mm6, mm4
216     movq      mm7, mm4
217     paddw     mm4, mm0
218     paddw     mm5, mm1
219     paddw     mm6, mm2
220     paddw     mm7, mm3
221     packuswb  mm4, mm5
222     packuswb  mm6, mm7
223     movq [r0+r1+0], mm4
224     movq [r0+r1+8], mm6
225     add        r0, r1
226     dec       r4d
227     jg .loop
228     REP_RET
229 %endmacro
230
231 INIT_MMX mmx
232 PRED16x16_TM_MMX
233 INIT_MMX mmx2
234 PRED16x16_TM_MMX
235 INIT_MMX
236
237 cglobal pred16x16_tm_vp8_8_sse2, 2,6,6
238     sub          r0, r1
239     pxor       xmm2, xmm2
240     movdqa     xmm0, [r0]
241     movdqa     xmm1, xmm0
242     punpcklbw  xmm0, xmm2
243     punpckhbw  xmm1, xmm2
244     movzx       r4d, byte [r0-1]
245     mov         r5d, 8
246 .loop:
247     movzx       r2d, byte [r0+r1*1-1]
248     movzx       r3d, byte [r0+r1*2-1]
249     sub         r2d, r4d
250     sub         r3d, r4d
251     movd       xmm2, r2d
252     movd       xmm4, r3d
253     pshuflw    xmm2, xmm2, 0
254     pshuflw    xmm4, xmm4, 0
255     punpcklqdq xmm2, xmm2
256     punpcklqdq xmm4, xmm4
257     movdqa     xmm3, xmm2
258     movdqa     xmm5, xmm4
259     paddw      xmm2, xmm0
260     paddw      xmm3, xmm1
261     paddw      xmm4, xmm0
262     paddw      xmm5, xmm1
263     packuswb   xmm2, xmm3
264     packuswb   xmm4, xmm5
265     movdqa [r0+r1*1], xmm2
266     movdqa [r0+r1*2], xmm4
267     lea          r0, [r0+r1*2]
268     dec         r5d
269     jg .loop
270     REP_RET
271
272 ;-----------------------------------------------------------------------------
273 ; void pred16x16_plane(uint8_t *src, int stride)
274 ;-----------------------------------------------------------------------------
275
276 %macro H264_PRED16x16_PLANE 1
277 cglobal pred16x16_plane_%1_8, 2,9,7
278     mov          r2, r1           ; +stride
279     neg          r1               ; -stride
280
281     movh         m0, [r0+r1  -1]
282 %if mmsize == 8
283     pxor         m4, m4
284     movh         m1, [r0+r1  +3 ]
285     movh         m2, [r0+r1  +8 ]
286     movh         m3, [r0+r1  +12]
287     punpcklbw    m0, m4
288     punpcklbw    m1, m4
289     punpcklbw    m2, m4
290     punpcklbw    m3, m4
291     pmullw       m0, [pw_m8tom1  ]
292     pmullw       m1, [pw_m8tom1+8]
293     pmullw       m2, [pw_1to8    ]
294     pmullw       m3, [pw_1to8  +8]
295     paddw        m0, m2
296     paddw        m1, m3
297 %else ; mmsize == 16
298 %if cpuflag(ssse3)
299     movhps       m0, [r0+r1  +8]
300     pmaddubsw    m0, [plane_shuf] ; H coefficients
301 %else ; sse2
302     pxor         m2, m2
303     movh         m1, [r0+r1  +8]
304     punpcklbw    m0, m2
305     punpcklbw    m1, m2
306     pmullw       m0, [pw_m8tom1]
307     pmullw       m1, [pw_1to8]
308     paddw        m0, m1
309 %endif
310     movhlps      m1, m0
311 %endif
312     paddw        m0, m1
313 %if cpuflag(mmx2)
314     PSHUFLW      m1, m0, 0xE
315 %elif cpuflag(mmx)
316     mova         m1, m0
317     psrlq        m1, 32
318 %endif
319     paddw        m0, m1
320 %if cpuflag(mmx2)
321     PSHUFLW      m1, m0, 0x1
322 %elif cpuflag(mmx)
323     mova         m1, m0
324     psrlq        m1, 16
325 %endif
326     paddw        m0, m1           ; sum of H coefficients
327
328     lea          r4, [r0+r2*8-1]
329     lea          r3, [r0+r2*4-1]
330     add          r4, r2
331
332 %if ARCH_X86_64
333 %define e_reg r8
334 %else
335 %define e_reg r0
336 %endif
337
338     movzx     e_reg, byte [r3+r2*2   ]
339     movzx        r5, byte [r4+r1     ]
340     sub          r5, e_reg
341
342     movzx     e_reg, byte [r3+r2     ]
343     movzx        r6, byte [r4        ]
344     sub          r6, e_reg
345     lea          r5, [r5+r6*2]
346
347     movzx     e_reg, byte [r3+r1     ]
348     movzx        r6, byte [r4+r2*2   ]
349     sub          r6, e_reg
350     lea          r5, [r5+r6*4]
351
352     movzx     e_reg, byte [r3        ]
353 %if ARCH_X86_64
354     movzx        r7, byte [r4+r2     ]
355     sub          r7, e_reg
356 %else
357     movzx        r6, byte [r4+r2     ]
358     sub          r6, e_reg
359     lea          r5, [r5+r6*4]
360     sub          r5, r6
361 %endif
362
363     lea       e_reg, [r3+r1*4]
364     lea          r3, [r4+r2*4]
365
366     movzx        r4, byte [e_reg+r2  ]
367     movzx        r6, byte [r3        ]
368     sub          r6, r4
369 %if ARCH_X86_64
370     lea          r6, [r7+r6*2]
371     lea          r5, [r5+r6*2]
372     add          r5, r6
373 %else
374     lea          r5, [r5+r6*4]
375     lea          r5, [r5+r6*2]
376 %endif
377
378     movzx        r4, byte [e_reg     ]
379 %if ARCH_X86_64
380     movzx        r7, byte [r3   +r2  ]
381     sub          r7, r4
382     sub          r5, r7
383 %else
384     movzx        r6, byte [r3   +r2  ]
385     sub          r6, r4
386     lea          r5, [r5+r6*8]
387     sub          r5, r6
388 %endif
389
390     movzx        r4, byte [e_reg+r1  ]
391     movzx        r6, byte [r3   +r2*2]
392     sub          r6, r4
393 %if ARCH_X86_64
394     add          r6, r7
395 %endif
396     lea          r5, [r5+r6*8]
397
398     movzx        r4, byte [e_reg+r2*2]
399     movzx        r6, byte [r3   +r1  ]
400     sub          r6, r4
401     lea          r5, [r5+r6*4]
402     add          r5, r6           ; sum of V coefficients
403
404 %if ARCH_X86_64 == 0
405     mov          r0, r0m
406 %endif
407
408 %ifidn %1, h264
409     lea          r5, [r5*5+32]
410     sar          r5, 6
411 %elifidn %1, rv40
412     lea          r5, [r5*5]
413     sar          r5, 6
414 %elifidn %1, svq3
415     test         r5, r5
416     lea          r6, [r5+3]
417     cmovs        r5, r6
418     sar          r5, 2            ; V/4
419     lea          r5, [r5*5]       ; 5*(V/4)
420     test         r5, r5
421     lea          r6, [r5+15]
422     cmovs        r5, r6
423     sar          r5, 4            ; (5*(V/4))/16
424 %endif
425
426     movzx        r4, byte [r0+r1  +15]
427     movzx        r3, byte [r3+r2*2   ]
428     lea          r3, [r3+r4+1]
429     shl          r3, 4
430
431     movd        r1d, m0
432     movsx       r1d, r1w
433 %ifnidn %1, svq3
434 %ifidn %1, h264
435     lea         r1d, [r1d*5+32]
436 %else ; rv40
437     lea         r1d, [r1d*5]
438 %endif
439     sar         r1d, 6
440 %else ; svq3
441     test        r1d, r1d
442     lea         r4d, [r1d+3]
443     cmovs       r1d, r4d
444     sar         r1d, 2           ; H/4
445     lea         r1d, [r1d*5]     ; 5*(H/4)
446     test        r1d, r1d
447     lea         r4d, [r1d+15]
448     cmovs       r1d, r4d
449     sar         r1d, 4           ; (5*(H/4))/16
450 %endif
451     movd         m0, r1d
452
453     add         r1d, r5d
454     add         r3d, r1d
455     shl         r1d, 3
456     sub         r3d, r1d          ; a
457
458     movd         m1, r5d
459     movd         m3, r3d
460     SPLATW       m0, m0, 0        ; H
461     SPLATW       m1, m1, 0        ; V
462     SPLATW       m3, m3, 0        ; a
463 %ifidn %1, svq3
464     SWAP          0, 1
465 %endif
466     mova         m2, m0
467 %if mmsize == 8
468     mova         m5, m0
469 %endif
470     pmullw       m0, [pw_0to7]    ; 0*H, 1*H, ..., 7*H  (words)
471 %if mmsize == 16
472     psllw        m2, 3
473 %else
474     psllw        m5, 3
475     psllw        m2, 2
476     mova         m6, m5
477     paddw        m6, m2
478 %endif
479     paddw        m0, m3           ; a + {0,1,2,3,4,5,6,7}*H
480     paddw        m2, m0           ; a + {8,9,10,11,12,13,14,15}*H
481 %if mmsize == 8
482     paddw        m5, m0           ; a + {8,9,10,11}*H
483     paddw        m6, m0           ; a + {12,13,14,15}*H
484 %endif
485
486     mov          r4, 8
487 .loop:
488     mova         m3, m0           ; b[0..7]
489     mova         m4, m2           ; b[8..15]
490     psraw        m3, 5
491     psraw        m4, 5
492     packuswb     m3, m4
493     mova       [r0], m3
494 %if mmsize == 8
495     mova         m3, m5           ; b[8..11]
496     mova         m4, m6           ; b[12..15]
497     psraw        m3, 5
498     psraw        m4, 5
499     packuswb     m3, m4
500     mova     [r0+8], m3
501 %endif
502     paddw        m0, m1
503     paddw        m2, m1
504 %if mmsize == 8
505     paddw        m5, m1
506     paddw        m6, m1
507 %endif
508
509     mova         m3, m0           ; b[0..7]
510     mova         m4, m2           ; b[8..15]
511     psraw        m3, 5
512     psraw        m4, 5
513     packuswb     m3, m4
514     mova    [r0+r2], m3
515 %if mmsize == 8
516     mova         m3, m5           ; b[8..11]
517     mova         m4, m6           ; b[12..15]
518     psraw        m3, 5
519     psraw        m4, 5
520     packuswb     m3, m4
521     mova  [r0+r2+8], m3
522 %endif
523     paddw        m0, m1
524     paddw        m2, m1
525 %if mmsize == 8
526     paddw        m5, m1
527     paddw        m6, m1
528 %endif
529
530     lea          r0, [r0+r2*2]
531     dec          r4
532     jg .loop
533     REP_RET
534 %endmacro
535
536 INIT_MMX mmx
537 H264_PRED16x16_PLANE h264
538 H264_PRED16x16_PLANE rv40
539 H264_PRED16x16_PLANE svq3
540 INIT_MMX mmx2
541 H264_PRED16x16_PLANE h264
542 H264_PRED16x16_PLANE rv40
543 H264_PRED16x16_PLANE svq3
544 INIT_XMM sse2
545 H264_PRED16x16_PLANE h264
546 H264_PRED16x16_PLANE rv40
547 H264_PRED16x16_PLANE svq3
548 INIT_XMM ssse3
549 H264_PRED16x16_PLANE h264
550 H264_PRED16x16_PLANE rv40
551 H264_PRED16x16_PLANE svq3
552 INIT_XMM
553
554 ;-----------------------------------------------------------------------------
555 ; void pred8x8_plane(uint8_t *src, int stride)
556 ;-----------------------------------------------------------------------------
557
558 %macro H264_PRED8x8_PLANE 0
559 cglobal pred8x8_plane_8, 2,9,7
560     mov          r2, r1           ; +stride
561     neg          r1               ; -stride
562
563     movd         m0, [r0+r1  -1]
564 %if mmsize == 8
565     pxor         m2, m2
566     movh         m1, [r0+r1  +4 ]
567     punpcklbw    m0, m2
568     punpcklbw    m1, m2
569     pmullw       m0, [pw_m4to4]
570     pmullw       m1, [pw_m4to4+8]
571 %else ; mmsize == 16
572 %if cpuflag(ssse3)
573     movhps       m0, [r0+r1  +4]   ; this reads 4 bytes more than necessary
574     pmaddubsw    m0, [plane8_shuf] ; H coefficients
575 %else ; sse2
576     pxor         m2, m2
577     movd         m1, [r0+r1  +4]
578     punpckldq    m0, m1
579     punpcklbw    m0, m2
580     pmullw       m0, [pw_m4to4]
581 %endif
582     movhlps      m1, m0
583 %endif
584     paddw        m0, m1
585
586 %if notcpuflag(ssse3)
587 %if cpuflag(mmx2)
588     PSHUFLW      m1, m0, 0xE
589 %elif cpuflag(mmx)
590     mova         m1, m0
591     psrlq        m1, 32
592 %endif
593     paddw        m0, m1
594 %endif ; !ssse3
595
596 %if cpuflag(mmx2)
597     PSHUFLW      m1, m0, 0x1
598 %elif cpuflag(mmx)
599     mova         m1, m0
600     psrlq        m1, 16
601 %endif
602     paddw        m0, m1           ; sum of H coefficients
603
604     lea          r4, [r0+r2*4-1]
605     lea          r3, [r0     -1]
606     add          r4, r2
607
608 %if ARCH_X86_64
609 %define e_reg r8
610 %else
611 %define e_reg r0
612 %endif
613
614     movzx     e_reg, byte [r3+r2*2   ]
615     movzx        r5, byte [r4+r1     ]
616     sub          r5, e_reg
617
618     movzx     e_reg, byte [r3        ]
619 %if ARCH_X86_64
620     movzx        r7, byte [r4+r2     ]
621     sub          r7, e_reg
622     sub          r5, r7
623 %else
624     movzx        r6, byte [r4+r2     ]
625     sub          r6, e_reg
626     lea          r5, [r5+r6*4]
627     sub          r5, r6
628 %endif
629
630     movzx     e_reg, byte [r3+r1     ]
631     movzx        r6, byte [r4+r2*2   ]
632     sub          r6, e_reg
633 %if ARCH_X86_64
634     add          r6, r7
635 %endif
636     lea          r5, [r5+r6*4]
637
638     movzx     e_reg, byte [r3+r2     ]
639     movzx        r6, byte [r4        ]
640     sub          r6, e_reg
641     lea          r6, [r5+r6*2]
642
643     lea          r5, [r6*9+16]
644     lea          r5, [r5+r6*8]
645     sar          r5, 5
646
647 %if ARCH_X86_64 == 0
648     mov          r0, r0m
649 %endif
650
651     movzx        r3, byte [r4+r2*2  ]
652     movzx        r4, byte [r0+r1  +7]
653     lea          r3, [r3+r4+1]
654     shl          r3, 4
655     movd        r1d, m0
656     movsx       r1d, r1w
657     imul        r1d, 17
658     add         r1d, 16
659     sar         r1d, 5
660     movd         m0, r1d
661     add         r1d, r5d
662     sub         r3d, r1d
663     add         r1d, r1d
664     sub         r3d, r1d          ; a
665
666     movd         m1, r5d
667     movd         m3, r3d
668     SPLATW       m0, m0, 0        ; H
669     SPLATW       m1, m1, 0        ; V
670     SPLATW       m3, m3, 0        ; a
671 %if mmsize == 8
672     mova         m2, m0
673 %endif
674     pmullw       m0, [pw_0to7]    ; 0*H, 1*H, ..., 7*H  (words)
675     paddw        m0, m3           ; a + {0,1,2,3,4,5,6,7}*H
676 %if mmsize == 8
677     psllw        m2, 2
678     paddw        m2, m0           ; a + {4,5,6,7}*H
679 %endif
680
681     mov          r4, 4
682 ALIGN 16
683 .loop:
684 %if mmsize == 16
685     mova         m3, m0           ; b[0..7]
686     paddw        m0, m1
687     psraw        m3, 5
688     mova         m4, m0           ; V+b[0..7]
689     paddw        m0, m1
690     psraw        m4, 5
691     packuswb     m3, m4
692     movh       [r0], m3
693     movhps  [r0+r2], m3
694 %else ; mmsize == 8
695     mova         m3, m0           ; b[0..3]
696     mova         m4, m2           ; b[4..7]
697     paddw        m0, m1
698     paddw        m2, m1
699     psraw        m3, 5
700     psraw        m4, 5
701     mova         m5, m0           ; V+b[0..3]
702     mova         m6, m2           ; V+b[4..7]
703     paddw        m0, m1
704     paddw        m2, m1
705     psraw        m5, 5
706     psraw        m6, 5
707     packuswb     m3, m4
708     packuswb     m5, m6
709     mova       [r0], m3
710     mova    [r0+r2], m5
711 %endif
712
713     lea          r0, [r0+r2*2]
714     dec          r4
715     jg .loop
716     REP_RET
717 %endmacro
718
719 INIT_MMX mmx
720 H264_PRED8x8_PLANE
721 INIT_MMX mmx2
722 H264_PRED8x8_PLANE
723 INIT_XMM sse2
724 H264_PRED8x8_PLANE
725 INIT_XMM ssse3
726 H264_PRED8x8_PLANE
727 INIT_XMM
728
729 ;-----------------------------------------------------------------------------
730 ; void pred8x8_vertical(uint8_t *src, int stride)
731 ;-----------------------------------------------------------------------------
732
733 cglobal pred8x8_vertical_8_mmx, 2,2
734     sub    r0, r1
735     movq  mm0, [r0]
736 %rep 3
737     movq [r0+r1*1], mm0
738     movq [r0+r1*2], mm0
739     lea    r0, [r0+r1*2]
740 %endrep
741     movq [r0+r1*1], mm0
742     movq [r0+r1*2], mm0
743     RET
744
745 ;-----------------------------------------------------------------------------
746 ; void pred8x8_horizontal(uint8_t *src, int stride)
747 ;-----------------------------------------------------------------------------
748
749 %macro PRED8x8_H 0
750 cglobal pred8x8_horizontal_8, 2,3
751     mov       r2, 4
752 %if cpuflag(ssse3)
753     mova      m2, [pb_3]
754 %endif
755 .loop:
756     SPLATB_LOAD m0, r0+r1*0-1, m2
757     SPLATB_LOAD m1, r0+r1*1-1, m2
758     mova [r0+r1*0], m0
759     mova [r0+r1*1], m1
760     lea       r0, [r0+r1*2]
761     dec       r2
762     jg .loop
763     REP_RET
764 %endmacro
765
766 INIT_MMX mmx
767 PRED8x8_H
768 INIT_MMX mmx2
769 PRED8x8_H
770 INIT_MMX ssse3
771 PRED8x8_H
772 INIT_MMX
773
774 ;-----------------------------------------------------------------------------
775 ; void pred8x8_top_dc_mmxext(uint8_t *src, int stride)
776 ;-----------------------------------------------------------------------------
777 cglobal pred8x8_top_dc_8_mmxext, 2,5
778     sub         r0, r1
779     movq       mm0, [r0]
780     pxor       mm1, mm1
781     pxor       mm2, mm2
782     lea         r2, [r0+r1*2]
783     punpckhbw  mm1, mm0
784     punpcklbw  mm0, mm2
785     psadbw     mm1, mm2        ; s1
786     lea         r3, [r2+r1*2]
787     psadbw     mm0, mm2        ; s0
788     psrlw      mm1, 1
789     psrlw      mm0, 1
790     pavgw      mm1, mm2
791     lea         r4, [r3+r1*2]
792     pavgw      mm0, mm2
793     pshufw     mm1, mm1, 0
794     pshufw     mm0, mm0, 0     ; dc0 (w)
795     packuswb   mm0, mm1        ; dc0,dc1 (b)
796     movq [r0+r1*1], mm0
797     movq [r0+r1*2], mm0
798     lea         r0, [r3+r1*2]
799     movq [r2+r1*1], mm0
800     movq [r2+r1*2], mm0
801     movq [r3+r1*1], mm0
802     movq [r3+r1*2], mm0
803     movq [r0+r1*1], mm0
804     movq [r0+r1*2], mm0
805     RET
806
807 ;-----------------------------------------------------------------------------
808 ; void pred8x8_dc_mmxext(uint8_t *src, int stride)
809 ;-----------------------------------------------------------------------------
810
811 INIT_MMX
812 cglobal pred8x8_dc_8_mmxext, 2,5
813     sub       r0, r1
814     pxor      m7, m7
815     movd      m0, [r0+0]
816     movd      m1, [r0+4]
817     psadbw    m0, m7            ; s0
818     mov       r4, r0
819     psadbw    m1, m7            ; s1
820
821     movzx    r2d, byte [r0+r1*1-1]
822     movzx    r3d, byte [r0+r1*2-1]
823     lea       r0, [r0+r1*2]
824     add      r2d, r3d
825     movzx    r3d, byte [r0+r1*1-1]
826     add      r2d, r3d
827     movzx    r3d, byte [r0+r1*2-1]
828     add      r2d, r3d
829     lea       r0, [r0+r1*2]
830     movd      m2, r2d            ; s2
831     movzx    r2d, byte [r0+r1*1-1]
832     movzx    r3d, byte [r0+r1*2-1]
833     lea       r0, [r0+r1*2]
834     add      r2d, r3d
835     movzx    r3d, byte [r0+r1*1-1]
836     add      r2d, r3d
837     movzx    r3d, byte [r0+r1*2-1]
838     add      r2d, r3d
839     movd      m3, r2d            ; s3
840
841     punpcklwd m0, m1
842     mov       r0, r4
843     punpcklwd m2, m3
844     punpckldq m0, m2            ; s0, s1, s2, s3
845     pshufw    m3, m0, 11110110b ; s2, s1, s3, s3
846     lea       r2, [r0+r1*2]
847     pshufw    m0, m0, 01110100b ; s0, s1, s3, s1
848     paddw     m0, m3
849     lea       r3, [r2+r1*2]
850     psrlw     m0, 2
851     pavgw     m0, m7            ; s0+s2, s1, s3, s1+s3
852     lea       r4, [r3+r1*2]
853     packuswb  m0, m0
854     punpcklbw m0, m0
855     movq      m1, m0
856     punpcklbw m0, m0
857     punpckhbw m1, m1
858     movq [r0+r1*1], m0
859     movq [r0+r1*2], m0
860     movq [r2+r1*1], m0
861     movq [r2+r1*2], m0
862     movq [r3+r1*1], m1
863     movq [r3+r1*2], m1
864     movq [r4+r1*1], m1
865     movq [r4+r1*2], m1
866     RET
867
868 ;-----------------------------------------------------------------------------
869 ; void pred8x8_dc_rv40(uint8_t *src, int stride)
870 ;-----------------------------------------------------------------------------
871
872 cglobal pred8x8_dc_rv40_8_mmxext, 2,7
873     mov       r4, r0
874     sub       r0, r1
875     pxor      mm0, mm0
876     psadbw    mm0, [r0]
877     dec        r0
878     movzx     r5d, byte [r0+r1*1]
879     movd      r6d, mm0
880     lea        r0, [r0+r1*2]
881 %rep 3
882     movzx     r2d, byte [r0+r1*0]
883     movzx     r3d, byte [r0+r1*1]
884     add       r5d, r2d
885     add       r6d, r3d
886     lea        r0, [r0+r1*2]
887 %endrep
888     movzx     r2d, byte [r0+r1*0]
889     add       r5d, r6d
890     lea       r2d, [r2+r5+8]
891     shr       r2d, 4
892     movd      mm0, r2d
893     punpcklbw mm0, mm0
894     pshufw    mm0, mm0, 0
895     mov       r3d, 4
896 .loop:
897     movq [r4+r1*0], mm0
898     movq [r4+r1*1], mm0
899     lea   r4, [r4+r1*2]
900     dec   r3d
901     jg .loop
902     REP_RET
903
904 ;-----------------------------------------------------------------------------
905 ; void pred8x8_tm_vp8(uint8_t *src, int stride)
906 ;-----------------------------------------------------------------------------
907
908 %macro PRED8x8_TM_MMX 0
909 cglobal pred8x8_tm_vp8_8, 2,6
910     sub        r0, r1
911     pxor      mm7, mm7
912     movq      mm0, [r0]
913     movq      mm1, mm0
914     punpcklbw mm0, mm7
915     punpckhbw mm1, mm7
916     movzx     r4d, byte [r0-1]
917     mov       r5d, 4
918 .loop:
919     movzx     r2d, byte [r0+r1*1-1]
920     movzx     r3d, byte [r0+r1*2-1]
921     sub       r2d, r4d
922     sub       r3d, r4d
923     movd      mm2, r2d
924     movd      mm4, r3d
925     SPLATW    mm2, mm2, 0
926     SPLATW    mm4, mm4, 0
927     movq      mm3, mm2
928     movq      mm5, mm4
929     paddw     mm2, mm0
930     paddw     mm3, mm1
931     paddw     mm4, mm0
932     paddw     mm5, mm1
933     packuswb  mm2, mm3
934     packuswb  mm4, mm5
935     movq [r0+r1*1], mm2
936     movq [r0+r1*2], mm4
937     lea        r0, [r0+r1*2]
938     dec       r5d
939     jg .loop
940     REP_RET
941 %endmacro
942
943 INIT_MMX mmx
944 PRED8x8_TM_MMX
945 INIT_MMX mmx2
946 PRED8x8_TM_MMX
947 INIT_MMX
948
949 cglobal pred8x8_tm_vp8_8_sse2, 2,6,4
950     sub          r0, r1
951     pxor       xmm1, xmm1
952     movq       xmm0, [r0]
953     punpcklbw  xmm0, xmm1
954     movzx       r4d, byte [r0-1]
955     mov         r5d, 4
956 .loop:
957     movzx       r2d, byte [r0+r1*1-1]
958     movzx       r3d, byte [r0+r1*2-1]
959     sub         r2d, r4d
960     sub         r3d, r4d
961     movd       xmm2, r2d
962     movd       xmm3, r3d
963     pshuflw    xmm2, xmm2, 0
964     pshuflw    xmm3, xmm3, 0
965     punpcklqdq xmm2, xmm2
966     punpcklqdq xmm3, xmm3
967     paddw      xmm2, xmm0
968     paddw      xmm3, xmm0
969     packuswb   xmm2, xmm3
970     movq   [r0+r1*1], xmm2
971     movhps [r0+r1*2], xmm2
972     lea          r0, [r0+r1*2]
973     dec         r5d
974     jg .loop
975     REP_RET
976
977 cglobal pred8x8_tm_vp8_8_ssse3, 2,3,6
978     sub          r0, r1
979     movdqa     xmm4, [tm_shuf]
980     pxor       xmm1, xmm1
981     movq       xmm0, [r0]
982     punpcklbw  xmm0, xmm1
983     movd       xmm5, [r0-4]
984     pshufb     xmm5, xmm4
985     mov         r2d, 4
986 .loop:
987     movd       xmm2, [r0+r1*1-4]
988     movd       xmm3, [r0+r1*2-4]
989     pshufb     xmm2, xmm4
990     pshufb     xmm3, xmm4
991     psubw      xmm2, xmm5
992     psubw      xmm3, xmm5
993     paddw      xmm2, xmm0
994     paddw      xmm3, xmm0
995     packuswb   xmm2, xmm3
996     movq   [r0+r1*1], xmm2
997     movhps [r0+r1*2], xmm2
998     lea          r0, [r0+r1*2]
999     dec         r2d
1000     jg .loop
1001     REP_RET
1002
1003 ; dest, left, right, src, tmp
1004 ; output: %1 = (t[n-1] + t[n]*2 + t[n+1] + 2) >> 2
1005 %macro PRED4x4_LOWPASS 5
1006     mova    %5, %2
1007     pavgb   %2, %3
1008     pxor    %3, %5
1009     mova    %1, %4
1010     pand    %3, [pb_1]
1011     psubusb %2, %3
1012     pavgb   %1, %2
1013 %endmacro
1014
1015 ;-----------------------------------------------------------------------------
1016 ; void pred8x8l_top_dc(uint8_t *src, int has_topleft, int has_topright, int stride)
1017 ;-----------------------------------------------------------------------------
1018 %macro PRED8x8L_TOP_DC 1
1019 cglobal pred8x8l_top_dc_8_%1, 4,4
1020     sub          r0, r3
1021     pxor        mm7, mm7
1022     movq        mm0, [r0-8]
1023     movq        mm3, [r0]
1024     movq        mm1, [r0+8]
1025     movq        mm2, mm3
1026     movq        mm4, mm3
1027     PALIGNR     mm2, mm0, 7, mm0
1028     PALIGNR     mm1, mm4, 1, mm4
1029     test         r1, r1 ; top_left
1030     jz .fix_lt_2
1031     test         r2, r2 ; top_right
1032     jz .fix_tr_1
1033     jmp .body
1034 .fix_lt_2:
1035     movq        mm5, mm3
1036     pxor        mm5, mm2
1037     psllq       mm5, 56
1038     psrlq       mm5, 56
1039     pxor        mm2, mm5
1040     test         r2, r2 ; top_right
1041     jnz .body
1042 .fix_tr_1:
1043     movq        mm5, mm3
1044     pxor        mm5, mm1
1045     psrlq       mm5, 56
1046     psllq       mm5, 56
1047     pxor        mm1, mm5
1048 .body:
1049     PRED4x4_LOWPASS mm0, mm2, mm1, mm3, mm5
1050     psadbw   mm7, mm0
1051     paddw    mm7, [pw_4]
1052     psrlw    mm7, 3
1053     pshufw   mm7, mm7, 0
1054     packuswb mm7, mm7
1055 %rep 3
1056     movq [r0+r3*1], mm7
1057     movq [r0+r3*2], mm7
1058     lea    r0, [r0+r3*2]
1059 %endrep
1060     movq [r0+r3*1], mm7
1061     movq [r0+r3*2], mm7
1062     RET
1063 %endmacro
1064
1065 INIT_MMX
1066 %define PALIGNR PALIGNR_MMX
1067 PRED8x8L_TOP_DC mmxext
1068 %define PALIGNR PALIGNR_SSSE3
1069 PRED8x8L_TOP_DC ssse3
1070
1071 ;-----------------------------------------------------------------------------
1072 ;void pred8x8l_dc(uint8_t *src, int has_topleft, int has_topright, int stride)
1073 ;-----------------------------------------------------------------------------
1074
1075 %macro PRED8x8L_DC 1
1076 cglobal pred8x8l_dc_8_%1, 4,5
1077     sub          r0, r3
1078     lea          r4, [r0+r3*2]
1079     movq        mm0, [r0+r3*1-8]
1080     punpckhbw   mm0, [r0+r3*0-8]
1081     movq        mm1, [r4+r3*1-8]
1082     punpckhbw   mm1, [r0+r3*2-8]
1083     mov          r4, r0
1084     punpckhwd   mm1, mm0
1085     lea          r0, [r0+r3*4]
1086     movq        mm2, [r0+r3*1-8]
1087     punpckhbw   mm2, [r0+r3*0-8]
1088     lea          r0, [r0+r3*2]
1089     movq        mm3, [r0+r3*1-8]
1090     punpckhbw   mm3, [r0+r3*0-8]
1091     punpckhwd   mm3, mm2
1092     punpckhdq   mm3, mm1
1093     lea          r0, [r0+r3*2]
1094     movq        mm0, [r0+r3*0-8]
1095     movq        mm1, [r4]
1096     mov          r0, r4
1097     movq        mm4, mm3
1098     movq        mm2, mm3
1099     PALIGNR     mm4, mm0, 7, mm0
1100     PALIGNR     mm1, mm2, 1, mm2
1101     test        r1, r1
1102     jnz .do_left
1103 .fix_lt_1:
1104     movq        mm5, mm3
1105     pxor        mm5, mm4
1106     psrlq       mm5, 56
1107     psllq       mm5, 48
1108     pxor        mm1, mm5
1109     jmp .do_left
1110 .fix_lt_2:
1111     movq        mm5, mm3
1112     pxor        mm5, mm2
1113     psllq       mm5, 56
1114     psrlq       mm5, 56
1115     pxor        mm2, mm5
1116     test         r2, r2
1117     jnz .body
1118 .fix_tr_1:
1119     movq        mm5, mm3
1120     pxor        mm5, mm1
1121     psrlq       mm5, 56
1122     psllq       mm5, 56
1123     pxor        mm1, mm5
1124     jmp .body
1125 .do_left:
1126     movq        mm0, mm4
1127     PRED4x4_LOWPASS mm2, mm1, mm4, mm3, mm5
1128     movq        mm4, mm0
1129     movq        mm7, mm2
1130     PRED4x4_LOWPASS mm1, mm3, mm0, mm4, mm5
1131     psllq       mm1, 56
1132     PALIGNR     mm7, mm1, 7, mm3
1133     movq        mm0, [r0-8]
1134     movq        mm3, [r0]
1135     movq        mm1, [r0+8]
1136     movq        mm2, mm3
1137     movq        mm4, mm3
1138     PALIGNR     mm2, mm0, 7, mm0
1139     PALIGNR     mm1, mm4, 1, mm4
1140     test         r1, r1
1141     jz .fix_lt_2
1142     test         r2, r2
1143     jz .fix_tr_1
1144 .body:
1145     lea          r1, [r0+r3*2]
1146     PRED4x4_LOWPASS mm6, mm2, mm1, mm3, mm5
1147     pxor        mm0, mm0
1148     pxor        mm1, mm1
1149     lea          r2, [r1+r3*2]
1150     psadbw      mm0, mm7
1151     psadbw      mm1, mm6
1152     paddw       mm0, [pw_8]
1153     paddw       mm0, mm1
1154     lea          r4, [r2+r3*2]
1155     psrlw       mm0, 4
1156     pshufw      mm0, mm0, 0
1157     packuswb    mm0, mm0
1158     movq [r0+r3*1], mm0
1159     movq [r0+r3*2], mm0
1160     movq [r1+r3*1], mm0
1161     movq [r1+r3*2], mm0
1162     movq [r2+r3*1], mm0
1163     movq [r2+r3*2], mm0
1164     movq [r4+r3*1], mm0
1165     movq [r4+r3*2], mm0
1166     RET
1167 %endmacro
1168 INIT_MMX
1169 %define PALIGNR PALIGNR_MMX
1170 PRED8x8L_DC mmxext
1171 %define PALIGNR PALIGNR_SSSE3
1172 PRED8x8L_DC ssse3
1173
1174 ;-----------------------------------------------------------------------------
1175 ; void pred8x8l_horizontal(uint8_t *src, int has_topleft, int has_topright, int stride)
1176 ;-----------------------------------------------------------------------------
1177
1178 %macro PRED8x8L_HORIZONTAL 1
1179 cglobal pred8x8l_horizontal_8_%1, 4,4
1180     sub          r0, r3
1181     lea          r2, [r0+r3*2]
1182     movq        mm0, [r0+r3*1-8]
1183     test         r1, r1
1184     lea          r1, [r0+r3]
1185     cmovnz       r1, r0
1186     punpckhbw   mm0, [r1+r3*0-8]
1187     movq        mm1, [r2+r3*1-8]
1188     punpckhbw   mm1, [r0+r3*2-8]
1189     mov          r2, r0
1190     punpckhwd   mm1, mm0
1191     lea          r0, [r0+r3*4]
1192     movq        mm2, [r0+r3*1-8]
1193     punpckhbw   mm2, [r0+r3*0-8]
1194     lea          r0, [r0+r3*2]
1195     movq        mm3, [r0+r3*1-8]
1196     punpckhbw   mm3, [r0+r3*0-8]
1197     punpckhwd   mm3, mm2
1198     punpckhdq   mm3, mm1
1199     lea          r0, [r0+r3*2]
1200     movq        mm0, [r0+r3*0-8]
1201     movq        mm1, [r1+r3*0-8]
1202     mov          r0, r2
1203     movq        mm4, mm3
1204     movq        mm2, mm3
1205     PALIGNR     mm4, mm0, 7, mm0
1206     PALIGNR     mm1, mm2, 1, mm2
1207     movq        mm0, mm4
1208     PRED4x4_LOWPASS mm2, mm1, mm4, mm3, mm5
1209     movq        mm4, mm0
1210     movq        mm7, mm2
1211     PRED4x4_LOWPASS mm1, mm3, mm0, mm4, mm5
1212     psllq       mm1, 56
1213     PALIGNR     mm7, mm1, 7, mm3
1214     movq        mm3, mm7
1215     lea         r1, [r0+r3*2]
1216     movq       mm7, mm3
1217     punpckhbw  mm3, mm3
1218     punpcklbw  mm7, mm7
1219     pshufw     mm0, mm3, 0xff
1220     pshufw     mm1, mm3, 0xaa
1221     lea         r2, [r1+r3*2]
1222     pshufw     mm2, mm3, 0x55
1223     pshufw     mm3, mm3, 0x00
1224     pshufw     mm4, mm7, 0xff
1225     pshufw     mm5, mm7, 0xaa
1226     pshufw     mm6, mm7, 0x55
1227     pshufw     mm7, mm7, 0x00
1228     movq [r0+r3*1], mm0
1229     movq [r0+r3*2], mm1
1230     movq [r1+r3*1], mm2
1231     movq [r1+r3*2], mm3
1232     movq [r2+r3*1], mm4
1233     movq [r2+r3*2], mm5
1234     lea         r0, [r2+r3*2]
1235     movq [r0+r3*1], mm6
1236     movq [r0+r3*2], mm7
1237     RET
1238 %endmacro
1239
1240 INIT_MMX
1241 %define PALIGNR PALIGNR_MMX
1242 PRED8x8L_HORIZONTAL mmxext
1243 %define PALIGNR PALIGNR_SSSE3
1244 PRED8x8L_HORIZONTAL ssse3
1245
1246 ;-----------------------------------------------------------------------------
1247 ; void pred8x8l_vertical(uint8_t *src, int has_topleft, int has_topright, int stride)
1248 ;-----------------------------------------------------------------------------
1249
1250 %macro PRED8x8L_VERTICAL 1
1251 cglobal pred8x8l_vertical_8_%1, 4,4
1252     sub          r0, r3
1253     movq        mm0, [r0-8]
1254     movq        mm3, [r0]
1255     movq        mm1, [r0+8]
1256     movq        mm2, mm3
1257     movq        mm4, mm3
1258     PALIGNR     mm2, mm0, 7, mm0
1259     PALIGNR     mm1, mm4, 1, mm4
1260     test         r1, r1 ; top_left
1261     jz .fix_lt_2
1262     test         r2, r2 ; top_right
1263     jz .fix_tr_1
1264     jmp .body
1265 .fix_lt_2:
1266     movq        mm5, mm3
1267     pxor        mm5, mm2
1268     psllq       mm5, 56
1269     psrlq       mm5, 56
1270     pxor        mm2, mm5
1271     test         r2, r2 ; top_right
1272     jnz .body
1273 .fix_tr_1:
1274     movq        mm5, mm3
1275     pxor        mm5, mm1
1276     psrlq       mm5, 56
1277     psllq       mm5, 56
1278     pxor        mm1, mm5
1279 .body:
1280     PRED4x4_LOWPASS mm0, mm2, mm1, mm3, mm5
1281 %rep 3
1282     movq [r0+r3*1], mm0
1283     movq [r0+r3*2], mm0
1284     lea    r0, [r0+r3*2]
1285 %endrep
1286     movq [r0+r3*1], mm0
1287     movq [r0+r3*2], mm0
1288     RET
1289 %endmacro
1290
1291 INIT_MMX
1292 %define PALIGNR PALIGNR_MMX
1293 PRED8x8L_VERTICAL mmxext
1294 %define PALIGNR PALIGNR_SSSE3
1295 PRED8x8L_VERTICAL ssse3
1296
1297 ;-----------------------------------------------------------------------------
1298 ;void pred8x8l_down_left(uint8_t *src, int has_topleft, int has_topright, int stride)
1299 ;-----------------------------------------------------------------------------
1300
1301 INIT_MMX
1302 %define PALIGNR PALIGNR_MMX
1303 cglobal pred8x8l_down_left_8_mmxext, 4,5
1304     sub          r0, r3
1305     movq        mm0, [r0-8]
1306     movq        mm3, [r0]
1307     movq        mm1, [r0+8]
1308     movq        mm2, mm3
1309     movq        mm4, mm3
1310     PALIGNR     mm2, mm0, 7, mm0
1311     PALIGNR     mm1, mm4, 1, mm4
1312     test         r1, r1
1313     jz .fix_lt_2
1314     test         r2, r2
1315     jz .fix_tr_1
1316     jmp .do_top
1317 .fix_lt_2:
1318     movq        mm5, mm3
1319     pxor        mm5, mm2
1320     psllq       mm5, 56
1321     psrlq       mm5, 56
1322     pxor        mm2, mm5
1323     test         r2, r2
1324     jnz .do_top
1325 .fix_tr_1:
1326     movq        mm5, mm3
1327     pxor        mm5, mm1
1328     psrlq       mm5, 56
1329     psllq       mm5, 56
1330     pxor        mm1, mm5
1331     jmp .do_top
1332 .fix_tr_2:
1333     punpckhbw   mm3, mm3
1334     pshufw      mm1, mm3, 0xFF
1335     jmp .do_topright
1336 .do_top:
1337     PRED4x4_LOWPASS mm4, mm2, mm1, mm3, mm5
1338     movq        mm7, mm4
1339     test         r2, r2
1340     jz .fix_tr_2
1341     movq        mm0, [r0+8]
1342     movq        mm5, mm0
1343     movq        mm2, mm0
1344     movq        mm4, mm0
1345     psrlq       mm5, 56
1346     PALIGNR     mm2, mm3, 7, mm3
1347     PALIGNR     mm5, mm4, 1, mm4
1348     PRED4x4_LOWPASS mm1, mm2, mm5, mm0, mm4
1349 .do_topright:
1350     lea          r1, [r0+r3*2]
1351     movq        mm6, mm1
1352     psrlq       mm1, 56
1353     movq        mm4, mm1
1354     lea          r2, [r1+r3*2]
1355     movq        mm2, mm6
1356     PALIGNR     mm2, mm7, 1, mm0
1357     movq        mm3, mm6
1358     PALIGNR     mm3, mm7, 7, mm0
1359     PALIGNR     mm4, mm6, 1, mm0
1360     movq        mm5, mm7
1361     movq        mm1, mm7
1362     movq        mm7, mm6
1363     lea          r4, [r2+r3*2]
1364     psllq       mm1, 8
1365     PRED4x4_LOWPASS mm0, mm1, mm2, mm5, mm6
1366     PRED4x4_LOWPASS mm1, mm3, mm4, mm7, mm6
1367     movq  [r4+r3*2], mm1
1368     movq        mm2, mm0
1369     psllq       mm1, 8
1370     psrlq       mm2, 56
1371     psllq       mm0, 8
1372     por         mm1, mm2
1373     movq  [r4+r3*1], mm1
1374     movq        mm2, mm0
1375     psllq       mm1, 8
1376     psrlq       mm2, 56
1377     psllq       mm0, 8
1378     por         mm1, mm2
1379     movq  [r2+r3*2], mm1
1380     movq        mm2, mm0
1381     psllq       mm1, 8
1382     psrlq       mm2, 56
1383     psllq       mm0, 8
1384     por         mm1, mm2
1385     movq  [r2+r3*1], mm1
1386     movq        mm2, mm0
1387     psllq       mm1, 8
1388     psrlq       mm2, 56
1389     psllq       mm0, 8
1390     por         mm1, mm2
1391     movq  [r1+r3*2], mm1
1392     movq        mm2, mm0
1393     psllq       mm1, 8
1394     psrlq       mm2, 56
1395     psllq       mm0, 8
1396     por         mm1, mm2
1397     movq  [r1+r3*1], mm1
1398     movq        mm2, mm0
1399     psllq       mm1, 8
1400     psrlq       mm2, 56
1401     psllq       mm0, 8
1402     por         mm1, mm2
1403     movq  [r0+r3*2], mm1
1404     psllq       mm1, 8
1405     psrlq       mm0, 56
1406     por         mm1, mm0
1407     movq  [r0+r3*1], mm1
1408     RET
1409
1410 %macro PRED8x8L_DOWN_LEFT 1
1411 cglobal pred8x8l_down_left_8_%1, 4,4
1412     sub          r0, r3
1413     movq        mm0, [r0-8]
1414     movq        mm3, [r0]
1415     movq        mm1, [r0+8]
1416     movq        mm2, mm3
1417     movq        mm4, mm3
1418     PALIGNR     mm2, mm0, 7, mm0
1419     PALIGNR     mm1, mm4, 1, mm4
1420     test         r1, r1 ; top_left
1421     jz .fix_lt_2
1422     test         r2, r2 ; top_right
1423     jz .fix_tr_1
1424     jmp .do_top
1425 .fix_lt_2:
1426     movq        mm5, mm3
1427     pxor        mm5, mm2
1428     psllq       mm5, 56
1429     psrlq       mm5, 56
1430     pxor        mm2, mm5
1431     test         r2, r2 ; top_right
1432     jnz .do_top
1433 .fix_tr_1:
1434     movq        mm5, mm3
1435     pxor        mm5, mm1
1436     psrlq       mm5, 56
1437     psllq       mm5, 56
1438     pxor        mm1, mm5
1439     jmp .do_top
1440 .fix_tr_2:
1441     punpckhbw   mm3, mm3
1442     pshufw      mm1, mm3, 0xFF
1443     jmp .do_topright
1444 .do_top:
1445     PRED4x4_LOWPASS mm4, mm2, mm1, mm3, mm5
1446     movq2dq    xmm3, mm4
1447     test         r2, r2 ; top_right
1448     jz .fix_tr_2
1449     movq        mm0, [r0+8]
1450     movq        mm5, mm0
1451     movq        mm2, mm0
1452     movq        mm4, mm0
1453     psrlq       mm5, 56
1454     PALIGNR     mm2, mm3, 7, mm3
1455     PALIGNR     mm5, mm4, 1, mm4
1456     PRED4x4_LOWPASS mm1, mm2, mm5, mm0, mm4
1457 .do_topright:
1458     movq2dq    xmm4, mm1
1459     psrlq       mm1, 56
1460     movq2dq    xmm5, mm1
1461     lea         r1, [r0+r3*2]
1462     pslldq    xmm4, 8
1463     por       xmm3, xmm4
1464     movdqa    xmm2, xmm3
1465     psrldq    xmm2, 1
1466     pslldq    xmm5, 15
1467     por       xmm2, xmm5
1468     lea         r2, [r1+r3*2]
1469     movdqa    xmm1, xmm3
1470     pslldq    xmm1, 1
1471 INIT_XMM
1472     PRED4x4_LOWPASS xmm0, xmm1, xmm2, xmm3, xmm4
1473     psrldq    xmm0, 1
1474     movq [r0+r3*1], xmm0
1475     psrldq    xmm0, 1
1476     movq [r0+r3*2], xmm0
1477     psrldq    xmm0, 1
1478     lea         r0, [r2+r3*2]
1479     movq [r1+r3*1], xmm0
1480     psrldq    xmm0, 1
1481     movq [r1+r3*2], xmm0
1482     psrldq    xmm0, 1
1483     movq [r2+r3*1], xmm0
1484     psrldq    xmm0, 1
1485     movq [r2+r3*2], xmm0
1486     psrldq    xmm0, 1
1487     movq [r0+r3*1], xmm0
1488     psrldq    xmm0, 1
1489     movq [r0+r3*2], xmm0
1490     RET
1491 %endmacro
1492
1493 INIT_MMX
1494 %define PALIGNR PALIGNR_MMX
1495 PRED8x8L_DOWN_LEFT sse2
1496 INIT_MMX
1497 %define PALIGNR PALIGNR_SSSE3
1498 PRED8x8L_DOWN_LEFT ssse3
1499
1500 ;-----------------------------------------------------------------------------
1501 ;void pred8x8l_down_right_mmxext(uint8_t *src, int has_topleft, int has_topright, int stride)
1502 ;-----------------------------------------------------------------------------
1503
1504 INIT_MMX
1505 %define PALIGNR PALIGNR_MMX
1506 cglobal pred8x8l_down_right_8_mmxext, 4,5
1507     sub          r0, r3
1508     lea          r4, [r0+r3*2]
1509     movq        mm0, [r0+r3*1-8]
1510     punpckhbw   mm0, [r0+r3*0-8]
1511     movq        mm1, [r4+r3*1-8]
1512     punpckhbw   mm1, [r0+r3*2-8]
1513     mov          r4, r0
1514     punpckhwd   mm1, mm0
1515     lea          r0, [r0+r3*4]
1516     movq        mm2, [r0+r3*1-8]
1517     punpckhbw   mm2, [r0+r3*0-8]
1518     lea          r0, [r0+r3*2]
1519     movq        mm3, [r0+r3*1-8]
1520     punpckhbw   mm3, [r0+r3*0-8]
1521     punpckhwd   mm3, mm2
1522     punpckhdq   mm3, mm1
1523     lea          r0, [r0+r3*2]
1524     movq        mm0, [r0+r3*0-8]
1525     movq        mm1, [r4]
1526     mov          r0, r4
1527     movq        mm4, mm3
1528     movq        mm2, mm3
1529     PALIGNR     mm4, mm0, 7, mm0
1530     PALIGNR     mm1, mm2, 1, mm2
1531     test        r1, r1 ; top_left
1532     jz .fix_lt_1
1533 .do_left:
1534     movq        mm0, mm4
1535     PRED4x4_LOWPASS mm2, mm1, mm4, mm3, mm5
1536     movq        mm4, mm0
1537     movq        mm7, mm2
1538     movq        mm6, mm2
1539     PRED4x4_LOWPASS mm1, mm3, mm0, mm4, mm5
1540     psllq       mm1, 56
1541     PALIGNR     mm7, mm1, 7, mm3
1542     movq        mm0, [r0-8]
1543     movq        mm3, [r0]
1544     movq        mm1, [r0+8]
1545     movq        mm2, mm3
1546     movq        mm4, mm3
1547     PALIGNR     mm2, mm0, 7, mm0
1548     PALIGNR     mm1, mm4, 1, mm4
1549     test         r1, r1 ; top_left
1550     jz .fix_lt_2
1551     test         r2, r2 ; top_right
1552     jz .fix_tr_1
1553 .do_top:
1554     PRED4x4_LOWPASS mm4, mm2, mm1, mm3, mm5
1555     movq        mm5, mm4
1556     jmp .body
1557 .fix_lt_1:
1558     movq        mm5, mm3
1559     pxor        mm5, mm4
1560     psrlq       mm5, 56
1561     psllq       mm5, 48
1562     pxor        mm1, mm5
1563     jmp .do_left
1564 .fix_lt_2:
1565     movq        mm5, mm3
1566     pxor        mm5, mm2
1567     psllq       mm5, 56
1568     psrlq       mm5, 56
1569     pxor        mm2, mm5
1570     test         r2, r2 ; top_right
1571     jnz .do_top
1572 .fix_tr_1:
1573     movq        mm5, mm3
1574     pxor        mm5, mm1
1575     psrlq       mm5, 56
1576     psllq       mm5, 56
1577     pxor        mm1, mm5
1578     jmp .do_top
1579 .body:
1580     lea         r1, [r0+r3*2]
1581     movq       mm1, mm7
1582     movq       mm7, mm5
1583     movq       mm5, mm6
1584     movq       mm2, mm7
1585     lea         r2, [r1+r3*2]
1586     PALIGNR    mm2, mm6, 1, mm0
1587     movq       mm3, mm7
1588     PALIGNR    mm3, mm6, 7, mm0
1589     movq       mm4, mm7
1590     lea         r4, [r2+r3*2]
1591     psrlq      mm4, 8
1592     PRED4x4_LOWPASS mm0, mm1, mm2, mm5, mm6
1593     PRED4x4_LOWPASS mm1, mm3, mm4, mm7, mm6
1594     movq [r4+r3*2], mm0
1595     movq       mm2, mm1
1596     psrlq      mm0, 8
1597     psllq      mm2, 56
1598     psrlq      mm1, 8
1599     por        mm0, mm2
1600     movq [r4+r3*1], mm0
1601     movq       mm2, mm1
1602     psrlq      mm0, 8
1603     psllq      mm2, 56
1604     psrlq      mm1, 8
1605     por        mm0, mm2
1606     movq [r2+r3*2], mm0
1607     movq       mm2, mm1
1608     psrlq      mm0, 8
1609     psllq      mm2, 56
1610     psrlq      mm1, 8
1611     por        mm0, mm2
1612     movq [r2+r3*1], mm0
1613     movq       mm2, mm1
1614     psrlq      mm0, 8
1615     psllq      mm2, 56
1616     psrlq      mm1, 8
1617     por        mm0, mm2
1618     movq [r1+r3*2], mm0
1619     movq       mm2, mm1
1620     psrlq      mm0, 8
1621     psllq      mm2, 56
1622     psrlq      mm1, 8
1623     por        mm0, mm2
1624     movq [r1+r3*1], mm0
1625     movq       mm2, mm1
1626     psrlq      mm0, 8
1627     psllq      mm2, 56
1628     psrlq      mm1, 8
1629     por        mm0, mm2
1630     movq [r0+r3*2], mm0
1631     psrlq      mm0, 8
1632     psllq      mm1, 56
1633     por        mm0, mm1
1634     movq [r0+r3*1], mm0
1635     RET
1636
1637 %macro PRED8x8L_DOWN_RIGHT 1
1638 cglobal pred8x8l_down_right_8_%1, 4,5
1639     sub          r0, r3
1640     lea          r4, [r0+r3*2]
1641     movq        mm0, [r0+r3*1-8]
1642     punpckhbw   mm0, [r0+r3*0-8]
1643     movq        mm1, [r4+r3*1-8]
1644     punpckhbw   mm1, [r0+r3*2-8]
1645     mov          r4, r0
1646     punpckhwd   mm1, mm0
1647     lea          r0, [r0+r3*4]
1648     movq        mm2, [r0+r3*1-8]
1649     punpckhbw   mm2, [r0+r3*0-8]
1650     lea          r0, [r0+r3*2]
1651     movq        mm3, [r0+r3*1-8]
1652     punpckhbw   mm3, [r0+r3*0-8]
1653     punpckhwd   mm3, mm2
1654     punpckhdq   mm3, mm1
1655     lea          r0, [r0+r3*2]
1656     movq        mm0, [r0+r3*0-8]
1657     movq        mm1, [r4]
1658     mov          r0, r4
1659     movq        mm4, mm3
1660     movq        mm2, mm3
1661     PALIGNR     mm4, mm0, 7, mm0
1662     PALIGNR     mm1, mm2, 1, mm2
1663     test        r1, r1
1664     jz .fix_lt_1
1665     jmp .do_left
1666 .fix_lt_1:
1667     movq        mm5, mm3
1668     pxor        mm5, mm4
1669     psrlq       mm5, 56
1670     psllq       mm5, 48
1671     pxor        mm1, mm5
1672     jmp .do_left
1673 .fix_lt_2:
1674     movq        mm5, mm3
1675     pxor        mm5, mm2
1676     psllq       mm5, 56
1677     psrlq       mm5, 56
1678     pxor        mm2, mm5
1679     test         r2, r2
1680     jnz .do_top
1681 .fix_tr_1:
1682     movq        mm5, mm3
1683     pxor        mm5, mm1
1684     psrlq       mm5, 56
1685     psllq       mm5, 56
1686     pxor        mm1, mm5
1687     jmp .do_top
1688 .do_left:
1689     movq        mm0, mm4
1690     PRED4x4_LOWPASS mm2, mm1, mm4, mm3, mm5
1691     movq        mm4, mm0
1692     movq        mm7, mm2
1693     movq2dq    xmm3, mm2
1694     PRED4x4_LOWPASS mm1, mm3, mm0, mm4, mm5
1695     psllq       mm1, 56
1696     PALIGNR     mm7, mm1, 7, mm3
1697     movq2dq    xmm1, mm7
1698     movq        mm0, [r0-8]
1699     movq        mm3, [r0]
1700     movq        mm1, [r0+8]
1701     movq        mm2, mm3
1702     movq        mm4, mm3
1703     PALIGNR     mm2, mm0, 7, mm0
1704     PALIGNR     mm1, mm4, 1, mm4
1705     test         r1, r1
1706     jz .fix_lt_2
1707     test         r2, r2
1708     jz .fix_tr_1
1709 .do_top:
1710     PRED4x4_LOWPASS mm4, mm2, mm1, mm3, mm5
1711     movq2dq   xmm4, mm4
1712     lea         r1, [r0+r3*2]
1713     movdqa    xmm0, xmm3
1714     pslldq    xmm4, 8
1715     por       xmm3, xmm4
1716     lea         r2, [r1+r3*2]
1717     pslldq    xmm4, 1
1718     por       xmm1, xmm4
1719     psrldq    xmm0, 7
1720     pslldq    xmm0, 15
1721     psrldq    xmm0, 7
1722     por       xmm1, xmm0
1723     lea         r0, [r2+r3*2]
1724     movdqa    xmm2, xmm3
1725     psrldq    xmm2, 1
1726 INIT_XMM
1727     PRED4x4_LOWPASS xmm0, xmm1, xmm2, xmm3, xmm4
1728     movdqa    xmm1, xmm0
1729     psrldq    xmm1, 1
1730     movq [r0+r3*2], xmm0
1731     movq [r0+r3*1], xmm1
1732     psrldq    xmm0, 2
1733     psrldq    xmm1, 2
1734     movq [r2+r3*2], xmm0
1735     movq [r2+r3*1], xmm1
1736     psrldq    xmm0, 2
1737     psrldq    xmm1, 2
1738     movq [r1+r3*2], xmm0
1739     movq [r1+r3*1], xmm1
1740     psrldq    xmm0, 2
1741     psrldq    xmm1, 2
1742     movq [r4+r3*2], xmm0
1743     movq [r4+r3*1], xmm1
1744     RET
1745 %endmacro
1746
1747 INIT_MMX
1748 %define PALIGNR PALIGNR_MMX
1749 PRED8x8L_DOWN_RIGHT sse2
1750 INIT_MMX
1751 %define PALIGNR PALIGNR_SSSE3
1752 PRED8x8L_DOWN_RIGHT ssse3
1753
1754 ;-----------------------------------------------------------------------------
1755 ; void pred8x8l_vertical_right(uint8_t *src, int has_topleft, int has_topright, int stride)
1756 ;-----------------------------------------------------------------------------
1757
1758 INIT_MMX
1759 %define PALIGNR PALIGNR_MMX
1760 cglobal pred8x8l_vertical_right_8_mmxext, 4,5
1761     sub          r0, r3
1762     lea          r4, [r0+r3*2]
1763     movq        mm0, [r0+r3*1-8]
1764     punpckhbw   mm0, [r0+r3*0-8]
1765     movq        mm1, [r4+r3*1-8]
1766     punpckhbw   mm1, [r0+r3*2-8]
1767     mov          r4, r0
1768     punpckhwd   mm1, mm0
1769     lea          r0, [r0+r3*4]
1770     movq        mm2, [r0+r3*1-8]
1771     punpckhbw   mm2, [r0+r3*0-8]
1772     lea          r0, [r0+r3*2]
1773     movq        mm3, [r0+r3*1-8]
1774     punpckhbw   mm3, [r0+r3*0-8]
1775     punpckhwd   mm3, mm2
1776     punpckhdq   mm3, mm1
1777     lea          r0, [r0+r3*2]
1778     movq        mm0, [r0+r3*0-8]
1779     movq        mm1, [r4]
1780     mov          r0, r4
1781     movq        mm4, mm3
1782     movq        mm2, mm3
1783     PALIGNR     mm4, mm0, 7, mm0
1784     PALIGNR     mm1, mm2, 1, mm2
1785     test        r1, r1
1786     jz .fix_lt_1
1787     jmp .do_left
1788 .fix_lt_1:
1789     movq        mm5, mm3
1790     pxor        mm5, mm4
1791     psrlq       mm5, 56
1792     psllq       mm5, 48
1793     pxor        mm1, mm5
1794     jmp .do_left
1795 .fix_lt_2:
1796     movq        mm5, mm3
1797     pxor        mm5, mm2
1798     psllq       mm5, 56
1799     psrlq       mm5, 56
1800     pxor        mm2, mm5
1801     test         r2, r2
1802     jnz .do_top
1803 .fix_tr_1:
1804     movq        mm5, mm3
1805     pxor        mm5, mm1
1806     psrlq       mm5, 56
1807     psllq       mm5, 56
1808     pxor        mm1, mm5
1809     jmp .do_top
1810 .do_left:
1811     movq        mm0, mm4
1812     PRED4x4_LOWPASS mm2, mm1, mm4, mm3, mm5
1813     movq        mm7, mm2
1814     movq        mm0, [r0-8]
1815     movq        mm3, [r0]
1816     movq        mm1, [r0+8]
1817     movq        mm2, mm3
1818     movq        mm4, mm3
1819     PALIGNR     mm2, mm0, 7, mm0
1820     PALIGNR     mm1, mm4, 1, mm4
1821     test         r1, r1
1822     jz .fix_lt_2
1823     test         r2, r2
1824     jz .fix_tr_1
1825 .do_top:
1826     PRED4x4_LOWPASS mm6, mm2, mm1, mm3, mm5
1827     lea         r1, [r0+r3*2]
1828     movq       mm2, mm6
1829     movq       mm3, mm6
1830     PALIGNR    mm3, mm7, 7, mm0
1831     PALIGNR    mm6, mm7, 6, mm1
1832     movq       mm4, mm3
1833     pavgb      mm3, mm2
1834     lea         r2, [r1+r3*2]
1835     PRED4x4_LOWPASS mm0, mm6, mm2, mm4, mm5
1836     movq [r0+r3*1], mm3
1837     movq [r0+r3*2], mm0
1838     movq       mm5, mm0
1839     movq       mm6, mm3
1840     movq       mm1, mm7
1841     movq       mm2, mm1
1842     psllq      mm2, 8
1843     movq       mm3, mm1
1844     psllq      mm3, 16
1845     lea         r4, [r2+r3*2]
1846     PRED4x4_LOWPASS mm0, mm1, mm3, mm2, mm4
1847     PALIGNR    mm6, mm0, 7, mm2
1848     movq [r1+r3*1], mm6
1849     psllq      mm0, 8
1850     PALIGNR    mm5, mm0, 7, mm1
1851     movq [r1+r3*2], mm5
1852     psllq      mm0, 8
1853     PALIGNR    mm6, mm0, 7, mm2
1854     movq [r2+r3*1], mm6
1855     psllq      mm0, 8
1856     PALIGNR    mm5, mm0, 7, mm1
1857     movq [r2+r3*2], mm5
1858     psllq      mm0, 8
1859     PALIGNR    mm6, mm0, 7, mm2
1860     movq [r4+r3*1], mm6
1861     psllq      mm0, 8
1862     PALIGNR    mm5, mm0, 7, mm1
1863     movq [r4+r3*2], mm5
1864     RET
1865
1866 %macro PRED8x8L_VERTICAL_RIGHT 1
1867 cglobal pred8x8l_vertical_right_8_%1, 4,5,7
1868     ; manually spill XMM registers for Win64 because
1869     ; the code here is initialized with INIT_MMX
1870     WIN64_SPILL_XMM 7
1871     sub          r0, r3
1872     lea          r4, [r0+r3*2]
1873     movq        mm0, [r0+r3*1-8]
1874     punpckhbw   mm0, [r0+r3*0-8]
1875     movq        mm1, [r4+r3*1-8]
1876     punpckhbw   mm1, [r0+r3*2-8]
1877     mov          r4, r0
1878     punpckhwd   mm1, mm0
1879     lea          r0, [r0+r3*4]
1880     movq        mm2, [r0+r3*1-8]
1881     punpckhbw   mm2, [r0+r3*0-8]
1882     lea          r0, [r0+r3*2]
1883     movq        mm3, [r0+r3*1-8]
1884     punpckhbw   mm3, [r0+r3*0-8]
1885     punpckhwd   mm3, mm2
1886     punpckhdq   mm3, mm1
1887     lea          r0, [r0+r3*2]
1888     movq        mm0, [r0+r3*0-8]
1889     movq        mm1, [r4]
1890     mov          r0, r4
1891     movq        mm4, mm3
1892     movq        mm2, mm3
1893     PALIGNR     mm4, mm0, 7, mm0
1894     PALIGNR     mm1, mm2, 1, mm2
1895     test        r1, r1
1896     jnz .do_left
1897 .fix_lt_1:
1898     movq        mm5, mm3
1899     pxor        mm5, mm4
1900     psrlq       mm5, 56
1901     psllq       mm5, 48
1902     pxor        mm1, mm5
1903     jmp .do_left
1904 .fix_lt_2:
1905     movq        mm5, mm3
1906     pxor        mm5, mm2
1907     psllq       mm5, 56
1908     psrlq       mm5, 56
1909     pxor        mm2, mm5
1910     test         r2, r2
1911     jnz .do_top
1912 .fix_tr_1:
1913     movq        mm5, mm3
1914     pxor        mm5, mm1
1915     psrlq       mm5, 56
1916     psllq       mm5, 56
1917     pxor        mm1, mm5
1918     jmp .do_top
1919 .do_left:
1920     movq        mm0, mm4
1921     PRED4x4_LOWPASS mm2, mm1, mm4, mm3, mm5
1922     movq2dq    xmm0, mm2
1923     movq        mm0, [r0-8]
1924     movq        mm3, [r0]
1925     movq        mm1, [r0+8]
1926     movq        mm2, mm3
1927     movq        mm4, mm3
1928     PALIGNR     mm2, mm0, 7, mm0
1929     PALIGNR     mm1, mm4, 1, mm4
1930     test         r1, r1
1931     jz .fix_lt_2
1932     test         r2, r2
1933     jz .fix_tr_1
1934 .do_top:
1935     PRED4x4_LOWPASS mm6, mm2, mm1, mm3, mm5
1936     lea           r1, [r0+r3*2]
1937     movq2dq     xmm4, mm6
1938     pslldq      xmm4, 8
1939     por         xmm0, xmm4
1940     movdqa      xmm6, [pw_ff00]
1941     movdqa      xmm1, xmm0
1942     lea           r2, [r1+r3*2]
1943     movdqa      xmm2, xmm0
1944     movdqa      xmm3, xmm0
1945     pslldq      xmm0, 1
1946     pslldq      xmm1, 2
1947     pavgb       xmm2, xmm0
1948 INIT_XMM
1949     PRED4x4_LOWPASS xmm4, xmm3, xmm1, xmm0, xmm5
1950     pandn       xmm6, xmm4
1951     movdqa      xmm5, xmm4
1952     psrlw       xmm4, 8
1953     packuswb    xmm6, xmm4
1954     movhlps     xmm4, xmm6
1955     movhps [r0+r3*2], xmm5
1956     movhps [r0+r3*1], xmm2
1957     psrldq      xmm5, 4
1958     movss       xmm5, xmm6
1959     psrldq      xmm2, 4
1960     movss       xmm2, xmm4
1961     lea           r0, [r2+r3*2]
1962     psrldq      xmm5, 1
1963     psrldq      xmm2, 1
1964     movq        [r0+r3*2], xmm5
1965     movq        [r0+r3*1], xmm2
1966     psrldq      xmm5, 1
1967     psrldq      xmm2, 1
1968     movq        [r2+r3*2], xmm5
1969     movq        [r2+r3*1], xmm2
1970     psrldq      xmm5, 1
1971     psrldq      xmm2, 1
1972     movq        [r1+r3*2], xmm5
1973     movq        [r1+r3*1], xmm2
1974     RET
1975 %endmacro
1976
1977 INIT_MMX
1978 %define PALIGNR PALIGNR_MMX
1979 PRED8x8L_VERTICAL_RIGHT sse2
1980 INIT_MMX
1981 %define PALIGNR PALIGNR_SSSE3
1982 PRED8x8L_VERTICAL_RIGHT ssse3
1983
1984 ;-----------------------------------------------------------------------------
1985 ;void pred8x8l_vertical_left(uint8_t *src, int has_topleft, int has_topright, int stride)
1986 ;-----------------------------------------------------------------------------
1987
1988 %macro PRED8x8L_VERTICAL_LEFT 1
1989 cglobal pred8x8l_vertical_left_8_%1, 4,4
1990     sub          r0, r3
1991     movq        mm0, [r0-8]
1992     movq        mm3, [r0]
1993     movq        mm1, [r0+8]
1994     movq        mm2, mm3
1995     movq        mm4, mm3
1996     PALIGNR     mm2, mm0, 7, mm0
1997     PALIGNR     mm1, mm4, 1, mm4
1998     test         r1, r1
1999     jz .fix_lt_2
2000     test         r2, r2
2001     jz .fix_tr_1
2002     jmp .do_top
2003 .fix_lt_2:
2004     movq        mm5, mm3
2005     pxor        mm5, mm2
2006     psllq       mm5, 56
2007     psrlq       mm5, 56
2008     pxor        mm2, mm5
2009     test         r2, r2
2010     jnz .do_top
2011 .fix_tr_1:
2012     movq        mm5, mm3
2013     pxor        mm5, mm1
2014     psrlq       mm5, 56
2015     psllq       mm5, 56
2016     pxor        mm1, mm5
2017     jmp .do_top
2018 .fix_tr_2:
2019     punpckhbw   mm3, mm3
2020     pshufw      mm1, mm3, 0xFF
2021     jmp .do_topright
2022 .do_top:
2023     PRED4x4_LOWPASS mm4, mm2, mm1, mm3, mm5
2024     movq2dq    xmm4, mm4
2025     test         r2, r2
2026     jz .fix_tr_2
2027     movq        mm0, [r0+8]
2028     movq        mm5, mm0
2029     movq        mm2, mm0
2030     movq        mm4, mm0
2031     psrlq       mm5, 56
2032     PALIGNR     mm2, mm3, 7, mm3
2033     PALIGNR     mm5, mm4, 1, mm4
2034     PRED4x4_LOWPASS mm1, mm2, mm5, mm0, mm4
2035 .do_topright:
2036     movq2dq   xmm3, mm1
2037     lea         r1, [r0+r3*2]
2038     pslldq    xmm3, 8
2039     por       xmm4, xmm3
2040     movdqa    xmm2, xmm4
2041     movdqa    xmm1, xmm4
2042     movdqa    xmm3, xmm4
2043     psrldq    xmm2, 1
2044     pslldq    xmm1, 1
2045     pavgb     xmm3, xmm2
2046     lea         r2, [r1+r3*2]
2047 INIT_XMM
2048     PRED4x4_LOWPASS xmm0, xmm1, xmm2, xmm4, xmm5
2049     psrldq    xmm0, 1
2050     movq [r0+r3*1], xmm3
2051     movq [r0+r3*2], xmm0
2052     lea         r0, [r2+r3*2]
2053     psrldq    xmm3, 1
2054     psrldq    xmm0, 1
2055     movq [r1+r3*1], xmm3
2056     movq [r1+r3*2], xmm0
2057     psrldq    xmm3, 1
2058     psrldq    xmm0, 1
2059     movq [r2+r3*1], xmm3
2060     movq [r2+r3*2], xmm0
2061     psrldq    xmm3, 1
2062     psrldq    xmm0, 1
2063     movq [r0+r3*1], xmm3
2064     movq [r0+r3*2], xmm0
2065     RET
2066 %endmacro
2067
2068 INIT_MMX
2069 %define PALIGNR PALIGNR_MMX
2070 PRED8x8L_VERTICAL_LEFT sse2
2071 %define PALIGNR PALIGNR_SSSE3
2072 INIT_MMX
2073 PRED8x8L_VERTICAL_LEFT ssse3
2074
2075 ;-----------------------------------------------------------------------------
2076 ; void pred8x8l_horizontal_up(uint8_t *src, int has_topleft, int has_topright, int stride)
2077 ;-----------------------------------------------------------------------------
2078
2079 %macro PRED8x8L_HORIZONTAL_UP 1
2080 cglobal pred8x8l_horizontal_up_8_%1, 4,4
2081     sub          r0, r3
2082     lea          r2, [r0+r3*2]
2083     movq        mm0, [r0+r3*1-8]
2084     test         r1, r1
2085     lea          r1, [r0+r3]
2086     cmovnz       r1, r0
2087     punpckhbw   mm0, [r1+r3*0-8]
2088     movq        mm1, [r2+r3*1-8]
2089     punpckhbw   mm1, [r0+r3*2-8]
2090     mov          r2, r0
2091     punpckhwd   mm1, mm0
2092     lea          r0, [r0+r3*4]
2093     movq        mm2, [r0+r3*1-8]
2094     punpckhbw   mm2, [r0+r3*0-8]
2095     lea          r0, [r0+r3*2]
2096     movq        mm3, [r0+r3*1-8]
2097     punpckhbw   mm3, [r0+r3*0-8]
2098     punpckhwd   mm3, mm2
2099     punpckhdq   mm3, mm1
2100     lea          r0, [r0+r3*2]
2101     movq        mm0, [r0+r3*0-8]
2102     movq        mm1, [r1+r3*0-8]
2103     mov          r0, r2
2104     movq        mm4, mm3
2105     movq        mm2, mm3
2106     PALIGNR     mm4, mm0, 7, mm0
2107     PALIGNR     mm1, mm2, 1, mm2
2108     movq       mm0, mm4
2109     PRED4x4_LOWPASS mm2, mm1, mm4, mm3, mm5
2110     movq       mm4, mm0
2111     movq       mm7, mm2
2112     PRED4x4_LOWPASS mm1, mm3, mm0, mm4, mm5
2113     psllq      mm1, 56
2114     PALIGNR    mm7, mm1, 7, mm3
2115     lea         r1, [r0+r3*2]
2116     pshufw     mm0, mm7, 00011011b ; l6 l7 l4 l5 l2 l3 l0 l1
2117     psllq      mm7, 56             ; l7 .. .. .. .. .. .. ..
2118     movq       mm2, mm0
2119     psllw      mm0, 8
2120     psrlw      mm2, 8
2121     por        mm2, mm0            ; l7 l6 l5 l4 l3 l2 l1 l0
2122     movq       mm3, mm2
2123     movq       mm4, mm2
2124     movq       mm5, mm2
2125     psrlq      mm2, 8
2126     psrlq      mm3, 16
2127     lea         r2, [r1+r3*2]
2128     por        mm2, mm7            ; l7 l7 l6 l5 l4 l3 l2 l1
2129     punpckhbw  mm7, mm7
2130     por        mm3, mm7            ; l7 l7 l7 l6 l5 l4 l3 l2
2131     pavgb      mm4, mm2
2132     PRED4x4_LOWPASS mm1, mm3, mm5, mm2, mm6
2133     movq       mm5, mm4
2134     punpcklbw  mm4, mm1            ; p4 p3 p2 p1
2135     punpckhbw  mm5, mm1            ; p8 p7 p6 p5
2136     movq       mm6, mm5
2137     movq       mm7, mm5
2138     movq       mm0, mm5
2139     PALIGNR    mm5, mm4, 2, mm1
2140     pshufw     mm1, mm6, 11111001b
2141     PALIGNR    mm6, mm4, 4, mm2
2142     pshufw     mm2, mm7, 11111110b
2143     PALIGNR    mm7, mm4, 6, mm3
2144     pshufw     mm3, mm0, 11111111b
2145     movq [r0+r3*1], mm4
2146     movq [r0+r3*2], mm5
2147     lea         r0, [r2+r3*2]
2148     movq [r1+r3*1], mm6
2149     movq [r1+r3*2], mm7
2150     movq [r2+r3*1], mm0
2151     movq [r2+r3*2], mm1
2152     movq [r0+r3*1], mm2
2153     movq [r0+r3*2], mm3
2154     RET
2155 %endmacro
2156
2157 INIT_MMX
2158 %define PALIGNR PALIGNR_MMX
2159 PRED8x8L_HORIZONTAL_UP mmxext
2160 %define PALIGNR PALIGNR_SSSE3
2161 PRED8x8L_HORIZONTAL_UP ssse3
2162
2163 ;-----------------------------------------------------------------------------
2164 ;void pred8x8l_horizontal_down(uint8_t *src, int has_topleft, int has_topright, int stride)
2165 ;-----------------------------------------------------------------------------
2166
2167 INIT_MMX
2168 %define PALIGNR PALIGNR_MMX
2169 cglobal pred8x8l_horizontal_down_8_mmxext, 4,5
2170     sub          r0, r3
2171     lea          r4, [r0+r3*2]
2172     movq        mm0, [r0+r3*1-8]
2173     punpckhbw   mm0, [r0+r3*0-8]
2174     movq        mm1, [r4+r3*1-8]
2175     punpckhbw   mm1, [r0+r3*2-8]
2176     mov          r4, r0
2177     punpckhwd   mm1, mm0
2178     lea          r0, [r0+r3*4]
2179     movq        mm2, [r0+r3*1-8]
2180     punpckhbw   mm2, [r0+r3*0-8]
2181     lea          r0, [r0+r3*2]
2182     movq        mm3, [r0+r3*1-8]
2183     punpckhbw   mm3, [r0+r3*0-8]
2184     punpckhwd   mm3, mm2
2185     punpckhdq   mm3, mm1
2186     lea          r0, [r0+r3*2]
2187     movq        mm0, [r0+r3*0-8]
2188     movq        mm1, [r4]
2189     mov          r0, r4
2190     movq        mm4, mm3
2191     movq        mm2, mm3
2192     PALIGNR     mm4, mm0, 7, mm0
2193     PALIGNR     mm1, mm2, 1, mm2
2194     test        r1, r1
2195     jnz .do_left
2196 .fix_lt_1:
2197     movq        mm5, mm3
2198     pxor        mm5, mm4
2199     psrlq       mm5, 56
2200     psllq       mm5, 48
2201     pxor        mm1, mm5
2202     jmp .do_left
2203 .fix_lt_2:
2204     movq        mm5, mm3
2205     pxor        mm5, mm2
2206     psllq       mm5, 56
2207     psrlq       mm5, 56
2208     pxor        mm2, mm5
2209     test         r2, r2
2210     jnz .do_top
2211 .fix_tr_1:
2212     movq        mm5, mm3
2213     pxor        mm5, mm1
2214     psrlq       mm5, 56
2215     psllq       mm5, 56
2216     pxor        mm1, mm5
2217     jmp .do_top
2218 .do_left:
2219     movq        mm0, mm4
2220     PRED4x4_LOWPASS mm2, mm1, mm4, mm3, mm5
2221     movq        mm4, mm0
2222     movq        mm7, mm2
2223     movq        mm6, mm2
2224     PRED4x4_LOWPASS mm1, mm3, mm0, mm4, mm5
2225     psllq       mm1, 56
2226     PALIGNR     mm7, mm1, 7, mm3
2227     movq        mm0, [r0-8]
2228     movq        mm3, [r0]
2229     movq        mm1, [r0+8]
2230     movq        mm2, mm3
2231     movq        mm4, mm3
2232     PALIGNR     mm2, mm0, 7, mm0
2233     PALIGNR     mm1, mm4, 1, mm4
2234     test         r1, r1
2235     jz .fix_lt_2
2236     test         r2, r2
2237     jz .fix_tr_1
2238 .do_top:
2239     PRED4x4_LOWPASS mm4, mm2, mm1, mm3, mm5
2240     movq       mm5, mm4
2241     lea         r1, [r0+r3*2]
2242     psllq      mm7, 56
2243     movq       mm2, mm5
2244     movq       mm3, mm6
2245     movq       mm4, mm2
2246     PALIGNR    mm2, mm6, 7, mm5
2247     PALIGNR    mm6, mm7, 7, mm0
2248     lea         r2, [r1+r3*2]
2249     PALIGNR    mm4, mm3, 1, mm7
2250     movq       mm5, mm3
2251     pavgb      mm3, mm6
2252     PRED4x4_LOWPASS mm0, mm4, mm6, mm5, mm7
2253     movq       mm4, mm2
2254     movq       mm1, mm2
2255     lea         r4, [r2+r3*2]
2256     psrlq      mm4, 16
2257     psrlq      mm1, 8
2258     PRED4x4_LOWPASS mm6, mm4, mm2, mm1, mm5
2259     movq       mm7, mm3
2260     punpcklbw  mm3, mm0
2261     punpckhbw  mm7, mm0
2262     movq       mm1, mm7
2263     movq       mm0, mm7
2264     movq       mm4, mm7
2265     movq [r4+r3*2], mm3
2266     PALIGNR    mm7, mm3, 2, mm5
2267     movq [r4+r3*1], mm7
2268     PALIGNR    mm1, mm3, 4, mm5
2269     movq [r2+r3*2], mm1
2270     PALIGNR    mm0, mm3, 6, mm3
2271     movq [r2+r3*1], mm0
2272     movq       mm2, mm6
2273     movq       mm3, mm6
2274     movq [r1+r3*2], mm4
2275     PALIGNR    mm6, mm4, 2, mm5
2276     movq [r1+r3*1], mm6
2277     PALIGNR    mm2, mm4, 4, mm5
2278     movq [r0+r3*2], mm2
2279     PALIGNR    mm3, mm4, 6, mm4
2280     movq [r0+r3*1], mm3
2281     RET
2282
2283 %macro PRED8x8L_HORIZONTAL_DOWN 1
2284 cglobal pred8x8l_horizontal_down_8_%1, 4,5
2285     sub          r0, r3
2286     lea          r4, [r0+r3*2]
2287     movq        mm0, [r0+r3*1-8]
2288     punpckhbw   mm0, [r0+r3*0-8]
2289     movq        mm1, [r4+r3*1-8]
2290     punpckhbw   mm1, [r0+r3*2-8]
2291     mov          r4, r0
2292     punpckhwd   mm1, mm0
2293     lea          r0, [r0+r3*4]
2294     movq        mm2, [r0+r3*1-8]
2295     punpckhbw   mm2, [r0+r3*0-8]
2296     lea          r0, [r0+r3*2]
2297     movq        mm3, [r0+r3*1-8]
2298     punpckhbw   mm3, [r0+r3*0-8]
2299     punpckhwd   mm3, mm2
2300     punpckhdq   mm3, mm1
2301     lea          r0, [r0+r3*2]
2302     movq        mm0, [r0+r3*0-8]
2303     movq        mm1, [r4]
2304     mov          r0, r4
2305     movq        mm4, mm3
2306     movq        mm2, mm3
2307     PALIGNR     mm4, mm0, 7, mm0
2308     PALIGNR     mm1, mm2, 1, mm2
2309     test        r1, r1
2310     jnz .do_left
2311 .fix_lt_1:
2312     movq        mm5, mm3
2313     pxor        mm5, mm4
2314     psrlq       mm5, 56
2315     psllq       mm5, 48
2316     pxor        mm1, mm5
2317     jmp .do_left
2318 .fix_lt_2:
2319     movq        mm5, mm3
2320     pxor        mm5, mm2
2321     psllq       mm5, 56
2322     psrlq       mm5, 56
2323     pxor        mm2, mm5
2324     test         r2, r2
2325     jnz .do_top
2326 .fix_tr_1:
2327     movq        mm5, mm3
2328     pxor        mm5, mm1
2329     psrlq       mm5, 56
2330     psllq       mm5, 56
2331     pxor        mm1, mm5
2332     jmp .do_top
2333 .fix_tr_2:
2334     punpckhbw   mm3, mm3
2335     pshufw      mm1, mm3, 0xFF
2336     jmp .do_topright
2337 .do_left:
2338     movq        mm0, mm4
2339     PRED4x4_LOWPASS mm2, mm1, mm4, mm3, mm5
2340     movq2dq    xmm0, mm2
2341     pslldq     xmm0, 8
2342     movq        mm4, mm0
2343     PRED4x4_LOWPASS mm1, mm3, mm0, mm4, mm5
2344     movq2dq    xmm2, mm1
2345     pslldq     xmm2, 15
2346     psrldq     xmm2, 8
2347     por        xmm0, xmm2
2348     movq        mm0, [r0-8]
2349     movq        mm3, [r0]
2350     movq        mm1, [r0+8]
2351     movq        mm2, mm3
2352     movq        mm4, mm3
2353     PALIGNR     mm2, mm0, 7, mm0
2354     PALIGNR     mm1, mm4, 1, mm4
2355     test         r1, r1
2356     jz .fix_lt_2
2357     test         r2, r2
2358     jz .fix_tr_1
2359 .do_top:
2360     PRED4x4_LOWPASS mm4, mm2, mm1, mm3, mm5
2361     movq2dq    xmm1, mm4
2362     test         r2, r2
2363     jz .fix_tr_2
2364     movq        mm0, [r0+8]
2365     movq        mm5, mm0
2366     movq        mm2, mm0
2367     movq        mm4, mm0
2368     psrlq       mm5, 56
2369     PALIGNR     mm2, mm3, 7, mm3
2370     PALIGNR     mm5, mm4, 1, mm4
2371     PRED4x4_LOWPASS mm1, mm2, mm5, mm0, mm4
2372 .do_topright:
2373     movq2dq    xmm5, mm1
2374     pslldq     xmm5, 8
2375     por        xmm1, xmm5
2376 INIT_XMM
2377     lea         r2, [r4+r3*2]
2378     movdqa    xmm2, xmm1
2379     movdqa    xmm3, xmm1
2380     PALIGNR   xmm1, xmm0, 7, xmm4
2381     PALIGNR   xmm2, xmm0, 9, xmm5
2382     lea         r1, [r2+r3*2]
2383     PALIGNR   xmm3, xmm0, 8, xmm0
2384     movdqa    xmm4, xmm1
2385     pavgb     xmm4, xmm3
2386     lea         r0, [r1+r3*2]
2387     PRED4x4_LOWPASS xmm0, xmm1, xmm2, xmm3, xmm5
2388     punpcklbw xmm4, xmm0
2389     movhlps   xmm0, xmm4
2390     movq   [r0+r3*2], xmm4
2391     movq   [r2+r3*2], xmm0
2392     psrldq xmm4, 2
2393     psrldq xmm0, 2
2394     movq   [r0+r3*1], xmm4
2395     movq   [r2+r3*1], xmm0
2396     psrldq xmm4, 2
2397     psrldq xmm0, 2
2398     movq   [r1+r3*2], xmm4
2399     movq   [r4+r3*2], xmm0
2400     psrldq xmm4, 2
2401     psrldq xmm0, 2
2402     movq   [r1+r3*1], xmm4
2403     movq   [r4+r3*1], xmm0
2404     RET
2405 %endmacro
2406
2407 INIT_MMX
2408 %define PALIGNR PALIGNR_MMX
2409 PRED8x8L_HORIZONTAL_DOWN sse2
2410 INIT_MMX
2411 %define PALIGNR PALIGNR_SSSE3
2412 PRED8x8L_HORIZONTAL_DOWN ssse3
2413
2414 ;-----------------------------------------------------------------------------
2415 ; void pred4x4_dc_mmxext(uint8_t *src, const uint8_t *topright, int stride)
2416 ;-----------------------------------------------------------------------------
2417
2418 cglobal pred4x4_dc_8_mmxext, 3,5
2419     pxor   mm7, mm7
2420     mov     r4, r0
2421     sub     r0, r2
2422     movd   mm0, [r0]
2423     psadbw mm0, mm7
2424     movzx  r1d, byte [r0+r2*1-1]
2425     movd   r3d, mm0
2426     add    r3d, r1d
2427     movzx  r1d, byte [r0+r2*2-1]
2428     lea     r0, [r0+r2*2]
2429     add    r3d, r1d
2430     movzx  r1d, byte [r0+r2*1-1]
2431     add    r3d, r1d
2432     movzx  r1d, byte [r0+r2*2-1]
2433     add    r3d, r1d
2434     add    r3d, 4
2435     shr    r3d, 3
2436     imul   r3d, 0x01010101
2437     mov   [r4+r2*0], r3d
2438     mov   [r0+r2*0], r3d
2439     mov   [r0+r2*1], r3d
2440     mov   [r0+r2*2], r3d
2441     RET
2442
2443 ;-----------------------------------------------------------------------------
2444 ; void pred4x4_tm_vp8_mmxext(uint8_t *src, const uint8_t *topright, int stride)
2445 ;-----------------------------------------------------------------------------
2446
2447 %macro PRED4x4_TM_MMX 0
2448 cglobal pred4x4_tm_vp8_8, 3,6
2449     sub        r0, r2
2450     pxor      mm7, mm7
2451     movd      mm0, [r0]
2452     punpcklbw mm0, mm7
2453     movzx     r4d, byte [r0-1]
2454     mov       r5d, 2
2455 .loop:
2456     movzx     r1d, byte [r0+r2*1-1]
2457     movzx     r3d, byte [r0+r2*2-1]
2458     sub       r1d, r4d
2459     sub       r3d, r4d
2460     movd      mm2, r1d
2461     movd      mm4, r3d
2462 %if cpuflag(mmx2)
2463     pshufw    mm2, mm2, 0
2464     pshufw    mm4, mm4, 0
2465 %else
2466     punpcklwd mm2, mm2
2467     punpcklwd mm4, mm4
2468     punpckldq mm2, mm2
2469     punpckldq mm4, mm4
2470 %endif
2471     paddw     mm2, mm0
2472     paddw     mm4, mm0
2473     packuswb  mm2, mm2
2474     packuswb  mm4, mm4
2475     movd [r0+r2*1], mm2
2476     movd [r0+r2*2], mm4
2477     lea        r0, [r0+r2*2]
2478     dec       r5d
2479     jg .loop
2480     REP_RET
2481 %endmacro
2482
2483 INIT_MMX mmx
2484 PRED4x4_TM_MMX
2485 INIT_MMX mmx2
2486 PRED4x4_TM_MMX
2487 INIT_MMX
2488
2489 cglobal pred4x4_tm_vp8_8_ssse3, 3,3
2490     sub         r0, r2
2491     movq       mm6, [tm_shuf]
2492     pxor       mm1, mm1
2493     movd       mm0, [r0]
2494     punpcklbw  mm0, mm1
2495     movd       mm7, [r0-4]
2496     pshufb     mm7, mm6
2497     lea         r1, [r0+r2*2]
2498     movd       mm2, [r0+r2*1-4]
2499     movd       mm3, [r0+r2*2-4]
2500     movd       mm4, [r1+r2*1-4]
2501     movd       mm5, [r1+r2*2-4]
2502     pshufb     mm2, mm6
2503     pshufb     mm3, mm6
2504     pshufb     mm4, mm6
2505     pshufb     mm5, mm6
2506     psubw      mm2, mm7
2507     psubw      mm3, mm7
2508     psubw      mm4, mm7
2509     psubw      mm5, mm7
2510     paddw      mm2, mm0
2511     paddw      mm3, mm0
2512     paddw      mm4, mm0
2513     paddw      mm5, mm0
2514     packuswb   mm2, mm2
2515     packuswb   mm3, mm3
2516     packuswb   mm4, mm4
2517     packuswb   mm5, mm5
2518     movd [r0+r2*1], mm2
2519     movd [r0+r2*2], mm3
2520     movd [r1+r2*1], mm4
2521     movd [r1+r2*2], mm5
2522     RET
2523
2524 ;-----------------------------------------------------------------------------
2525 ; void pred4x4_vertical_vp8_mmxext(uint8_t *src, const uint8_t *topright, int stride)
2526 ;-----------------------------------------------------------------------------
2527
2528 INIT_MMX
2529 cglobal pred4x4_vertical_vp8_8_mmxext, 3,3
2530     sub       r0, r2
2531     movd      m1, [r0-1]
2532     movd      m0, [r0]
2533     mova      m2, m0   ;t0 t1 t2 t3
2534     punpckldq m0, [r1] ;t0 t1 t2 t3 t4 t5 t6 t7
2535     lea       r1, [r0+r2*2]
2536     psrlq     m0, 8    ;t1 t2 t3 t4
2537     PRED4x4_LOWPASS m3, m1, m0, m2, m4
2538     movd [r0+r2*1], m3
2539     movd [r0+r2*2], m3
2540     movd [r1+r2*1], m3
2541     movd [r1+r2*2], m3
2542     RET
2543
2544 ;-----------------------------------------------------------------------------
2545 ; void pred4x4_down_left_mmxext(uint8_t *src, const uint8_t *topright, int stride)
2546 ;-----------------------------------------------------------------------------
2547 INIT_MMX
2548 cglobal pred4x4_down_left_8_mmxext, 3,3
2549     sub       r0, r2
2550     movq      m1, [r0]
2551     punpckldq m1, [r1]
2552     movq      m2, m1
2553     movq      m3, m1
2554     psllq     m1, 8
2555     pxor      m2, m1
2556     psrlq     m2, 8
2557     pxor      m2, m3
2558     PRED4x4_LOWPASS m0, m1, m2, m3, m4
2559     lea       r1, [r0+r2*2]
2560     psrlq     m0, 8
2561     movd      [r0+r2*1], m0
2562     psrlq     m0, 8
2563     movd      [r0+r2*2], m0
2564     psrlq     m0, 8
2565     movd      [r1+r2*1], m0
2566     psrlq     m0, 8
2567     movd      [r1+r2*2], m0
2568     RET
2569
2570 ;-----------------------------------------------------------------------------
2571 ; void pred4x4_vertical_left_mmxext(uint8_t *src, const uint8_t *topright, int stride)
2572 ;-----------------------------------------------------------------------------
2573
2574 INIT_MMX
2575 cglobal pred4x4_vertical_left_8_mmxext, 3,3
2576     sub       r0, r2
2577     movq      m1, [r0]
2578     punpckldq m1, [r1]
2579     movq      m3, m1
2580     movq      m2, m1
2581     psrlq     m3, 8
2582     psrlq     m2, 16
2583     movq      m4, m3
2584     pavgb     m4, m1
2585     PRED4x4_LOWPASS m0, m1, m2, m3, m5
2586     lea       r1, [r0+r2*2]
2587     movh      [r0+r2*1], m4
2588     movh      [r0+r2*2], m0
2589     psrlq     m4, 8
2590     psrlq     m0, 8
2591     movh      [r1+r2*1], m4
2592     movh      [r1+r2*2], m0
2593     RET
2594
2595 ;-----------------------------------------------------------------------------
2596 ; void pred4x4_horizontal_up_mmxext(uint8_t *src, const uint8_t *topright, int stride)
2597 ;-----------------------------------------------------------------------------
2598
2599 INIT_MMX
2600 cglobal pred4x4_horizontal_up_8_mmxext, 3,3
2601     sub       r0, r2
2602     lea       r1, [r0+r2*2]
2603     movd      m0, [r0+r2*1-4]
2604     punpcklbw m0, [r0+r2*2-4]
2605     movd      m1, [r1+r2*1-4]
2606     punpcklbw m1, [r1+r2*2-4]
2607     punpckhwd m0, m1
2608     movq      m1, m0
2609     punpckhbw m1, m1
2610     pshufw    m1, m1, 0xFF
2611     punpckhdq m0, m1
2612     movq      m2, m0
2613     movq      m3, m0
2614     movq      m7, m0
2615     psrlq     m2, 16
2616     psrlq     m3, 8
2617     pavgb     m7, m3
2618     PRED4x4_LOWPASS m4, m0, m2, m3, m5
2619     punpcklbw m7, m4
2620     movd    [r0+r2*1], m7
2621     psrlq    m7, 16
2622     movd    [r0+r2*2], m7
2623     psrlq    m7, 16
2624     movd    [r1+r2*1], m7
2625     movd    [r1+r2*2], m1
2626     RET
2627
2628 ;-----------------------------------------------------------------------------
2629 ; void pred4x4_horizontal_down_mmxext(uint8_t *src, const uint8_t *topright, int stride)
2630 ;-----------------------------------------------------------------------------
2631
2632 INIT_MMX
2633 %define PALIGNR PALIGNR_MMX
2634 cglobal pred4x4_horizontal_down_8_mmxext, 3,3
2635     sub       r0, r2
2636     lea       r1, [r0+r2*2]
2637     movh      m0, [r0-4]      ; lt ..
2638     punpckldq m0, [r0]        ; t3 t2 t1 t0 lt .. .. ..
2639     psllq     m0, 8           ; t2 t1 t0 lt .. .. .. ..
2640     movd      m1, [r1+r2*2-4] ; l3
2641     punpcklbw m1, [r1+r2*1-4] ; l2 l3
2642     movd      m2, [r0+r2*2-4] ; l1
2643     punpcklbw m2, [r0+r2*1-4] ; l0 l1
2644     punpckhwd m1, m2          ; l0 l1 l2 l3
2645     punpckhdq m1, m0          ; t2 t1 t0 lt l0 l1 l2 l3
2646     movq      m0, m1
2647     movq      m2, m1
2648     movq      m5, m1
2649     psrlq     m0, 16          ; .. .. t2 t1 t0 lt l0 l1
2650     psrlq     m2, 8           ; .. t2 t1 t0 lt l0 l1 l2
2651     pavgb     m5, m2
2652     PRED4x4_LOWPASS m3, m1, m0, m2, m4
2653     punpcklbw m5, m3
2654     psrlq     m3, 32
2655     PALIGNR   m3, m5, 6, m4
2656     movh      [r1+r2*2], m5
2657     psrlq     m5, 16
2658     movh      [r1+r2*1], m5
2659     psrlq     m5, 16
2660     movh      [r0+r2*2], m5
2661     movh      [r0+r2*1], m3
2662     RET
2663
2664 ;-----------------------------------------------------------------------------
2665 ; void pred4x4_vertical_right_mmxext(uint8_t *src, const uint8_t *topright, int stride)
2666 ;-----------------------------------------------------------------------------
2667
2668 INIT_MMX
2669 %define PALIGNR PALIGNR_MMX
2670 cglobal pred4x4_vertical_right_8_mmxext, 3,3
2671     sub     r0, r2
2672     lea     r1, [r0+r2*2]
2673     movh    m0, [r0]                    ; ........t3t2t1t0
2674     movq    m5, m0
2675     PALIGNR m0, [r0-8], 7, m1           ; ......t3t2t1t0lt
2676     pavgb   m5, m0
2677     PALIGNR m0, [r0+r2*1-8], 7, m1      ; ....t3t2t1t0ltl0
2678     movq    m1, m0
2679     PALIGNR m0, [r0+r2*2-8], 7, m2      ; ..t3t2t1t0ltl0l1
2680     movq    m2, m0
2681     PALIGNR m0, [r1+r2*1-8], 7, m3      ; t3t2t1t0ltl0l1l2
2682     PRED4x4_LOWPASS m3, m1, m0, m2, m4
2683     movq    m1, m3
2684     psrlq   m3, 16
2685     psllq   m1, 48
2686     movh    [r0+r2*1], m5
2687     movh    [r0+r2*2], m3
2688     PALIGNR m5, m1, 7, m2
2689     psllq   m1, 8
2690     movh    [r1+r2*1], m5
2691     PALIGNR m3, m1, 7, m1
2692     movh    [r1+r2*2], m3
2693     RET
2694
2695 ;-----------------------------------------------------------------------------
2696 ; void pred4x4_down_right_mmxext(uint8_t *src, const uint8_t *topright, int stride)
2697 ;-----------------------------------------------------------------------------
2698
2699 INIT_MMX
2700 %define PALIGNR PALIGNR_MMX
2701 cglobal pred4x4_down_right_8_mmxext, 3,3
2702     sub       r0, r2
2703     lea       r1, [r0+r2*2]
2704     movq      m1, [r1-8]
2705     movq      m2, [r0+r2*1-8]
2706     punpckhbw m2, [r0-8]
2707     movh      m3, [r0]
2708     punpckhwd m1, m2
2709     PALIGNR   m3, m1, 5, m1
2710     movq      m1, m3
2711     PALIGNR   m3, [r1+r2*1-8], 7, m4
2712     movq      m2, m3
2713     PALIGNR   m3, [r1+r2*2-8], 7, m4
2714     PRED4x4_LOWPASS m0, m3, m1, m2, m4
2715     movh      [r1+r2*2], m0
2716     psrlq     m0, 8
2717     movh      [r1+r2*1], m0
2718     psrlq     m0, 8
2719     movh      [r0+r2*2], m0
2720     psrlq     m0, 8
2721     movh      [r0+r2*1], m0
2722     RET