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