Tizen 2.1 base
[platform/upstream/ffmpeg.git] / libavcodec / x86 / h264_deblock_10bit.asm
1 ;*****************************************************************************
2 ;* MMX/SSE2/AVX-optimized 10-bit H.264 deblocking code
3 ;*****************************************************************************
4 ;* Copyright (C) 2005-2011 x264 project
5 ;*
6 ;* Authors: Oskar Arvidsson <oskar@irock.se>
7 ;*          Loren Merritt <lorenm@u.washington.edu>
8 ;*          Jason Garrett-Glaser <darkshikari@gmail.com>
9 ;*
10 ;* This file is part of Libav.
11 ;*
12 ;* Libav is free software; you can redistribute it and/or
13 ;* modify it under the terms of the GNU Lesser General Public
14 ;* License as published by the Free Software Foundation; either
15 ;* version 2.1 of the License, or (at your option) any later version.
16 ;*
17 ;* Libav is distributed in the hope that it will be useful,
18 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20 ;* Lesser General Public License for more details.
21 ;*
22 ;* You should have received a copy of the GNU Lesser General Public
23 ;* License along with Libav; if not, write to the Free Software
24 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 ;******************************************************************************
26
27 %include "libavutil/x86/x86inc.asm"
28 %include "libavutil/x86/x86util.asm"
29
30 SECTION_RODATA
31
32 pw_pixel_max: times 8 dw ((1 << 10)-1)
33
34 SECTION .text
35
36 cextern pw_2
37 cextern pw_3
38 cextern pw_4
39
40 ; out: %4 = |%1-%2|-%3
41 ; clobbers: %5
42 %macro ABS_SUB 5
43     psubusw %5, %2, %1
44     psubusw %4, %1, %2
45     por     %4, %5
46     psubw   %4, %3
47 %endmacro
48
49 ; out: %4 = |%1-%2|<%3
50 %macro DIFF_LT   5
51     psubusw %4, %2, %1
52     psubusw %5, %1, %2
53     por     %5, %4 ; |%1-%2|
54     pxor    %4, %4
55     psubw   %5, %3 ; |%1-%2|-%3
56     pcmpgtw %4, %5 ; 0 > |%1-%2|-%3
57 %endmacro
58
59 %macro LOAD_AB 4
60     movd       %1, %3
61     movd       %2, %4
62     SPLATW     %1, %1
63     SPLATW     %2, %2
64 %endmacro
65
66 ; in:  %2=tc reg
67 ; out: %1=splatted tc
68 %macro LOAD_TC 2
69     movd        %1, [%2]
70     punpcklbw   %1, %1
71 %if mmsize == 8
72     pshufw      %1, %1, 0
73 %else
74     pshuflw     %1, %1, 01010000b
75     pshufd      %1, %1, 01010000b
76 %endif
77     psraw       %1, 6
78 %endmacro
79
80 ; in: %1=p1, %2=p0, %3=q0, %4=q1
81 ;     %5=alpha, %6=beta, %7-%9=tmp
82 ; out: %7=mask
83 %macro LOAD_MASK 9
84     ABS_SUB     %2, %3, %5, %8, %7 ; |p0-q0| - alpha
85     ABS_SUB     %1, %2, %6, %9, %7 ; |p1-p0| - beta
86     pand        %8, %9
87     ABS_SUB     %3, %4, %6, %9, %7 ; |q1-q0| - beta
88     pxor        %7, %7
89     pand        %8, %9
90     pcmpgtw     %7, %8
91 %endmacro
92
93 ; in: %1=p0, %2=q0, %3=p1, %4=q1, %5=mask, %6=tmp, %7=tmp
94 ; out: %1=p0', m2=q0'
95 %macro DEBLOCK_P0_Q0 7
96     psubw   %3, %4
97     pxor    %7, %7
98     paddw   %3, [pw_4]
99     psubw   %7, %5
100     psubw   %6, %2, %1
101     psllw   %6, 2
102     paddw   %3, %6
103     psraw   %3, 3
104     mova    %6, [pw_pixel_max]
105     CLIPW   %3, %7, %5
106     pxor    %7, %7
107     paddw   %1, %3
108     psubw   %2, %3
109     CLIPW   %1, %7, %6
110     CLIPW   %2, %7, %6
111 %endmacro
112
113 ; in: %1=x2, %2=x1, %3=p0, %4=q0 %5=mask&tc, %6=tmp
114 %macro LUMA_Q1 6
115     pavgw       %6, %3, %4      ; (p0+q0+1)>>1
116     paddw       %1, %6
117     pxor        %6, %6
118     psraw       %1, 1
119     psubw       %6, %5
120     psubw       %1, %2
121     CLIPW       %1, %6, %5
122     paddw       %1, %2
123 %endmacro
124
125 %macro LUMA_DEBLOCK_ONE 3
126     DIFF_LT     m5, %1, bm, m4, m6
127     pxor        m6, m6
128     mova        %3, m4
129     pcmpgtw     m6, tcm
130     pand        m4, tcm
131     pandn       m6, m7
132     pand        m4, m6
133     LUMA_Q1 m5, %2, m1, m2, m4, m6
134 %endmacro
135
136 %macro LUMA_H_STORE 2
137 %if mmsize == 8
138     movq        [r0-4], m0
139     movq        [r0+r1-4], m1
140     movq        [r0+r1*2-4], m2
141     movq        [r0+%2-4], m3
142 %else
143     movq        [r0-4], m0
144     movhps      [r0+r1-4], m0
145     movq        [r0+r1*2-4], m1
146     movhps      [%1-4], m1
147     movq        [%1+r1-4], m2
148     movhps      [%1+r1*2-4], m2
149     movq        [%1+%2-4], m3
150     movhps      [%1+r1*4-4], m3
151 %endif
152 %endmacro
153
154 %macro DEBLOCK_LUMA 0
155 ;-----------------------------------------------------------------------------
156 ; void deblock_v_luma( uint16_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
157 ;-----------------------------------------------------------------------------
158 cglobal deblock_v_luma_10, 5,5,8*(mmsize/16)
159     %assign pad 5*mmsize+12-(stack_offset&15)
160     %define tcm [rsp]
161     %define ms1 [rsp+mmsize]
162     %define ms2 [rsp+mmsize*2]
163     %define am  [rsp+mmsize*3]
164     %define bm  [rsp+mmsize*4]
165     SUB        rsp, pad
166     shl        r2d, 2
167     shl        r3d, 2
168     LOAD_AB     m4, m5, r2d, r3d
169     mov         r3, 32/mmsize
170     mov         r2, r0
171     sub         r0, r1
172     mova        am, m4
173     sub         r0, r1
174     mova        bm, m5
175     sub         r0, r1
176 .loop:
177     mova        m0, [r0+r1]
178     mova        m1, [r0+r1*2]
179     mova        m2, [r2]
180     mova        m3, [r2+r1]
181
182     LOAD_MASK   m0, m1, m2, m3, am, bm, m7, m4, m6
183     LOAD_TC     m6, r4
184     mova       tcm, m6
185
186     mova        m5, [r0]
187     LUMA_DEBLOCK_ONE m1, m0, ms1
188     mova   [r0+r1], m5
189
190     mova        m5, [r2+r1*2]
191     LUMA_DEBLOCK_ONE m2, m3, ms2
192     mova   [r2+r1], m5
193
194     pxor        m5, m5
195     mova        m6, tcm
196     pcmpgtw     m5, tcm
197     psubw       m6, ms1
198     pandn       m5, m7
199     psubw       m6, ms2
200     pand        m5, m6
201     DEBLOCK_P0_Q0 m1, m2, m0, m3, m5, m7, m6
202     mova [r0+r1*2], m1
203     mova      [r2], m2
204
205     add         r0, mmsize
206     add         r2, mmsize
207     add         r4, mmsize/8
208     dec         r3
209     jg .loop
210     ADD         rsp, pad
211     RET
212
213 cglobal deblock_h_luma_10, 5,6,8*(mmsize/16)
214     %assign pad 7*mmsize+12-(stack_offset&15)
215     %define tcm [rsp]
216     %define ms1 [rsp+mmsize]
217     %define ms2 [rsp+mmsize*2]
218     %define p1m [rsp+mmsize*3]
219     %define p2m [rsp+mmsize*4]
220     %define am  [rsp+mmsize*5]
221     %define bm  [rsp+mmsize*6]
222     SUB        rsp, pad
223     shl        r2d, 2
224     shl        r3d, 2
225     LOAD_AB     m4, m5, r2d, r3d
226     mov         r3, r1
227     mova        am, m4
228     add         r3, r1
229     mov         r5, 32/mmsize
230     mova        bm, m5
231     add         r3, r1
232 %if mmsize == 16
233     mov         r2, r0
234     add         r2, r3
235 %endif
236 .loop:
237 %if mmsize == 8
238     movq        m2, [r0-8]     ; y q2 q1 q0
239     movq        m7, [r0+0]
240     movq        m5, [r0+r1-8]
241     movq        m3, [r0+r1+0]
242     movq        m0, [r0+r1*2-8]
243     movq        m6, [r0+r1*2+0]
244     movq        m1, [r0+r3-8]
245     TRANSPOSE4x4W 2, 5, 0, 1, 4
246     SWAP         2, 7
247     movq        m7, [r0+r3]
248     TRANSPOSE4x4W 2, 3, 6, 7, 4
249 %else
250     movu        m5, [r0-8]     ; y q2 q1 q0 p0 p1 p2 x
251     movu        m0, [r0+r1-8]
252     movu        m2, [r0+r1*2-8]
253     movu        m3, [r2-8]
254     TRANSPOSE4x4W 5, 0, 2, 3, 6
255     mova       tcm, m3
256
257     movu        m4, [r2+r1-8]
258     movu        m1, [r2+r1*2-8]
259     movu        m3, [r2+r3-8]
260     movu        m7, [r2+r1*4-8]
261     TRANSPOSE4x4W 4, 1, 3, 7, 6
262
263     mova        m6, tcm
264     punpcklqdq  m6, m7
265     punpckhqdq  m5, m4
266     SBUTTERFLY qdq, 0, 1, 7
267     SBUTTERFLY qdq, 2, 3, 7
268 %endif
269
270     mova       p2m, m6
271     LOAD_MASK   m0, m1, m2, m3, am, bm, m7, m4, m6
272     LOAD_TC     m6, r4
273     mova       tcm, m6
274
275     LUMA_DEBLOCK_ONE m1, m0, ms1
276     mova       p1m, m5
277
278     mova        m5, p2m
279     LUMA_DEBLOCK_ONE m2, m3, ms2
280     mova       p2m, m5
281
282     pxor        m5, m5
283     mova        m6, tcm
284     pcmpgtw     m5, tcm
285     psubw       m6, ms1
286     pandn       m5, m7
287     psubw       m6, ms2
288     pand        m5, m6
289     DEBLOCK_P0_Q0 m1, m2, m0, m3, m5, m7, m6
290     mova        m0, p1m
291     mova        m3, p2m
292     TRANSPOSE4x4W 0, 1, 2, 3, 4
293     LUMA_H_STORE r2, r3
294
295     add         r4, mmsize/8
296     lea         r0, [r0+r1*(mmsize/2)]
297     lea         r2, [r2+r1*(mmsize/2)]
298     dec         r5
299     jg .loop
300     ADD        rsp, pad
301     RET
302 %endmacro
303
304 %if ARCH_X86_64
305 ; in:  m0=p1, m1=p0, m2=q0, m3=q1, m8=p2, m9=q2
306 ;      m12=alpha, m13=beta
307 ; out: m0=p1', m3=q1', m1=p0', m2=q0'
308 ; clobbers: m4, m5, m6, m7, m10, m11, m14
309 %macro DEBLOCK_LUMA_INTER_SSE2 0
310     LOAD_MASK   m0, m1, m2, m3, m12, m13, m7, m4, m6
311     LOAD_TC     m6, r4
312     DIFF_LT     m8, m1, m13, m10, m4
313     DIFF_LT     m9, m2, m13, m11, m4
314     pand        m6, m7
315
316     mova       m14, m6
317     pxor        m4, m4
318     pcmpgtw     m6, m4
319     pand        m6, m14
320
321     mova        m5, m10
322     pand        m5, m6
323     LUMA_Q1 m8, m0, m1, m2, m5, m4
324
325     mova        m5, m11
326     pand        m5, m6
327     LUMA_Q1 m9, m3, m1, m2, m5, m4
328
329     pxor        m4, m4
330     psubw       m6, m10
331     pcmpgtw     m4, m14
332     pandn       m4, m7
333     psubw       m6, m11
334     pand        m4, m6
335     DEBLOCK_P0_Q0 m1, m2, m0, m3, m4, m5, m6
336
337     SWAP         0, 8
338     SWAP         3, 9
339 %endmacro
340
341 %macro DEBLOCK_LUMA_64 0
342 cglobal deblock_v_luma_10, 5,5,15
343     %define p2 m8
344     %define p1 m0
345     %define p0 m1
346     %define q0 m2
347     %define q1 m3
348     %define q2 m9
349     %define mask0 m7
350     %define mask1 m10
351     %define mask2 m11
352     shl        r2d, 2
353     shl        r3d, 2
354     LOAD_AB    m12, m13, r2d, r3d
355     mov         r2, r0
356     sub         r0, r1
357     sub         r0, r1
358     sub         r0, r1
359     mov         r3, 2
360 .loop:
361     mova        p2, [r0]
362     mova        p1, [r0+r1]
363     mova        p0, [r0+r1*2]
364     mova        q0, [r2]
365     mova        q1, [r2+r1]
366     mova        q2, [r2+r1*2]
367     DEBLOCK_LUMA_INTER_SSE2
368     mova   [r0+r1], p1
369     mova [r0+r1*2], p0
370     mova      [r2], q0
371     mova   [r2+r1], q1
372     add         r0, mmsize
373     add         r2, mmsize
374     add         r4, 2
375     dec         r3
376     jg .loop
377     REP_RET
378
379 cglobal deblock_h_luma_10, 5,7,15
380     shl        r2d, 2
381     shl        r3d, 2
382     LOAD_AB    m12, m13, r2d, r3d
383     mov         r2, r1
384     add         r2, r1
385     add         r2, r1
386     mov         r5, r0
387     add         r5, r2
388     mov         r6, 2
389 .loop:
390     movu        m8, [r0-8]     ; y q2 q1 q0 p0 p1 p2 x
391     movu        m0, [r0+r1-8]
392     movu        m2, [r0+r1*2-8]
393     movu        m9, [r5-8]
394     movu        m5, [r5+r1-8]
395     movu        m1, [r5+r1*2-8]
396     movu        m3, [r5+r2-8]
397     movu        m7, [r5+r1*4-8]
398
399     TRANSPOSE4x4W 8, 0, 2, 9, 10
400     TRANSPOSE4x4W 5, 1, 3, 7, 10
401
402     punpckhqdq  m8, m5
403     SBUTTERFLY qdq, 0, 1, 10
404     SBUTTERFLY qdq, 2, 3, 10
405     punpcklqdq  m9, m7
406
407     DEBLOCK_LUMA_INTER_SSE2
408
409     TRANSPOSE4x4W 0, 1, 2, 3, 4
410     LUMA_H_STORE r5, r2
411     add         r4, 2
412     lea         r0, [r0+r1*8]
413     lea         r5, [r5+r1*8]
414     dec         r6
415     jg .loop
416     REP_RET
417 %endmacro
418
419 INIT_XMM sse2
420 DEBLOCK_LUMA_64
421 %if HAVE_AVX_EXTERNAL
422 INIT_XMM avx
423 DEBLOCK_LUMA_64
424 %endif
425 %endif
426
427 %macro SWAPMOVA 2
428 %ifid %1
429     SWAP %1, %2
430 %else
431     mova %1, %2
432 %endif
433 %endmacro
434
435 ; in: t0-t2: tmp registers
436 ;     %1=p0 %2=p1 %3=p2 %4=p3 %5=q0 %6=q1 %7=mask0
437 ;     %8=mask1p %9=2 %10=p0' %11=p1' %12=p2'
438 %macro LUMA_INTRA_P012 12 ; p0..p3 in memory
439 %if ARCH_X86_64
440     paddw     t0, %3, %2
441     mova      t2, %4
442     paddw     t2, %3
443 %else
444     mova      t0, %3
445     mova      t2, %4
446     paddw     t0, %2
447     paddw     t2, %3
448 %endif
449     paddw     t0, %1
450     paddw     t2, t2
451     paddw     t0, %5
452     paddw     t2, %9
453     paddw     t0, %9    ; (p2 + p1 + p0 + q0 + 2)
454     paddw     t2, t0    ; (2*p3 + 3*p2 + p1 + p0 + q0 + 4)
455
456     psrlw     t2, 3
457     psrlw     t1, t0, 2
458     psubw     t2, %3
459     psubw     t1, %2
460     pand      t2, %8
461     pand      t1, %8
462     paddw     t2, %3
463     paddw     t1, %2
464     SWAPMOVA %11, t1
465
466     psubw     t1, t0, %3
467     paddw     t0, t0
468     psubw     t1, %5
469     psubw     t0, %3
470     paddw     t1, %6
471     paddw     t1, %2
472     paddw     t0, %6
473     psrlw     t1, 2     ; (2*p1 + p0 + q1 + 2)/4
474     psrlw     t0, 3     ; (p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4)>>3
475
476     pxor      t0, t1
477     pxor      t1, %1
478     pand      t0, %8
479     pand      t1, %7
480     pxor      t0, t1
481     pxor      t0, %1
482     SWAPMOVA %10, t0
483     SWAPMOVA %12, t2
484 %endmacro
485
486 %macro LUMA_INTRA_INIT 1
487     %xdefine pad %1*mmsize+((gprsize*3) % mmsize)-(stack_offset&15)
488     %define t0 m4
489     %define t1 m5
490     %define t2 m6
491     %define t3 m7
492     %assign i 4
493 %rep %1
494     CAT_XDEFINE t, i, [rsp+mmsize*(i-4)]
495     %assign i i+1
496 %endrep
497     SUB    rsp, pad
498 %endmacro
499
500 ; in: %1-%3=tmp, %4=p2, %5=q2
501 %macro LUMA_INTRA_INTER 5
502     LOAD_AB t0, t1, r2d, r3d
503     mova    %1, t0
504     LOAD_MASK m0, m1, m2, m3, %1, t1, t0, t2, t3
505 %if ARCH_X86_64
506     mova    %2, t0        ; mask0
507     psrlw   t3, %1, 2
508 %else
509     mova    t3, %1
510     mova    %2, t0        ; mask0
511     psrlw   t3, 2
512 %endif
513     paddw   t3, [pw_2]    ; alpha/4+2
514     DIFF_LT m1, m2, t3, t2, t0 ; t2 = |p0-q0| < alpha/4+2
515     pand    t2, %2
516     mova    t3, %5        ; q2
517     mova    %1, t2        ; mask1
518     DIFF_LT t3, m2, t1, t2, t0 ; t2 = |q2-q0| < beta
519     pand    t2, %1
520     mova    t3, %4        ; p2
521     mova    %3, t2        ; mask1q
522     DIFF_LT t3, m1, t1, t2, t0 ; t2 = |p2-p0| < beta
523     pand    t2, %1
524     mova    %1, t2        ; mask1p
525 %endmacro
526
527 %macro LUMA_H_INTRA_LOAD 0
528 %if mmsize == 8
529     movu    t0, [r0-8]
530     movu    t1, [r0+r1-8]
531     movu    m0, [r0+r1*2-8]
532     movu    m1, [r0+r4-8]
533     TRANSPOSE4x4W 4, 5, 0, 1, 2
534     mova    t4, t0        ; p3
535     mova    t5, t1        ; p2
536
537     movu    m2, [r0]
538     movu    m3, [r0+r1]
539     movu    t0, [r0+r1*2]
540     movu    t1, [r0+r4]
541     TRANSPOSE4x4W 2, 3, 4, 5, 6
542     mova    t6, t0        ; q2
543     mova    t7, t1        ; q3
544 %else
545     movu    t0, [r0-8]
546     movu    t1, [r0+r1-8]
547     movu    m0, [r0+r1*2-8]
548     movu    m1, [r0+r5-8]
549     movu    m2, [r4-8]
550     movu    m3, [r4+r1-8]
551     movu    t2, [r4+r1*2-8]
552     movu    t3, [r4+r5-8]
553     TRANSPOSE8x8W 4, 5, 0, 1, 2, 3, 6, 7, t4, t5
554     mova    t4, t0        ; p3
555     mova    t5, t1        ; p2
556     mova    t6, t2        ; q2
557     mova    t7, t3        ; q3
558 %endif
559 %endmacro
560
561 ; in: %1=q3 %2=q2' %3=q1' %4=q0' %5=p0' %6=p1' %7=p2' %8=p3 %9=tmp
562 %macro LUMA_H_INTRA_STORE 9
563 %if mmsize == 8
564     TRANSPOSE4x4W %1, %2, %3, %4, %9
565     movq       [r0-8], m%1
566     movq       [r0+r1-8], m%2
567     movq       [r0+r1*2-8], m%3
568     movq       [r0+r4-8], m%4
569     movq       m%1, %8
570     TRANSPOSE4x4W %5, %6, %7, %1, %9
571     movq       [r0], m%5
572     movq       [r0+r1], m%6
573     movq       [r0+r1*2], m%7
574     movq       [r0+r4], m%1
575 %else
576     TRANSPOSE2x4x4W %1, %2, %3, %4, %9
577     movq       [r0-8], m%1
578     movq       [r0+r1-8], m%2
579     movq       [r0+r1*2-8], m%3
580     movq       [r0+r5-8], m%4
581     movhps     [r4-8], m%1
582     movhps     [r4+r1-8], m%2
583     movhps     [r4+r1*2-8], m%3
584     movhps     [r4+r5-8], m%4
585 %ifnum %8
586     SWAP       %1, %8
587 %else
588     mova       m%1, %8
589 %endif
590     TRANSPOSE2x4x4W %5, %6, %7, %1, %9
591     movq       [r0], m%5
592     movq       [r0+r1], m%6
593     movq       [r0+r1*2], m%7
594     movq       [r0+r5], m%1
595     movhps     [r4], m%5
596     movhps     [r4+r1], m%6
597     movhps     [r4+r1*2], m%7
598     movhps     [r4+r5], m%1
599 %endif
600 %endmacro
601
602 %if ARCH_X86_64
603 ;-----------------------------------------------------------------------------
604 ; void deblock_v_luma_intra( uint16_t *pix, int stride, int alpha, int beta )
605 ;-----------------------------------------------------------------------------
606 %macro DEBLOCK_LUMA_INTRA_64 0
607 cglobal deblock_v_luma_intra_10, 4,7,16
608     %define t0 m1
609     %define t1 m2
610     %define t2 m4
611     %define p2 m8
612     %define p1 m9
613     %define p0 m10
614     %define q0 m11
615     %define q1 m12
616     %define q2 m13
617     %define aa m5
618     %define bb m14
619     lea     r4, [r1*4]
620     lea     r5, [r1*3] ; 3*stride
621     neg     r4
622     add     r4, r0     ; pix-4*stride
623     mov     r6, 2
624     mova    m0, [pw_2]
625     shl    r2d, 2
626     shl    r3d, 2
627     LOAD_AB aa, bb, r2d, r3d
628 .loop:
629     mova    p2, [r4+r1]
630     mova    p1, [r4+2*r1]
631     mova    p0, [r4+r5]
632     mova    q0, [r0]
633     mova    q1, [r0+r1]
634     mova    q2, [r0+2*r1]
635
636     LOAD_MASK p1, p0, q0, q1, aa, bb, m3, t0, t1
637     mova    t2, aa
638     psrlw   t2, 2
639     paddw   t2, m0 ; alpha/4+2
640     DIFF_LT p0, q0, t2, m6, t0 ; m6 = |p0-q0| < alpha/4+2
641     DIFF_LT p2, p0, bb, t1, t0 ; m7 = |p2-p0| < beta
642     DIFF_LT q2, q0, bb, m7, t0 ; t1 = |q2-q0| < beta
643     pand    m6, m3
644     pand    m7, m6
645     pand    m6, t1
646     LUMA_INTRA_P012 p0, p1, p2, [r4], q0, q1, m3, m6, m0, [r4+r5], [r4+2*r1], [r4+r1]
647     LUMA_INTRA_P012 q0, q1, q2, [r0+r5], p0, p1, m3, m7, m0, [r0], [r0+r1], [r0+2*r1]
648     add     r0, mmsize
649     add     r4, mmsize
650     dec     r6
651     jg .loop
652     REP_RET
653
654 ;-----------------------------------------------------------------------------
655 ; void deblock_h_luma_intra( uint16_t *pix, int stride, int alpha, int beta )
656 ;-----------------------------------------------------------------------------
657 cglobal deblock_h_luma_intra_10, 4,7,16
658     %define t0 m15
659     %define t1 m14
660     %define t2 m2
661     %define q3 m5
662     %define q2 m8
663     %define q1 m9
664     %define q0 m10
665     %define p0 m11
666     %define p1 m12
667     %define p2 m13
668     %define p3 m4
669     %define spill [rsp]
670     %assign pad 24-(stack_offset&15)
671     SUB     rsp, pad
672     lea     r4, [r1*4]
673     lea     r5, [r1*3] ; 3*stride
674     add     r4, r0     ; pix+4*stride
675     mov     r6, 2
676     mova    m0, [pw_2]
677     shl    r2d, 2
678     shl    r3d, 2
679 .loop:
680     movu    q3, [r0-8]
681     movu    q2, [r0+r1-8]
682     movu    q1, [r0+r1*2-8]
683     movu    q0, [r0+r5-8]
684     movu    p0, [r4-8]
685     movu    p1, [r4+r1-8]
686     movu    p2, [r4+r1*2-8]
687     movu    p3, [r4+r5-8]
688     TRANSPOSE8x8W 5, 8, 9, 10, 11, 12, 13, 4, 1
689
690     LOAD_AB m1, m2, r2d, r3d
691     LOAD_MASK q1, q0, p0, p1, m1, m2, m3, t0, t1
692     psrlw   m1, 2
693     paddw   m1, m0 ; alpha/4+2
694     DIFF_LT p0, q0, m1, m6, t0 ; m6 = |p0-q0| < alpha/4+2
695     DIFF_LT q2, q0, m2, t1, t0 ; t1 = |q2-q0| < beta
696     DIFF_LT p0, p2, m2, m7, t0 ; m7 = |p2-p0| < beta
697     pand    m6, m3
698     pand    m7, m6
699     pand    m6, t1
700
701     mova spill, q3
702     LUMA_INTRA_P012 q0, q1, q2, q3, p0, p1, m3, m6, m0, m5, m1, q2
703     LUMA_INTRA_P012 p0, p1, p2, p3, q0, q1, m3, m7, m0, p0, m6, p2
704     mova    m7, spill
705
706     LUMA_H_INTRA_STORE 7, 8, 1, 5, 11, 6, 13, 4, 14
707
708     lea     r0, [r0+r1*8]
709     lea     r4, [r4+r1*8]
710     dec     r6
711     jg .loop
712     ADD    rsp, pad
713     RET
714 %endmacro
715
716 INIT_XMM sse2
717 DEBLOCK_LUMA_INTRA_64
718 %if HAVE_AVX_EXTERNAL
719 INIT_XMM avx
720 DEBLOCK_LUMA_INTRA_64
721 %endif
722
723 %endif
724
725 %macro DEBLOCK_LUMA_INTRA 0
726 ;-----------------------------------------------------------------------------
727 ; void deblock_v_luma_intra( uint16_t *pix, int stride, int alpha, int beta )
728 ;-----------------------------------------------------------------------------
729 cglobal deblock_v_luma_intra_10, 4,7,8*(mmsize/16)
730     LUMA_INTRA_INIT 3
731     lea     r4, [r1*4]
732     lea     r5, [r1*3]
733     neg     r4
734     add     r4, r0
735     mov     r6, 32/mmsize
736     shl    r2d, 2
737     shl    r3d, 2
738 .loop:
739     mova    m0, [r4+r1*2] ; p1
740     mova    m1, [r4+r5]   ; p0
741     mova    m2, [r0]      ; q0
742     mova    m3, [r0+r1]   ; q1
743     LUMA_INTRA_INTER t4, t5, t6, [r4+r1], [r0+r1*2]
744     LUMA_INTRA_P012 m1, m0, t3, [r4], m2, m3, t5, t4, [pw_2], [r4+r5], [r4+2*r1], [r4+r1]
745     mova    t3, [r0+r1*2] ; q2
746     LUMA_INTRA_P012 m2, m3, t3, [r0+r5], m1, m0, t5, t6, [pw_2], [r0], [r0+r1], [r0+2*r1]
747     add     r0, mmsize
748     add     r4, mmsize
749     dec     r6
750     jg .loop
751     ADD    rsp, pad
752     RET
753
754 ;-----------------------------------------------------------------------------
755 ; void deblock_h_luma_intra( uint16_t *pix, int stride, int alpha, int beta )
756 ;-----------------------------------------------------------------------------
757 cglobal deblock_h_luma_intra_10, 4,7,8*(mmsize/16)
758     LUMA_INTRA_INIT 8
759 %if mmsize == 8
760     lea     r4, [r1*3]
761     mov     r5, 32/mmsize
762 %else
763     lea     r4, [r1*4]
764     lea     r5, [r1*3] ; 3*stride
765     add     r4, r0     ; pix+4*stride
766     mov     r6, 32/mmsize
767 %endif
768     shl    r2d, 2
769     shl    r3d, 2
770 .loop:
771     LUMA_H_INTRA_LOAD
772     LUMA_INTRA_INTER t8, t9, t10, t5, t6
773
774     LUMA_INTRA_P012 m1, m0, t3, t4, m2, m3, t9, t8, [pw_2], t8, t5, t11
775     mova    t3, t6     ; q2
776     LUMA_INTRA_P012 m2, m3, t3, t7, m1, m0, t9, t10, [pw_2], m4, t6, m5
777
778     mova    m2, t4
779     mova    m0, t11
780     mova    m1, t5
781     mova    m3, t8
782     mova    m6, t6
783
784     LUMA_H_INTRA_STORE 2, 0, 1, 3, 4, 6, 5, t7, 7
785
786     lea     r0, [r0+r1*(mmsize/2)]
787 %if mmsize == 8
788     dec     r5
789 %else
790     lea     r4, [r4+r1*(mmsize/2)]
791     dec     r6
792 %endif
793     jg .loop
794     ADD    rsp, pad
795     RET
796 %endmacro
797
798 %if ARCH_X86_64 == 0
799 INIT_MMX mmx2
800 DEBLOCK_LUMA
801 DEBLOCK_LUMA_INTRA
802 INIT_XMM sse2
803 DEBLOCK_LUMA
804 DEBLOCK_LUMA_INTRA
805 %if HAVE_AVX_EXTERNAL
806 INIT_XMM avx
807 DEBLOCK_LUMA
808 DEBLOCK_LUMA_INTRA
809 %endif
810 %endif
811
812 ; in: %1=p0, %2=q0, %3=p1, %4=q1, %5=mask, %6=tmp, %7=tmp
813 ; out: %1=p0', %2=q0'
814 %macro CHROMA_DEBLOCK_P0_Q0_INTRA 7
815     mova    %6, [pw_2]
816     paddw   %6, %3
817     paddw   %6, %4
818     paddw   %7, %6, %2
819     paddw   %6, %1
820     paddw   %6, %3
821     paddw   %7, %4
822     psraw   %6, 2
823     psraw   %7, 2
824     psubw   %6, %1
825     psubw   %7, %2
826     pand    %6, %5
827     pand    %7, %5
828     paddw   %1, %6
829     paddw   %2, %7
830 %endmacro
831
832 %macro CHROMA_V_LOAD 1
833     mova        m0, [r0]    ; p1
834     mova        m1, [r0+r1] ; p0
835     mova        m2, [%1]    ; q0
836     mova        m3, [%1+r1] ; q1
837 %endmacro
838
839 %macro CHROMA_V_STORE 0
840     mova [r0+1*r1], m1
841     mova [r0+2*r1], m2
842 %endmacro
843
844 %macro CHROMA_V_LOAD_TC 2
845     movd        %1, [%2]
846     punpcklbw   %1, %1
847     punpcklwd   %1, %1
848     psraw       %1, 6
849 %endmacro
850
851 %macro DEBLOCK_CHROMA 0
852 ;-----------------------------------------------------------------------------
853 ; void deblock_v_chroma( uint16_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
854 ;-----------------------------------------------------------------------------
855 cglobal deblock_v_chroma_10, 5,7-(mmsize/16),8*(mmsize/16)
856     mov         r5, r0
857     sub         r0, r1
858     sub         r0, r1
859     shl        r2d, 2
860     shl        r3d, 2
861 %if mmsize < 16
862     mov         r6, 16/mmsize
863 .loop:
864 %endif
865     CHROMA_V_LOAD r5
866     LOAD_AB     m4, m5, r2d, r3d
867     LOAD_MASK   m0, m1, m2, m3, m4, m5, m7, m6, m4
868     pxor        m4, m4
869     CHROMA_V_LOAD_TC m6, r4
870     psubw       m6, [pw_3]
871     pmaxsw      m6, m4
872     pand        m7, m6
873     DEBLOCK_P0_Q0 m1, m2, m0, m3, m7, m5, m6
874     CHROMA_V_STORE
875 %if mmsize < 16
876     add         r0, mmsize
877     add         r5, mmsize
878     add         r4, mmsize/4
879     dec         r6
880     jg .loop
881     REP_RET
882 %else
883     RET
884 %endif
885
886 ;-----------------------------------------------------------------------------
887 ; void deblock_v_chroma_intra( uint16_t *pix, int stride, int alpha, int beta )
888 ;-----------------------------------------------------------------------------
889 cglobal deblock_v_chroma_intra_10, 4,6-(mmsize/16),8*(mmsize/16)
890     mov         r4, r0
891     sub         r0, r1
892     sub         r0, r1
893     shl        r2d, 2
894     shl        r3d, 2
895 %if mmsize < 16
896     mov         r5, 16/mmsize
897 .loop:
898 %endif
899     CHROMA_V_LOAD r4
900     LOAD_AB     m4, m5, r2d, r3d
901     LOAD_MASK   m0, m1, m2, m3, m4, m5, m7, m6, m4
902     CHROMA_DEBLOCK_P0_Q0_INTRA m1, m2, m0, m3, m7, m5, m6
903     CHROMA_V_STORE
904 %if mmsize < 16
905     add         r0, mmsize
906     add         r4, mmsize
907     dec         r5
908     jg .loop
909     REP_RET
910 %else
911     RET
912 %endif
913 %endmacro
914
915 %if ARCH_X86_64 == 0
916 INIT_MMX mmx2
917 DEBLOCK_CHROMA
918 %endif
919 INIT_XMM sse2
920 DEBLOCK_CHROMA
921 %if HAVE_AVX_EXTERNAL
922 INIT_XMM avx
923 DEBLOCK_CHROMA
924 %endif