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%macro PROCESS_16X2X8 1
156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%if %1
166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm0,       XMMWORD PTR [rsi]
176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm1,       MMWORD PTR [rdi]
186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm3,       MMWORD PTR [rdi+8]
196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm2,       MMWORD PTR [rdi+16]
206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklqdq      xmm1,       xmm3
216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklqdq      xmm3,       xmm2
226fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
236fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm2,       xmm1
246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm1,       xmm0,  0x0
256fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm2,       xmm0,  0x5
266fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psrldq          xmm0,       8
286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm4,       xmm3
306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm3,       xmm0,  0x0
316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm4,       xmm0,  0x5
326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm1,       xmm2
346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm1,       xmm3
356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm1,       xmm4
366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%else
376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm0,       XMMWORD PTR [rsi]
386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm5,       MMWORD PTR [rdi]
396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm3,       MMWORD PTR [rdi+8]
406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm2,       MMWORD PTR [rdi+16]
416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklqdq      xmm5,       xmm3
426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklqdq      xmm3,       xmm2
436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm2,       xmm5
456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm5,       xmm0,  0x0
466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm2,       xmm0,  0x5
476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psrldq          xmm0,       8
496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm4,       xmm3
516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm3,       xmm0,  0x0
526fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm4,       xmm0,  0x5
536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm5,       xmm2
556fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm5,       xmm3
566fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm5,       xmm4
576fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
586fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm1,       xmm5
596fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%endif
606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm0,       XMMWORD PTR [rsi + rax]
616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm5,       MMWORD PTR [rdi+ rdx]
626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm3,       MMWORD PTR [rdi+ rdx+8]
636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm2,       MMWORD PTR [rdi+ rdx+16]
646fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklqdq      xmm5,       xmm3
656fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklqdq      xmm3,       xmm2
666fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea             rsi,        [rsi+rax*2]
686fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea             rdi,        [rdi+rdx*2]
696fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
706fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm2,       xmm5
716fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm5,       xmm0,  0x0
726fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm2,       xmm0,  0x5
736fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
746fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psrldq          xmm0,       8
756fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm4,       xmm3
766fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm3,       xmm0,  0x0
776fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm4,       xmm0,  0x5
786fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
796fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm5,       xmm2
806fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm5,       xmm3
816fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm5,       xmm4
826fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
836fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm1,       xmm5
846fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%endmacro
856fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
866fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%macro PROCESS_8X2X8 1
876fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%if %1
886fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm0,       MMWORD PTR [rsi]
896fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm1,       MMWORD PTR [rdi]
906fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm3,       MMWORD PTR [rdi+8]
916fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklqdq      xmm1,       xmm3
926fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
936fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm2,       xmm1
946fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm1,       xmm0,  0x0
956fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm2,       xmm0,  0x5
966fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm1,       xmm2
976fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%else
986fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm0,       MMWORD PTR [rsi]
996fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm5,       MMWORD PTR [rdi]
1006fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm3,       MMWORD PTR [rdi+8]
1016fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklqdq      xmm5,       xmm3
1026fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1036fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm2,       xmm5
1046fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm5,       xmm0,  0x0
1056fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm2,       xmm0,  0x5
1066fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm5,       xmm2
1076fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1086fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm1,       xmm5
1096fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%endif
1106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm0,       MMWORD PTR [rsi + rax]
1116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm5,       MMWORD PTR [rdi+ rdx]
1126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm3,       MMWORD PTR [rdi+ rdx+8]
1136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklqdq      xmm5,       xmm3
1146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea             rsi,        [rsi+rax*2]
1166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea             rdi,        [rdi+rdx*2]
1176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm2,       xmm5
1196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm5,       xmm0,  0x0
1206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm2,       xmm0,  0x5
1216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm5,       xmm2
1226fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1236fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm1,       xmm5
1246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%endmacro
1256fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1266fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%macro PROCESS_4X2X8 1
1276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%if %1
1286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movd            xmm0,       [rsi]
1296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm1,       MMWORD PTR [rdi]
1306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm3,       MMWORD PTR [rdi+8]
1316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklqdq      xmm1,       xmm3
1326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm1,       xmm0,  0x0
1346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%else
1356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movd            xmm0,       [rsi]
1366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm5,       MMWORD PTR [rdi]
1376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm3,       MMWORD PTR [rdi+8]
1386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklqdq      xmm5,       xmm3
1396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm5,       xmm0,  0x0
1416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm1,       xmm5
1436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%endif
1446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movd            xmm0,       [rsi + rax]
1456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm5,       MMWORD PTR [rdi+ rdx]
1466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm3,       MMWORD PTR [rdi+ rdx+8]
1476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        punpcklqdq      xmm5,       xmm3
1486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea             rsi,        [rsi+rax*2]
1506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea             rdi,        [rdi+rdx*2]
1516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1526fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mpsadbw         xmm5,       xmm0,  0x0
1536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm1,       xmm5
1556fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%endmacro
1566fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1573f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org%macro WRITE_AS_INTS 0
1583f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    mov             rdi,        arg(4)           ;Results
1593f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    pxor            xmm0, xmm0
1603f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    movdqa          xmm2, xmm1
1613f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    punpcklwd       xmm1, xmm0
1623f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    punpckhwd       xmm2, xmm0
1633f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org
1643f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    movdqa          [rdi],    xmm1
1653f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    movdqa          [rdi + 16],    xmm2
1663f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org%endmacro
1676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1686fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;void vp9_sad16x16x8_sse4(
1696fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    const unsigned char *src_ptr,
1706fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int  src_stride,
1716fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    const unsigned char *ref_ptr,
1726fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int  ref_stride,
1736fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    unsigned short *sad_array);
174afc4a270e3f2ecbbb47aad63c6a6a77ca902d30efgalligan@chromium.orgglobal sym(vp9_sad16x16x8_sse4) PRIVATE
1756fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgsym(vp9_sad16x16x8_sse4):
1766fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rbp
1776fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    mov         rbp, rsp
1786fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    SHADOW_ARGS_TO_STACK 5
1796fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rsi
1806fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rdi
1816fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; end prolog
1826fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1833f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    mov             rsi,        arg(0)           ;src_ptr
1843f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    mov             rdi,        arg(2)           ;ref_ptr
1856fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1863f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    movsxd          rax,        dword ptr arg(1) ;src_stride
1873f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    movsxd          rdx,        dword ptr arg(3) ;ref_stride
1886fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1893f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_16X2X8 1
1903f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_16X2X8 0
1913f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_16X2X8 0
1923f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_16X2X8 0
1933f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_16X2X8 0
1943f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_16X2X8 0
1953f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_16X2X8 0
1963f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_16X2X8 0
1976fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1983f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    WRITE_AS_INTS
1996fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2006fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; begin epilog
2016fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rdi
2026fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rsi
2036fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    UNSHADOW_ARGS
2046fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rbp
2056fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ret
2066fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2076fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2086fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;void vp9_sad16x8x8_sse4(
2096fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    const unsigned char *src_ptr,
2106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int  src_stride,
2116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    const unsigned char *ref_ptr,
2126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int  ref_stride,
2136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    unsigned short *sad_array
2146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;);
215afc4a270e3f2ecbbb47aad63c6a6a77ca902d30efgalligan@chromium.orgglobal sym(vp9_sad16x8x8_sse4) PRIVATE
2166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgsym(vp9_sad16x8x8_sse4):
2176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rbp
2186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    mov         rbp, rsp
2196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    SHADOW_ARGS_TO_STACK 5
2206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rsi
2216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rdi
2226fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; end prolog
2236fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2243f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    mov             rsi,        arg(0)           ;src_ptr
2253f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    mov             rdi,        arg(2)           ;ref_ptr
2266fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2273f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    movsxd          rax,        dword ptr arg(1) ;src_stride
2283f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    movsxd          rdx,        dword ptr arg(3) ;ref_stride
2296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2303f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_16X2X8 1
2313f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_16X2X8 0
2323f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_16X2X8 0
2333f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_16X2X8 0
2346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2353f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    WRITE_AS_INTS
2366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; begin epilog
2386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rdi
2396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rsi
2406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    UNSHADOW_ARGS
2416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rbp
2426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ret
2436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;void vp9_sad8x8x8_sse4(
2466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    const unsigned char *src_ptr,
2476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int  src_stride,
2486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    const unsigned char *ref_ptr,
2496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int  ref_stride,
2506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    unsigned short *sad_array
2516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;);
252afc4a270e3f2ecbbb47aad63c6a6a77ca902d30efgalligan@chromium.orgglobal sym(vp9_sad8x8x8_sse4) PRIVATE
2536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgsym(vp9_sad8x8x8_sse4):
2546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rbp
2556fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    mov         rbp, rsp
2566fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    SHADOW_ARGS_TO_STACK 5
2576fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rsi
2586fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rdi
2596fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; end prolog
2606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2613f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    mov             rsi,        arg(0)           ;src_ptr
2623f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    mov             rdi,        arg(2)           ;ref_ptr
2636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2643f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    movsxd          rax,        dword ptr arg(1) ;src_stride
2653f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    movsxd          rdx,        dword ptr arg(3) ;ref_stride
2666fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2673f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_8X2X8 1
2683f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_8X2X8 0
2693f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_8X2X8 0
2703f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_8X2X8 0
2716fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2723f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    WRITE_AS_INTS
2736fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2746fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; begin epilog
2756fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rdi
2766fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rsi
2776fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    UNSHADOW_ARGS
2786fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rbp
2796fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ret
2806fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2816fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2826fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;void vp9_sad8x16x8_sse4(
2836fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    const unsigned char *src_ptr,
2846fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int  src_stride,
2856fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    const unsigned char *ref_ptr,
2866fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int  ref_stride,
2876fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    unsigned short *sad_array
2886fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;);
289afc4a270e3f2ecbbb47aad63c6a6a77ca902d30efgalligan@chromium.orgglobal sym(vp9_sad8x16x8_sse4) PRIVATE
2906fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgsym(vp9_sad8x16x8_sse4):
2916fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rbp
2926fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    mov         rbp, rsp
2936fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    SHADOW_ARGS_TO_STACK 5
2946fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rsi
2956fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rdi
2966fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; end prolog
2976fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2983f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    mov             rsi,        arg(0)           ;src_ptr
2993f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    mov             rdi,        arg(2)           ;ref_ptr
3003f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org
3013f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    movsxd          rax,        dword ptr arg(1) ;src_stride
3023f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    movsxd          rdx,        dword ptr arg(3) ;ref_stride
3036fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3043f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_8X2X8 1
3053f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_8X2X8 0
3063f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_8X2X8 0
3073f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_8X2X8 0
3083f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_8X2X8 0
3093f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_8X2X8 0
3103f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_8X2X8 0
3113f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_8X2X8 0
3126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3133f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    WRITE_AS_INTS
3146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; begin epilog
3166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rdi
3176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rsi
3186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    UNSHADOW_ARGS
3196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rbp
3206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ret
3216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3226fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3236fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;void vp9_sad4x4x8_c(
3246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    const unsigned char *src_ptr,
3256fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int  src_stride,
3266fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    const unsigned char *ref_ptr,
3276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int  ref_stride,
3286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    unsigned short *sad_array
3296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;);
330afc4a270e3f2ecbbb47aad63c6a6a77ca902d30efgalligan@chromium.orgglobal sym(vp9_sad4x4x8_sse4) PRIVATE
3316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgsym(vp9_sad4x4x8_sse4):
3326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rbp
3336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    mov         rbp, rsp
3346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    SHADOW_ARGS_TO_STACK 5
3356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rsi
3366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rdi
3376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; end prolog
3386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3393f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    mov             rsi,        arg(0)           ;src_ptr
3403f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    mov             rdi,        arg(2)           ;ref_ptr
3416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3423f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    movsxd          rax,        dword ptr arg(1) ;src_stride
3433f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    movsxd          rdx,        dword ptr arg(3) ;ref_stride
3446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3453f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_4X2X8 1
3463f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    PROCESS_4X2X8 0
3476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3483f0af3b06425f635f3559f0bd4f53efea95fa5e2johannkoenig@chromium.org    WRITE_AS_INTS
3496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; begin epilog
3516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rdi
3526fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rsi
3536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    UNSHADOW_ARGS
3546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rbp
3556fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ret
3566fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3576fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3586fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3596fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
360