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