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