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