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