]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/h264_intrapred_10bit.asm
dsputil: remove ff_emulated_edge_mc macro used in one place
[ffmpeg] / libavcodec / x86 / h264_intrapred_10bit.asm
1 ;*****************************************************************************
2 ;* MMX/SSE2/AVX-optimized 10-bit H.264 intra prediction code
3 ;*****************************************************************************
4 ;* Copyright (C) 2005-2011 x264 project
5 ;*
6 ;* Authors: Daniel Kang <daniel.d.kang@gmail.com>
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 SECTION .text
31
32 cextern pw_8
33 cextern pw_4
34 cextern pw_2
35 cextern pw_1
36
37 ; dest, left, right, src
38 ; output: %1 = (t[n-1] + t[n]*2 + t[n+1] + 2) >> 2
39 %macro PRED4x4_LOWPASS 4
40     paddw       %2, %3
41     psrlw       %2, 1
42     pavgw       %1, %4, %2
43 %endmacro
44
45 ;-----------------------------------------------------------------------------
46 ; void pred4x4_down_right(pixel *src, const pixel *topright, int stride)
47 ;-----------------------------------------------------------------------------
48 %macro PRED4x4_DR 1
49 cglobal pred4x4_down_right_10_%1, 3,3
50     sub       r0, r2
51     lea       r1, [r0+r2*2]
52     movhps    m1, [r1-8]
53     movhps    m2, [r0+r2*1-8]
54     movhps    m4, [r0-8]
55     punpckhwd m2, m4
56     movq      m3, [r0]
57     punpckhdq m1, m2
58     PALIGNR   m3, m1, 10, m1
59     mova      m1, m3
60     movhps    m4, [r1+r2*1-8]
61     PALIGNR   m3, m4, 14, m4
62     mova      m2, m3
63     movhps    m4, [r1+r2*2-8]
64     PALIGNR   m3, m4, 14, m4
65     PRED4x4_LOWPASS m0, m3, m1, m2
66     movq      [r1+r2*2], m0
67     psrldq    m0, 2
68     movq      [r1+r2*1], m0
69     psrldq    m0, 2
70     movq      [r0+r2*2], m0
71     psrldq    m0, 2
72     movq      [r0+r2*1], m0
73     RET
74 %endmacro
75
76 INIT_XMM
77 %define PALIGNR PALIGNR_MMX
78 PRED4x4_DR sse2
79 %define PALIGNR PALIGNR_SSSE3
80 PRED4x4_DR ssse3
81 %ifdef HAVE_AVX
82 INIT_AVX
83 PRED4x4_DR avx
84 %endif
85
86 ;-----------------------------------------------------------------------------
87 ; void pred4x4_vertical_right(pixel *src, const pixel *topright, int stride)
88 ;-----------------------------------------------------------------------------
89 %macro PRED4x4_VR 1
90 cglobal pred4x4_vertical_right_10_%1, 3,3,6
91     sub     r0, r2
92     lea     r1, [r0+r2*2]
93     movq    m5, [r0]            ; ........t3t2t1t0
94     movhps  m1, [r0-8]
95     PALIGNR m0, m5, m1, 14, m1  ; ......t3t2t1t0lt
96     pavgw   m5, m0
97     movhps  m1, [r0+r2*1-8]
98     PALIGNR m0, m1, 14, m1      ; ....t3t2t1t0ltl0
99     mova    m1, m0
100     movhps  m2, [r0+r2*2-8]
101     PALIGNR m0, m2, 14, m2      ; ..t3t2t1t0ltl0l1
102     mova    m2, m0
103     movhps  m3, [r1+r2*1-8]
104     PALIGNR m0, m3, 14, m3      ; t3t2t1t0ltl0l1l2
105     PRED4x4_LOWPASS m3, m1, m0, m2
106     pslldq  m1, m3, 12
107     psrldq  m3, 4
108     movq    [r0+r2*1], m5
109     movq    [r0+r2*2], m3
110     PALIGNR m5, m1, 14, m2
111     pslldq  m1, 2
112     movq    [r1+r2*1], m5
113     PALIGNR m3, m1, 14, m1
114     movq    [r1+r2*2], m3
115     RET
116 %endmacro
117
118 INIT_XMM
119 %define PALIGNR PALIGNR_MMX
120 PRED4x4_VR sse2
121 %define PALIGNR PALIGNR_SSSE3
122 PRED4x4_VR ssse3
123 %ifdef HAVE_AVX
124 INIT_AVX
125 PRED4x4_VR avx
126 %endif
127
128 ;-----------------------------------------------------------------------------
129 ; void pred4x4_horizontal_down(pixel *src, const pixel *topright, int stride)
130 ;-----------------------------------------------------------------------------
131 %macro PRED4x4_HD 1
132 cglobal pred4x4_horizontal_down_10_%1, 3,3
133     sub        r0, r2
134     lea        r1, [r0+r2*2]
135     movq       m0, [r0-8]      ; lt ..
136     movhps     m0, [r0]
137     pslldq     m0, 2           ; t2 t1 t0 lt .. .. .. ..
138     movq       m1, [r1+r2*2-8] ; l3
139     movq       m3, [r1+r2*1-8]
140     punpcklwd  m1, m3          ; l2 l3
141     movq       m2, [r0+r2*2-8] ; l1
142     movq       m3, [r0+r2*1-8]
143     punpcklwd  m2, m3          ; l0 l1
144     punpckhdq  m1, m2          ; l0 l1 l2 l3
145     punpckhqdq m1, m0          ; t2 t1 t0 lt l0 l1 l2 l3
146     psrldq     m0, m1, 4       ; .. .. t2 t1 t0 lt l0 l1
147     psrldq     m2, m1, 2       ; .. t2 t1 t0 lt l0 l1 l2
148     pavgw      m5, m1, m2
149     PRED4x4_LOWPASS m3, m1, m0, m2
150     punpcklwd  m5, m3
151     psrldq     m3, 8
152     PALIGNR    m3, m5, 12, m4
153     movq       [r1+r2*2], m5
154     movhps     [r0+r2*2], m5
155     psrldq     m5, 4
156     movq       [r1+r2*1], m5
157     movq       [r0+r2*1], m3
158     RET
159 %endmacro
160
161 INIT_XMM
162 %define PALIGNR PALIGNR_MMX
163 PRED4x4_HD sse2
164 %define PALIGNR PALIGNR_SSSE3
165 PRED4x4_HD ssse3
166 %ifdef HAVE_AVX
167 INIT_AVX
168 PRED4x4_HD avx
169 %endif
170
171 ;-----------------------------------------------------------------------------
172 ; void pred4x4_dc(pixel *src, const pixel *topright, int stride)
173 ;-----------------------------------------------------------------------------
174 %macro HADDD 2 ; sum junk
175 %if mmsize == 16
176     movhlps %2, %1
177     paddd   %1, %2
178     pshuflw %2, %1, 0xE
179     paddd   %1, %2
180 %else
181     pshufw  %2, %1, 0xE
182     paddd   %1, %2
183 %endif
184 %endmacro
185
186 %macro HADDW 2
187     pmaddwd %1, [pw_1]
188     HADDD   %1, %2
189 %endmacro
190
191 INIT_MMX
192 cglobal pred4x4_dc_10_mmxext, 3,3
193     sub    r0, r2
194     lea    r1, [r0+r2*2]
195     movq   m2, [r0+r2*1-8]
196     paddw  m2, [r0+r2*2-8]
197     paddw  m2, [r1+r2*1-8]
198     paddw  m2, [r1+r2*2-8]
199     psrlq  m2, 48
200     movq   m0, [r0]
201     HADDW  m0, m1
202     paddw  m0, [pw_4]
203     paddw  m0, m2
204     psrlw  m0, 3
205     SPLATW m0, m0, 0
206     movq   [r0+r2*1], m0
207     movq   [r0+r2*2], m0
208     movq   [r1+r2*1], m0
209     movq   [r1+r2*2], m0
210     RET
211
212 ;-----------------------------------------------------------------------------
213 ; void pred4x4_down_left(pixel *src, const pixel *topright, int stride)
214 ;-----------------------------------------------------------------------------
215 ;TODO: more AVX here
216 %macro PRED4x4_DL 1
217 cglobal pred4x4_down_left_10_%1, 3,3
218     sub        r0, r2
219     movq       m1, [r0]
220     movhps     m1, [r1]
221     pslldq     m5, m1, 2
222     pxor       m2, m5, m1
223     psrldq     m2, 2
224     pxor       m3, m1, m2
225     PRED4x4_LOWPASS m0, m5, m3, m1
226     lea        r1, [r0+r2*2]
227     movhps     [r1+r2*2], m0
228     psrldq     m0, 2
229     movq       [r0+r2*1], m0
230     psrldq     m0, 2
231     movq       [r0+r2*2], m0
232     psrldq     m0, 2
233     movq       [r1+r2*1], m0
234     RET
235 %endmacro
236
237 INIT_XMM
238 PRED4x4_DL sse2
239 %ifdef HAVE_AVX
240 INIT_AVX
241 PRED4x4_DL avx
242 %endif
243
244 ;-----------------------------------------------------------------------------
245 ; void pred4x4_vertical_left(pixel *src, const pixel *topright, int stride)
246 ;-----------------------------------------------------------------------------
247 %macro PRED4x4_VL 1
248 cglobal pred4x4_vertical_left_10_%1, 3,3
249     sub        r0, r2
250     movu       m1, [r0]
251     movhps     m1, [r1]
252     psrldq     m3, m1, 2
253     psrldq     m2, m1, 4
254     pavgw      m4, m3, m1
255     PRED4x4_LOWPASS m0, m1, m2, m3
256     lea        r1, [r0+r2*2]
257     movq       [r0+r2*1], m4
258     movq       [r0+r2*2], m0
259     psrldq     m4, 2
260     psrldq     m0, 2
261     movq       [r1+r2*1], m4
262     movq       [r1+r2*2], m0
263     RET
264 %endmacro
265
266 INIT_XMM
267 PRED4x4_VL sse2
268 %ifdef HAVE_AVX
269 INIT_AVX
270 PRED4x4_VL avx
271 %endif
272
273 ;-----------------------------------------------------------------------------
274 ; void pred4x4_horizontal_up(pixel *src, const pixel *topright, int stride)
275 ;-----------------------------------------------------------------------------
276 INIT_MMX
277 cglobal pred4x4_horizontal_up_10_mmxext, 3,3
278     sub       r0, r2
279     lea       r1, [r0+r2*2]
280     movq      m0, [r0+r2*1-8]
281     punpckhwd m0, [r0+r2*2-8]
282     movq      m1, [r1+r2*1-8]
283     punpckhwd m1, [r1+r2*2-8]
284     punpckhdq m0, m1
285     pshufw    m1, m1, 0xFF
286     movq      [r1+r2*2], m1
287     movd      [r1+r2*1+4], m1
288     pshufw    m2, m0, 11111001b
289     movq      m1, m2
290     pavgw     m2, m0
291
292     pshufw    m5, m0, 11111110b
293     PRED4x4_LOWPASS m3, m0, m5, m1
294     movq      m6, m2
295     punpcklwd m6, m3
296     movq      [r0+r2*1], m6
297     psrlq     m2, 16
298     psrlq     m3, 16
299     punpcklwd m2, m3
300     movq      [r0+r2*2], m2
301     psrlq     m2, 32
302     movd      [r1+r2*1], m2
303     RET
304
305
306
307 ;-----------------------------------------------------------------------------
308 ; void pred8x8_vertical(pixel *src, int stride)
309 ;-----------------------------------------------------------------------------
310 INIT_XMM
311 cglobal pred8x8_vertical_10_sse2, 2,2
312     sub  r0, r1
313     mova m0, [r0]
314 %rep 3
315     mova [r0+r1*1], m0
316     mova [r0+r1*2], m0
317     lea  r0, [r0+r1*2]
318 %endrep
319     mova [r0+r1*1], m0
320     mova [r0+r1*2], m0
321     RET
322
323 ;-----------------------------------------------------------------------------
324 ; void pred8x8_horizontal(pixel *src, int stride)
325 ;-----------------------------------------------------------------------------
326 INIT_XMM
327 cglobal pred8x8_horizontal_10_sse2, 2,3
328     mov          r2, 4
329 .loop:
330     movq         m0, [r0+r1*0-8]
331     movq         m1, [r0+r1*1-8]
332     pshuflw      m0, m0, 0xff
333     pshuflw      m1, m1, 0xff
334     punpcklqdq   m0, m0
335     punpcklqdq   m1, m1
336     mova  [r0+r1*0], m0
337     mova  [r0+r1*1], m1
338     lea          r0, [r0+r1*2]
339     dec          r2
340     jg .loop
341     REP_RET
342
343 ;-----------------------------------------------------------------------------
344 ; void predict_8x8_dc(pixel *src, int stride)
345 ;-----------------------------------------------------------------------------
346 %macro MOV8 2-3
347 ; sort of a hack, but it works
348 %if mmsize==8
349     movq    [%1+0], %2
350     movq    [%1+8], %3
351 %else
352     movdqa    [%1], %2
353 %endif
354 %endmacro
355
356 %macro PRED8x8_DC 2
357 cglobal pred8x8_dc_10_%1, 2,4
358 %ifdef ARCH_X86_64
359 %define t0 r10
360 %else
361 %define t0 r0m
362 %endif
363     sub         r0, r1
364     pxor        m4, m4
365     movq        m0, [r0+0]
366     movq        m1, [r0+8]
367     HADDW       m0, m2
368     mov         t0, r0
369     HADDW       m1, m2
370
371     movzx      r2d, word [r0+r1*1-2]
372     movzx      r3d, word [r0+r1*2-2]
373     lea         r0, [r0+r1*2]
374     add        r2d, r3d
375     movzx      r3d, word [r0+r1*1-2]
376     add        r2d, r3d
377     movzx      r3d, word [r0+r1*2-2]
378     add        r2d, r3d
379     lea         r0, [r0+r1*2]
380     movd        m2, r2d            ; s2
381
382     movzx      r2d, word [r0+r1*1-2]
383     movzx      r3d, word [r0+r1*2-2]
384     lea         r0, [r0+r1*2]
385     add        r2d, r3d
386     movzx      r3d, word [r0+r1*1-2]
387     add        r2d, r3d
388     movzx      r3d, word [r0+r1*2-2]
389     add        r2d, r3d
390     movd        m3, r2d            ; s3
391
392     punpcklwd   m0, m1
393     mov         r0, t0
394     punpcklwd   m2, m3
395     punpckldq   m0, m2            ; s0, s1, s2, s3
396     %2          m3, m0, 11110110b ; s2, s1, s3, s3
397     lea         r2, [r1+r1*2]
398     %2          m0, m0, 01110100b ; s0, s1, s3, s1
399     paddw       m0, m3
400     lea         r3, [r0+r1*4]
401     psrlw       m0, 2
402     pavgw       m0, m4            ; s0+s2, s1, s3, s1+s3
403 %ifidn %1, sse2
404     punpcklwd   m0, m0
405     pshufd      m3, m0, 11111010b
406     punpckldq   m0, m0
407     SWAP         0,1
408 %else
409     pshufw      m1, m0, 0x00
410     pshufw      m2, m0, 0x55
411     pshufw      m3, m0, 0xaa
412     pshufw      m4, m0, 0xff
413 %endif
414     MOV8   r0+r1*1, m1, m2
415     MOV8   r0+r1*2, m1, m2
416     MOV8   r0+r2*1, m1, m2
417     MOV8   r0+r1*4, m1, m2
418     MOV8   r3+r1*1, m3, m4
419     MOV8   r3+r1*2, m3, m4
420     MOV8   r3+r2*1, m3, m4
421     MOV8   r3+r1*4, m3, m4
422     RET
423 %endmacro
424
425 INIT_MMX
426 PRED8x8_DC mmxext, pshufw
427 INIT_XMM
428 PRED8x8_DC sse2  , pshuflw
429
430 ;-----------------------------------------------------------------------------
431 ; void pred8x8_top_dc(pixel *src, int stride)
432 ;-----------------------------------------------------------------------------
433 %macro PRED8x8_TOP_DC 2
434 cglobal pred8x8_top_dc_10_%1, 2,4
435     sub         r0, r1
436     movq        m0, [r0+0]
437     movq        m1, [r0+8]
438     HADDW       m0, m2
439     HADDW       m1, m3
440     lea         r2, [r1+r1*2]
441     paddw       m0, [pw_2]
442     paddw       m1, [pw_2]
443     lea         r3, [r0+r1*4]
444     psrlw       m0, 2
445     psrlw       m1, 2
446     %2          m0, m0, 0
447     %2          m1, m1, 0
448 %ifidn %1, sse2
449     punpcklqdq  m0, m1
450 %endif
451     MOV8   r0+r1*1, m0, m1
452     MOV8   r0+r1*2, m0, m1
453     MOV8   r0+r2*1, m0, m1
454     MOV8   r0+r1*4, m0, m1
455     MOV8   r3+r1*1, m0, m1
456     MOV8   r3+r1*2, m0, m1
457     MOV8   r3+r2*1, m0, m1
458     MOV8   r3+r1*4, m0, m1
459     RET
460 %endmacro
461
462 INIT_MMX
463 PRED8x8_TOP_DC mmxext, pshufw
464 INIT_XMM
465 PRED8x8_TOP_DC sse2  , pshuflw
466
467
468
469 ;-----------------------------------------------------------------------------
470 ; void pred8x8l_top_dc(pixel *src, int has_topleft, int has_topright, int stride)
471 ;-----------------------------------------------------------------------------
472 %macro PRED8x8L_TOP_DC 1
473 cglobal pred8x8l_top_dc_10_%1, 4,4,6
474     sub         r0, r3
475     pxor        m7, m7
476     mova        m0, [r0-16]
477     mova        m3, [r0]
478     mova        m1, [r0+16]
479     mova        m2, m3
480     mova        m4, m3
481     PALIGNR     m2, m0, 14, m0
482     PALIGNR     m1, m4,  2, m4
483     test        r1, r1 ; top_left
484     jz .fix_lt_2
485     test        r2, r2 ; top_right
486     jz .fix_tr_1
487     jmp .body
488 .fix_lt_2:
489     mova        m5, m3
490     pxor        m5, m2
491     pslldq      m5, 14
492     psrldq      m5, 14
493     pxor        m2, m5
494     test        r2, r2 ; top_right
495     jnz .body
496 .fix_tr_1:
497     mova        m5, m3
498     pxor        m5, m1
499     psrldq      m5, 14
500     pslldq      m5, 14
501     pxor        m1, m5
502 .body
503     lea         r1, [r3+r3*2]
504     lea         r2, [r0+r3*4]
505     PRED4x4_LOWPASS m0, m2, m1, m3
506     HADDW       m0, m1
507     paddw       m0, [pw_4]
508     psrlw       m0, 3
509     SPLATW      m0, m0, 0
510     mova [r0+r3*1], m0
511     mova [r0+r3*2], m0
512     mova [r0+r1*1], m0
513     mova [r0+r3*4], m0
514     mova [r2+r3*1], m0
515     mova [r2+r3*2], m0
516     mova [r2+r1*1], m0
517     mova [r2+r3*4], m0
518     RET
519 %endmacro
520
521 INIT_XMM
522 %define PALIGNR PALIGNR_MMX
523 PRED8x8L_TOP_DC sse2
524 %define PALIGNR PALIGNR_SSSE3
525 PRED8x8L_TOP_DC ssse3
526
527 ;-----------------------------------------------------------------------------
528 ;void pred8x8l_dc(pixel *src, int has_topleft, int has_topright, int stride)
529 ;-----------------------------------------------------------------------------
530 ;TODO: see if scalar is faster
531 %macro PRED8x8L_DC 1
532 cglobal pred8x8l_dc_10_%1, 4,5,8
533     sub         r0, r3
534     lea         r4, [r0+r3*2]
535     mova        m0, [r0+r3*1-16]
536     punpckhwd   m0, [r0+r3*0-16]
537     mova        m1, [r4+r3*1-16]
538     punpckhwd   m1, [r0+r3*2-16]
539     mov         r4, r0
540     punpckhdq   m1, m0
541     lea         r0, [r0+r3*4]
542     mova        m2, [r0+r3*1-16]
543     punpckhwd   m2, [r0+r3*0-16]
544     lea         r0, [r0+r3*2]
545     mova        m3, [r0+r3*1-16]
546     punpckhwd   m3, [r0+r3*0-16]
547     punpckhdq   m3, m2
548     punpckhqdq  m3, m1
549     lea         r0, [r0+r3*2]
550     mova        m0, [r0+r3*0-16]
551     mova        m1, [r4]
552     mov         r0, r4
553     mova        m4, m3
554     mova        m2, m3
555     PALIGNR     m4, m0, 14, m0
556     PALIGNR     m1, m2,  2, m2
557     test        r1, r1
558     jnz .do_left
559 .fix_lt_1:
560     mova        m5, m3
561     pxor        m5, m4
562     psrldq      m5, 14
563     pslldq      m5, 12
564     pxor        m1, m5
565     jmp .do_left
566 .fix_lt_2:
567     mova        m5, m3
568     pxor        m5, m2
569     pslldq      m5, 14
570     psrldq      m5, 14
571     pxor        m2, m5
572     test        r2, r2
573     jnz .body
574 .fix_tr_1:
575     mova        m5, m3
576     pxor        m5, m1
577     psrldq      m5, 14
578     pslldq      m5, 14
579     pxor        m1, m5
580     jmp .body
581 .do_left:
582     mova        m0, m4
583     PRED4x4_LOWPASS m2, m1, m4, m3
584     mova        m4, m0
585     mova        m7, m2
586     PRED4x4_LOWPASS m1, m3, m0, m4
587     pslldq      m1, 14
588     PALIGNR     m7, m1, 14, m3
589     mova        m0, [r0-16]
590     mova        m3, [r0]
591     mova        m1, [r0+16]
592     mova        m2, m3
593     mova        m4, m3
594     PALIGNR     m2, m0, 14, m0
595     PALIGNR     m1, m4,  2, m4
596     test        r1, r1
597     jz .fix_lt_2
598     test        r2, r2
599     jz .fix_tr_1
600 .body
601     lea         r1, [r3+r3*2]
602     PRED4x4_LOWPASS m6, m2, m1, m3
603     HADDW       m7, m0
604     HADDW       m6, m0
605     lea         r2, [r0+r3*4]
606     paddw       m7, [pw_8]
607     paddw       m7, m6
608     psrlw       m7, 4
609     SPLATW      m7, m7
610     mova [r0+r3*1], m7
611     mova [r0+r3*2], m7
612     mova [r0+r1*1], m7
613     mova [r0+r3*4], m7
614     mova [r2+r3*1], m7
615     mova [r2+r3*2], m7
616     mova [r2+r1*1], m7
617     mova [r2+r3*4], m7
618     RET
619 %endmacro
620
621 INIT_XMM
622 %define PALIGNR PALIGNR_MMX
623 PRED8x8L_DC sse2
624 %define PALIGNR PALIGNR_SSSE3
625 PRED8x8L_DC ssse3
626
627 ;-----------------------------------------------------------------------------
628 ; void pred8x8l_vertical(pixel *src, int has_topleft, int has_topright, int stride)
629 ;-----------------------------------------------------------------------------
630 %macro PRED8x8L_VERTICAL 1
631 cglobal pred8x8l_vertical_10_%1, 4,4,6
632     sub         r0, r3
633     mova        m0, [r0-16]
634     mova        m3, [r0]
635     mova        m1, [r0+16]
636     mova        m2, m3
637     mova        m4, m3
638     PALIGNR     m2, m0, 14, m0
639     PALIGNR     m1, m4,  2, m4
640     test        r1, r1 ; top_left
641     jz .fix_lt_2
642     test        r2, r2 ; top_right
643     jz .fix_tr_1
644     jmp .body
645 .fix_lt_2:
646     mova        m5, m3
647     pxor        m5, m2
648     pslldq      m5, 14
649     psrldq      m5, 14
650     pxor        m2, m5
651     test        r2, r2 ; top_right
652     jnz .body
653 .fix_tr_1:
654     mova        m5, m3
655     pxor        m5, m1
656     psrldq      m5, 14
657     pslldq      m5, 14
658     pxor        m1, m5
659 .body
660     lea         r1, [r3+r3*2]
661     lea         r2, [r0+r3*4]
662     PRED4x4_LOWPASS m0, m2, m1, m3
663     mova [r0+r3*1], m0
664     mova [r0+r3*2], m0
665     mova [r0+r1*1], m0
666     mova [r0+r3*4], m0
667     mova [r2+r3*1], m0
668     mova [r2+r3*2], m0
669     mova [r2+r1*1], m0
670     mova [r2+r3*4], m0
671     RET
672 %endmacro
673
674 INIT_XMM
675 %define PALIGNR PALIGNR_MMX
676 PRED8x8L_VERTICAL sse2
677 %define PALIGNR PALIGNR_SSSE3
678 PRED8x8L_VERTICAL ssse3
679
680 ;-----------------------------------------------------------------------------
681 ; void pred8x8l_horizontal(uint8_t *src, int has_topleft, int has_topright, int stride)
682 ;-----------------------------------------------------------------------------
683 %macro PRED8x8L_HORIZONTAL 1
684 cglobal pred8x8l_horizontal_10_%1, 4,4,8
685     sub         r0, r3
686     lea         r2, [r0+r3*2]
687     mova        m0, [r0+r3*1-16]
688     test        r1, r1
689     lea         r1, [r0+r3]
690     cmovnz      r1, r0
691     punpckhwd   m0, [r1+r3*0-16]
692     mova        m1, [r2+r3*1-16]
693     punpckhwd   m1, [r0+r3*2-16]
694     mov         r2, r0
695     punpckhdq   m1, m0
696     lea         r0, [r0+r3*4]
697     mova        m2, [r0+r3*1-16]
698     punpckhwd   m2, [r0+r3*0-16]
699     lea         r0, [r0+r3*2]
700     mova        m3, [r0+r3*1-16]
701     punpckhwd   m3, [r0+r3*0-16]
702     punpckhdq   m3, m2
703     punpckhqdq  m3, m1
704     lea         r0, [r0+r3*2]
705     mova        m0, [r0+r3*0-16]
706     mova        m1, [r1+r3*0-16]
707     mov         r0, r2
708     mova        m4, m3
709     mova        m2, m3
710     PALIGNR     m4, m0, 14, m0
711     PALIGNR     m1, m2,  2, m2
712     mova        m0, m4
713     PRED4x4_LOWPASS m2, m1, m4, m3
714     mova        m4, m0
715     mova        m7, m2
716     PRED4x4_LOWPASS m1, m3, m0, m4
717     pslldq      m1, 14
718     PALIGNR     m7, m1, 14, m3
719     lea         r1, [r3+r3*2]
720     punpckhwd   m3, m7, m7
721     punpcklwd   m7, m7
722     pshufd      m0, m3, 0xff
723     pshufd      m1, m3, 0xaa
724     lea         r2, [r0+r3*4]
725     pshufd      m2, m3, 0x55
726     pshufd      m3, m3, 0x00
727     pshufd      m4, m7, 0xff
728     pshufd      m5, m7, 0xaa
729     pshufd      m6, m7, 0x55
730     pshufd      m7, m7, 0x00
731     mova [r0+r3*1], m0
732     mova [r0+r3*2], m1
733     mova [r0+r1*1], m2
734     mova [r0+r3*4], m3
735     mova [r2+r3*1], m4
736     mova [r2+r3*2], m5
737     mova [r2+r1*1], m6
738     mova [r2+r3*4], m7
739     RET
740 %endmacro
741
742 INIT_XMM
743 %define PALIGNR PALIGNR_MMX
744 PRED8x8L_HORIZONTAL sse2
745 %define PALIGNR PALIGNR_SSSE3
746 PRED8x8L_HORIZONTAL ssse3
747
748 ;-----------------------------------------------------------------------------
749 ;void pred8x8l_down_left(pixel *src, int has_topleft, int has_topright, int stride)
750 ;-----------------------------------------------------------------------------
751 %macro PRED8x8L_DOWN_LEFT 1
752 cglobal pred8x8l_down_left_10_%1, 4,4,8
753     sub         r0, r3
754     mova        m0, [r0-16]
755     mova        m3, [r0]
756     mova        m1, [r0+16]
757     mova        m2, m3
758     mova        m4, m3
759     PALIGNR     m2, m0, 14, m0
760     PALIGNR     m1, m4,  2, m4
761     test        r1, r1
762     jz .fix_lt_2
763     test        r2, r2
764     jz .fix_tr_1
765     jmp .do_top
766 .fix_lt_2:
767     mova        m5, m3
768     pxor        m5, m2
769     pslldq      m5, 14
770     psrldq      m5, 14
771     pxor        m2, m5
772     test        r2, r2
773     jnz .do_top
774 .fix_tr_1:
775     mova        m5, m3
776     pxor        m5, m1
777     psrldq      m5, 14
778     pslldq      m5, 14
779     pxor        m1, m5
780     jmp .do_top
781 .fix_tr_2:
782     punpckhwd   m3, m3
783     pshufd      m1, m3, 0xFF
784     jmp .do_topright
785 .do_top:
786     PRED4x4_LOWPASS m4, m2, m1, m3
787     mova        m7, m4
788     test        r2, r2
789     jz .fix_tr_2
790     mova        m0, [r0+16]
791     mova        m5, m0
792     mova        m2, m0
793     mova        m4, m0
794     psrldq      m5, 14
795     PALIGNR     m2, m3, 14, m3
796     PALIGNR     m5, m4,  2, m4
797     PRED4x4_LOWPASS m1, m2, m5, m0
798 .do_topright:
799     lea         r1, [r3+r3*2]
800     mova        m6, m1
801     psrldq      m1, 14
802     mova        m4, m1
803     lea         r2, [r0+r3*4]
804     mova        m2, m6
805     PALIGNR     m2, m7,  2, m0
806     mova        m3, m6
807     PALIGNR     m3, m7, 14, m0
808     PALIGNR     m4, m6,  2, m0
809     mova        m5, m7
810     mova        m1, m7
811     mova        m7, m6
812     pslldq      m1, 2
813     PRED4x4_LOWPASS m0, m1, m2, m5
814     PRED4x4_LOWPASS m1, m3, m4, m7
815     mova [r2+r3*4], m1
816     mova        m2, m0
817     pslldq      m1, 2
818     psrldq      m2, 14
819     pslldq      m0, 2
820     por         m1, m2
821     mova [r2+r1*1], m1
822     mova        m2, m0
823     pslldq      m1, 2
824     psrldq      m2, 14
825     pslldq      m0, 2
826     por         m1, m2
827     mova [r2+r3*2], m1
828     mova        m2, m0
829     pslldq      m1, 2
830     psrldq      m2, 14
831     pslldq      m0, 2
832     por         m1, m2
833     mova [r2+r3*1], m1
834     mova        m2, m0
835     pslldq      m1, 2
836     psrldq      m2, 14
837     pslldq      m0, 2
838     por         m1, m2
839     mova [r0+r3*4], m1
840     mova        m2, m0
841     pslldq      m1, 2
842     psrldq      m2, 14
843     pslldq      m0, 2
844     por         m1, m2
845     mova [r0+r1*1], m1
846     mova        m2, m0
847     pslldq      m1, 2
848     psrldq      m2, 14
849     pslldq      m0, 2
850     por         m1, m2
851     mova [r0+r3*2], m1
852     pslldq      m1, 2
853     psrldq      m0, 14
854     por         m1, m0
855     mova [r0+r3*1], m1
856     RET
857 %endmacro
858
859 INIT_XMM
860 %define PALIGNR PALIGNR_MMX
861 PRED8x8L_DOWN_LEFT sse2
862 %define PALIGNR PALIGNR_SSSE3
863 PRED8x8L_DOWN_LEFT ssse3
864
865 ;-----------------------------------------------------------------------------
866 ;void pred8x8l_down_right_mxext(pixel *src, int has_topleft, int has_topright, int stride)
867 ;-----------------------------------------------------------------------------
868 %macro PRED8x8L_DOWN_RIGHT 1
869 cglobal pred8x8l_down_right_10_%1, 4,5,8
870     sub         r0, r3
871     lea         r4, [r0+r3*2]
872     mova        m0, [r0+r3*1-16]
873     punpckhwd   m0, [r0+r3*0-16]
874     mova        m1, [r4+r3*1-16]
875     punpckhwd   m1, [r0+r3*2-16]
876     mov         r4, r0
877     punpckhdq   m1, m0
878     lea         r0, [r0+r3*4]
879     mova        m2, [r0+r3*1-16]
880     punpckhwd   m2, [r0+r3*0-16]
881     lea         r0, [r0+r3*2]
882     mova        m3, [r0+r3*1-16]
883     punpckhwd   m3, [r0+r3*0-16]
884     punpckhdq   m3, m2
885     punpckhqdq  m3, m1
886     lea         r0, [r0+r3*2]
887     mova        m0, [r0+r3*0-16]
888     mova        m1, [r4]
889     mov         r0, r4
890     mova        m4, m3
891     mova        m2, m3
892     PALIGNR     m4, m0, 14, m0
893     PALIGNR     m1, m2,  2, m2
894     test        r1, r1 ; top_left
895     jz .fix_lt_1
896 .do_left:
897     mova        m0, m4
898     PRED4x4_LOWPASS m2, m1, m4, m3
899     mova        m4, m0
900     mova        m7, m2
901     mova        m6, m2
902     PRED4x4_LOWPASS m1, m3, m0, m4
903     pslldq      m1, 14
904     PALIGNR     m7, m1, 14, m3
905     mova        m0, [r0-16]
906     mova        m3, [r0]
907     mova        m1, [r0+16]
908     mova        m2, m3
909     mova        m4, m3
910     PALIGNR     m2, m0, 14, m0
911     PALIGNR     m1, m4,  2, m4
912     test        r1, r1 ; top_left
913     jz .fix_lt_2
914     test        r2, r2 ; top_right
915     jz .fix_tr_1
916 .do_top:
917     PRED4x4_LOWPASS m4, m2, m1, m3
918     mova        m5, m4
919     jmp .body
920 .fix_lt_1:
921     mova        m5, m3
922     pxor        m5, m4
923     psrldq      m5, 14
924     pslldq      m5, 12
925     pxor        m1, m5
926     jmp .do_left
927 .fix_lt_2:
928     mova        m5, m3
929     pxor        m5, m2
930     pslldq      m5, 14
931     psrldq      m5, 14
932     pxor        m2, m5
933     test        r2, r2 ; top_right
934     jnz .do_top
935 .fix_tr_1:
936     mova        m5, m3
937     pxor        m5, m1
938     psrldq      m5, 14
939     pslldq      m5, 14
940     pxor        m1, m5
941     jmp .do_top
942 .body
943     lea         r1, [r3+r3*2]
944     mova        m1, m7
945     mova        m7, m5
946     mova        m5, m6
947     mova        m2, m7
948     lea         r2, [r0+r3*4]
949     PALIGNR     m2, m6,  2, m0
950     mova        m3, m7
951     PALIGNR     m3, m6, 14, m0
952     mova        m4, m7
953     psrldq      m4, 2
954     PRED4x4_LOWPASS m0, m1, m2, m5
955     PRED4x4_LOWPASS m1, m3, m4, m7
956     mova [r2+r3*4], m0
957     mova        m2, m1
958     psrldq      m0, 2
959     pslldq      m2, 14
960     psrldq      m1, 2
961     por         m0, m2
962     mova [r2+r1*1], m0
963     mova        m2, m1
964     psrldq      m0, 2
965     pslldq      m2, 14
966     psrldq      m1, 2
967     por         m0, m2
968     mova [r2+r3*2], m0
969     mova        m2, m1
970     psrldq      m0, 2
971     pslldq      m2, 14
972     psrldq      m1, 2
973     por         m0, m2
974     mova [r2+r3*1], m0
975     mova        m2, m1
976     psrldq      m0, 2
977     pslldq      m2, 14
978     psrldq      m1, 2
979     por         m0, m2
980     mova [r0+r3*4], m0
981     mova        m2, m1
982     psrldq      m0, 2
983     pslldq      m2, 14
984     psrldq      m1, 2
985     por         m0, m2
986     mova [r0+r1*1], m0
987     mova        m2, m1
988     psrldq      m0, 2
989     pslldq      m2, 14
990     psrldq      m1, 2
991     por         m0, m2
992     mova [r0+r3*2], m0
993     psrldq      m0, 2
994     pslldq      m1, 14
995     por         m0, m1
996     mova [r0+r3*1], m0
997     RET
998 %endmacro
999
1000 INIT_XMM
1001 %define PALIGNR PALIGNR_MMX
1002 PRED8x8L_DOWN_RIGHT sse2
1003 %define PALIGNR PALIGNR_SSSE3
1004 PRED8x8L_DOWN_RIGHT ssse3
1005
1006 ;-----------------------------------------------------------------------------
1007 ; void pred8x8l_vertical_right(pixel *src, int has_topleft, int has_topright, int stride)
1008 ;-----------------------------------------------------------------------------
1009 %macro PRED8x8L_VERTICAL_RIGHT 1
1010 cglobal pred8x8l_vertical_right_10_%1, 4,5,8
1011     sub         r0, r3
1012     lea         r4, [r0+r3*2]
1013     mova        m0, [r0+r3*1-16]
1014     punpckhwd   m0, [r0+r3*0-16]
1015     mova        m1, [r4+r3*1-16]
1016     punpckhwd   m1, [r0+r3*2-16]
1017     mov         r4, r0
1018     punpckhdq   m1, m0
1019     lea         r0, [r0+r3*4]
1020     mova        m2, [r0+r3*1-16]
1021     punpckhwd   m2, [r0+r3*0-16]
1022     lea         r0, [r0+r3*2]
1023     mova        m3, [r0+r3*1-16]
1024     punpckhwd   m3, [r0+r3*0-16]
1025     punpckhdq   m3, m2
1026     punpckhqdq  m3, m1
1027     lea         r0, [r0+r3*2]
1028     mova        m0, [r0+r3*0-16]
1029     mova        m1, [r4]
1030     mov         r0, r4
1031     mova        m4, m3
1032     mova        m2, m3
1033     PALIGNR     m4, m0, 14, m0
1034     PALIGNR     m1, m2,  2, m2
1035     test        r1, r1
1036     jz .fix_lt_1
1037     jmp .do_left
1038 .fix_lt_1:
1039     mova        m5, m3
1040     pxor        m5, m4
1041     psrldq      m5, 14
1042     pslldq      m5, 12
1043     pxor        m1, m5
1044     jmp .do_left
1045 .fix_lt_2:
1046     mova        m5, m3
1047     pxor        m5, m2
1048     pslldq      m5, 14
1049     psrldq      m5, 14
1050     pxor        m2, m5
1051     test        r2, r2
1052     jnz .do_top
1053 .fix_tr_1:
1054     mova        m5, m3
1055     pxor        m5, m1
1056     psrldq      m5, 14
1057     pslldq      m5, 14
1058     pxor        m1, m5
1059     jmp .do_top
1060 .do_left:
1061     mova        m0, m4
1062     PRED4x4_LOWPASS m2, m1, m4, m3
1063     mova        m7, m2
1064     mova        m0, [r0-16]
1065     mova        m3, [r0]
1066     mova        m1, [r0+16]
1067     mova        m2, m3
1068     mova        m4, m3
1069     PALIGNR     m2, m0, 14, m0
1070     PALIGNR     m1, m4,  2, m4
1071     test        r1, r1
1072     jz .fix_lt_2
1073     test        r2, r2
1074     jz .fix_tr_1
1075 .do_top
1076     PRED4x4_LOWPASS m6, m2, m1, m3
1077     lea         r1, [r3+r3*2]
1078     mova        m2, m6
1079     mova        m3, m6
1080     PALIGNR     m3, m7, 14, m0
1081     PALIGNR     m6, m7, 12, m1
1082     mova        m4, m3
1083     pavgw       m3, m2
1084     lea         r2, [r0+r3*4]
1085     PRED4x4_LOWPASS m0, m6, m2, m4
1086     mova [r0+r3*1], m3
1087     mova [r0+r3*2], m0
1088     mova        m5, m0
1089     mova        m6, m3
1090     mova        m1, m7
1091     mova        m2, m1
1092     pslldq      m2, 2
1093     mova        m3, m1
1094     pslldq      m3, 4
1095     PRED4x4_LOWPASS m0, m1, m3, m2
1096     PALIGNR     m6, m0, 14, m2
1097     mova [r0+r1*1], m6
1098     pslldq      m0, 2
1099     PALIGNR     m5, m0, 14, m1
1100     mova [r0+r3*4], m5
1101     pslldq      m0, 2
1102     PALIGNR     m6, m0, 14, m2
1103     mova [r2+r3*1], m6
1104     pslldq      m0, 2
1105     PALIGNR     m5, m0, 14, m1
1106     mova [r2+r3*2], m5
1107     pslldq      m0, 2
1108     PALIGNR     m6, m0, 14, m2
1109     mova [r2+r1*1], m6
1110     pslldq      m0, 2
1111     PALIGNR     m5, m0, 14, m1
1112     mova [r2+r3*4], m5
1113     RET
1114 %endmacro
1115
1116 INIT_XMM
1117 %define PALIGNR PALIGNR_MMX
1118 PRED8x8L_VERTICAL_RIGHT sse2
1119 %define PALIGNR PALIGNR_SSSE3
1120 PRED8x8L_VERTICAL_RIGHT ssse3
1121
1122 ;-----------------------------------------------------------------------------
1123 ; void pred8x8l_horizontal_up(pixel *src, int has_topleft, int has_topright, int stride)
1124 ;-----------------------------------------------------------------------------
1125 %macro PRED8x8L_HORIZONTAL_UP 1
1126 cglobal pred8x8l_horizontal_up_10_%1, 4,4,8
1127     sub         r0, r3
1128     lea         r2, [r0+r3*2]
1129     mova        m0, [r0+r3*1-16]
1130     test        r1, r1
1131     lea         r1, [r0+r3]
1132     cmovnz      r1, r0
1133     punpckhwd   m0, [r1+r3*0-16]
1134     mova        m1, [r2+r3*1-16]
1135     punpckhwd   m1, [r0+r3*2-16]
1136     mov         r2, r0
1137     punpckhdq   m1, m0
1138     lea         r0, [r0+r3*4]
1139     mova        m2, [r0+r3*1-16]
1140     punpckhwd   m2, [r0+r3*0-16]
1141     lea         r0, [r0+r3*2]
1142     mova        m3, [r0+r3*1-16]
1143     punpckhwd   m3, [r0+r3*0-16]
1144     punpckhdq   m3, m2
1145     punpckhqdq  m3, m1
1146     lea         r0, [r0+r3*2]
1147     mova        m0, [r0+r3*0-16]
1148     mova        m1, [r1+r3*0-16]
1149     mov         r0, r2
1150     mova        m4, m3
1151     mova        m2, m3
1152     PALIGNR     m4, m0, 14, m0
1153     PALIGNR     m1, m2,  2, m2
1154     mova        m0, m4
1155     PRED4x4_LOWPASS m2, m1, m4, m3
1156     mova        m4, m0
1157     mova        m7, m2
1158     PRED4x4_LOWPASS m1, m3, m0, m4
1159     pslldq      m1, 14
1160     PALIGNR     m7, m1, 14, m3
1161     lea         r1, [r3+r3*2]
1162     pshufd      m0, m7, 00011011b ; l6 l7 l4 l5 l2 l3 l0 l1
1163     pslldq      m7, 14             ; l7 .. .. .. .. .. .. ..
1164     mova        m2, m0
1165     pslld       m0, 16
1166     psrld       m2, 16
1167     por         m2, m0            ; l7 l6 l5 l4 l3 l2 l1 l0
1168     mova        m3, m2
1169     mova        m4, m2
1170     mova        m5, m2
1171     psrldq      m2, 2
1172     psrldq      m3, 4
1173     lea         r2, [r0+r3*4]
1174     por         m2, m7            ; l7 l7 l6 l5 l4 l3 l2 l1
1175     punpckhwd   m7, m7
1176     por         m3, m7            ; l7 l7 l7 l6 l5 l4 l3 l2
1177     pavgw       m4, m2
1178     PRED4x4_LOWPASS m1, m3, m5, m2
1179     mova        m5, m4
1180     punpcklwd   m4, m1            ; p4 p3 p2 p1
1181     punpckhwd   m5, m1            ; p8 p7 p6 p5
1182     mova        m6, m5
1183     mova        m7, m5
1184     mova        m0, m5
1185     PALIGNR     m5, m4, 4, m1
1186     pshufd      m1, m6, 11111001b
1187     PALIGNR     m6, m4, 8, m2
1188     pshufd      m2, m7, 11111110b
1189     PALIGNR     m7, m4, 12, m3
1190     pshufd      m3, m0, 11111111b
1191     mova [r0+r3*1], m4
1192     mova [r0+r3*2], m5
1193     mova [r0+r1*1], m6
1194     mova [r0+r3*4], m7
1195     mova [r2+r3*1], m0
1196     mova [r2+r3*2], m1
1197     mova [r2+r1*1], m2
1198     mova [r2+r3*4], m3
1199     RET
1200 %endmacro
1201
1202 INIT_XMM
1203 %define PALIGNR PALIGNR_MMX
1204 PRED8x8L_HORIZONTAL_UP sse2
1205 %define PALIGNR PALIGNR_SSSE3
1206 PRED8x8L_HORIZONTAL_UP ssse3
1207
1208
1209
1210 ;-----------------------------------------------------------------------------
1211 ; void pred16x16_vertical(pixel *src, int stride)
1212 ;-----------------------------------------------------------------------------
1213 %macro MOV16 3-5
1214     mova [%1+     0], %2
1215     mova [%1+mmsize], %3
1216 %if mmsize==8
1217     mova [%1+    16], %4
1218     mova [%1+    24], %5
1219 %endif
1220 %endmacro
1221
1222 %macro PRED16x16_VERTICAL 1
1223 cglobal pred16x16_vertical_10_%1, 2,3
1224     sub   r0, r1
1225     mov   r2, 8
1226     mova  m0, [r0+ 0]
1227     mova  m1, [r0+mmsize]
1228 %if mmsize==8
1229     mova  m2, [r0+16]
1230     mova  m3, [r0+24]
1231 %endif
1232 .loop:
1233     MOV16 r0+r1*1, m0, m1, m2, m3
1234     MOV16 r0+r1*2, m0, m1, m2, m3
1235     lea   r0, [r0+r1*2]
1236     dec   r2
1237     jg .loop
1238     REP_RET
1239 %endmacro
1240
1241 INIT_MMX
1242 PRED16x16_VERTICAL mmxext
1243 INIT_XMM
1244 PRED16x16_VERTICAL sse2
1245
1246 ;-----------------------------------------------------------------------------
1247 ; void pred16x16_horizontal(pixel *src, int stride)
1248 ;-----------------------------------------------------------------------------
1249 %macro PRED16x16_HORIZONTAL 1
1250 cglobal pred16x16_horizontal_10_%1, 2,3
1251     mov    r2, 8
1252 .vloop:
1253     movd   m0, [r0+r1*0-4]
1254     movd   m1, [r0+r1*1-4]
1255     SPLATW m0, m0, 1
1256     SPLATW m1, m1, 1
1257     MOV16  r0+r1*0, m0, m0, m0, m0
1258     MOV16  r0+r1*1, m1, m1, m1, m1
1259     lea    r0, [r0+r1*2]
1260     dec    r2
1261     jge .vloop
1262     REP_RET
1263 %endmacro
1264
1265 INIT_MMX
1266 PRED16x16_HORIZONTAL mmxext
1267 INIT_XMM
1268 PRED16x16_HORIZONTAL sse2