Fix missing used attribute for inline assembly variables
[ffmpeg.git] / libavcodec / x86 / hevc_deblock.asm
index b79ed40..85ee480 100644 (file)
 
 SECTION_RODATA
 
-pw_pixel_max: times 8 dw ((1 << 10)-1)
+cextern pw_1023
+%define pw_pixel_max_10 pw_1023
+pw_pixel_max_12: times 8 dw ((1 << 12)-1)
+pw_m2:           times 8 dw -2
+pd_1 :           times 4 dd  1
+
+cextern pw_4
+cextern pw_8
+cextern pw_m1
 
 SECTION .text
 INIT_XMM sse2
 
-; expands to [base],...,[base+7*stride]
-%define PASS8ROWS(base, base3, stride, stride3) \
-    [base], [base+stride], [base+stride*2], [base3], \
-    [base3+stride], [base3+stride*2], [base3+stride3], [base3+stride*4]
-
 ; in: 8 rows of 4 bytes in %4..%11
 ; out: 4 rows of 8 words in m0..m3
 %macro TRANSPOSE4x8B_LOAD 8
@@ -51,37 +54,29 @@ INIT_XMM sse2
     movd             m4, %5
     movd             m6, %6
     movd             m5, %7
-    movd             m7, %8
+    movd             m3, %8
 
     punpcklbw        m4, m6
-    punpcklbw        m5, m7
+    punpcklbw        m5, m3
     punpcklwd        m4, m5
 
     punpckhdq        m2, m0, m4
     punpckldq        m0, m4
-    mova             m1, m0
-    mova             m3, m2
 
     pxor             m5, m5
+    punpckhbw        m1, m0, m5
     punpcklbw        m0, m5
-    punpckhbw        m1, m5
+    punpckhbw        m3, m2, m5
     punpcklbw        m2, m5
-    punpckhbw        m3, m5
 %endmacro
 
 ; in: 4 rows of 8 words in m0..m3
 ; out: 8 rows of 4 bytes in %1..%8
 %macro TRANSPOSE8x4B_STORE 8
-    packuswb         m0, m0
-    packuswb         m1, m1
-    packuswb         m2, m2
-    packuswb         m3, m3
-
-    punpcklbw        m0, m1
-    punpcklbw        m2, m3
-
-    punpckhwd        m6, m0, m2
-    punpcklwd        m0, m2
+    packuswb         m0, m2
+    packuswb         m1, m3
+    SBUTTERFLY bw, 0, 1, 2
+    SBUTTERFLY wd, 0, 1, 2
 
     movd             %1, m0
     pshufd           m0, m0, 0x39
@@ -91,13 +86,13 @@ INIT_XMM sse2
     pshufd           m0, m0, 0x39
     movd             %4, m0
 
-    movd             %5, m6
-    pshufd           m6, m6, 0x39
-    movd             %6, m6
-    pshufd           m6, m6, 0x39
-    movd             %7, m6
-    pshufd           m6, m6, 0x39
-    movd             %8, m6
+    movd             %5, m1
+    pshufd           m1, m1, 0x39
+    movd             %6, m1
+    pshufd           m1, m1, 0x39
+    movd             %7, m1
+    pshufd           m1, m1, 0x39
+    movd             %8, m1
 %endmacro
 
 ; in: 8 rows of 4 words in %4..%11
@@ -116,10 +111,10 @@ INIT_XMM sse2
     movq             m4, %5
     movq             m6, %6
     movq             m5, %7
-    movq             m7, %8
+    movq             m3, %8
 
     punpcklwd        m4, m6
-    punpcklwd        m5, m7
+    punpcklwd        m5, m3
     punpckhdq        m6, m4, m5
     punpckldq        m4, m5
 
@@ -132,39 +127,23 @@ INIT_XMM sse2
 
 ; in: 4 rows of 8 words in m0..m3
 ; out: 8 rows of 4 words in %1..%8
-%macro TRANSPOSE8x4W_STORE 8
-    pxor             m5, m5; zeros reg
-    CLIPW            m0, m5, [pw_pixel_max]
-    CLIPW            m1, m5, [pw_pixel_max]
-    CLIPW            m2, m5, [pw_pixel_max]
-    CLIPW            m3, m5, [pw_pixel_max]
-
-    mova             m4, m0
-    mova             m5, m2
+%macro TRANSPOSE8x4W_STORE 9
+    TRANSPOSE4x4W     0, 1, 2, 3, 4
 
-    punpcklwd        m0, m1
-    punpcklwd        m2, m3
-    punpckhdq        m6, m0, m2
-    punpckldq        m0, m2
+    pxor             m5, m5; zeros reg
+    CLIPW            m0, m5, %9
+    CLIPW            m1, m5, %9
+    CLIPW            m2, m5, %9
+    CLIPW            m3, m5, %9
 
     movq             %1, m0
-    punpckhqdq       m0, m0
-    movq             %2, m0
-    movq             %3, m6
-    punpckhqdq       m6, m6
-    movq             %4, m6
-
-    punpckhwd        m4, m1
-    punpckhwd        m5, m3
-    punpckhdq        m6, m4, m5
-    punpckldq        m4, m5
-
-    movq             %5, m4
-    punpckhqdq       m4, m4
-    movq             %6, m4
-    movq             %7, m6
-    punpckhqdq       m6, m6
-    movq             %8, m6
+    movhps           %2, m0
+    movq             %3, m1
+    movhps           %4, m1
+    movq             %5, m2
+    movhps           %6, m2
+    movq             %7, m3
+    movhps           %8, m3
 %endmacro
 
 ; in: 8 rows of 8 bytes in %1..%8
@@ -215,44 +194,20 @@ INIT_XMM sse2
 ; in: 8 rows of 8 words in m0..m8
 ; out: 8 rows of 8 bytes in %1..%8
 %macro TRANSPOSE8x8B_STORE 8
-    packuswb         m0, m0
-    packuswb         m1, m1
-    packuswb         m2, m2
-    packuswb         m3, m3
-    packuswb         m4, m4
-    packuswb         m5, m5
-    packuswb         m6, m6
-    packuswb         m7, m7
-
-    punpcklbw        m0, m1
-    punpcklbw        m2, m3
-
-    punpckhwd        m8, m0, m2
-    punpcklwd        m0, m2
-
-    punpcklbw        m4, m5
-    punpcklbw        m6, m7
-
-    punpckhwd        m9, m4, m6
-    punpcklwd        m4, m6
-
-    punpckhdq       m10, m0, m4; 2, 3
-    punpckldq        m0, m4;   0, 1
+    packuswb         m0, m4
+    packuswb         m1, m5
+    packuswb         m2, m6
+    packuswb         m3, m7
+    TRANSPOSE2x4x4B   0, 1, 2, 3, 4
 
-    punpckldq       m11, m8, m9;  4, 5
-    punpckhdq        m8, m9;   6, 7
     movq             %1, m0
-    pshufd           m0, m0, 0x4E
-    movq             %2, m0
-    movq             %3, m10
-    pshufd           m10, m10, 0x4E
-    movq             %4, m10
-    movq             %5, m11
-    pshufd          m11, m11, 0x4E
-    movq             %6, m11
-    movq             %7, m8
-    pshufd           m8, m8, 0x4E
-    movq             %8, m8
+    movhps           %2, m0
+    movq             %3, m1
+    movhps           %4, m1
+    movq             %5, m2
+    movhps           %6, m2
+    movq             %7, m3
+    movhps           %8, m3
 %endmacro
 
 ; in: 8 rows of 8 words in %1..%8
@@ -271,18 +226,18 @@ INIT_XMM sse2
 
 ; in: 8 rows of 8 words in m0..m8
 ; out: 8 rows of 8 words in %1..%8
-%macro TRANSPOSE8x8W_STORE 8
+%macro TRANSPOSE8x8W_STORE 9
     TRANSPOSE8x8W     0, 1, 2, 3, 4, 5, 6, 7, 8
 
     pxor             m8, m8
-    CLIPW            m0, m8, [pw_pixel_max]
-    CLIPW            m1, m8, [pw_pixel_max]
-    CLIPW            m2, m8, [pw_pixel_max]
-    CLIPW            m3, m8, [pw_pixel_max]
-    CLIPW            m4, m8, [pw_pixel_max]
-    CLIPW            m5, m8, [pw_pixel_max]
-    CLIPW            m6, m8, [pw_pixel_max]
-    CLIPW            m7, m8, [pw_pixel_max]
+    CLIPW            m0, m8, %9
+    CLIPW            m1, m8, %9
+    CLIPW            m2, m8, %9
+    CLIPW            m3, m8, %9
+    CLIPW            m4, m8, %9
+    CLIPW            m5, m8, %9
+    CLIPW            m6, m8, %9
+    CLIPW            m7, m8, %9
 
     movdqu           %1, m0
     movdqu           %2, m1
@@ -301,8 +256,7 @@ INIT_XMM sse2
 ; clobbers m10
 %macro MASKED_COPY 2
     pand             %2, m11 ; and mask
-    mova            m10, m11
-    pandn           m10, %1; and -mask
+    pandn           m10, m11, %1; and -mask
     por              %2, m10
     mova             %1, %2
 %endmacro
@@ -320,70 +274,56 @@ INIT_XMM sse2
 ALIGN 16
 ; input in m0 ... m3 and tcs in r2. Output in m1 and m2
 %macro CHROMA_DEBLOCK_BODY 1
-    mova             m4, m2; temp copy of q0
-    mova             m5, m0; temp copy of p1
-    psubw            m4, m1; q0 - p0
-    psubw            m5, m3; p1 - q1
+    psubw            m4, m2, m1; q0 - p0
+    psubw            m5, m0, m3; p1 - q1
     psllw            m4, 2; << 2
     paddw            m5, m4;
 
     ;tc calculations
-    movd             m6, [r2]; tc0
-    add              r2, 4;
+    movq             m6, [tcq]; tc0
     punpcklwd        m6, m6
-    movd             m7, [r2]; tc1
-    punpcklwd        m7, m7
-    shufps           m6, m7, 0; tc0, tc1
-    mova             m4, m6
-    pcmpeqw          m7, m7; set all bits to 1
-    pxor             m4, m7; flip all bits of first reg
-    psrlw            m7, 15; 1 in every cell
-    paddw            m4, m7; -tc0, -tc1
+    pshufd           m6, m6, 0xA0; tc0, tc1
+%if cpuflag(ssse3)
+    psignw           m4, m6, [pw_m1]; -tc0, -tc1
+%else
+    pmullw           m4, m6, [pw_m1]; -tc0, -tc1
+%endif
     ;end tc calculations
 
-    psllw            m7, 2; 4 in every cell
-    paddw            m5, m7; +4
+    paddw            m5, [pw_4]; +4
     psraw            m5, 3; >> 3
 
+%if %1 > 8
     psllw            m4, %1-8; << (BIT_DEPTH - 8)
     psllw            m6, %1-8; << (BIT_DEPTH - 8)
+%endif
     pmaxsw           m5, m4
     pminsw           m5, m6
     paddw            m1, m5; p0 + delta0
     psubw            m2, m5; q0 - delta0
 %endmacro
 
-; input in m0 ... m7, betas in r2 tcs in r3. Output in m1...m6
+; input in m0 ... m7, beta in r2 tcs in r3. Output in m1...m6
 %macro LUMA_DEBLOCK_BODY 2
-    mova             m9, m2
-    psllw            m9, 1; *2
-    mova            m10, m1
-    psubw           m10, m9
+    psllw            m9, m2, 1; *2
+    psubw           m10, m1, m9
     paddw           m10, m3
-    ABS1            m10, m10 ; 0dp0, 0dp3 , 1dp0, 1dp3
+    ABS1            m10, m11 ; 0dp0, 0dp3 , 1dp0, 1dp3
 
-    mova             m9, m5
-    psllw            m9, 1; *2
-    mova            m11, m6
-    psubw           m11, m9
+    psllw            m9, m5, 1; *2
+    psubw           m11, m6, m9
     paddw           m11, m4
-    ABS1            m11, m11 ; 0dq0, 0dq3 , 1dq0, 1dq3
+    ABS1            m11, m13 ; 0dq0, 0dq3 , 1dq0, 1dq3
 
     ;beta calculations
-    mov             r11, [betaq];
-    shl             r11, %1 - 8
-    movd            m13, r11; beta0
-    add           betaq, 4;
-    punpcklwd       m13, m13
-    mov             r12, [betaq];
-    shl             r12, %1 - 8
-    movd            m14, r12; beta1
-    punpcklwd       m14, m14
-    pshufd          m13, m14, 0; beta0, beta1
+%if %1 > 8
+    shl             betaq, %1 - 8
+%endif
+    movd            m13, betad
+    SPLATW          m13, m13, 0
     ;end beta calculations
 
-    mova             m9, m10
-    paddw            m9, m11;   0d0, 0d3  ,  1d0, 1d3
+    paddw            m9, m10, m11;   0d0, 0d3  ,  1d0, 1d3
 
     pshufhw         m14, m9, 0x0f ;0b00001111;  0d3 0d3 0d0 0d0 in high
     pshuflw         m14, m14, 0x0f ;0b00001111;  1d3 1d3 1d0 1d0 in low
@@ -392,72 +332,63 @@ ALIGN 16
     pshuflw          m9, m9, 0xf0 ;0b11110000; 1d0 1d0 1d3 1d3
 
     paddw           m14, m9; 0d0+0d3, 1d0+1d3
-    mova            m15, m13; beta0, beta1
 
     ;compare
-    pcmpgtw         m15, m14
+    pcmpgtw         m15, m13, m14
     movmskps        r13, m15 ;filtering mask 0d0 + 0d3 < beta0 (bit 2 or 3) , 1d0 + 1d3 < beta1 (bit 0 or 1)
-    cmp             r13, 0
-    je bypasswrite_macro_%2%1
+    test            r13, r13
+    je              .bypassluma
 
     ;weak / strong decision compare to beta_2
-    mova            m15, m13; beta0, beta1
-    psraw           m15, 2;   beta >> 2
-    mova             m8, m9;
-    psllw            m8, 1;
+    psraw           m15, m13, 2;   beta >> 2
+    psllw            m8, m9, 1;
     pcmpgtw         m15, m8; (d0 << 1) < beta_2, (d3 << 1) < beta_2
-    movmskps        r14, m15;
+    movmskps        r6, m15;
     ;end weak / strong decision
 
     ; weak filter nd_p/q calculation
     pshufd           m8, m10, 0x31
     psrld            m8, 16
     paddw            m8, m10
-    movd             r7, m8
-    and              r7, 0xffff; 1dp0 + 1dp3
+    movd            r7d, m8
     pshufd           m8, m8, 0x4E
-    movd             r8, m8
-    and              r8, 0xffff; 0dp0 + 0dp3
+    movd            r8d, m8
 
     pshufd           m8, m11, 0x31
     psrld            m8, 16
     paddw            m8, m11
-    movd             r9, m8
-    and              r9, 0xffff; 1dq0 + 1dq3
+    movd            r9d, m8
     pshufd           m8, m8, 0x4E
-    movd            r10, m8
-    and             r10, 0xffff; 0dq0 + 0dq3
+    movd           r10d, m8
     ; end calc for weak filter
 
     ; filtering mask
-    mov              r2, r13
-    shr              r2, 3
-    movd            m15, r2
+    mov             r11, r13
+    shr             r11, 3
+    movd            m15, r11d
     and             r13, 1
-    movd            m11, r13
+    movd            m11, r13d
     shufps          m11, m15, 0
-    shl              r2, 1
-    or              r13, r2
+    shl             r11, 1
+    or              r13, r11
 
-    pcmpeqd         m15, m15; set all bits to 1
-    psrld           m15, 31; set to 32bit 1
-    pcmpeqd         m11, m15; filtering mask
+    pcmpeqd         m11, [pd_1]; filtering mask
 
     ;decide between strong and weak filtering
     ;tc25 calculations
-    mov             r2d, [tcq];
-    shl              r2, %1 - 8
-    movd             m8, r2; tc0
-    add             tcq, 4;
-    punpcklwd        m8, m8
-    mov             r3d, [tcq];
+    mov            r11d, [tcq];
+%if %1 > 8
+    shl             r11, %1 - 8
+%endif
+    movd             m8, r11d; tc0
+    mov             r3d, [tcq+4];
+%if %1 > 8
     shl              r3, %1 - 8
-    movd             m9, r3; tc0
-    punpcklwd        m9, m9
-    movd             m9, r3; tc1
-    add             r2d, r3d; tc0 + tc1
-    cmp             r2d, 0;
-    je        bypasswrite_macro_%2%1
+%endif
+    add            r11d, r3d; tc0 + tc1
+    jz             .bypassluma
+    movd             m9, r3d; tc1
+    punpcklwd        m8, m8
     punpcklwd        m9, m9
     shufps           m8, m9, 0; tc0, tc1
     mova             m9, m8
@@ -466,13 +397,11 @@ ALIGN 16
     ;end tc25 calculations
 
     ;----beta_3 comparison-----
-    mova            m12, m0;      p3
-    psubw           m12, m3;      p3 - p0
-    ABS1            m12, m12; abs(p3 - p0)
+    psubw           m12, m0, m3;      p3 - p0
+    ABS1            m12, m14; abs(p3 - p0)
 
-    mova            m15, m7;      q3
-    psubw           m15, m4;      q3 - q0
-    ABS1            m15, m15; abs(q3 - q0)
+    psubw           m15, m7, m4;      q3 - q0
+    ABS1            m15, m14; abs(q3 - q0)
 
     paddw           m12, m15; abs(p3 - p0) + abs(q3 - q0)
 
@@ -481,58 +410,46 @@ ALIGN 16
 
     psraw           m13, 3; beta >> 3
     pcmpgtw         m13, m12;
-    movmskps         r2, m13;
-    and             r14, r2; strong mask , beta_2 and beta_3 comparisons
+    movmskps        r11, m13;
+    and             r6, r11; strong mask , beta_2 and beta_3 comparisons
     ;----beta_3 comparison end-----
     ;----tc25 comparison---
-    mova            m12, m3;      p0
-    psubw           m12, m4;      p0 - q0
-    ABS1            m12, m12; abs(p0 - q0)
+    psubw           m12, m3, m4;      p0 - q0
+    ABS1            m12, m14; abs(p0 - q0)
 
     pshufhw         m12, m12, 0xf0 ;0b11110000;
     pshuflw         m12, m12, 0xf0 ;0b11110000;
 
     pcmpgtw          m8, m12; tc25 comparisons
-    movmskps         r2, m8;
-    and             r14, r2; strong mask, beta_2, beta_3 and tc25 comparisons
+    movmskps        r11, m8;
+    and             r6, r11; strong mask, beta_2, beta_3 and tc25 comparisons
     ;----tc25 comparison end---
-    mov              r2, r14;
-    shr              r2, 1;
-    and             r14, r2; strong mask, bits 2 and 0
-
-    pcmpeqw         m13, m13; set all bits to 1
-    mova            m14, m9; tc
-    pxor            m14, m13; invert bits
-    psrlw           m13, 15; 1 in every cell
-    paddw           m14, m13; -tc
-
-    psllw            m9, 1;  tc * 2
-    psllw           m14, 1; -tc * 2
-
-    and             r14, 5; 0b101
-    mov              r2, r14; strong mask
-    shr             r14, 2;
-    movd            m12, r14; store to xmm for mask generation
-    shl             r14, 1
-    and              r2, 1
-    movd            m10, r2; store to xmm for mask generation
-    or              r14, r2; final strong mask, bits 1 and 0
-    cmp             r14, 0;
-    je      weakfilter_macro_%2%1
+    mov             r11, r6;
+    shr             r11, 1;
+    and             r6, r11; strong mask, bits 2 and 0
+
+    pmullw          m14, m9, [pw_m2]; -tc * 2
+    paddw            m9, m9
+
+    and             r6, 5; 0b101
+    mov             r11, r6; strong mask
+    shr             r6, 2;
+    movd            m12, r6d; store to xmm for mask generation
+    shl             r6, 1
+    and             r11, 1
+    movd            m10, r11d; store to xmm for mask generation
+    or              r6, r11; final strong mask, bits 1 and 0
+    jz      .weakfilter
 
     shufps          m10, m12, 0
+    pcmpeqd         m10, [pd_1]; strong mask
 
-    pcmpeqd         m12, m12; set all bits to 1
-    psrld           m12, 31; set to 32bit 1
-    pcmpeqd         m10, m12; strong mask
-
-    psllw           m13, 2; 4 in every cell
+    mova            m13, [pw_4]; 4 in every cell
     pand            m11, m10; combine filtering mask and strong mask
-    mova            m12, m2;          p1
-    paddw           m12, m3;          p1 +   p0
+    paddw           m12, m2, m3;          p1 +   p0
     paddw           m12, m4;          p1 +   p0 +   q0
     mova            m10, m12; copy
-    psllw           m12, 1;         2*p1 + 2*p0 + 2*q0
+    paddw           m12, m12;       2*p1 + 2*p0 + 2*q0
     paddw           m12, m1;   p2 + 2*p1 + 2*p0 + 2*q0
     paddw           m12, m5;   p2 + 2*p1 + 2*p0 + 2*q0 + q1
     paddw           m12, m13;  p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4
@@ -542,8 +459,7 @@ ALIGN 16
     pminsw          m12, m9; av_clip( , -2 * tc, 2 * tc)
     paddw           m12, m3; p0'
 
-    mova            m15, m1;  p2
-    paddw           m15, m10; p2 + p1 + p0 + q0
+    paddw           m15, m1, m10; p2 + p1 + p0 + q0
     psrlw           m13, 1; 2 in every cell
     paddw           m15, m13; p2 + p1 + p0 + q0 + 2
     psraw           m15, 2;  (p2 + p1 + p0 + q0 + 2) >> 2
@@ -552,12 +468,11 @@ ALIGN 16
     pminsw          m15, m9; av_clip( , -2 * tc, 2 * tc)
     paddw           m15, m2; p1'
 
-    mova             m8, m1;            p2
-    paddw            m8, m0;     p3 +   p2
-    psllw            m8, 1;    2*p3 + 2*p2
+    paddw            m8, m1, m0;     p3 +   p2
+    paddw            m8, m8;   2*p3 + 2*p2
     paddw            m8, m1;   2*p3 + 3*p2
     paddw            m8, m10;  2*p3 + 3*p2 + p1 + p0 + q0
-    psllw           m13, 1; 4 in every cell
+    paddw           m13, m13
     paddw            m8, m13;  2*p3 + 3*p2 + p1 + p0 + q0 + 4
     psraw            m8, 3;   (2*p3 + 3*p2 + p1 + p0 + q0 + 4) >> 3
     psubw            m8, m1; ((2*p3 + 3*p2 + p1 + p0 + q0 + 4) >> 3) - p2
@@ -566,10 +481,9 @@ ALIGN 16
     paddw            m8, m1; p2'
     MASKED_COPY      m1, m8
 
-    mova             m8, m3;         p0
-    paddw            m8, m4;         p0 +   q0
+    paddw            m8, m3, m4;         p0 +   q0
     paddw            m8, m5;         p0 +   q0 +   q1
-    psllw            m8, 1;        2*p0 + 2*q0 + 2*q1
+    paddw            m8, m8;       2*p0 + 2*q0 + 2*q1
     paddw            m8, m2;  p1 + 2*p0 + 2*q0 + 2*q1
     paddw            m8, m6;  p1 + 2*p0 + 2*q0 + 2*q1 + q2
     paddw            m8, m13; p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4
@@ -580,8 +494,7 @@ ALIGN 16
     paddw            m8, m4; q0'
     MASKED_COPY      m2, m15
 
-    mova            m15, m3;   p0
-    paddw           m15, m4;   p0 + q0
+    paddw           m15, m3, m4;   p0 + q0
     paddw           m15, m5;   p0 + q0 + q1
     mova            m10, m15;
     paddw           m15, m6;   p0 + q0 + q1 + q2
@@ -595,8 +508,8 @@ ALIGN 16
 
     paddw           m13, m7;      q3 + 2
     paddw           m13, m6;      q3 +  q2 + 2
-    psllw           m13, 1;     2*q3 + 2*q2 + 4
-    paddw          m13, m6;    2*q3 + 3*q2 + 4
+    paddw           m13, m13;   2*q3 + 2*q2 + 4
+    paddw           m13, m6;    2*q3 + 3*q2 + 4
     paddw           m13, m10;   2*q3 + 3*q2 + q1 + q0 + p0 + 4
     psraw           m13, 3;    (2*q3 + 3*q2 + q1 + q0 + p0 + 4) >> 3
     psubw           m13, m6;  ((2*q3 + 3*q2 + q1 + q0 + p0 + 4) >> 3) - q2
@@ -609,48 +522,32 @@ ALIGN 16
     MASKED_COPY      m4, m8
     MASKED_COPY      m3, m12
 
-weakfilter_macro_%2%1:
-    not             r14; strong mask -> weak mask
-    and             r14, r13; final weak filtering mask, bits 0 and 1
-    cmp             r14, 0;
-    je      ready_macro_%2%1
+.weakfilter:
+    not             r6; strong mask -> weak mask
+    and             r6, r13; final weak filtering mask, bits 0 and 1
+    jz             .store
 
     ; weak filtering mask
-    mov              r2, r14
-    shr              r2, 1
-    movd            m12, r2
-    and             r14, 1
-    movd            m11, r14
+    mov             r11, r6
+    shr             r11, 1
+    movd            m12, r11d
+    and             r6, 1
+    movd            m11, r6d
     shufps          m11, m12, 0
+    pcmpeqd         m11, [pd_1]; filtering mask
 
-    pcmpeqd         m12, m12; set all bits to 1
-    psrld           m12, 31; set to 32bit 1
-    pcmpeqd         m11, m12; filtering mask
-
-    mov             r13, r11; beta0
-    shr             r13, 1;
-    add             r11, r13
-    shr             r11, 3; ((beta0+(beta0>>1))>>3))
-
-    mov             r13, r12; beta1
+    mov             r13, betaq
     shr             r13, 1;
-    add             r12, r13
-    shr             r12, 3; ((beta1+(beta1>>1))>>3))
+    add             betaq, r13
+    shr             betaq, 3; ((beta + (beta >> 1)) >> 3))
 
-    pcmpeqw         m13, m13; set all bits to 1
-    psrlw           m13, 15; 1 in every cell
-    psllw           m13, 3; 8 in every cell
-
-    mova            m12, m4 ; q0
-    psubw           m12, m3 ; q0 - p0
-    mova            m10, m12
-    psllw           m10, 3; 8 * (q0 - p0)
+    mova            m13, [pw_8]
+    psubw           m12, m4, m3 ; q0 - p0
+    psllw           m10, m12, 3; 8 * (q0 - p0)
     paddw           m12, m10 ; 9 * (q0 - p0)
 
-    mova            m10, m5 ; q1
-    psubw           m10, m2 ; q1 - p1
-    mova             m8, m10
-    psllw            m8, 1; 2 * ( q1 - p1 )
+    psubw           m10, m5, m2 ; q1 - p1
+    psllw            m8, m10, 1; 2 * ( q1 - p1 )
     paddw           m10, m8; 3 * ( q1 - p1 )
     psubw           m12, m10; 9 * (q0 - p0) - 3 * ( q1 - p1 )
     paddw           m12, m13; + 8
@@ -658,8 +555,7 @@ weakfilter_macro_%2%1:
     PABSW           m13, m12; abs(delta0)
 
 
-    mova            m10, m9; 2*tc
-    psllw           m10, 2; 8 * tc
+    psllw           m10, m9, 2; 8 * tc
     paddw           m10, m9; 10 * tc
     pcmpgtw         m10, m13
     pand            m11, m10
@@ -670,15 +566,14 @@ weakfilter_macro_%2%1:
     pmaxsw          m12, m14
     pminsw          m12, m9;  av_clip(delta0, -tc, tc)
 
-    pcmpeqw         m13, m13; set all bits to 1
     psraw            m9, 1;   tc -> tc / 2
-    mova            m14, m9;
-    pxor            m14, m13; complement -tc
-    psrlw           m13, 15; set all cells to 1
-    paddw           m14, m13; add 1, -tc / 2
+%if cpuflag(ssse3)
+    psignw          m14, m9, [pw_m1]; -tc / 2
+%else
+    pmullw          m14, m9, [pw_m1]; -tc / 2
+%endif
 
-    mova            m15, m1;    p2
-    pavgw           m15, m3;   (p2 + p0 + 1) >> 1
+    pavgw           m15, m1, m3;   (p2 + p0 + 1) >> 1
     psubw           m15, m2;  ((p2 + p0 + 1) >> 1) - p1
     paddw           m15, m12; ((p2 + p0 + 1) >> 1) - p1 + delta0
     psraw           m15, 1;   (((p2 + p0 + 1) >> 1) - p1 + delta0) >> 1
@@ -687,25 +582,20 @@ weakfilter_macro_%2%1:
     paddw           m15, m2; p1'
 
     ;beta calculations
-    movd            m10, r11; beta0
-    punpcklwd       m10, m10
-    movd            m13, r12; beta1
-    punpcklwd       m13, m13
-    shufps          m10, m13, 0; betax0, betax1
+    movd            m10, betad
+    SPLATW          m10, m10, 0
 
-    movd            m13, r7; 1dp0 + 1dp3
-    movd             m8, r8; 0dp0 + 0dp3
+    movd            m13, r7d; 1dp0 + 1dp3
+    movd             m8, r8d; 0dp0 + 0dp3
     punpcklwd        m8, m8
     punpcklwd       m13, m13
     shufps          m13, m8, 0;
-    mova             m8, m10; copy of beta
-    pcmpgtw          m8, m13
+    pcmpgtw          m8, m10, m13
     pand             m8, m11
     ;end beta calculations
     MASKED_COPY2     m2, m15, m8; write p1'
 
-    mova             m8, m6;    q2
-    pavgw            m8, m4;   (q2 + q0 + 1) >> 1
+    pavgw            m8, m6, m4;   (q2 + q0 + 1) >> 1
     psubw            m8, m5;  ((q2 + q0 + 1) >> 1) - q1
     psubw            m8, m12; ((q2 + q0 + 1) >> 1) - q1 - delta0)
     psraw            m8, 1;   ((q2 + q0 + 1) >> 1) - q1 - delta0) >> 1
@@ -713,8 +603,8 @@ weakfilter_macro_%2%1:
     pminsw           m8, m9; av_clip(deltaq1, -tc/2, tc/2)
     paddw            m8, m5; q1'
 
-    movd            m13, r9;
-    movd            m15, r10;
+    movd            m13, r9d;
+    movd            m15, r10d;
     punpcklwd       m15, m15
     punpcklwd       m13, m13
     shufps          m13, m15, 0; dq0 + dq3
@@ -723,127 +613,168 @@ weakfilter_macro_%2%1:
     pand            m10, m11
     MASKED_COPY2     m5, m8, m10; write q1'
 
-    mova            m15, m3 ; p0
-    paddw           m15, m12 ; p0 + delta0
+    paddw           m15, m3, m12 ; p0 + delta0
     MASKED_COPY      m3, m15
 
-    mova             m8, m4 ; q0
-    psubw            m8, m12 ; q0 - delta0
+    psubw            m8, m4, m12 ; q0 - delta0
     MASKED_COPY      m4, m8
-ready_macro_%2%1:
-    jmp to_store_%2%1
-bypasswrite_macro_%2%1:
-    jmp bypass%2luma_10
 %endmacro
 
-INIT_XMM sse2
 ;-----------------------------------------------------------------------------
-; void ff_hevc_v_loop_filter_chroma(uint8_t *_pix, ptrdiff_t _stride, int *_tc, uint8_t *_no_p, uint8_t *_no_q)
+; void ff_hevc_v_loop_filter_chroma(uint8_t *_pix, ptrdiff_t _stride, int32_t *tc,
+;                                   uint8_t *_no_p, uint8_t *_no_q);
 ;-----------------------------------------------------------------------------
-cglobal hevc_v_loop_filter_chroma_8, 3, 6, 8
-    sub              r0, 2
-    lea              r5, [3*r1]
-    mov              r4, r0
-    add              r0, r5
-    TRANSPOSE4x8B_LOAD  PASS8ROWS(r4, r0, r1, r5)
+%macro LOOP_FILTER_CHROMA 0
+cglobal hevc_v_loop_filter_chroma_8, 3, 5, 7, pix, stride, tc, pix0, r3stride
+    sub            pixq, 2
+    lea       r3strideq, [3*strideq]
+    mov           pix0q, pixq
+    add            pixq, r3strideq
+    TRANSPOSE4x8B_LOAD  PASS8ROWS(pix0q, pixq, strideq, r3strideq)
     CHROMA_DEBLOCK_BODY 8
-    TRANSPOSE8x4B_STORE PASS8ROWS(r4, r0, r1, r5)
+    TRANSPOSE8x4B_STORE PASS8ROWS(pix0q, pixq, strideq, r3strideq)
     RET
 
-cglobal hevc_v_loop_filter_chroma_10, 3, 6, 8
-    sub              r0, 4
-    lea              r5, [3*r1]
-    mov              r4, r0
-    add              r0, r5
-    TRANSPOSE4x8W_LOAD  PASS8ROWS(r4, r0, r1, r5)
+cglobal hevc_v_loop_filter_chroma_10, 3, 5, 7, pix, stride, tc, pix0, r3stride
+    sub            pixq, 4
+    lea       r3strideq, [3*strideq]
+    mov           pix0q, pixq
+    add            pixq, r3strideq
+    TRANSPOSE4x8W_LOAD  PASS8ROWS(pix0q, pixq, strideq, r3strideq)
     CHROMA_DEBLOCK_BODY 10
-    TRANSPOSE8x4W_STORE PASS8ROWS(r4, r0, r1, r5)
+    TRANSPOSE8x4W_STORE PASS8ROWS(pix0q, pixq, strideq, r3strideq), [pw_pixel_max_10]
+    RET
+
+cglobal hevc_v_loop_filter_chroma_12, 3, 5, 7, pix, stride, tc, pix0, r3stride
+    sub            pixq, 4
+    lea       r3strideq, [3*strideq]
+    mov           pix0q, pixq
+    add            pixq, r3strideq
+    TRANSPOSE4x8W_LOAD  PASS8ROWS(pix0q, pixq, strideq, r3strideq)
+    CHROMA_DEBLOCK_BODY 12
+    TRANSPOSE8x4W_STORE PASS8ROWS(pix0q, pixq, strideq, r3strideq), [pw_pixel_max_12]
     RET
 
 ;-----------------------------------------------------------------------------
-; void ff_hevc_h_loop_filter_chroma(uint8_t *_pix, ptrdiff_t _stride, int *_tc, uint8_t *_no_p, uint8_t *_no_q
+; void ff_hevc_h_loop_filter_chroma(uint8_t *_pix, ptrdiff_t _stride, int32_t *tc,
+;                                   uint8_t *_no_p, uint8_t *_no_q);
 ;-----------------------------------------------------------------------------
-cglobal hevc_h_loop_filter_chroma_8, 3, 6, 8
-    mov              r5, r0; pix
-    sub              r5, r1
-    sub              r5, r1
-    movq             m0, [r5];    p1
-    movq             m1, [r5+r1]; p0
-    movq             m2, [r0];    q0
-    movq             m3, [r0+r1]; q1
+cglobal hevc_h_loop_filter_chroma_8, 3, 4, 7, pix, stride, tc, pix0
+    mov           pix0q, pixq
+    sub           pix0q, strideq
+    sub           pix0q, strideq
+    movq             m0, [pix0q];    p1
+    movq             m1, [pix0q+strideq]; p0
+    movq             m2, [pixq];    q0
+    movq             m3, [pixq+strideq]; q1
     pxor             m5, m5; zeros reg
     punpcklbw        m0, m5
     punpcklbw        m1, m5
     punpcklbw        m2, m5
     punpcklbw        m3, m5
     CHROMA_DEBLOCK_BODY  8
-    packuswb         m1, m1 ; p0' packed in bytes on low quadword
-    packuswb         m2, m2 ; q0' packed in bytes on low quadword
-    movq        [r5+r1], m1
-    movq           [r0], m2
+    packuswb         m1, m2
+    movh[pix0q+strideq], m1
+    movhps       [pixq], m1
     RET
 
-cglobal hevc_h_loop_filter_chroma_10, 3, 6, 8
-    mov             r5, r0; pix
-    sub             r5, r1
-    sub             r5, r1
-    movdqu          m0, [r5];    p1
-    movdqu          m1, [r5+r1]; p0
-    movdqu          m2, [r0];    q0
-    movdqu          m3, [r0+r1]; q1
+cglobal hevc_h_loop_filter_chroma_10, 3, 4, 7, pix, stride, tc, pix0
+    mov          pix0q, pixq
+    sub          pix0q, strideq
+    sub          pix0q, strideq
+    movu            m0, [pix0q];    p1
+    movu            m1, [pix0q+strideq]; p0
+    movu            m2, [pixq];    q0
+    movu            m3, [pixq+strideq]; q1
     CHROMA_DEBLOCK_BODY 10
     pxor            m5, m5; zeros reg
-    CLIPW           m1, m5, [pw_pixel_max]
-    CLIPW           m2, m5, [pw_pixel_max]
-    movdqu     [r5+r1], m1
-    movdqu        [r0], m2
+    CLIPW           m1, m5, [pw_pixel_max_10]
+    CLIPW           m2, m5, [pw_pixel_max_10]
+    movu [pix0q+strideq], m1
+    movu        [pixq], m2
     RET
 
+cglobal hevc_h_loop_filter_chroma_12, 3, 4, 7, pix, stride, tc, pix0
+    mov          pix0q, pixq
+    sub          pix0q, strideq
+    sub          pix0q, strideq
+    movu            m0, [pix0q];    p1
+    movu            m1, [pix0q+strideq]; p0
+    movu            m2, [pixq];    q0
+    movu            m3, [pixq+strideq]; q1
+    CHROMA_DEBLOCK_BODY 12
+    pxor            m5, m5; zeros reg
+    CLIPW           m1, m5, [pw_pixel_max_12]
+    CLIPW           m2, m5, [pw_pixel_max_12]
+    movu [pix0q+strideq], m1
+    movu        [pixq], m2
+    RET
+%endmacro
+
+INIT_XMM sse2
+LOOP_FILTER_CHROMA
+INIT_XMM avx
+LOOP_FILTER_CHROMA
+
 %if ARCH_X86_64
-INIT_XMM ssse3
+%macro LOOP_FILTER_LUMA 0
 ;-----------------------------------------------------------------------------
-;    void ff_hevc_v_loop_filter_luma(uint8_t *_pix, ptrdiff_t _stride, int *_beta, int *_tc, uint8_t *_no_p, uint8_t *_no_q);
+; void ff_hevc_v_loop_filter_luma(uint8_t *_pix, ptrdiff_t _stride, int beta,
+;                                 int32_t *tc, uint8_t *_no_p, uint8_t *_no_q);
 ;-----------------------------------------------------------------------------
-cglobal hevc_v_loop_filter_luma_8, 4, 15, 16, pix, stride, beta, tc
-    sub              r0, 4
-    lea              r5, [3*r1]
-    mov              r6, r0
-    add              r0, r5
-    TRANSPOSE8x8B_LOAD  PASS8ROWS(r6, r0, r1, r5)
-        LUMA_DEBLOCK_BODY 8, v
-to_store_v8:
-    TRANSPOSE8x8B_STORE PASS8ROWS(r6, r0, r1, r5)
-bypassvluma_8:
+cglobal hevc_v_loop_filter_luma_8, 4, 14, 16, pix, stride, beta, tc, pix0, src3stride
+    sub            pixq, 4
+    lea           pix0q, [3 * r1]
+    mov     src3strideq, pixq
+    add            pixq, pix0q
+    TRANSPOSE8x8B_LOAD  PASS8ROWS(src3strideq, pixq, r1, pix0q)
+    LUMA_DEBLOCK_BODY 8, v
+.store:
+    TRANSPOSE8x8B_STORE PASS8ROWS(src3strideq, pixq, r1, pix0q)
+.bypassluma:
+    RET
+
+cglobal hevc_v_loop_filter_luma_10, 4, 14, 16, pix, stride, beta, tc, pix0, src3stride
+    sub            pixq, 8
+    lea           pix0q, [3 * strideq]
+    mov     src3strideq, pixq
+    add            pixq, pix0q
+    TRANSPOSE8x8W_LOAD  PASS8ROWS(src3strideq, pixq, strideq, pix0q)
+    LUMA_DEBLOCK_BODY 10, v
+.store:
+    TRANSPOSE8x8W_STORE PASS8ROWS(src3strideq, pixq, r1, pix0q), [pw_pixel_max_10]
+.bypassluma:
     RET
 
-cglobal hevc_v_loop_filter_luma_10, 4, 15, 16, pix, stride, beta, tc
+cglobal hevc_v_loop_filter_luma_12, 4, 14, 16, pix, stride, beta, tc, pix0, src3stride
     sub            pixq, 8
-    lea              r5, [3*strideq]
-    mov              r6, pixq
-    add            pixq, r5
-    TRANSPOSE8x8W_LOAD  PASS8ROWS(r6, pixq, strideq, r5)
-        LUMA_DEBLOCK_BODY 10, v
-to_store_v10:
-    TRANSPOSE8x8W_STORE PASS8ROWS(r6, r0, r1, r5)
-bypassvluma_10:
+    lea           pix0q, [3 * strideq]
+    mov     src3strideq, pixq
+    add            pixq, pix0q
+    TRANSPOSE8x8W_LOAD  PASS8ROWS(src3strideq, pixq, strideq, pix0q)
+    LUMA_DEBLOCK_BODY 12, v
+.store:
+    TRANSPOSE8x8W_STORE PASS8ROWS(src3strideq, pixq, r1, pix0q), [pw_pixel_max_12]
+.bypassluma:
     RET
 
 ;-----------------------------------------------------------------------------
-;    void ff_hevc_h_loop_filter_luma(uint8_t *_pix, ptrdiff_t _stride, int *_beta, int *_tc, uint8_t *_no_p, uint8_t *_no_q);
+; void ff_hevc_h_loop_filter_luma(uint8_t *_pix, ptrdiff_t _stride, int beta,
+;                                 int32_t *tc, uint8_t *_no_p, uint8_t *_no_q);
 ;-----------------------------------------------------------------------------
-cglobal hevc_h_loop_filter_luma_8, 4, 15, 16, pix, stride, beta, tc, count, pix0, src3stride
-    lea     src3strideq, [3*strideq]
+cglobal hevc_h_loop_filter_luma_8, 4, 14, 16, pix, stride, beta, tc, pix0, src3stride
+    lea     src3strideq, [3 * strideq]
     mov           pix0q, pixq
     sub           pix0q, src3strideq
     sub           pix0q, strideq
-    movdqu           m0, [pix0q];       p3
-    movdqu           m1, [pix0q+strideq];    p2
-    movdqu           m2, [pix0q+2*strideq];  p1
-    movdqu           m3, [pix0q+src3strideq];    p0
-    movdqu           m4, [pixq];       q0
-    movdqu           m5, [pixq+strideq];    q1
-    movdqu           m6, [pixq+2*strideq];  q2
-    movdqu           m7, [pixq+src3strideq];    q3
+    movq             m0, [pix0q];               p3
+    movq             m1, [pix0q +     strideq]; p2
+    movq             m2, [pix0q + 2 * strideq]; p1
+    movq             m3, [pix0q + src3strideq]; p0
+    movq             m4, [pixq];                q0
+    movq             m5, [pixq +     strideq];  q1
+    movq             m6, [pixq + 2 * strideq];  q2
+    movq             m7, [pixq + src3strideq];  q3
     pxor             m8, m8
     punpcklbw        m0, m8
     punpcklbw        m1, m8
@@ -853,51 +784,88 @@ cglobal hevc_h_loop_filter_luma_8, 4, 15, 16, pix, stride, beta, tc, count, pix0
     punpcklbw        m5, m8
     punpcklbw        m6, m8
     punpcklbw        m7, m8
-        LUMA_DEBLOCK_BODY 8, h
-to_store_h8:
-    packuswb         m1, m1; p2
-    packuswb         m2, m2; p1
-    packuswb         m3, m3; p0
-    packuswb         m4, m4; q0
-    packuswb         m5, m5; q1
-    packuswb         m6, m6; q2
-    movq        [r5+r1], m1;  p2
-    movq      [r5+2*r1], m2;  p1
-    movq        [r5+r6], m3;  p0
-    movq           [r0], m4;  q0
-    movq        [r0+r1], m5;  q1
-    movq      [r0+2*r1], m6;  q2
-bypasshluma_8:
+    LUMA_DEBLOCK_BODY 8, h
+.store:
+    packuswb          m1, m2
+    packuswb          m3, m4
+    packuswb          m5, m6
+    movh   [pix0q +     strideq], m1
+    movhps [pix0q + 2 * strideq], m1
+    movh   [pix0q + src3strideq], m3
+    movhps [pixq               ], m3
+    movh   [pixq  +     strideq], m5
+    movhps [pixq  + 2 * strideq], m5
+.bypassluma:
     RET
 
-cglobal hevc_h_loop_filter_luma_10, 4, 15, 16, pix, stride, beta, tc, count, pix0, src3stride
-    lea     src3strideq, [3*strideq]
-    mov           pix0q, pixq
-    sub           pix0q, src3strideq
-    sub           pix0q, strideq
-    movdqu           m0, [pix0q];       p3
-    movdqu           m1, [pix0q+strideq];    p2
-    movdqu           m2, [pix0q+2*strideq];  p1
-    movdqu           m3, [pix0q+src3strideq];    p0
-    movdqu           m4, [pixq];       q0
-    movdqu           m5, [pixq+strideq];    q1
-    movdqu           m6, [pixq+2*strideq];  q2
-    movdqu           m7, [pixq+src3strideq];    q3
-        LUMA_DEBLOCK_BODY 10, h
-to_store_h10:
-    pxor             m8, m8; zeros reg
-    CLIPW            m1, m8, [pw_pixel_max]
-    CLIPW            m2, m8, [pw_pixel_max]
-    CLIPW            m3, m8, [pw_pixel_max]
-    CLIPW            m4, m8, [pw_pixel_max]
-    CLIPW            m5, m8, [pw_pixel_max]
-    CLIPW            m6, m8, [pw_pixel_max]
-    movdqu     [pix0q+strideq], m1;  p2
-    movdqu   [pix0q+2*strideq], m2;  p1
-    movdqu [pix0q+src3strideq], m3;  p0
-    movdqu              [pixq], m4;  q0
-    movdqu      [pixq+strideq], m5;  q1
-    movdqu    [pixq+2*strideq], m6;  q2
-bypasshluma_10:
+cglobal hevc_h_loop_filter_luma_10, 4, 14, 16, pix, stride, beta, tc, pix0, src3stride
+    lea                  src3strideq, [3 * strideq]
+    mov                        pix0q, pixq
+    sub                        pix0q, src3strideq
+    sub                        pix0q, strideq
+    movdqu                        m0, [pix0q];               p3
+    movdqu                        m1, [pix0q +     strideq]; p2
+    movdqu                        m2, [pix0q + 2 * strideq]; p1
+    movdqu                        m3, [pix0q + src3strideq]; p0
+    movdqu                        m4, [pixq];                q0
+    movdqu                        m5, [pixq  +     strideq]; q1
+    movdqu                        m6, [pixq  + 2 * strideq]; q2
+    movdqu                        m7, [pixq  + src3strideq]; q3
+    LUMA_DEBLOCK_BODY             10, h
+.store:
+    pxor                          m8, m8; zeros reg
+    CLIPW                         m1, m8, [pw_pixel_max_10]
+    CLIPW                         m2, m8, [pw_pixel_max_10]
+    CLIPW                         m3, m8, [pw_pixel_max_10]
+    CLIPW                         m4, m8, [pw_pixel_max_10]
+    CLIPW                         m5, m8, [pw_pixel_max_10]
+    CLIPW                         m6, m8, [pw_pixel_max_10]
+    movdqu     [pix0q +     strideq], m1;  p2
+    movdqu     [pix0q + 2 * strideq], m2;  p1
+    movdqu     [pix0q + src3strideq], m3;  p0
+    movdqu     [pixq               ], m4;  q0
+    movdqu     [pixq  +     strideq], m5;  q1
+    movdqu     [pixq  + 2 * strideq], m6;  q2
+.bypassluma:
+    RET
+
+cglobal hevc_h_loop_filter_luma_12, 4, 14, 16, pix, stride, beta, tc, pix0, src3stride
+    lea                  src3strideq, [3 * strideq]
+    mov                        pix0q, pixq
+    sub                        pix0q, src3strideq
+    sub                        pix0q, strideq
+    movdqu                        m0, [pix0q];               p3
+    movdqu                        m1, [pix0q +     strideq]; p2
+    movdqu                        m2, [pix0q + 2 * strideq]; p1
+    movdqu                        m3, [pix0q + src3strideq]; p0
+    movdqu                        m4, [pixq];                q0
+    movdqu                        m5, [pixq  +     strideq]; q1
+    movdqu                        m6, [pixq  + 2 * strideq]; q2
+    movdqu                        m7, [pixq  + src3strideq]; q3
+    LUMA_DEBLOCK_BODY             12, h
+.store:
+    pxor                          m8, m8; zeros reg
+    CLIPW                         m1, m8, [pw_pixel_max_12]
+    CLIPW                         m2, m8, [pw_pixel_max_12]
+    CLIPW                         m3, m8, [pw_pixel_max_12]
+    CLIPW                         m4, m8, [pw_pixel_max_12]
+    CLIPW                         m5, m8, [pw_pixel_max_12]
+    CLIPW                         m6, m8, [pw_pixel_max_12]
+    movdqu     [pix0q +     strideq], m1;  p2
+    movdqu     [pix0q + 2 * strideq], m2;  p1
+    movdqu     [pix0q + src3strideq], m3;  p0
+    movdqu     [pixq               ], m4;  q0
+    movdqu     [pixq  +     strideq], m5;  q1
+    movdqu     [pixq  + 2 * strideq], m6;  q2
+.bypassluma:
     RET
+
+%endmacro
+
+INIT_XMM sse2
+LOOP_FILTER_LUMA
+INIT_XMM ssse3
+LOOP_FILTER_LUMA
+INIT_XMM avx
+LOOP_FILTER_LUMA
 %endif