]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/h264_deblock_10bit.asm
Merge remote-tracking branch 'qatar/master'
[ffmpeg] / 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 1
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_%1, 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_%1, 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 INIT_XMM
305 %if ARCH_X86_64
306 ; in:  m0=p1, m1=p0, m2=q0, m3=q1, m8=p2, m9=q2
307 ;      m12=alpha, m13=beta
308 ; out: m0=p1', m3=q1', m1=p0', m2=q0'
309 ; clobbers: m4, m5, m6, m7, m10, m11, m14
310 %macro DEBLOCK_LUMA_INTER_SSE2 0
311     LOAD_MASK   m0, m1, m2, m3, m12, m13, m7, m4, m6
312     LOAD_TC     m6, r4
313     DIFF_LT     m8, m1, m13, m10, m4
314     DIFF_LT     m9, m2, m13, m11, m4
315     pand        m6, m7
316
317     mova       m14, m6
318     pxor        m4, m4
319     pcmpgtw     m6, m4
320     pand        m6, m14
321
322     mova        m5, m10
323     pand        m5, m6
324     LUMA_Q1 m8, m0, m1, m2, m5, m4
325
326     mova        m5, m11
327     pand        m5, m6
328     LUMA_Q1 m9, m3, m1, m2, m5, m4
329
330     pxor        m4, m4
331     psubw       m6, m10
332     pcmpgtw     m4, m14
333     pandn       m4, m7
334     psubw       m6, m11
335     pand        m4, m6
336     DEBLOCK_P0_Q0 m1, m2, m0, m3, m4, m5, m6
337
338     SWAP         0, 8
339     SWAP         3, 9
340 %endmacro
341
342 %macro DEBLOCK_LUMA_64 1
343 cglobal deblock_v_luma_10_%1, 5,5,15
344     %define p2 m8
345     %define p1 m0
346     %define p0 m1
347     %define q0 m2
348     %define q1 m3
349     %define q2 m9
350     %define mask0 m7
351     %define mask1 m10
352     %define mask2 m11
353     shl        r2d, 2
354     shl        r3d, 2
355     LOAD_AB    m12, m13, r2d, r3d
356     mov         r2, r0
357     sub         r0, r1
358     sub         r0, r1
359     sub         r0, r1
360     mov         r3, 2
361 .loop:
362     mova        p2, [r0]
363     mova        p1, [r0+r1]
364     mova        p0, [r0+r1*2]
365     mova        q0, [r2]
366     mova        q1, [r2+r1]
367     mova        q2, [r2+r1*2]
368     DEBLOCK_LUMA_INTER_SSE2
369     mova   [r0+r1], p1
370     mova [r0+r1*2], p0
371     mova      [r2], q0
372     mova   [r2+r1], q1
373     add         r0, mmsize
374     add         r2, mmsize
375     add         r4, 2
376     dec         r3
377     jg .loop
378     REP_RET
379
380 cglobal deblock_h_luma_10_%1, 5,7,15
381     shl        r2d, 2
382     shl        r3d, 2
383     LOAD_AB    m12, m13, r2d, r3d
384     mov         r2, r1
385     add         r2, r1
386     add         r2, r1
387     mov         r5, r0
388     add         r5, r2
389     mov         r6, 2
390 .loop:
391     movu        m8, [r0-8]     ; y q2 q1 q0 p0 p1 p2 x
392     movu        m0, [r0+r1-8]
393     movu        m2, [r0+r1*2-8]
394     movu        m9, [r5-8]
395     movu        m5, [r5+r1-8]
396     movu        m1, [r5+r1*2-8]
397     movu        m3, [r5+r2-8]
398     movu        m7, [r5+r1*4-8]
399
400     TRANSPOSE4x4W 8, 0, 2, 9, 10
401     TRANSPOSE4x4W 5, 1, 3, 7, 10
402
403     punpckhqdq  m8, m5
404     SBUTTERFLY qdq, 0, 1, 10
405     SBUTTERFLY qdq, 2, 3, 10
406     punpcklqdq  m9, m7
407
408     DEBLOCK_LUMA_INTER_SSE2
409
410     TRANSPOSE4x4W 0, 1, 2, 3, 4
411     LUMA_H_STORE r5, r2
412     add         r4, 2
413     lea         r0, [r0+r1*8]
414     lea         r5, [r5+r1*8]
415     dec         r6
416     jg .loop
417     REP_RET
418 %endmacro
419
420 INIT_XMM
421 DEBLOCK_LUMA_64 sse2
422 %ifdef HAVE_AVX
423 INIT_AVX
424 DEBLOCK_LUMA_64 avx
425 %endif
426 %endif
427
428 %macro SWAPMOVA 2
429 %ifid %1
430     SWAP %1, %2
431 %else
432     mova %1, %2
433 %endif
434 %endmacro
435
436 ; in: t0-t2: tmp registers
437 ;     %1=p0 %2=p1 %3=p2 %4=p3 %5=q0 %6=q1 %7=mask0
438 ;     %8=mask1p %9=2 %10=p0' %11=p1' %12=p2'
439 %macro LUMA_INTRA_P012 12 ; p0..p3 in memory
440 %if ARCH_X86_64
441     paddw     t0, %3, %2
442     mova      t2, %4
443     paddw     t2, %3
444 %else
445     mova      t0, %3
446     mova      t2, %4
447     paddw     t0, %2
448     paddw     t2, %3
449 %endif
450     paddw     t0, %1
451     paddw     t2, t2
452     paddw     t0, %5
453     paddw     t2, %9
454     paddw     t0, %9    ; (p2 + p1 + p0 + q0 + 2)
455     paddw     t2, t0    ; (2*p3 + 3*p2 + p1 + p0 + q0 + 4)
456
457     psrlw     t2, 3
458     psrlw     t1, t0, 2
459     psubw     t2, %3
460     psubw     t1, %2
461     pand      t2, %8
462     pand      t1, %8
463     paddw     t2, %3
464     paddw     t1, %2
465     SWAPMOVA %11, t1
466
467     psubw     t1, t0, %3
468     paddw     t0, t0
469     psubw     t1, %5
470     psubw     t0, %3
471     paddw     t1, %6
472     paddw     t1, %2
473     paddw     t0, %6
474     psrlw     t1, 2     ; (2*p1 + p0 + q1 + 2)/4
475     psrlw     t0, 3     ; (p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4)>>3
476
477     pxor      t0, t1
478     pxor      t1, %1
479     pand      t0, %8
480     pand      t1, %7
481     pxor      t0, t1
482     pxor      t0, %1
483     SWAPMOVA %10, t0
484     SWAPMOVA %12, t2
485 %endmacro
486
487 %macro LUMA_INTRA_INIT 1
488     %xdefine pad %1*mmsize+((gprsize*3) % mmsize)-(stack_offset&15)
489     %define t0 m4
490     %define t1 m5
491     %define t2 m6
492     %define t3 m7
493     %assign i 4
494 %rep %1
495     CAT_XDEFINE t, i, [rsp+mmsize*(i-4)]
496     %assign i i+1
497 %endrep
498     SUB    rsp, pad
499 %endmacro
500
501 ; in: %1-%3=tmp, %4=p2, %5=q2
502 %macro LUMA_INTRA_INTER 5
503     LOAD_AB t0, t1, r2d, r3d
504     mova    %1, t0
505     LOAD_MASK m0, m1, m2, m3, %1, t1, t0, t2, t3
506 %if ARCH_X86_64
507     mova    %2, t0        ; mask0
508     psrlw   t3, %1, 2
509 %else
510     mova    t3, %1
511     mova    %2, t0        ; mask0
512     psrlw   t3, 2
513 %endif
514     paddw   t3, [pw_2]    ; alpha/4+2
515     DIFF_LT m1, m2, t3, t2, t0 ; t2 = |p0-q0| < alpha/4+2
516     pand    t2, %2
517     mova    t3, %5        ; q2
518     mova    %1, t2        ; mask1
519     DIFF_LT t3, m2, t1, t2, t0 ; t2 = |q2-q0| < beta
520     pand    t2, %1
521     mova    t3, %4        ; p2
522     mova    %3, t2        ; mask1q
523     DIFF_LT t3, m1, t1, t2, t0 ; t2 = |p2-p0| < beta
524     pand    t2, %1
525     mova    %1, t2        ; mask1p
526 %endmacro
527
528 %macro LUMA_H_INTRA_LOAD 0
529 %if mmsize == 8
530     movu    t0, [r0-8]
531     movu    t1, [r0+r1-8]
532     movu    m0, [r0+r1*2-8]
533     movu    m1, [r0+r4-8]
534     TRANSPOSE4x4W 4, 5, 0, 1, 2
535     mova    t4, t0        ; p3
536     mova    t5, t1        ; p2
537
538     movu    m2, [r0]
539     movu    m3, [r0+r1]
540     movu    t0, [r0+r1*2]
541     movu    t1, [r0+r4]
542     TRANSPOSE4x4W 2, 3, 4, 5, 6
543     mova    t6, t0        ; q2
544     mova    t7, t1        ; q3
545 %else
546     movu    t0, [r0-8]
547     movu    t1, [r0+r1-8]
548     movu    m0, [r0+r1*2-8]
549     movu    m1, [r0+r5-8]
550     movu    m2, [r4-8]
551     movu    m3, [r4+r1-8]
552     movu    t2, [r4+r1*2-8]
553     movu    t3, [r4+r5-8]
554     TRANSPOSE8x8W 4, 5, 0, 1, 2, 3, 6, 7, t4, t5
555     mova    t4, t0        ; p3
556     mova    t5, t1        ; p2
557     mova    t6, t2        ; q2
558     mova    t7, t3        ; q3
559 %endif
560 %endmacro
561
562 ; in: %1=q3 %2=q2' %3=q1' %4=q0' %5=p0' %6=p1' %7=p2' %8=p3 %9=tmp
563 %macro LUMA_H_INTRA_STORE 9
564 %if mmsize == 8
565     TRANSPOSE4x4W %1, %2, %3, %4, %9
566     movq       [r0-8], m%1
567     movq       [r0+r1-8], m%2
568     movq       [r0+r1*2-8], m%3
569     movq       [r0+r4-8], m%4
570     movq       m%1, %8
571     TRANSPOSE4x4W %5, %6, %7, %1, %9
572     movq       [r0], m%5
573     movq       [r0+r1], m%6
574     movq       [r0+r1*2], m%7
575     movq       [r0+r4], m%1
576 %else
577     TRANSPOSE2x4x4W %1, %2, %3, %4, %9
578     movq       [r0-8], m%1
579     movq       [r0+r1-8], m%2
580     movq       [r0+r1*2-8], m%3
581     movq       [r0+r5-8], m%4
582     movhps     [r4-8], m%1
583     movhps     [r4+r1-8], m%2
584     movhps     [r4+r1*2-8], m%3
585     movhps     [r4+r5-8], m%4
586 %ifnum %8
587     SWAP       %1, %8
588 %else
589     mova       m%1, %8
590 %endif
591     TRANSPOSE2x4x4W %5, %6, %7, %1, %9
592     movq       [r0], m%5
593     movq       [r0+r1], m%6
594     movq       [r0+r1*2], m%7
595     movq       [r0+r5], m%1
596     movhps     [r4], m%5
597     movhps     [r4+r1], m%6
598     movhps     [r4+r1*2], m%7
599     movhps     [r4+r5], m%1
600 %endif
601 %endmacro
602
603 %if ARCH_X86_64
604 ;-----------------------------------------------------------------------------
605 ; void deblock_v_luma_intra( uint16_t *pix, int stride, int alpha, int beta )
606 ;-----------------------------------------------------------------------------
607 %macro DEBLOCK_LUMA_INTRA_64 1
608 cglobal deblock_v_luma_intra_10_%1, 4,7,16
609     %define t0 m1
610     %define t1 m2
611     %define t2 m4
612     %define p2 m8
613     %define p1 m9
614     %define p0 m10
615     %define q0 m11
616     %define q1 m12
617     %define q2 m13
618     %define aa m5
619     %define bb m14
620     lea     r4, [r1*4]
621     lea     r5, [r1*3] ; 3*stride
622     neg     r4
623     add     r4, r0     ; pix-4*stride
624     mov     r6, 2
625     mova    m0, [pw_2]
626     shl    r2d, 2
627     shl    r3d, 2
628     LOAD_AB aa, bb, r2d, r3d
629 .loop
630     mova    p2, [r4+r1]
631     mova    p1, [r4+2*r1]
632     mova    p0, [r4+r5]
633     mova    q0, [r0]
634     mova    q1, [r0+r1]
635     mova    q2, [r0+2*r1]
636
637     LOAD_MASK p1, p0, q0, q1, aa, bb, m3, t0, t1
638     mova    t2, aa
639     psrlw   t2, 2
640     paddw   t2, m0 ; alpha/4+2
641     DIFF_LT p0, q0, t2, m6, t0 ; m6 = |p0-q0| < alpha/4+2
642     DIFF_LT p2, p0, bb, t1, t0 ; m7 = |p2-p0| < beta
643     DIFF_LT q2, q0, bb, m7, t0 ; t1 = |q2-q0| < beta
644     pand    m6, m3
645     pand    m7, m6
646     pand    m6, t1
647     LUMA_INTRA_P012 p0, p1, p2, [r4], q0, q1, m3, m6, m0, [r4+r5], [r4+2*r1], [r4+r1]
648     LUMA_INTRA_P012 q0, q1, q2, [r0+r5], p0, p1, m3, m7, m0, [r0], [r0+r1], [r0+2*r1]
649     add     r0, mmsize
650     add     r4, mmsize
651     dec     r6
652     jg .loop
653     REP_RET
654
655 ;-----------------------------------------------------------------------------
656 ; void deblock_h_luma_intra( uint16_t *pix, int stride, int alpha, int beta )
657 ;-----------------------------------------------------------------------------
658 cglobal deblock_h_luma_intra_10_%1, 4,7,16
659     %define t0 m15
660     %define t1 m14
661     %define t2 m2
662     %define q3 m5
663     %define q2 m8
664     %define q1 m9
665     %define q0 m10
666     %define p0 m11
667     %define p1 m12
668     %define p2 m13
669     %define p3 m4
670     %define spill [rsp]
671     %assign pad 24-(stack_offset&15)
672     SUB     rsp, pad
673     lea     r4, [r1*4]
674     lea     r5, [r1*3] ; 3*stride
675     add     r4, r0     ; pix+4*stride
676     mov     r6, 2
677     mova    m0, [pw_2]
678     shl    r2d, 2
679     shl    r3d, 2
680 .loop
681     movu    q3, [r0-8]
682     movu    q2, [r0+r1-8]
683     movu    q1, [r0+r1*2-8]
684     movu    q0, [r0+r5-8]
685     movu    p0, [r4-8]
686     movu    p1, [r4+r1-8]
687     movu    p2, [r4+r1*2-8]
688     movu    p3, [r4+r5-8]
689     TRANSPOSE8x8W 5, 8, 9, 10, 11, 12, 13, 4, 1
690
691     LOAD_AB m1, m2, r2d, r3d
692     LOAD_MASK q1, q0, p0, p1, m1, m2, m3, t0, t1
693     psrlw   m1, 2
694     paddw   m1, m0 ; alpha/4+2
695     DIFF_LT p0, q0, m1, m6, t0 ; m6 = |p0-q0| < alpha/4+2
696     DIFF_LT q2, q0, m2, t1, t0 ; t1 = |q2-q0| < beta
697     DIFF_LT p0, p2, m2, m7, t0 ; m7 = |p2-p0| < beta
698     pand    m6, m3
699     pand    m7, m6
700     pand    m6, t1
701
702     mova spill, q3
703     LUMA_INTRA_P012 q0, q1, q2, q3, p0, p1, m3, m6, m0, m5, m1, q2
704     LUMA_INTRA_P012 p0, p1, p2, p3, q0, q1, m3, m7, m0, p0, m6, p2
705     mova    m7, spill
706
707     LUMA_H_INTRA_STORE 7, 8, 1, 5, 11, 6, 13, 4, 14
708
709     lea     r0, [r0+r1*8]
710     lea     r4, [r4+r1*8]
711     dec     r6
712     jg .loop
713     ADD    rsp, pad
714     RET
715 %endmacro
716
717 INIT_XMM
718 DEBLOCK_LUMA_INTRA_64 sse2
719 %ifdef HAVE_AVX
720 INIT_AVX
721 DEBLOCK_LUMA_INTRA_64 avx
722 %endif
723
724 %endif
725
726 %macro DEBLOCK_LUMA_INTRA 1
727 ;-----------------------------------------------------------------------------
728 ; void deblock_v_luma_intra( uint16_t *pix, int stride, int alpha, int beta )
729 ;-----------------------------------------------------------------------------
730 cglobal deblock_v_luma_intra_10_%1, 4,7,8*(mmsize/16)
731     LUMA_INTRA_INIT 3
732     lea     r4, [r1*4]
733     lea     r5, [r1*3]
734     neg     r4
735     add     r4, r0
736     mov     r6, 32/mmsize
737     shl    r2d, 2
738     shl    r3d, 2
739 .loop:
740     mova    m0, [r4+r1*2] ; p1
741     mova    m1, [r4+r5]   ; p0
742     mova    m2, [r0]      ; q0
743     mova    m3, [r0+r1]   ; q1
744     LUMA_INTRA_INTER t4, t5, t6, [r4+r1], [r0+r1*2]
745     LUMA_INTRA_P012 m1, m0, t3, [r4], m2, m3, t5, t4, [pw_2], [r4+r5], [r4+2*r1], [r4+r1]
746     mova    t3, [r0+r1*2] ; q2
747     LUMA_INTRA_P012 m2, m3, t3, [r0+r5], m1, m0, t5, t6, [pw_2], [r0], [r0+r1], [r0+2*r1]
748     add     r0, mmsize
749     add     r4, mmsize
750     dec     r6
751     jg .loop
752     ADD    rsp, pad
753     RET
754
755 ;-----------------------------------------------------------------------------
756 ; void deblock_h_luma_intra( uint16_t *pix, int stride, int alpha, int beta )
757 ;-----------------------------------------------------------------------------
758 cglobal deblock_h_luma_intra_10_%1, 4,7,8*(mmsize/16)
759     LUMA_INTRA_INIT 8
760 %if mmsize == 8
761     lea     r4, [r1*3]
762     mov     r5, 32/mmsize
763 %else
764     lea     r4, [r1*4]
765     lea     r5, [r1*3] ; 3*stride
766     add     r4, r0     ; pix+4*stride
767     mov     r6, 32/mmsize
768 %endif
769     shl    r2d, 2
770     shl    r3d, 2
771 .loop:
772     LUMA_H_INTRA_LOAD
773     LUMA_INTRA_INTER t8, t9, t10, t5, t6
774
775     LUMA_INTRA_P012 m1, m0, t3, t4, m2, m3, t9, t8, [pw_2], t8, t5, t11
776     mova    t3, t6     ; q2
777     LUMA_INTRA_P012 m2, m3, t3, t7, m1, m0, t9, t10, [pw_2], m4, t6, m5
778
779     mova    m2, t4
780     mova    m0, t11
781     mova    m1, t5
782     mova    m3, t8
783     mova    m6, t6
784
785     LUMA_H_INTRA_STORE 2, 0, 1, 3, 4, 6, 5, t7, 7
786
787     lea     r0, [r0+r1*(mmsize/2)]
788 %if mmsize == 8
789     dec     r5
790 %else
791     lea     r4, [r4+r1*(mmsize/2)]
792     dec     r6
793 %endif
794     jg .loop
795     ADD    rsp, pad
796     RET
797 %endmacro
798
799 %if ARCH_X86_64 == 0
800 INIT_MMX
801 DEBLOCK_LUMA mmxext
802 DEBLOCK_LUMA_INTRA mmxext
803 INIT_XMM
804 DEBLOCK_LUMA sse2
805 DEBLOCK_LUMA_INTRA sse2
806 %ifdef HAVE_AVX
807 INIT_AVX
808 DEBLOCK_LUMA avx
809 DEBLOCK_LUMA_INTRA avx
810 %endif
811 %endif
812
813 ; in: %1=p0, %2=q0, %3=p1, %4=q1, %5=mask, %6=tmp, %7=tmp
814 ; out: %1=p0', %2=q0'
815 %macro CHROMA_DEBLOCK_P0_Q0_INTRA 7
816     mova    %6, [pw_2]
817     paddw   %6, %3
818     paddw   %6, %4
819     paddw   %7, %6, %2
820     paddw   %6, %1
821     paddw   %6, %3
822     paddw   %7, %4
823     psraw   %6, 2
824     psraw   %7, 2
825     psubw   %6, %1
826     psubw   %7, %2
827     pand    %6, %5
828     pand    %7, %5
829     paddw   %1, %6
830     paddw   %2, %7
831 %endmacro
832
833 %macro CHROMA_V_LOAD 1
834     mova        m0, [r0]    ; p1
835     mova        m1, [r0+r1] ; p0
836     mova        m2, [%1]    ; q0
837     mova        m3, [%1+r1] ; q1
838 %endmacro
839
840 %macro CHROMA_V_STORE 0
841     mova [r0+1*r1], m1
842     mova [r0+2*r1], m2
843 %endmacro
844
845 %macro CHROMA_V_LOAD_TC 2
846     movd        %1, [%2]
847     punpcklbw   %1, %1
848     punpcklwd   %1, %1
849     psraw       %1, 6
850 %endmacro
851
852 %macro DEBLOCK_CHROMA 1
853 ;-----------------------------------------------------------------------------
854 ; void deblock_v_chroma( uint16_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
855 ;-----------------------------------------------------------------------------
856 cglobal deblock_v_chroma_10_%1, 5,7-(mmsize/16),8*(mmsize/16)
857     mov         r5, r0
858     sub         r0, r1
859     sub         r0, r1
860     shl        r2d, 2
861     shl        r3d, 2
862 %if mmsize < 16
863     mov         r6, 16/mmsize
864 .loop:
865 %endif
866     CHROMA_V_LOAD r5
867     LOAD_AB     m4, m5, r2d, r3d
868     LOAD_MASK   m0, m1, m2, m3, m4, m5, m7, m6, m4
869     pxor        m4, m4
870     CHROMA_V_LOAD_TC m6, r4
871     psubw       m6, [pw_3]
872     pmaxsw      m6, m4
873     pand        m7, m6
874     DEBLOCK_P0_Q0 m1, m2, m0, m3, m7, m5, m6
875     CHROMA_V_STORE
876 %if mmsize < 16
877     add         r0, mmsize
878     add         r5, mmsize
879     add         r4, mmsize/8
880     dec         r6
881     jg .loop
882     REP_RET
883 %else
884     RET
885 %endif
886
887 ;-----------------------------------------------------------------------------
888 ; void deblock_v_chroma_intra( uint16_t *pix, int stride, int alpha, int beta )
889 ;-----------------------------------------------------------------------------
890 cglobal deblock_v_chroma_intra_10_%1, 4,6-(mmsize/16),8*(mmsize/16)
891     mov         r4, r0
892     sub         r0, r1
893     sub         r0, r1
894     shl        r2d, 2
895     shl        r3d, 2
896 %if mmsize < 16
897     mov         r5, 16/mmsize
898 .loop:
899 %endif
900     CHROMA_V_LOAD r4
901     LOAD_AB     m4, m5, r2d, r3d
902     LOAD_MASK   m0, m1, m2, m3, m4, m5, m7, m6, m4
903     CHROMA_DEBLOCK_P0_Q0_INTRA m1, m2, m0, m3, m7, m5, m6
904     CHROMA_V_STORE
905 %if mmsize < 16
906     add         r0, mmsize
907     add         r4, mmsize
908     dec         r5
909     jg .loop
910     REP_RET
911 %else
912     RET
913 %endif
914 %endmacro
915
916 %if ARCH_X86_64 == 0
917 INIT_MMX
918 DEBLOCK_CHROMA mmxext
919 %endif
920 INIT_XMM
921 DEBLOCK_CHROMA sse2
922 %ifdef HAVE_AVX
923 INIT_AVX
924 DEBLOCK_CHROMA avx
925 %endif