16fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;
26fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
36fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;
46fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;  Use of this source code is governed by a BSD-style license
56fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;  that can be found in the LICENSE file in the root of the source
66fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;  tree. An additional intellectual property rights grant can be found
76fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;  in the file PATENTS.  All contributing project authors may
86fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;  be found in the AUTHORS file in the root of the source tree.
96fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;
106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%include "vpx_ports/x86_abi_support.asm"
136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;unsigned int vp9_get_mb_ss_sse2
156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;(
166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    short *src_ptr
176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;)
18afc4a270e3f2ecbbb47aad63c6a6a77ca902d30efgalligan@chromium.orgglobal sym(vp9_get_mb_ss_sse2) PRIVATE
196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgsym(vp9_get_mb_ss_sse2):
206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rbp
216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    mov         rbp, rsp
226fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    SHADOW_ARGS_TO_STACK 1
236fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    GET_GOT     rbx
246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push rsi
256fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push rdi
266fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    sub         rsp, 16
276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; end prolog
286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov         rax, arg(0) ;[src_ptr]
316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov         rcx, 8
326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pxor        xmm4, xmm4
336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org.NEXTROW:
356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa      xmm0, [rax]
366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa      xmm1, [rax+16]
376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa      xmm2, [rax+32]
386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa      xmm3, [rax+48]
396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pmaddwd     xmm0, xmm0
406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pmaddwd     xmm1, xmm1
416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pmaddwd     xmm2, xmm2
426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pmaddwd     xmm3, xmm3
436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm0, xmm1
456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm2, xmm3
466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm4, xmm0
476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm4, xmm2
486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        add         rax, 0x40
506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dec         rcx
516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        ja          .NEXTROW
526fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa      xmm3,xmm4
546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psrldq      xmm4,8
556fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm4,xmm3
566fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa      xmm3,xmm4
576fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psrldq      xmm4,4
586fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm4,xmm3
596fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq        rax,xmm4
606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; begin epilog
636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    add rsp, 16
646fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop rdi
656fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop rsi
666fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    RESTORE_GOT
676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    UNSHADOW_ARGS
686fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rbp
696fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ret
706fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
716fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
726fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;unsigned int vp9_get16x16var_sse2
736fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;(
746fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    unsigned char   *  src_ptr,
756fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int             source_stride,
766fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    unsigned char   *  ref_ptr,
776fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int             recon_stride,
786fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    unsigned int    *  SSE,
796fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int             *  Sum
806fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;)
81afc4a270e3f2ecbbb47aad63c6a6a77ca902d30efgalligan@chromium.orgglobal sym(vp9_get16x16var_sse2) PRIVATE
826fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgsym(vp9_get16x16var_sse2):
836fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rbp
846fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    mov         rbp, rsp
856fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    SHADOW_ARGS_TO_STACK 6
866fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    SAVE_XMM 7
876fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push rbx
886fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push rsi
896fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push rdi
906fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; end prolog
916fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
926fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov         rsi,            arg(0) ;[src_ptr]
936fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov         rdi,            arg(2) ;[ref_ptr]
946fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
956fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movsxd      rax,            DWORD PTR arg(1) ;[source_stride]
966fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movsxd      rdx,            DWORD PTR arg(3) ;[recon_stride]
976fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
986fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        ; Prefetch data
996fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea             rcx,    [rax+rax*2]
1006fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        prefetcht0      [rsi]
1016fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        prefetcht0      [rsi+rax]
1026fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        prefetcht0      [rsi+rax*2]
1036fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        prefetcht0      [rsi+rcx]
1046fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea             rbx,    [rsi+rax*4]
1056fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        prefetcht0      [rbx]
1066fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        prefetcht0      [rbx+rax]
1076fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        prefetcht0      [rbx+rax*2]
1086fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        prefetcht0      [rbx+rcx]
1096fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea             rcx,    [rdx+rdx*2]
1116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        prefetcht0      [rdi]
1126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        prefetcht0      [rdi+rdx]
1136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        prefetcht0      [rdi+rdx*2]
1146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        prefetcht0      [rdi+rcx]
1156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea             rbx,    [rdi+rdx*4]
1166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        prefetcht0      [rbx]
1176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        prefetcht0      [rbx+rdx]
1186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        prefetcht0      [rbx+rdx*2]
1196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        prefetcht0      [rbx+rcx]
1206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pxor        xmm0,           xmm0                        ; clear xmm0 for unpack
1226fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pxor        xmm7,           xmm7                        ; clear xmm7 for accumulating diffs
1236fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pxor        xmm6,           xmm6                        ; clear xmm6 for accumulating sse
1256fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov         rcx,            16
1266fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org.var16loop:
1286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqu      xmm1,           XMMWORD PTR [rsi]
1296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqu      xmm2,           XMMWORD PTR [rdi]
1306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        prefetcht0      [rsi+rax*8]
1326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        prefetcht0      [rdi+rdx*8]
1336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa      xmm3,           xmm1
1356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa      xmm4,           xmm2
1366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklbw   xmm1,           xmm0
1396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpckhbw   xmm3,           xmm0
1406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklbw   xmm2,           xmm0
1426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpckhbw   xmm4,           xmm0
1436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psubw       xmm1,           xmm2
1466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psubw       xmm3,           xmm4
1476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw       xmm7,           xmm1
1496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pmaddwd     xmm1,           xmm1
1506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw       xmm7,           xmm3
1526fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pmaddwd     xmm3,           xmm3
1536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm6,           xmm1
1556fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm6,           xmm3
1566fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1576fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        add         rsi,            rax
1586fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        add         rdi,            rdx
1596fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        sub         rcx,            1
1616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        jnz         .var16loop
1626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1646fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa      xmm1,           xmm6
1656fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pxor        xmm6,           xmm6
1666fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pxor        xmm5,           xmm5
1686fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklwd   xmm6,           xmm7
1696fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1706fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpckhwd   xmm5,           xmm7
1716fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psrad       xmm5,           16
1726fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1736fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psrad       xmm6,           16
1746fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm6,           xmm5
1756fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1766fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa      xmm2,           xmm1
1776fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpckldq   xmm1,           xmm0
1786fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1796fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpckhdq   xmm2,           xmm0
1806fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa      xmm7,           xmm6
1816fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1826fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm1,           xmm2
1836fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpckldq   xmm6,           xmm0
1846fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1856fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpckhdq   xmm7,           xmm0
1866fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm6,           xmm7
1876fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1886fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa      xmm2,           xmm1
1896fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa      xmm7,           xmm6
1906fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1916fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psrldq      xmm1,           8
1926fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psrldq      xmm6,           8
1936fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1946fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm7,           xmm6
1956fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm1,           xmm2
1966fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1976fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov         rax,            arg(5) ;[Sum]
1986fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov         rdi,            arg(4) ;[SSE]
1996fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2006fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movd DWORD PTR [rax],       xmm7
2016fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movd DWORD PTR [rdi],       xmm1
2026fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2036fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2046fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; begin epilog
2056fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop rdi
2066fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop rsi
2076fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop rbx
2086fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    RESTORE_XMM
2096fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    UNSHADOW_ARGS
2106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rbp
2116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ret
2126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;unsigned int vp9_get8x8var_sse2
2176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;(
2186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    unsigned char   *  src_ptr,
2196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int             source_stride,
2206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    unsigned char   *  ref_ptr,
2216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int             recon_stride,
2226fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    unsigned int    *  SSE,
2236fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int             *  Sum
2246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;)
225afc4a270e3f2ecbbb47aad63c6a6a77ca902d30efgalligan@chromium.orgglobal sym(vp9_get8x8var_sse2) PRIVATE
2266fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgsym(vp9_get8x8var_sse2):
2276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rbp
2286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    mov         rbp, rsp
2296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    SHADOW_ARGS_TO_STACK 6
2306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    SAVE_XMM 7
2316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    GET_GOT     rbx
2326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push rsi
2336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push rdi
2346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    sub         rsp, 16
2356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; end prolog
2366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov         rsi,            arg(0) ;[src_ptr]
2386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov         rdi,            arg(2) ;[ref_ptr]
2396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movsxd      rax,            DWORD PTR arg(1) ;[source_stride]
2416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movsxd      rdx,            DWORD PTR arg(3) ;[recon_stride]
2426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pxor        xmm0,           xmm0                        ; clear xmm0 for unpack
2446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pxor        xmm7,           xmm7                        ; clear xmm7 for accumulating diffs
2456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq        xmm1,           QWORD PTR [rsi]
2476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq        xmm2,           QWORD PTR [rdi]
2486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklbw   xmm1,           xmm0
2506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklbw   xmm2,           xmm0
2516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2526fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psubsw      xmm1,           xmm2
2536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw       xmm7,           xmm1
2546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2556fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pmaddwd     xmm1,           xmm1
2566fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2576fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq        xmm2,           QWORD PTR[rsi + rax]
2586fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq        xmm3,           QWORD PTR[rdi + rdx]
2596fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklbw   xmm2,           xmm0
2616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklbw   xmm3,           xmm0
2626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psubsw      xmm2,           xmm3
2646fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw       xmm7,           xmm2
2656fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2666fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pmaddwd     xmm2,           xmm2
2676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm1,           xmm2
2686fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2696fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2706fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq        xmm2,           QWORD PTR[rsi + rax * 2]
2716fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq        xmm3,           QWORD PTR[rdi + rdx * 2]
2726fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2736fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklbw   xmm2,           xmm0
2746fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklbw   xmm3,           xmm0
2756fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2766fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psubsw      xmm2,           xmm3
2776fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw       xmm7,           xmm2
2786fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2796fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pmaddwd     xmm2,           xmm2
2806fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm1,           xmm2
2816fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2826fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2836fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea         rsi,            [rsi + rax * 2]
2846fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea         rdi,            [rdi + rdx * 2]
2856fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq        xmm2,           QWORD PTR[rsi + rax]
2866fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq        xmm3,           QWORD PTR[rdi + rdx]
2876fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2886fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklbw   xmm2,           xmm0
2896fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklbw   xmm3,           xmm0
2906fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2916fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psubsw      xmm2,           xmm3
2926fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw       xmm7,           xmm2
2936fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2946fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pmaddwd     xmm2,           xmm2
2956fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm1,           xmm2
2966fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2976fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq        xmm2,           QWORD PTR[rsi + rax *2]
2986fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq        xmm3,           QWORD PTR[rdi + rdx *2]
2996fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3006fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklbw   xmm2,           xmm0
3016fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklbw   xmm3,           xmm0
3026fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3036fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psubsw      xmm2,           xmm3
3046fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw       xmm7,           xmm2
3056fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3066fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pmaddwd     xmm2,           xmm2
3076fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm1,           xmm2
3086fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3096fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea         rsi,            [rsi + rax * 2]
3116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea         rdi,            [rdi + rdx * 2]
3126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq        xmm2,           QWORD PTR[rsi + rax]
3156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq        xmm3,           QWORD PTR[rdi + rdx]
3166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklbw   xmm2,           xmm0
3186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklbw   xmm3,           xmm0
3196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psubsw      xmm2,           xmm3
3216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw       xmm7,           xmm2
3226fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3236fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pmaddwd     xmm2,           xmm2
3246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm1,           xmm2
3256fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3266fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq        xmm2,           QWORD PTR[rsi + rax *2]
3276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq        xmm3,           QWORD PTR[rdi + rdx *2]
3286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklbw   xmm2,           xmm0
3306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklbw   xmm3,           xmm0
3316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psubsw      xmm2,           xmm3
3336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw       xmm7,           xmm2
3346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pmaddwd     xmm2,           xmm2
3366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm1,           xmm2
3376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea         rsi,            [rsi + rax * 2]
3406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea         rdi,            [rdi + rdx * 2]
3416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq        xmm2,           QWORD PTR[rsi + rax]
3436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq        xmm3,           QWORD PTR[rdi + rdx]
3446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklbw   xmm2,           xmm0
3466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklbw   xmm3,           xmm0
3476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psubsw      xmm2,           xmm3
3496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw       xmm7,           xmm2
3506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pmaddwd     xmm2,           xmm2
3526fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm1,           xmm2
3536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3556fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa      xmm6,           xmm7
3566fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklwd   xmm6,           xmm0
3576fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3586fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpckhwd   xmm7,           xmm0
3596fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa      xmm2,           xmm1
3606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw       xmm6,           xmm7
3626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpckldq   xmm1,           xmm0
3636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3646fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpckhdq   xmm2,           xmm0
3656fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa      xmm7,           xmm6
3666fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm1,           xmm2
3686fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpckldq   xmm6,           xmm0
3696fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3706fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpckhdq   xmm7,           xmm0
3716fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw       xmm6,           xmm7
3726fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3736fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa      xmm2,           xmm1
3746fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa      xmm7,           xmm6
3756fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3766fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psrldq      xmm1,           8
3776fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psrldq      xmm6,           8
3786fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3796fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw       xmm7,           xmm6
3806fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddd       xmm1,           xmm2
3816fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3826fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov         rax,            arg(5) ;[Sum]
3836fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov         rdi,            arg(4) ;[SSE]
3846fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3856fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq        rdx,            xmm7
3866fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movsx       rcx,            dx
3876fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3886fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov  dword ptr [rax],       ecx
3896fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movd DWORD PTR [rdi],       xmm1
3906fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3916fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; begin epilog
3926fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    add rsp, 16
3936fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop rdi
3946fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop rsi
3956fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    RESTORE_GOT
3966fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    RESTORE_XMM
3976fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    UNSHADOW_ARGS
3986fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rbp
3996fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ret
4006fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
4016fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
402