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