11b362b15af34006e6a11974088a46d42b903418eJohann;
21b362b15af34006e6a11974088a46d42b903418eJohann;  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
31b362b15af34006e6a11974088a46d42b903418eJohann;
41b362b15af34006e6a11974088a46d42b903418eJohann;  Use of this source code is governed by a BSD-style license
51b362b15af34006e6a11974088a46d42b903418eJohann;  that can be found in the LICENSE file in the root of the source
61b362b15af34006e6a11974088a46d42b903418eJohann;  tree. An additional intellectual property rights grant can be found
71b362b15af34006e6a11974088a46d42b903418eJohann;  in the file PATENTS.  All contributing project authors may
81b362b15af34006e6a11974088a46d42b903418eJohann;  be found in the AUTHORS file in the root of the source tree.
91b362b15af34006e6a11974088a46d42b903418eJohann;
101b362b15af34006e6a11974088a46d42b903418eJohann
111b362b15af34006e6a11974088a46d42b903418eJohann
121b362b15af34006e6a11974088a46d42b903418eJohann%include "vpx_ports/x86_abi_support.asm"
131b362b15af34006e6a11974088a46d42b903418eJohann
141b362b15af34006e6a11974088a46d42b903418eJohann%macro LF_ABS 2
151b362b15af34006e6a11974088a46d42b903418eJohann        ; %1 value not preserved
161b362b15af34006e6a11974088a46d42b903418eJohann        ; %2 value preserved
171b362b15af34006e6a11974088a46d42b903418eJohann        ; output in %1
181b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      scratch1, %2            ; v2
191b362b15af34006e6a11974088a46d42b903418eJohann
201b362b15af34006e6a11974088a46d42b903418eJohann        psubusb     scratch1, %1            ; v2 - v1
211b362b15af34006e6a11974088a46d42b903418eJohann        psubusb     %1, %2                  ; v1 - v2
221b362b15af34006e6a11974088a46d42b903418eJohann        por         %1, scratch1            ; abs(v2 - v1)
231b362b15af34006e6a11974088a46d42b903418eJohann%endmacro
241b362b15af34006e6a11974088a46d42b903418eJohann
251b362b15af34006e6a11974088a46d42b903418eJohann%macro LF_FILTER_HEV_MASK 8-9
261b362b15af34006e6a11974088a46d42b903418eJohann
271b362b15af34006e6a11974088a46d42b903418eJohann        LF_ABS      %1, %2                  ; abs(p3 - p2)
281b362b15af34006e6a11974088a46d42b903418eJohann        LF_ABS      %2, %3                  ; abs(p2 - p1)
291b362b15af34006e6a11974088a46d42b903418eJohann        pmaxub      %1, %2                  ; accumulate mask
301b362b15af34006e6a11974088a46d42b903418eJohann%if %0 == 8
311b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      scratch2, %3            ; save p1
321b362b15af34006e6a11974088a46d42b903418eJohann        LF_ABS      scratch2, %4            ; abs(p1 - p0)
331b362b15af34006e6a11974088a46d42b903418eJohann%endif
341b362b15af34006e6a11974088a46d42b903418eJohann        LF_ABS      %4, %5                  ; abs(p0 - q0)
351b362b15af34006e6a11974088a46d42b903418eJohann        LF_ABS      %5, %6                  ; abs(q0 - q1)
361b362b15af34006e6a11974088a46d42b903418eJohann%if %0 == 8
371b362b15af34006e6a11974088a46d42b903418eJohann        pmaxub      %5, scratch2            ; accumulate hev
381b362b15af34006e6a11974088a46d42b903418eJohann%else
391b362b15af34006e6a11974088a46d42b903418eJohann        pmaxub      %5, %9
401b362b15af34006e6a11974088a46d42b903418eJohann%endif
411b362b15af34006e6a11974088a46d42b903418eJohann        pmaxub      %1, %5                  ; accumulate mask
421b362b15af34006e6a11974088a46d42b903418eJohann
431b362b15af34006e6a11974088a46d42b903418eJohann        LF_ABS      %3, %6                  ; abs(p1 - q1)
441b362b15af34006e6a11974088a46d42b903418eJohann        LF_ABS      %6, %7                  ; abs(q1 - q2)
451b362b15af34006e6a11974088a46d42b903418eJohann        pmaxub      %1, %6                  ; accumulate mask
461b362b15af34006e6a11974088a46d42b903418eJohann        LF_ABS      %7, %8                  ; abs(q2 - q3)
471b362b15af34006e6a11974088a46d42b903418eJohann        pmaxub      %1, %7                  ; accumulate mask
481b362b15af34006e6a11974088a46d42b903418eJohann
491b362b15af34006e6a11974088a46d42b903418eJohann        paddusb     %4, %4                  ; 2 * abs(p0 - q0)
501b362b15af34006e6a11974088a46d42b903418eJohann        pand        %3, [GLOBAL(tfe)]
511b362b15af34006e6a11974088a46d42b903418eJohann        psrlw       %3, 1                   ; abs(p1 - q1) / 2
521b362b15af34006e6a11974088a46d42b903418eJohann        paddusb     %4, %3                  ; abs(p0 - q0) * 2 + abs(p1 - q1) / 2
531b362b15af34006e6a11974088a46d42b903418eJohann
541b362b15af34006e6a11974088a46d42b903418eJohann        psubusb     %1, [limit]
551b362b15af34006e6a11974088a46d42b903418eJohann        psubusb     %4, [blimit]
561b362b15af34006e6a11974088a46d42b903418eJohann        por         %1, %4
571b362b15af34006e6a11974088a46d42b903418eJohann        pcmpeqb     %1, zero                ; mask
581b362b15af34006e6a11974088a46d42b903418eJohann
591b362b15af34006e6a11974088a46d42b903418eJohann        psubusb     %5, [thresh]
601b362b15af34006e6a11974088a46d42b903418eJohann        pcmpeqb     %5, zero                ; ~hev
611b362b15af34006e6a11974088a46d42b903418eJohann%endmacro
621b362b15af34006e6a11974088a46d42b903418eJohann
631b362b15af34006e6a11974088a46d42b903418eJohann%macro LF_FILTER 6
641b362b15af34006e6a11974088a46d42b903418eJohann        ; %1-%4: p1-q1
651b362b15af34006e6a11974088a46d42b903418eJohann        ; %5: mask
661b362b15af34006e6a11974088a46d42b903418eJohann        ; %6: hev
671b362b15af34006e6a11974088a46d42b903418eJohann
681b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      scratch2, %6            ; save hev
691b362b15af34006e6a11974088a46d42b903418eJohann
701b362b15af34006e6a11974088a46d42b903418eJohann        pxor        %1, [GLOBAL(t80)]       ; ps1
711b362b15af34006e6a11974088a46d42b903418eJohann        pxor        %4, [GLOBAL(t80)]       ; qs1
721b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      scratch1, %1
731b362b15af34006e6a11974088a46d42b903418eJohann        psubsb      scratch1, %4            ; signed_char_clamp(ps1 - qs1)
741b362b15af34006e6a11974088a46d42b903418eJohann        pandn       scratch2, scratch1      ; vp8_filter &= hev
751b362b15af34006e6a11974088a46d42b903418eJohann
761b362b15af34006e6a11974088a46d42b903418eJohann        pxor        %2, [GLOBAL(t80)]       ; ps0
771b362b15af34006e6a11974088a46d42b903418eJohann        pxor        %3, [GLOBAL(t80)]       ; qs0
781b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      scratch1, %3
791b362b15af34006e6a11974088a46d42b903418eJohann        psubsb      scratch1, %2            ; qs0 - ps0
801b362b15af34006e6a11974088a46d42b903418eJohann        paddsb      scratch2, scratch1      ; vp8_filter += (qs0 - ps0)
811b362b15af34006e6a11974088a46d42b903418eJohann        paddsb      scratch2, scratch1      ; vp8_filter += (qs0 - ps0)
821b362b15af34006e6a11974088a46d42b903418eJohann        paddsb      scratch2, scratch1      ; vp8_filter += (qs0 - ps0)
831b362b15af34006e6a11974088a46d42b903418eJohann        pand        %5, scratch2            ; &= mask
841b362b15af34006e6a11974088a46d42b903418eJohann
851b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      scratch2, %5
861b362b15af34006e6a11974088a46d42b903418eJohann        paddsb      %5, [GLOBAL(t4)]        ; Filter1
871b362b15af34006e6a11974088a46d42b903418eJohann        paddsb      scratch2, [GLOBAL(t3)]  ; Filter2
881b362b15af34006e6a11974088a46d42b903418eJohann
891b362b15af34006e6a11974088a46d42b903418eJohann        ; Filter1 >> 3
901b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      scratch1, zero
911b362b15af34006e6a11974088a46d42b903418eJohann        pcmpgtb     scratch1, %5
921b362b15af34006e6a11974088a46d42b903418eJohann        psrlw       %5, 3
931b362b15af34006e6a11974088a46d42b903418eJohann        pand        scratch1, [GLOBAL(te0)]
941b362b15af34006e6a11974088a46d42b903418eJohann        pand        %5, [GLOBAL(t1f)]
951b362b15af34006e6a11974088a46d42b903418eJohann        por         %5, scratch1
961b362b15af34006e6a11974088a46d42b903418eJohann
971b362b15af34006e6a11974088a46d42b903418eJohann        psubsb      %3, %5                  ; qs0 - Filter1
981b362b15af34006e6a11974088a46d42b903418eJohann        pxor        %3, [GLOBAL(t80)]
991b362b15af34006e6a11974088a46d42b903418eJohann
1001b362b15af34006e6a11974088a46d42b903418eJohann        ; Filter2 >> 3
1011b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      scratch1, zero
1021b362b15af34006e6a11974088a46d42b903418eJohann        pcmpgtb     scratch1, scratch2
1031b362b15af34006e6a11974088a46d42b903418eJohann        psrlw       scratch2, 3
1041b362b15af34006e6a11974088a46d42b903418eJohann        pand        scratch1, [GLOBAL(te0)]
1051b362b15af34006e6a11974088a46d42b903418eJohann        pand        scratch2, [GLOBAL(t1f)]
1061b362b15af34006e6a11974088a46d42b903418eJohann        por         scratch2, scratch1
1071b362b15af34006e6a11974088a46d42b903418eJohann
1081b362b15af34006e6a11974088a46d42b903418eJohann        paddsb      %2, scratch2            ; ps0 + Filter2
1091b362b15af34006e6a11974088a46d42b903418eJohann        pxor        %2, [GLOBAL(t80)]
1101b362b15af34006e6a11974088a46d42b903418eJohann
1111b362b15af34006e6a11974088a46d42b903418eJohann        ; outer tap adjustments
1121b362b15af34006e6a11974088a46d42b903418eJohann        paddsb      %5, [GLOBAL(t1)]
1131b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      scratch1, zero
1141b362b15af34006e6a11974088a46d42b903418eJohann        pcmpgtb     scratch1, %5
1151b362b15af34006e6a11974088a46d42b903418eJohann        psrlw       %5, 1
1161b362b15af34006e6a11974088a46d42b903418eJohann        pand        scratch1, [GLOBAL(t80)]
1171b362b15af34006e6a11974088a46d42b903418eJohann        pand        %5, [GLOBAL(t7f)]
1181b362b15af34006e6a11974088a46d42b903418eJohann        por         %5, scratch1
1191b362b15af34006e6a11974088a46d42b903418eJohann        pand        %5, %6                  ; vp8_filter &= ~hev
1201b362b15af34006e6a11974088a46d42b903418eJohann
1211b362b15af34006e6a11974088a46d42b903418eJohann        psubsb      %4, %5                  ; qs1 - vp8_filter
1221b362b15af34006e6a11974088a46d42b903418eJohann        pxor        %4, [GLOBAL(t80)]
1231b362b15af34006e6a11974088a46d42b903418eJohann
1241b362b15af34006e6a11974088a46d42b903418eJohann        paddsb      %1, %5                  ; ps1 + vp8_filter
1251b362b15af34006e6a11974088a46d42b903418eJohann        pxor        %1, [GLOBAL(t80)]
1261b362b15af34006e6a11974088a46d42b903418eJohann%endmacro
1271b362b15af34006e6a11974088a46d42b903418eJohann
1281b362b15af34006e6a11974088a46d42b903418eJohann;void vp8_loop_filter_bh_y_sse2
1291b362b15af34006e6a11974088a46d42b903418eJohann;(
1301b362b15af34006e6a11974088a46d42b903418eJohann;    unsigned char *src_ptr,
1311b362b15af34006e6a11974088a46d42b903418eJohann;    int            src_pixel_step,
1321b362b15af34006e6a11974088a46d42b903418eJohann;    const char    *blimit,
1331b362b15af34006e6a11974088a46d42b903418eJohann;    const char    *limit,
1341b362b15af34006e6a11974088a46d42b903418eJohann;    const char    *thresh
1351b362b15af34006e6a11974088a46d42b903418eJohann;)
1361b362b15af34006e6a11974088a46d42b903418eJohannglobal sym(vp8_loop_filter_bh_y_sse2) PRIVATE
1371b362b15af34006e6a11974088a46d42b903418eJohannsym(vp8_loop_filter_bh_y_sse2):
1381b362b15af34006e6a11974088a46d42b903418eJohann
139ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang%if LIBVPX_YASM_WIN64
1401b362b15af34006e6a11974088a46d42b903418eJohann    %define src      rcx ; src_ptr
1411b362b15af34006e6a11974088a46d42b903418eJohann    %define stride   rdx ; src_pixel_step
1421b362b15af34006e6a11974088a46d42b903418eJohann    %define blimit   r8
1431b362b15af34006e6a11974088a46d42b903418eJohann    %define limit    r9
1441b362b15af34006e6a11974088a46d42b903418eJohann    %define thresh   r10
1451b362b15af34006e6a11974088a46d42b903418eJohann
1461b362b15af34006e6a11974088a46d42b903418eJohann    %define spp      rax
1471b362b15af34006e6a11974088a46d42b903418eJohann    %define stride3  r11
1481b362b15af34006e6a11974088a46d42b903418eJohann    %define stride5  r12
1491b362b15af34006e6a11974088a46d42b903418eJohann    %define stride7  r13
1501b362b15af34006e6a11974088a46d42b903418eJohann
1511b362b15af34006e6a11974088a46d42b903418eJohann    push    rbp
1521b362b15af34006e6a11974088a46d42b903418eJohann    mov     rbp, rsp
153ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    SAVE_XMM 11
1541b362b15af34006e6a11974088a46d42b903418eJohann    push    r12
1551b362b15af34006e6a11974088a46d42b903418eJohann    push    r13
1561b362b15af34006e6a11974088a46d42b903418eJohann    mov     thresh, arg(4)
1571b362b15af34006e6a11974088a46d42b903418eJohann%else
1581b362b15af34006e6a11974088a46d42b903418eJohann    %define src      rdi ; src_ptr
1591b362b15af34006e6a11974088a46d42b903418eJohann    %define stride   rsi ; src_pixel_step
1601b362b15af34006e6a11974088a46d42b903418eJohann    %define blimit   rdx
1611b362b15af34006e6a11974088a46d42b903418eJohann    %define limit    rcx
1621b362b15af34006e6a11974088a46d42b903418eJohann    %define thresh   r8
1631b362b15af34006e6a11974088a46d42b903418eJohann
1641b362b15af34006e6a11974088a46d42b903418eJohann    %define spp      rax
1651b362b15af34006e6a11974088a46d42b903418eJohann    %define stride3  r9
1661b362b15af34006e6a11974088a46d42b903418eJohann    %define stride5  r10
1671b362b15af34006e6a11974088a46d42b903418eJohann    %define stride7  r11
1681b362b15af34006e6a11974088a46d42b903418eJohann%endif
1691b362b15af34006e6a11974088a46d42b903418eJohann
1701b362b15af34006e6a11974088a46d42b903418eJohann    %define scratch1 xmm5
1711b362b15af34006e6a11974088a46d42b903418eJohann    %define scratch2 xmm6
1721b362b15af34006e6a11974088a46d42b903418eJohann    %define zero     xmm7
1731b362b15af34006e6a11974088a46d42b903418eJohann
1741b362b15af34006e6a11974088a46d42b903418eJohann    %define i0       [src]
1751b362b15af34006e6a11974088a46d42b903418eJohann    %define i1       [spp]
1761b362b15af34006e6a11974088a46d42b903418eJohann    %define i2       [src + 2 * stride]
1771b362b15af34006e6a11974088a46d42b903418eJohann    %define i3       [spp + 2 * stride]
1781b362b15af34006e6a11974088a46d42b903418eJohann    %define i4       [src + 4 * stride]
1791b362b15af34006e6a11974088a46d42b903418eJohann    %define i5       [spp + 4 * stride]
1801b362b15af34006e6a11974088a46d42b903418eJohann    %define i6       [src + 2 * stride3]
1811b362b15af34006e6a11974088a46d42b903418eJohann    %define i7       [spp + 2 * stride3]
1821b362b15af34006e6a11974088a46d42b903418eJohann    %define i8       [src + 8 * stride]
1831b362b15af34006e6a11974088a46d42b903418eJohann    %define i9       [spp + 8 * stride]
1841b362b15af34006e6a11974088a46d42b903418eJohann    %define i10      [src + 2 * stride5]
1851b362b15af34006e6a11974088a46d42b903418eJohann    %define i11      [spp + 2 * stride5]
1861b362b15af34006e6a11974088a46d42b903418eJohann    %define i12      [src + 4 * stride3]
1871b362b15af34006e6a11974088a46d42b903418eJohann    %define i13      [spp + 4 * stride3]
1881b362b15af34006e6a11974088a46d42b903418eJohann    %define i14      [src + 2 * stride7]
1891b362b15af34006e6a11974088a46d42b903418eJohann    %define i15      [spp + 2 * stride7]
1901b362b15af34006e6a11974088a46d42b903418eJohann
1911b362b15af34006e6a11974088a46d42b903418eJohann    ; prep work
1921b362b15af34006e6a11974088a46d42b903418eJohann    lea         spp, [src + stride]
1931b362b15af34006e6a11974088a46d42b903418eJohann    lea         stride3, [stride + 2 * stride]
1941b362b15af34006e6a11974088a46d42b903418eJohann    lea         stride5, [stride3 + 2 * stride]
1951b362b15af34006e6a11974088a46d42b903418eJohann    lea         stride7, [stride3 + 4 * stride]
1961b362b15af34006e6a11974088a46d42b903418eJohann    pxor        zero, zero
1971b362b15af34006e6a11974088a46d42b903418eJohann
1981b362b15af34006e6a11974088a46d42b903418eJohann        ; load the first set into registers
1991b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm0, i0
2001b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm1, i1
2011b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm2, i2
2021b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm3, i3
2031b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm4, i4
2041b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm8, i5
2051b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm9, i6   ; q2, will contain abs(p1-p0)
2061b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm10, i7
2071b362b15af34006e6a11974088a46d42b903418eJohannLF_FILTER_HEV_MASK xmm0, xmm1, xmm2, xmm3, xmm4, xmm8, xmm9, xmm10
2081b362b15af34006e6a11974088a46d42b903418eJohann
2091b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm1, i2
2101b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm2, i3
2111b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm3, i4
2121b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm8, i5
2131b362b15af34006e6a11974088a46d42b903418eJohannLF_FILTER xmm1, xmm2, xmm3, xmm8, xmm0, xmm4
2141b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i2, xmm1
2151b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i3, xmm2
2161b362b15af34006e6a11974088a46d42b903418eJohann
2171b362b15af34006e6a11974088a46d42b903418eJohann; second set
2181b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i4, xmm3
2191b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i5, xmm8
2201b362b15af34006e6a11974088a46d42b903418eJohann
2211b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm0, i6
2221b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm1, i7
2231b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm2, i8
2241b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm4, i9
2251b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm10, i10   ; q2, will contain abs(p1-p0)
2261b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm11, i11
2271b362b15af34006e6a11974088a46d42b903418eJohannLF_FILTER_HEV_MASK xmm3, xmm8, xmm0, xmm1, xmm2, xmm4, xmm10, xmm11, xmm9
2281b362b15af34006e6a11974088a46d42b903418eJohann
2291b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm0, i6
2301b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm1, i7
2311b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm4, i8
2321b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm8, i9
2331b362b15af34006e6a11974088a46d42b903418eJohannLF_FILTER xmm0, xmm1, xmm4, xmm8, xmm3, xmm2
2341b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i6, xmm0
2351b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i7, xmm1
2361b362b15af34006e6a11974088a46d42b903418eJohann
2371b362b15af34006e6a11974088a46d42b903418eJohann; last set
2381b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i8, xmm4
2391b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i9, xmm8
2401b362b15af34006e6a11974088a46d42b903418eJohann
2411b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm0, i10
2421b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm1, i11
2431b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm2, i12
2441b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm3, i13
2451b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm9, i14   ; q2, will contain abs(p1-p0)
2461b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm11, i15
2471b362b15af34006e6a11974088a46d42b903418eJohannLF_FILTER_HEV_MASK xmm4, xmm8, xmm0, xmm1, xmm2, xmm3, xmm9, xmm11, xmm10
2481b362b15af34006e6a11974088a46d42b903418eJohann
2491b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm0, i10
2501b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm1, i11
2511b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm3, i12
2521b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm8, i13
2531b362b15af34006e6a11974088a46d42b903418eJohannLF_FILTER xmm0, xmm1, xmm3, xmm8, xmm4, xmm2
2541b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i10, xmm0
2551b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i11, xmm1
2561b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i12, xmm3
2571b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i13, xmm8
2581b362b15af34006e6a11974088a46d42b903418eJohann
259ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang%if LIBVPX_YASM_WIN64
2601b362b15af34006e6a11974088a46d42b903418eJohann    pop    r13
2611b362b15af34006e6a11974088a46d42b903418eJohann    pop    r12
262ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    RESTORE_XMM
2631b362b15af34006e6a11974088a46d42b903418eJohann    pop    rbp
2641b362b15af34006e6a11974088a46d42b903418eJohann%endif
2651b362b15af34006e6a11974088a46d42b903418eJohann
2661b362b15af34006e6a11974088a46d42b903418eJohann    ret
2671b362b15af34006e6a11974088a46d42b903418eJohann
2681b362b15af34006e6a11974088a46d42b903418eJohann
2691b362b15af34006e6a11974088a46d42b903418eJohann;void vp8_loop_filter_bv_y_sse2
2701b362b15af34006e6a11974088a46d42b903418eJohann;(
2711b362b15af34006e6a11974088a46d42b903418eJohann;    unsigned char *src_ptr,
2721b362b15af34006e6a11974088a46d42b903418eJohann;    int            src_pixel_step,
2731b362b15af34006e6a11974088a46d42b903418eJohann;    const char    *blimit,
2741b362b15af34006e6a11974088a46d42b903418eJohann;    const char    *limit,
2751b362b15af34006e6a11974088a46d42b903418eJohann;    const char    *thresh
2761b362b15af34006e6a11974088a46d42b903418eJohann;)
2771b362b15af34006e6a11974088a46d42b903418eJohann
2781b362b15af34006e6a11974088a46d42b903418eJohannglobal sym(vp8_loop_filter_bv_y_sse2) PRIVATE
2791b362b15af34006e6a11974088a46d42b903418eJohannsym(vp8_loop_filter_bv_y_sse2):
2801b362b15af34006e6a11974088a46d42b903418eJohann
281ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang%if LIBVPX_YASM_WIN64
2821b362b15af34006e6a11974088a46d42b903418eJohann    %define src      rcx ; src_ptr
2831b362b15af34006e6a11974088a46d42b903418eJohann    %define stride   rdx ; src_pixel_step
2841b362b15af34006e6a11974088a46d42b903418eJohann    %define blimit   r8
2851b362b15af34006e6a11974088a46d42b903418eJohann    %define limit    r9
2861b362b15af34006e6a11974088a46d42b903418eJohann    %define thresh   r10
2871b362b15af34006e6a11974088a46d42b903418eJohann
2881b362b15af34006e6a11974088a46d42b903418eJohann    %define spp      rax
2891b362b15af34006e6a11974088a46d42b903418eJohann    %define stride3  r11
2901b362b15af34006e6a11974088a46d42b903418eJohann    %define stride5  r12
2911b362b15af34006e6a11974088a46d42b903418eJohann    %define stride7  r13
2921b362b15af34006e6a11974088a46d42b903418eJohann
2931b362b15af34006e6a11974088a46d42b903418eJohann    push    rbp
2941b362b15af34006e6a11974088a46d42b903418eJohann    mov     rbp, rsp
2951b362b15af34006e6a11974088a46d42b903418eJohann    SAVE_XMM 15
2961b362b15af34006e6a11974088a46d42b903418eJohann    push    r12
2971b362b15af34006e6a11974088a46d42b903418eJohann    push    r13
2981b362b15af34006e6a11974088a46d42b903418eJohann    mov     thresh, arg(4)
2991b362b15af34006e6a11974088a46d42b903418eJohann%else
3001b362b15af34006e6a11974088a46d42b903418eJohann    %define src      rdi
3011b362b15af34006e6a11974088a46d42b903418eJohann    %define stride   rsi
3021b362b15af34006e6a11974088a46d42b903418eJohann    %define blimit   rdx
3031b362b15af34006e6a11974088a46d42b903418eJohann    %define limit    rcx
3041b362b15af34006e6a11974088a46d42b903418eJohann    %define thresh   r8
3051b362b15af34006e6a11974088a46d42b903418eJohann
3061b362b15af34006e6a11974088a46d42b903418eJohann    %define spp      rax
3071b362b15af34006e6a11974088a46d42b903418eJohann    %define stride3  r9
3081b362b15af34006e6a11974088a46d42b903418eJohann    %define stride5  r10
3091b362b15af34006e6a11974088a46d42b903418eJohann    %define stride7  r11
3101b362b15af34006e6a11974088a46d42b903418eJohann%endif
3111b362b15af34006e6a11974088a46d42b903418eJohann
3121b362b15af34006e6a11974088a46d42b903418eJohann    %define scratch1 xmm5
3131b362b15af34006e6a11974088a46d42b903418eJohann    %define scratch2 xmm6
3141b362b15af34006e6a11974088a46d42b903418eJohann    %define zero     xmm7
3151b362b15af34006e6a11974088a46d42b903418eJohann
3161b362b15af34006e6a11974088a46d42b903418eJohann    %define s0       [src]
3171b362b15af34006e6a11974088a46d42b903418eJohann    %define s1       [spp]
3181b362b15af34006e6a11974088a46d42b903418eJohann    %define s2       [src + 2 * stride]
3191b362b15af34006e6a11974088a46d42b903418eJohann    %define s3       [spp + 2 * stride]
3201b362b15af34006e6a11974088a46d42b903418eJohann    %define s4       [src + 4 * stride]
3211b362b15af34006e6a11974088a46d42b903418eJohann    %define s5       [spp + 4 * stride]
3221b362b15af34006e6a11974088a46d42b903418eJohann    %define s6       [src + 2 * stride3]
3231b362b15af34006e6a11974088a46d42b903418eJohann    %define s7       [spp + 2 * stride3]
3241b362b15af34006e6a11974088a46d42b903418eJohann    %define s8       [src + 8 * stride]
3251b362b15af34006e6a11974088a46d42b903418eJohann    %define s9       [spp + 8 * stride]
3261b362b15af34006e6a11974088a46d42b903418eJohann    %define s10      [src + 2 * stride5]
3271b362b15af34006e6a11974088a46d42b903418eJohann    %define s11      [spp + 2 * stride5]
3281b362b15af34006e6a11974088a46d42b903418eJohann    %define s12      [src + 4 * stride3]
3291b362b15af34006e6a11974088a46d42b903418eJohann    %define s13      [spp + 4 * stride3]
3301b362b15af34006e6a11974088a46d42b903418eJohann    %define s14      [src + 2 * stride7]
3311b362b15af34006e6a11974088a46d42b903418eJohann    %define s15      [spp + 2 * stride7]
3321b362b15af34006e6a11974088a46d42b903418eJohann
3331b362b15af34006e6a11974088a46d42b903418eJohann    %define i0       [rsp]
3341b362b15af34006e6a11974088a46d42b903418eJohann    %define i1       [rsp + 16]
3351b362b15af34006e6a11974088a46d42b903418eJohann    %define i2       [rsp + 32]
3361b362b15af34006e6a11974088a46d42b903418eJohann    %define i3       [rsp + 48]
3371b362b15af34006e6a11974088a46d42b903418eJohann    %define i4       [rsp + 64]
3381b362b15af34006e6a11974088a46d42b903418eJohann    %define i5       [rsp + 80]
3391b362b15af34006e6a11974088a46d42b903418eJohann    %define i6       [rsp + 96]
3401b362b15af34006e6a11974088a46d42b903418eJohann    %define i7       [rsp + 112]
3411b362b15af34006e6a11974088a46d42b903418eJohann    %define i8       [rsp + 128]
3421b362b15af34006e6a11974088a46d42b903418eJohann    %define i9       [rsp + 144]
3431b362b15af34006e6a11974088a46d42b903418eJohann    %define i10      [rsp + 160]
3441b362b15af34006e6a11974088a46d42b903418eJohann    %define i11      [rsp + 176]
3451b362b15af34006e6a11974088a46d42b903418eJohann    %define i12      [rsp + 192]
3461b362b15af34006e6a11974088a46d42b903418eJohann    %define i13      [rsp + 208]
3471b362b15af34006e6a11974088a46d42b903418eJohann    %define i14      [rsp + 224]
3481b362b15af34006e6a11974088a46d42b903418eJohann    %define i15      [rsp + 240]
3491b362b15af34006e6a11974088a46d42b903418eJohann
3501b362b15af34006e6a11974088a46d42b903418eJohann    ALIGN_STACK 16, rax
3511b362b15af34006e6a11974088a46d42b903418eJohann
3521b362b15af34006e6a11974088a46d42b903418eJohann    ; reserve stack space
3531b362b15af34006e6a11974088a46d42b903418eJohann    %define      temp_storage  0 ; size is 256 (16*16)
3541b362b15af34006e6a11974088a46d42b903418eJohann    %define      stack_size 256
3551b362b15af34006e6a11974088a46d42b903418eJohann    sub          rsp, stack_size
3561b362b15af34006e6a11974088a46d42b903418eJohann
3571b362b15af34006e6a11974088a46d42b903418eJohann    ; prep work
3581b362b15af34006e6a11974088a46d42b903418eJohann    lea         spp, [src + stride]
3591b362b15af34006e6a11974088a46d42b903418eJohann    lea         stride3, [stride + 2 * stride]
3601b362b15af34006e6a11974088a46d42b903418eJohann    lea         stride5, [stride3 + 2 * stride]
3611b362b15af34006e6a11974088a46d42b903418eJohann    lea         stride7, [stride3 + 4 * stride]
3621b362b15af34006e6a11974088a46d42b903418eJohann
3631b362b15af34006e6a11974088a46d42b903418eJohann        ; 8-f
3641b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm0, s8
3651b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm1, xmm0
3661b362b15af34006e6a11974088a46d42b903418eJohann        punpcklbw   xmm0, s9                ; 80 90
3671b362b15af34006e6a11974088a46d42b903418eJohann        punpckhbw   xmm1, s9                ; 88 98
3681b362b15af34006e6a11974088a46d42b903418eJohann
3691b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm2, s10
3701b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm3, xmm2
3711b362b15af34006e6a11974088a46d42b903418eJohann        punpcklbw   xmm2, s11 ; a0 b0
3721b362b15af34006e6a11974088a46d42b903418eJohann        punpckhbw   xmm3, s11 ; a8 b8
3731b362b15af34006e6a11974088a46d42b903418eJohann
3741b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm4, xmm0
3751b362b15af34006e6a11974088a46d42b903418eJohann        punpcklwd   xmm0, xmm2              ; 80 90 a0 b0
3761b362b15af34006e6a11974088a46d42b903418eJohann        punpckhwd   xmm4, xmm2              ; 84 94 a4 b4
3771b362b15af34006e6a11974088a46d42b903418eJohann
3781b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm2, xmm1
3791b362b15af34006e6a11974088a46d42b903418eJohann        punpcklwd   xmm1, xmm3              ; 88 98 a8 b8
3801b362b15af34006e6a11974088a46d42b903418eJohann        punpckhwd   xmm2, xmm3              ; 8c 9c ac bc
3811b362b15af34006e6a11974088a46d42b903418eJohann
3821b362b15af34006e6a11974088a46d42b903418eJohann        ; using xmm[0124]
3831b362b15af34006e6a11974088a46d42b903418eJohann        ; work on next 4 rows
3841b362b15af34006e6a11974088a46d42b903418eJohann
3851b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm3, s12
3861b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm5, xmm3
3871b362b15af34006e6a11974088a46d42b903418eJohann        punpcklbw   xmm3, s13 ; c0 d0
3881b362b15af34006e6a11974088a46d42b903418eJohann        punpckhbw   xmm5, s13 ; c8 d8
3891b362b15af34006e6a11974088a46d42b903418eJohann
3901b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm6, s14
3911b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm7, xmm6
3921b362b15af34006e6a11974088a46d42b903418eJohann        punpcklbw   xmm6, s15 ; e0 f0
3931b362b15af34006e6a11974088a46d42b903418eJohann        punpckhbw   xmm7, s15 ; e8 f8
3941b362b15af34006e6a11974088a46d42b903418eJohann
3951b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm8, xmm3
3961b362b15af34006e6a11974088a46d42b903418eJohann        punpcklwd   xmm3, xmm6              ; c0 d0 e0 f0
3971b362b15af34006e6a11974088a46d42b903418eJohann        punpckhwd   xmm8, xmm6              ; c4 d4 e4 f4
3981b362b15af34006e6a11974088a46d42b903418eJohann
3991b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm6, xmm5
4001b362b15af34006e6a11974088a46d42b903418eJohann        punpcklwd   xmm5, xmm7              ; c8 d8 e8 f8
4011b362b15af34006e6a11974088a46d42b903418eJohann        punpckhwd   xmm6, xmm7              ; cc dc ec fc
4021b362b15af34006e6a11974088a46d42b903418eJohann
4031b362b15af34006e6a11974088a46d42b903418eJohann        ; pull the third and fourth sets together
4041b362b15af34006e6a11974088a46d42b903418eJohann
4051b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm7, xmm0
4061b362b15af34006e6a11974088a46d42b903418eJohann        punpckldq   xmm0, xmm3              ; 80 90 a0 b0 c0 d0 e0 f0
4071b362b15af34006e6a11974088a46d42b903418eJohann        punpckhdq   xmm7, xmm3              ; 82 92 a2 b2 c2 d2 e2 f2
4081b362b15af34006e6a11974088a46d42b903418eJohann
4091b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm3, xmm4
4101b362b15af34006e6a11974088a46d42b903418eJohann        punpckldq   xmm4, xmm8              ; 84 94 a4 b4 c4 d4 e4 f4
4111b362b15af34006e6a11974088a46d42b903418eJohann        punpckhdq   xmm3, xmm8              ; 86 96 a6 b6 c6 d6 e6 f6
4121b362b15af34006e6a11974088a46d42b903418eJohann
4131b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm8, xmm1
4141b362b15af34006e6a11974088a46d42b903418eJohann        punpckldq   xmm1, xmm5              ; 88 88 a8 b8 c8 d8 e8 f8
4151b362b15af34006e6a11974088a46d42b903418eJohann        punpckhdq   xmm8, xmm5              ; 8a 9a aa ba ca da ea fa
4161b362b15af34006e6a11974088a46d42b903418eJohann
4171b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm5, xmm2
4181b362b15af34006e6a11974088a46d42b903418eJohann        punpckldq   xmm2, xmm6              ; 8c 9c ac bc cc dc ec fc
4191b362b15af34006e6a11974088a46d42b903418eJohann        punpckhdq   xmm5, xmm6              ; 8e 9e ae be ce de ee fe
4201b362b15af34006e6a11974088a46d42b903418eJohann
4211b362b15af34006e6a11974088a46d42b903418eJohann        ; save the calculations. we only have 15 registers ...
4221b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i0, xmm0
4231b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i1, xmm7
4241b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i2, xmm4
4251b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i3, xmm3
4261b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i4, xmm1
4271b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i5, xmm8
4281b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i6, xmm2
4291b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i7, xmm5
4301b362b15af34006e6a11974088a46d42b903418eJohann
4311b362b15af34006e6a11974088a46d42b903418eJohann        ; 0-7
4321b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm0, s0
4331b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm1, xmm0
4341b362b15af34006e6a11974088a46d42b903418eJohann        punpcklbw   xmm0, s1 ; 00 10
4351b362b15af34006e6a11974088a46d42b903418eJohann        punpckhbw   xmm1, s1 ; 08 18
4361b362b15af34006e6a11974088a46d42b903418eJohann
4371b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm2, s2
4381b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm3, xmm2
4391b362b15af34006e6a11974088a46d42b903418eJohann        punpcklbw   xmm2, s3 ; 20 30
4401b362b15af34006e6a11974088a46d42b903418eJohann        punpckhbw   xmm3, s3 ; 28 38
4411b362b15af34006e6a11974088a46d42b903418eJohann
4421b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm4, xmm0
4431b362b15af34006e6a11974088a46d42b903418eJohann        punpcklwd   xmm0, xmm2              ; 00 10 20 30
4441b362b15af34006e6a11974088a46d42b903418eJohann        punpckhwd   xmm4, xmm2              ; 04 14 24 34
4451b362b15af34006e6a11974088a46d42b903418eJohann
4461b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm2, xmm1
4471b362b15af34006e6a11974088a46d42b903418eJohann        punpcklwd   xmm1, xmm3              ; 08 18 28 38
4481b362b15af34006e6a11974088a46d42b903418eJohann        punpckhwd   xmm2, xmm3              ; 0c 1c 2c 3c
4491b362b15af34006e6a11974088a46d42b903418eJohann
4501b362b15af34006e6a11974088a46d42b903418eJohann        ; using xmm[0124]
4511b362b15af34006e6a11974088a46d42b903418eJohann        ; work on next 4 rows
4521b362b15af34006e6a11974088a46d42b903418eJohann
4531b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm3, s4
4541b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm5, xmm3
4551b362b15af34006e6a11974088a46d42b903418eJohann        punpcklbw   xmm3, s5 ; 40 50
4561b362b15af34006e6a11974088a46d42b903418eJohann        punpckhbw   xmm5, s5 ; 48 58
4571b362b15af34006e6a11974088a46d42b903418eJohann
4581b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm6, s6
4591b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm7, xmm6
4601b362b15af34006e6a11974088a46d42b903418eJohann        punpcklbw   xmm6, s7   ; 60 70
4611b362b15af34006e6a11974088a46d42b903418eJohann        punpckhbw   xmm7, s7   ; 68 78
4621b362b15af34006e6a11974088a46d42b903418eJohann
4631b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm8, xmm3
4641b362b15af34006e6a11974088a46d42b903418eJohann        punpcklwd   xmm3, xmm6              ; 40 50 60 70
4651b362b15af34006e6a11974088a46d42b903418eJohann        punpckhwd   xmm8, xmm6              ; 44 54 64 74
4661b362b15af34006e6a11974088a46d42b903418eJohann
4671b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm6, xmm5
4681b362b15af34006e6a11974088a46d42b903418eJohann        punpcklwd   xmm5, xmm7              ; 48 58 68 78
4691b362b15af34006e6a11974088a46d42b903418eJohann        punpckhwd   xmm6, xmm7              ; 4c 5c 6c 7c
4701b362b15af34006e6a11974088a46d42b903418eJohann
4711b362b15af34006e6a11974088a46d42b903418eJohann        ; pull the first two sets together
4721b362b15af34006e6a11974088a46d42b903418eJohann
4731b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm7, xmm0
4741b362b15af34006e6a11974088a46d42b903418eJohann        punpckldq   xmm0, xmm3              ; 00 10 20 30 40 50 60 70
4751b362b15af34006e6a11974088a46d42b903418eJohann        punpckhdq   xmm7, xmm3              ; 02 12 22 32 42 52 62 72
4761b362b15af34006e6a11974088a46d42b903418eJohann
4771b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm3, xmm4
4781b362b15af34006e6a11974088a46d42b903418eJohann        punpckldq   xmm4, xmm8              ; 04 14 24 34 44 54 64 74
4791b362b15af34006e6a11974088a46d42b903418eJohann        punpckhdq   xmm3, xmm8              ; 06 16 26 36 46 56 66 76
4801b362b15af34006e6a11974088a46d42b903418eJohann
4811b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm8, xmm1
4821b362b15af34006e6a11974088a46d42b903418eJohann        punpckldq   xmm1, xmm5              ; 08 18 28 38 48 58 68 78
4831b362b15af34006e6a11974088a46d42b903418eJohann        punpckhdq   xmm8, xmm5              ; 0a 1a 2a 3a 4a 5a 6a 7a
4841b362b15af34006e6a11974088a46d42b903418eJohann
4851b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm5, xmm2
4861b362b15af34006e6a11974088a46d42b903418eJohann        punpckldq   xmm2, xmm6              ; 0c 1c 2c 3c 4c 5c 6c 7c
4871b362b15af34006e6a11974088a46d42b903418eJohann        punpckhdq   xmm5, xmm6              ; 0e 1e 2e 3e 4e 5e 6e 7e
4881b362b15af34006e6a11974088a46d42b903418eJohann        ; final combination
4891b362b15af34006e6a11974088a46d42b903418eJohann
4901b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm6, xmm0
4911b362b15af34006e6a11974088a46d42b903418eJohann        punpcklqdq  xmm0, i0
4921b362b15af34006e6a11974088a46d42b903418eJohann        punpckhqdq  xmm6, i0
4931b362b15af34006e6a11974088a46d42b903418eJohann
4941b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm9, xmm7
4951b362b15af34006e6a11974088a46d42b903418eJohann        punpcklqdq  xmm7, i1
4961b362b15af34006e6a11974088a46d42b903418eJohann        punpckhqdq  xmm9, i1
4971b362b15af34006e6a11974088a46d42b903418eJohann
4981b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm10, xmm4
4991b362b15af34006e6a11974088a46d42b903418eJohann        punpcklqdq  xmm4, i2
5001b362b15af34006e6a11974088a46d42b903418eJohann        punpckhqdq  xmm10, i2
5011b362b15af34006e6a11974088a46d42b903418eJohann
5021b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm11, xmm3
5031b362b15af34006e6a11974088a46d42b903418eJohann        punpcklqdq  xmm3, i3
5041b362b15af34006e6a11974088a46d42b903418eJohann        punpckhqdq  xmm11, i3
5051b362b15af34006e6a11974088a46d42b903418eJohann
5061b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm12, xmm1
5071b362b15af34006e6a11974088a46d42b903418eJohann        punpcklqdq  xmm1, i4
5081b362b15af34006e6a11974088a46d42b903418eJohann        punpckhqdq  xmm12, i4
5091b362b15af34006e6a11974088a46d42b903418eJohann
5101b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm13, xmm8
5111b362b15af34006e6a11974088a46d42b903418eJohann        punpcklqdq  xmm8, i5
5121b362b15af34006e6a11974088a46d42b903418eJohann        punpckhqdq  xmm13, i5
5131b362b15af34006e6a11974088a46d42b903418eJohann
5141b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm14, xmm2
5151b362b15af34006e6a11974088a46d42b903418eJohann        punpcklqdq  xmm2, i6
5161b362b15af34006e6a11974088a46d42b903418eJohann        punpckhqdq  xmm14, i6
5171b362b15af34006e6a11974088a46d42b903418eJohann
5181b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm15, xmm5
5191b362b15af34006e6a11974088a46d42b903418eJohann        punpcklqdq  xmm5, i7
5201b362b15af34006e6a11974088a46d42b903418eJohann        punpckhqdq  xmm15, i7
5211b362b15af34006e6a11974088a46d42b903418eJohann
5221b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i0, xmm0
5231b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i1, xmm6
5241b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i2, xmm7
5251b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i3, xmm9
5261b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i4, xmm4
5271b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i5, xmm10
5281b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i6, xmm3
5291b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i7, xmm11
5301b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i8, xmm1
5311b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i9, xmm12
5321b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i10, xmm8
5331b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i11, xmm13
5341b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i12, xmm2
5351b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i13, xmm14
5361b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i14, xmm5
5371b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i15, xmm15
5381b362b15af34006e6a11974088a46d42b903418eJohann
5391b362b15af34006e6a11974088a46d42b903418eJohann; TRANSPOSED DATA AVAILABLE ON THE STACK
5401b362b15af34006e6a11974088a46d42b903418eJohann
5411b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm12, xmm6
5421b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm13, xmm7
5431b362b15af34006e6a11974088a46d42b903418eJohann
5441b362b15af34006e6a11974088a46d42b903418eJohann        pxor        zero, zero
5451b362b15af34006e6a11974088a46d42b903418eJohann
5461b362b15af34006e6a11974088a46d42b903418eJohannLF_FILTER_HEV_MASK xmm0, xmm12, xmm13, xmm9, xmm4, xmm10, xmm3, xmm11
5471b362b15af34006e6a11974088a46d42b903418eJohann
5481b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm1, i2
5491b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm2, i3
5501b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm8, i4
5511b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm9, i5
5521b362b15af34006e6a11974088a46d42b903418eJohannLF_FILTER xmm1, xmm2, xmm8, xmm9, xmm0, xmm4
5531b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i2, xmm1
5541b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i3, xmm2
5551b362b15af34006e6a11974088a46d42b903418eJohann
5561b362b15af34006e6a11974088a46d42b903418eJohann; second set
5571b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i4, xmm8
5581b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i5, xmm9
5591b362b15af34006e6a11974088a46d42b903418eJohann
5601b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm0, i6
5611b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm1, i7
5621b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm2, i8
5631b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm4, i9
5641b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm10, i10   ; q2, will contain abs(p1-p0)
5651b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm11, i11
5661b362b15af34006e6a11974088a46d42b903418eJohannLF_FILTER_HEV_MASK xmm8, xmm9, xmm0, xmm1, xmm2, xmm4, xmm10, xmm11, xmm3
5671b362b15af34006e6a11974088a46d42b903418eJohann
5681b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm0, i6
5691b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm1, i7
5701b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm3, i8
5711b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm4, i9
5721b362b15af34006e6a11974088a46d42b903418eJohannLF_FILTER xmm0, xmm1, xmm3, xmm4, xmm8, xmm2
5731b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i6, xmm0
5741b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i7, xmm1
5751b362b15af34006e6a11974088a46d42b903418eJohann
5761b362b15af34006e6a11974088a46d42b903418eJohann; last set
5771b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i8, xmm3
5781b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i9, xmm4
5791b362b15af34006e6a11974088a46d42b903418eJohann
5801b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm0, i10
5811b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm1, i11
5821b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm2, i12
5831b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm8, i13
5841b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm9, i14   ; q2, will contain abs(p1-p0)
5851b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm11, i15
5861b362b15af34006e6a11974088a46d42b903418eJohannLF_FILTER_HEV_MASK xmm3, xmm4, xmm0, xmm1, xmm2, xmm8, xmm9, xmm11, xmm10
5871b362b15af34006e6a11974088a46d42b903418eJohann
5881b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm0, i10
5891b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm1, i11
5901b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm4, i12
5911b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       xmm8, i13
5921b362b15af34006e6a11974088a46d42b903418eJohannLF_FILTER xmm0, xmm1, xmm4, xmm8, xmm3, xmm2
5931b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i10, xmm0
5941b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i11, xmm1
5951b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i12, xmm4
5961b362b15af34006e6a11974088a46d42b903418eJohann        movdqa       i13, xmm8
5971b362b15af34006e6a11974088a46d42b903418eJohann
5981b362b15af34006e6a11974088a46d42b903418eJohann
5991b362b15af34006e6a11974088a46d42b903418eJohann; RESHUFFLE AND WRITE OUT
6001b362b15af34006e6a11974088a46d42b903418eJohann        ; 8-f
6011b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm0, i8
6021b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm1, xmm0
6031b362b15af34006e6a11974088a46d42b903418eJohann        punpcklbw   xmm0, i9                ; 80 90
6041b362b15af34006e6a11974088a46d42b903418eJohann        punpckhbw   xmm1, i9                ; 88 98
6051b362b15af34006e6a11974088a46d42b903418eJohann
6061b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm2, i10
6071b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm3, xmm2
6081b362b15af34006e6a11974088a46d42b903418eJohann        punpcklbw   xmm2, i11               ; a0 b0
6091b362b15af34006e6a11974088a46d42b903418eJohann        punpckhbw   xmm3, i11               ; a8 b8
6101b362b15af34006e6a11974088a46d42b903418eJohann
6111b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm4, xmm0
6121b362b15af34006e6a11974088a46d42b903418eJohann        punpcklwd   xmm0, xmm2              ; 80 90 a0 b0
6131b362b15af34006e6a11974088a46d42b903418eJohann        punpckhwd   xmm4, xmm2              ; 84 94 a4 b4
6141b362b15af34006e6a11974088a46d42b903418eJohann
6151b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm2, xmm1
6161b362b15af34006e6a11974088a46d42b903418eJohann        punpcklwd   xmm1, xmm3              ; 88 98 a8 b8
6171b362b15af34006e6a11974088a46d42b903418eJohann        punpckhwd   xmm2, xmm3              ; 8c 9c ac bc
6181b362b15af34006e6a11974088a46d42b903418eJohann
6191b362b15af34006e6a11974088a46d42b903418eJohann        ; using xmm[0124]
6201b362b15af34006e6a11974088a46d42b903418eJohann        ; work on next 4 rows
6211b362b15af34006e6a11974088a46d42b903418eJohann
6221b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm3, i12
6231b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm5, xmm3
6241b362b15af34006e6a11974088a46d42b903418eJohann        punpcklbw   xmm3, i13               ; c0 d0
6251b362b15af34006e6a11974088a46d42b903418eJohann        punpckhbw   xmm5, i13               ; c8 d8
6261b362b15af34006e6a11974088a46d42b903418eJohann
6271b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm6, i14
6281b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm7, xmm6
6291b362b15af34006e6a11974088a46d42b903418eJohann        punpcklbw   xmm6, i15               ; e0 f0
6301b362b15af34006e6a11974088a46d42b903418eJohann        punpckhbw   xmm7, i15               ; e8 f8
6311b362b15af34006e6a11974088a46d42b903418eJohann
6321b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm8, xmm3
6331b362b15af34006e6a11974088a46d42b903418eJohann        punpcklwd   xmm3, xmm6              ; c0 d0 e0 f0
6341b362b15af34006e6a11974088a46d42b903418eJohann        punpckhwd   xmm8, xmm6              ; c4 d4 e4 f4
6351b362b15af34006e6a11974088a46d42b903418eJohann
6361b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm6, xmm5
6371b362b15af34006e6a11974088a46d42b903418eJohann        punpcklwd   xmm5, xmm7              ; c8 d8 e8 f8
6381b362b15af34006e6a11974088a46d42b903418eJohann        punpckhwd   xmm6, xmm7              ; cc dc ec fc
6391b362b15af34006e6a11974088a46d42b903418eJohann
6401b362b15af34006e6a11974088a46d42b903418eJohann        ; pull the third and fourth sets together
6411b362b15af34006e6a11974088a46d42b903418eJohann
6421b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm7, xmm0
6431b362b15af34006e6a11974088a46d42b903418eJohann        punpckldq   xmm0, xmm3              ; 80 90 a0 b0 c0 d0 e0 f0
6441b362b15af34006e6a11974088a46d42b903418eJohann        punpckhdq   xmm7, xmm3              ; 82 92 a2 b2 c2 d2 e2 f2
6451b362b15af34006e6a11974088a46d42b903418eJohann
6461b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm3, xmm4
6471b362b15af34006e6a11974088a46d42b903418eJohann        punpckldq   xmm4, xmm8              ; 84 94 a4 b4 c4 d4 e4 f4
6481b362b15af34006e6a11974088a46d42b903418eJohann        punpckhdq   xmm3, xmm8              ; 86 96 a6 b6 c6 d6 e6 f6
6491b362b15af34006e6a11974088a46d42b903418eJohann
6501b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm8, xmm1
6511b362b15af34006e6a11974088a46d42b903418eJohann        punpckldq   xmm1, xmm5              ; 88 88 a8 b8 c8 d8 e8 f8
6521b362b15af34006e6a11974088a46d42b903418eJohann        punpckhdq   xmm8, xmm5              ; 8a 9a aa ba ca da ea fa
6531b362b15af34006e6a11974088a46d42b903418eJohann
6541b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm5, xmm2
6551b362b15af34006e6a11974088a46d42b903418eJohann        punpckldq   xmm2, xmm6              ; 8c 9c ac bc cc dc ec fc
6561b362b15af34006e6a11974088a46d42b903418eJohann        punpckhdq   xmm5, xmm6              ; 8e 9e ae be ce de ee fe
6571b362b15af34006e6a11974088a46d42b903418eJohann
6581b362b15af34006e6a11974088a46d42b903418eJohann        ; save the calculations. we only have 15 registers ...
6591b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i8, xmm0
6601b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i9, xmm7
6611b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i10, xmm4
6621b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i11, xmm3
6631b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i12, xmm1
6641b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i13, xmm8
6651b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i14, xmm2
6661b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      i15, xmm5
6671b362b15af34006e6a11974088a46d42b903418eJohann
6681b362b15af34006e6a11974088a46d42b903418eJohann        ; 0-7
6691b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm0, i0
6701b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm1, xmm0
6711b362b15af34006e6a11974088a46d42b903418eJohann        punpcklbw   xmm0, i1                ; 00 10
6721b362b15af34006e6a11974088a46d42b903418eJohann        punpckhbw   xmm1, i1                ; 08 18
6731b362b15af34006e6a11974088a46d42b903418eJohann
6741b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm2, i2
6751b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm3, xmm2
6761b362b15af34006e6a11974088a46d42b903418eJohann        punpcklbw   xmm2, i3                ; 20 30
6771b362b15af34006e6a11974088a46d42b903418eJohann        punpckhbw   xmm3, i3                ; 28 38
6781b362b15af34006e6a11974088a46d42b903418eJohann
6791b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm4, xmm0
6801b362b15af34006e6a11974088a46d42b903418eJohann        punpcklwd   xmm0, xmm2              ; 00 10 20 30
6811b362b15af34006e6a11974088a46d42b903418eJohann        punpckhwd   xmm4, xmm2              ; 04 14 24 34
6821b362b15af34006e6a11974088a46d42b903418eJohann
6831b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm2, xmm1
6841b362b15af34006e6a11974088a46d42b903418eJohann        punpcklwd   xmm1, xmm3              ; 08 18 28 38
6851b362b15af34006e6a11974088a46d42b903418eJohann        punpckhwd   xmm2, xmm3              ; 0c 1c 2c 3c
6861b362b15af34006e6a11974088a46d42b903418eJohann
6871b362b15af34006e6a11974088a46d42b903418eJohann        ; using xmm[0124]
6881b362b15af34006e6a11974088a46d42b903418eJohann        ; work on next 4 rows
6891b362b15af34006e6a11974088a46d42b903418eJohann
6901b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm3, i4
6911b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm5, xmm3
6921b362b15af34006e6a11974088a46d42b903418eJohann        punpcklbw   xmm3, i5                ; 40 50
6931b362b15af34006e6a11974088a46d42b903418eJohann        punpckhbw   xmm5, i5                ; 48 58
6941b362b15af34006e6a11974088a46d42b903418eJohann
6951b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm6, i6
6961b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm7, xmm6
6971b362b15af34006e6a11974088a46d42b903418eJohann        punpcklbw   xmm6, i7                ; 60 70
6981b362b15af34006e6a11974088a46d42b903418eJohann        punpckhbw   xmm7, i7                ; 68 78
6991b362b15af34006e6a11974088a46d42b903418eJohann
7001b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm8, xmm3
7011b362b15af34006e6a11974088a46d42b903418eJohann        punpcklwd   xmm3, xmm6              ; 40 50 60 70
7021b362b15af34006e6a11974088a46d42b903418eJohann        punpckhwd   xmm8, xmm6              ; 44 54 64 74
7031b362b15af34006e6a11974088a46d42b903418eJohann
7041b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm6, xmm5
7051b362b15af34006e6a11974088a46d42b903418eJohann        punpcklwd   xmm5, xmm7              ; 48 58 68 78
7061b362b15af34006e6a11974088a46d42b903418eJohann        punpckhwd   xmm6, xmm7              ; 4c 5c 6c 7c
7071b362b15af34006e6a11974088a46d42b903418eJohann
7081b362b15af34006e6a11974088a46d42b903418eJohann        ; pull the first two sets together
7091b362b15af34006e6a11974088a46d42b903418eJohann
7101b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm7, xmm0
7111b362b15af34006e6a11974088a46d42b903418eJohann        punpckldq   xmm0, xmm3              ; 00 10 20 30 40 50 60 70
7121b362b15af34006e6a11974088a46d42b903418eJohann        punpckhdq   xmm7, xmm3              ; 02 12 22 32 42 52 62 72
7131b362b15af34006e6a11974088a46d42b903418eJohann
7141b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm3, xmm4
7151b362b15af34006e6a11974088a46d42b903418eJohann        punpckldq   xmm4, xmm8              ; 04 14 24 34 44 54 64 74
7161b362b15af34006e6a11974088a46d42b903418eJohann        punpckhdq   xmm3, xmm8              ; 06 16 26 36 46 56 66 76
7171b362b15af34006e6a11974088a46d42b903418eJohann
7181b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm8, xmm1
7191b362b15af34006e6a11974088a46d42b903418eJohann        punpckldq   xmm1, xmm5              ; 08 18 28 38 48 58 68 78
7201b362b15af34006e6a11974088a46d42b903418eJohann        punpckhdq   xmm8, xmm5              ; 0a 1a 2a 3a 4a 5a 6a 7a
7211b362b15af34006e6a11974088a46d42b903418eJohann
7221b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm5, xmm2
7231b362b15af34006e6a11974088a46d42b903418eJohann        punpckldq   xmm2, xmm6              ; 0c 1c 2c 3c 4c 5c 6c 7c
7241b362b15af34006e6a11974088a46d42b903418eJohann        punpckhdq   xmm5, xmm6              ; 0e 1e 2e 3e 4e 5e 6e 7e
7251b362b15af34006e6a11974088a46d42b903418eJohann        ; final combination
7261b362b15af34006e6a11974088a46d42b903418eJohann
7271b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm6, xmm0
7281b362b15af34006e6a11974088a46d42b903418eJohann        punpcklqdq  xmm0, i8
7291b362b15af34006e6a11974088a46d42b903418eJohann        punpckhqdq  xmm6, i8
7301b362b15af34006e6a11974088a46d42b903418eJohann
7311b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm9, xmm7
7321b362b15af34006e6a11974088a46d42b903418eJohann        punpcklqdq  xmm7, i9
7331b362b15af34006e6a11974088a46d42b903418eJohann        punpckhqdq  xmm9, i9
7341b362b15af34006e6a11974088a46d42b903418eJohann
7351b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm10, xmm4
7361b362b15af34006e6a11974088a46d42b903418eJohann        punpcklqdq  xmm4, i10
7371b362b15af34006e6a11974088a46d42b903418eJohann        punpckhqdq  xmm10, i10
7381b362b15af34006e6a11974088a46d42b903418eJohann
7391b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm11, xmm3
7401b362b15af34006e6a11974088a46d42b903418eJohann        punpcklqdq  xmm3, i11
7411b362b15af34006e6a11974088a46d42b903418eJohann        punpckhqdq  xmm11, i11
7421b362b15af34006e6a11974088a46d42b903418eJohann
7431b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm12, xmm1
7441b362b15af34006e6a11974088a46d42b903418eJohann        punpcklqdq  xmm1, i12
7451b362b15af34006e6a11974088a46d42b903418eJohann        punpckhqdq  xmm12, i12
7461b362b15af34006e6a11974088a46d42b903418eJohann
7471b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm13, xmm8
7481b362b15af34006e6a11974088a46d42b903418eJohann        punpcklqdq  xmm8, i13
7491b362b15af34006e6a11974088a46d42b903418eJohann        punpckhqdq  xmm13, i13
7501b362b15af34006e6a11974088a46d42b903418eJohann
7511b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm14, xmm2
7521b362b15af34006e6a11974088a46d42b903418eJohann        punpcklqdq  xmm2, i14
7531b362b15af34006e6a11974088a46d42b903418eJohann        punpckhqdq  xmm14, i14
7541b362b15af34006e6a11974088a46d42b903418eJohann
7551b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      xmm15, xmm5
7561b362b15af34006e6a11974088a46d42b903418eJohann        punpcklqdq  xmm5, i15
7571b362b15af34006e6a11974088a46d42b903418eJohann        punpckhqdq  xmm15, i15
7581b362b15af34006e6a11974088a46d42b903418eJohann
7591b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      s0, xmm0
7601b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      s1, xmm6
7611b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      s2, xmm7
7621b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      s3, xmm9
7631b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      s4, xmm4
7641b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      s5, xmm10
7651b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      s6, xmm3
7661b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      s7, xmm11
7671b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      s8, xmm1
7681b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      s9, xmm12
7691b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      s10, xmm8
7701b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      s11, xmm13
7711b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      s12, xmm2
7721b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      s13, xmm14
7731b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      s14, xmm5
7741b362b15af34006e6a11974088a46d42b903418eJohann        movdqa      s15, xmm15
7751b362b15af34006e6a11974088a46d42b903418eJohann
7761b362b15af34006e6a11974088a46d42b903418eJohann    ; free stack space
7771b362b15af34006e6a11974088a46d42b903418eJohann    add          rsp, stack_size
7781b362b15af34006e6a11974088a46d42b903418eJohann
7791b362b15af34006e6a11974088a46d42b903418eJohann    ; un-ALIGN_STACK
7801b362b15af34006e6a11974088a46d42b903418eJohann    pop          rsp
7811b362b15af34006e6a11974088a46d42b903418eJohann
782ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang%if LIBVPX_YASM_WIN64
7831b362b15af34006e6a11974088a46d42b903418eJohann    pop    r13
7841b362b15af34006e6a11974088a46d42b903418eJohann    pop    r12
7851b362b15af34006e6a11974088a46d42b903418eJohann    RESTORE_XMM
7861b362b15af34006e6a11974088a46d42b903418eJohann    pop    rbp
7871b362b15af34006e6a11974088a46d42b903418eJohann%endif
7881b362b15af34006e6a11974088a46d42b903418eJohann
7891b362b15af34006e6a11974088a46d42b903418eJohann    ret
7901b362b15af34006e6a11974088a46d42b903418eJohann
7911b362b15af34006e6a11974088a46d42b903418eJohannSECTION_RODATA
7921b362b15af34006e6a11974088a46d42b903418eJohannalign 16
7931b362b15af34006e6a11974088a46d42b903418eJohannte0:
7941b362b15af34006e6a11974088a46d42b903418eJohann    times 16 db 0xe0
7951b362b15af34006e6a11974088a46d42b903418eJohannalign 16
7961b362b15af34006e6a11974088a46d42b903418eJohannt7f:
7971b362b15af34006e6a11974088a46d42b903418eJohann    times 16 db 0x7f
7981b362b15af34006e6a11974088a46d42b903418eJohannalign 16
7991b362b15af34006e6a11974088a46d42b903418eJohanntfe:
8001b362b15af34006e6a11974088a46d42b903418eJohann    times 16 db 0xfe
8011b362b15af34006e6a11974088a46d42b903418eJohannalign 16
8021b362b15af34006e6a11974088a46d42b903418eJohannt1f:
8031b362b15af34006e6a11974088a46d42b903418eJohann    times 16 db 0x1f
8041b362b15af34006e6a11974088a46d42b903418eJohannalign 16
8051b362b15af34006e6a11974088a46d42b903418eJohannt80:
8061b362b15af34006e6a11974088a46d42b903418eJohann    times 16 db 0x80
8071b362b15af34006e6a11974088a46d42b903418eJohannalign 16
8081b362b15af34006e6a11974088a46d42b903418eJohannt1:
8091b362b15af34006e6a11974088a46d42b903418eJohann    times 16 db 0x01
8101b362b15af34006e6a11974088a46d42b903418eJohannalign 16
8111b362b15af34006e6a11974088a46d42b903418eJohannt3:
8121b362b15af34006e6a11974088a46d42b903418eJohann    times 16 db 0x03
8131b362b15af34006e6a11974088a46d42b903418eJohannalign 16
8141b362b15af34006e6a11974088a46d42b903418eJohannt4:
8151b362b15af34006e6a11974088a46d42b903418eJohann    times 16 db 0x04
816