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_16X2X3 1
156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%if %1
166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm0,       XMMWORD PTR [rsi]
176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lddqu           xmm5,       XMMWORD PTR [rdi]
186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lddqu           xmm6,       XMMWORD PTR [rdi+1]
196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lddqu           xmm7,       XMMWORD PTR [rdi+2]
206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psadbw          xmm5,       xmm0
226fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psadbw          xmm6,       xmm0
236fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psadbw          xmm7,       xmm0
246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%else
256fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm0,       XMMWORD PTR [rsi]
266fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lddqu           xmm1,       XMMWORD PTR [rdi]
276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lddqu           xmm2,       XMMWORD PTR [rdi+1]
286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lddqu           xmm3,       XMMWORD PTR [rdi+2]
296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psadbw          xmm1,       xmm0
316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psadbw          xmm2,       xmm0
326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psadbw          xmm3,       xmm0
336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm5,       xmm1
356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm6,       xmm2
366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm7,       xmm3
376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%endif
386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm0,       XMMWORD PTR [rsi+rax]
396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lddqu           xmm1,       XMMWORD PTR [rdi+rdx]
406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lddqu           xmm2,       XMMWORD PTR [rdi+rdx+1]
416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lddqu           xmm3,       XMMWORD PTR [rdi+rdx+2]
426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea             rsi,        [rsi+rax*2]
446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea             rdi,        [rdi+rdx*2]
456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psadbw          xmm1,       xmm0
476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psadbw          xmm2,       xmm0
486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psadbw          xmm3,       xmm0
496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm5,       xmm1
516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm6,       xmm2
526fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm7,       xmm3
536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%endmacro
546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
556fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%macro PROCESS_16X2X3_OFFSET 2
566fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%if %1
576fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm0,       XMMWORD PTR [rsi]
586fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm4,       XMMWORD PTR [rdi]
596fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm7,       XMMWORD PTR [rdi+16]
606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm5,       xmm7
626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        palignr         xmm5,       xmm4,       %2
636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
646fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm6,       xmm7
656fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        palignr         xmm6,       xmm4,       (%2+1)
666fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        palignr         xmm7,       xmm4,       (%2+2)
686fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
696fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psadbw          xmm5,       xmm0
706fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psadbw          xmm6,       xmm0
716fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psadbw          xmm7,       xmm0
726fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%else
736fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm0,       XMMWORD PTR [rsi]
746fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm4,       XMMWORD PTR [rdi]
756fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm3,       XMMWORD PTR [rdi+16]
766fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
776fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm1,       xmm3
786fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        palignr         xmm1,       xmm4,       %2
796fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
806fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm2,       xmm3
816fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        palignr         xmm2,       xmm4,       (%2+1)
826fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
836fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        palignr         xmm3,       xmm4,       (%2+2)
846fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
856fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psadbw          xmm1,       xmm0
866fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psadbw          xmm2,       xmm0
876fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psadbw          xmm3,       xmm0
886fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
896fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm5,       xmm1
906fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm6,       xmm2
916fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm7,       xmm3
926fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%endif
936fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm0,       XMMWORD PTR [rsi+rax]
946fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm4,       XMMWORD PTR [rdi+rdx]
956fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm3,       XMMWORD PTR [rdi+rdx+16]
966fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
976fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm1,       xmm3
986fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        palignr         xmm1,       xmm4,       %2
996fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1006fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movdqa          xmm2,       xmm3
1016fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        palignr         xmm2,       xmm4,       (%2+1)
1026fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1036fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        palignr         xmm3,       xmm4,       (%2+2)
1046fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1056fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea             rsi,        [rsi+rax*2]
1066fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        lea             rdi,        [rdi+rdx*2]
1076fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1086fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psadbw          xmm1,       xmm0
1096fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psadbw          xmm2,       xmm0
1106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psadbw          xmm3,       xmm0
1116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm5,       xmm1
1136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm6,       xmm2
1146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm7,       xmm3
1156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%endmacro
1166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%macro PROCESS_16X16X3_OFFSET 2
1186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%2_aligned_by_%1:
1196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        sub             rdi,        %1
1216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1226fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3_OFFSET 1, %1
1236fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
1246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
1256fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
1266fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
1276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
1286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
1296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
1306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        jmp             %2_store_off
1326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%endmacro
1346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%macro PROCESS_16X8X3_OFFSET 2
1366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%2_aligned_by_%1:
1376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        sub             rdi,        %1
1396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3_OFFSET 1, %1
1416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
1426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
1436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
1446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        jmp             %2_store_off
1466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org%endmacro
1486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;void int vp9_sad16x16x3_ssse3(
1506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    unsigned char *src_ptr,
1516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int  src_stride,
1526fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    unsigned char *ref_ptr,
1536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int  ref_stride,
1546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int  *results)
155afc4a270e3f2ecbbb47aad63c6a6a77ca902d30efgalligan@chromium.orgglobal sym(vp9_sad16x16x3_ssse3) PRIVATE
1566fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgsym(vp9_sad16x16x3_ssse3):
1576fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rbp
1586fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    mov         rbp, rsp
1596fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    SHADOW_ARGS_TO_STACK 5
1606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    SAVE_XMM 7
1616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rsi
1626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rdi
1636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rcx
1646fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; end prolog
1656fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1666fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov             rsi,        arg(0) ;src_ptr
1676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov             rdi,        arg(2) ;ref_ptr
1686fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1696fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov             rdx,        0xf
1706fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        and             rdx,        rdi
1716fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1726fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        jmp .vp9_sad16x16x3_ssse3_skiptable
1736fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org.vp9_sad16x16x3_ssse3_jumptable:
1746fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x16x3_ssse3_aligned_by_0  - .vp9_sad16x16x3_ssse3_do_jump
1756fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x16x3_ssse3_aligned_by_1  - .vp9_sad16x16x3_ssse3_do_jump
1766fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x16x3_ssse3_aligned_by_2  - .vp9_sad16x16x3_ssse3_do_jump
1776fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x16x3_ssse3_aligned_by_3  - .vp9_sad16x16x3_ssse3_do_jump
1786fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x16x3_ssse3_aligned_by_4  - .vp9_sad16x16x3_ssse3_do_jump
1796fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x16x3_ssse3_aligned_by_5  - .vp9_sad16x16x3_ssse3_do_jump
1806fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x16x3_ssse3_aligned_by_6  - .vp9_sad16x16x3_ssse3_do_jump
1816fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x16x3_ssse3_aligned_by_7  - .vp9_sad16x16x3_ssse3_do_jump
1826fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x16x3_ssse3_aligned_by_8  - .vp9_sad16x16x3_ssse3_do_jump
1836fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x16x3_ssse3_aligned_by_9  - .vp9_sad16x16x3_ssse3_do_jump
1846fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x16x3_ssse3_aligned_by_10 - .vp9_sad16x16x3_ssse3_do_jump
1856fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x16x3_ssse3_aligned_by_11 - .vp9_sad16x16x3_ssse3_do_jump
1866fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x16x3_ssse3_aligned_by_12 - .vp9_sad16x16x3_ssse3_do_jump
1876fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x16x3_ssse3_aligned_by_13 - .vp9_sad16x16x3_ssse3_do_jump
1886fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x16x3_ssse3_aligned_by_14 - .vp9_sad16x16x3_ssse3_do_jump
1896fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x16x3_ssse3_aligned_by_15 - .vp9_sad16x16x3_ssse3_do_jump
1906fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org.vp9_sad16x16x3_ssse3_skiptable:
1916fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1926fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        call .vp9_sad16x16x3_ssse3_do_jump
1936fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org.vp9_sad16x16x3_ssse3_do_jump:
1946fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pop             rcx                         ; get the address of do_jump
1956fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov             rax,  .vp9_sad16x16x3_ssse3_jumptable - .vp9_sad16x16x3_ssse3_do_jump
1966fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        add             rax,  rcx  ; get the absolute address of vp9_sad16x16x3_ssse3_jumptable
1976fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1986fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movsxd          rax,  dword [rax + 4*rdx]   ; get the 32 bit offset from the jumptable
1996fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        add             rcx,        rax
2006fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2016fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movsxd          rax,        dword ptr arg(1) ;src_stride
2026fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movsxd          rdx,        dword ptr arg(3) ;ref_stride
2036fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2046fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        jmp             rcx
2056fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2066fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X16X3_OFFSET 0,  .vp9_sad16x16x3_ssse3
2076fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X16X3_OFFSET 1,  .vp9_sad16x16x3_ssse3
2086fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X16X3_OFFSET 2,  .vp9_sad16x16x3_ssse3
2096fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X16X3_OFFSET 3,  .vp9_sad16x16x3_ssse3
2106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X16X3_OFFSET 4,  .vp9_sad16x16x3_ssse3
2116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X16X3_OFFSET 5,  .vp9_sad16x16x3_ssse3
2126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X16X3_OFFSET 6,  .vp9_sad16x16x3_ssse3
2136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X16X3_OFFSET 7,  .vp9_sad16x16x3_ssse3
2146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X16X3_OFFSET 8,  .vp9_sad16x16x3_ssse3
2156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X16X3_OFFSET 9,  .vp9_sad16x16x3_ssse3
2166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X16X3_OFFSET 10, .vp9_sad16x16x3_ssse3
2176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X16X3_OFFSET 11, .vp9_sad16x16x3_ssse3
2186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X16X3_OFFSET 12, .vp9_sad16x16x3_ssse3
2196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X16X3_OFFSET 13, .vp9_sad16x16x3_ssse3
2206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X16X3_OFFSET 14, .vp9_sad16x16x3_ssse3
2216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2226fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org.vp9_sad16x16x3_ssse3_aligned_by_15:
2236fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3 1
2246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3 0
2256fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3 0
2266fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3 0
2276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3 0
2286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3 0
2296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3 0
2306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3 0
2316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org.vp9_sad16x16x3_ssse3_store_off:
2336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov             rdi,        arg(4) ;Results
2346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm0,       xmm5
2366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psrldq          xmm5,       8
2376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm0,       xmm5
2396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movd            [rdi],      xmm0
2406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;-
2416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm0,       xmm6
2426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psrldq          xmm6,       8
2436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm0,       xmm6
2456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movd            [rdi+4],    xmm0
2466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;-
2476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm0,       xmm7
2486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psrldq          xmm7,       8
2496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm0,       xmm7
2516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movd            [rdi+8],    xmm0
2526fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; begin epilog
2546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rcx
2556fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rdi
2566fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rsi
2576fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    RESTORE_XMM
2586fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    UNSHADOW_ARGS
2596fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rbp
2606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ret
2616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;void int vp9_sad16x8x3_ssse3(
2636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    unsigned char *src_ptr,
2646fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int  src_stride,
2656fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    unsigned char *ref_ptr,
2666fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int  ref_stride,
2676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;    int  *results)
268afc4a270e3f2ecbbb47aad63c6a6a77ca902d30efgalligan@chromium.orgglobal sym(vp9_sad16x8x3_ssse3) PRIVATE
2696fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgsym(vp9_sad16x8x3_ssse3):
2706fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rbp
2716fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    mov         rbp, rsp
2726fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    SHADOW_ARGS_TO_STACK 5
2736fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    SAVE_XMM 7
2746fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rsi
2756fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rdi
2766fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    push        rcx
2776fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; end prolog
2786fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2796fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov             rsi,        arg(0) ;src_ptr
2806fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov             rdi,        arg(2) ;ref_ptr
2816fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2826fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov             rdx,        0xf
2836fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        and             rdx,        rdi
2846fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2856fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        jmp .vp9_sad16x8x3_ssse3_skiptable
2866fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org.vp9_sad16x8x3_ssse3_jumptable:
2876fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x8x3_ssse3_aligned_by_0  - .vp9_sad16x8x3_ssse3_do_jump
2886fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x8x3_ssse3_aligned_by_1  - .vp9_sad16x8x3_ssse3_do_jump
2896fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x8x3_ssse3_aligned_by_2  - .vp9_sad16x8x3_ssse3_do_jump
2906fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x8x3_ssse3_aligned_by_3  - .vp9_sad16x8x3_ssse3_do_jump
2916fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x8x3_ssse3_aligned_by_4  - .vp9_sad16x8x3_ssse3_do_jump
2926fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x8x3_ssse3_aligned_by_5  - .vp9_sad16x8x3_ssse3_do_jump
2936fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x8x3_ssse3_aligned_by_6  - .vp9_sad16x8x3_ssse3_do_jump
2946fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x8x3_ssse3_aligned_by_7  - .vp9_sad16x8x3_ssse3_do_jump
2956fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x8x3_ssse3_aligned_by_8  - .vp9_sad16x8x3_ssse3_do_jump
2966fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x8x3_ssse3_aligned_by_9  - .vp9_sad16x8x3_ssse3_do_jump
2976fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x8x3_ssse3_aligned_by_10 - .vp9_sad16x8x3_ssse3_do_jump
2986fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x8x3_ssse3_aligned_by_11 - .vp9_sad16x8x3_ssse3_do_jump
2996fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x8x3_ssse3_aligned_by_12 - .vp9_sad16x8x3_ssse3_do_jump
3006fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x8x3_ssse3_aligned_by_13 - .vp9_sad16x8x3_ssse3_do_jump
3016fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x8x3_ssse3_aligned_by_14 - .vp9_sad16x8x3_ssse3_do_jump
3026fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        dd .vp9_sad16x8x3_ssse3_aligned_by_15 - .vp9_sad16x8x3_ssse3_do_jump
3036fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org.vp9_sad16x8x3_ssse3_skiptable:
3046fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3056fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        call .vp9_sad16x8x3_ssse3_do_jump
3066fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org.vp9_sad16x8x3_ssse3_do_jump:
3076fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        pop             rcx                         ; get the address of do_jump
3086fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov             rax,  .vp9_sad16x8x3_ssse3_jumptable - .vp9_sad16x8x3_ssse3_do_jump
3096fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        add             rax,  rcx  ; get the absolute address of vp9_sad16x8x3_ssse3_jumptable
3106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movsxd          rax,  dword [rax + 4*rdx]   ; get the 32 bit offset from the jumptable
3126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        add             rcx,        rax
3136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movsxd          rax,        dword ptr arg(1) ;src_stride
3156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movsxd          rdx,        dword ptr arg(3) ;ref_stride
3166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        jmp             rcx
3186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X8X3_OFFSET 0,  .vp9_sad16x8x3_ssse3
3206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X8X3_OFFSET 1,  .vp9_sad16x8x3_ssse3
3216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X8X3_OFFSET 2,  .vp9_sad16x8x3_ssse3
3226fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X8X3_OFFSET 3,  .vp9_sad16x8x3_ssse3
3236fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X8X3_OFFSET 4,  .vp9_sad16x8x3_ssse3
3246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X8X3_OFFSET 5,  .vp9_sad16x8x3_ssse3
3256fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X8X3_OFFSET 6,  .vp9_sad16x8x3_ssse3
3266fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X8X3_OFFSET 7,  .vp9_sad16x8x3_ssse3
3276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X8X3_OFFSET 8,  .vp9_sad16x8x3_ssse3
3286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X8X3_OFFSET 9,  .vp9_sad16x8x3_ssse3
3296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X8X3_OFFSET 10, .vp9_sad16x8x3_ssse3
3306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X8X3_OFFSET 11, .vp9_sad16x8x3_ssse3
3316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X8X3_OFFSET 12, .vp9_sad16x8x3_ssse3
3326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X8X3_OFFSET 13, .vp9_sad16x8x3_ssse3
3336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X8X3_OFFSET 14, .vp9_sad16x8x3_ssse3
3346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org.vp9_sad16x8x3_ssse3_aligned_by_15:
3366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3 1
3386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3 0
3396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3 0
3406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        PROCESS_16X2X3 0
3416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org.vp9_sad16x8x3_ssse3_store_off:
3436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        mov             rdi,        arg(4) ;Results
3446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm0,       xmm5
3466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psrldq          xmm5,       8
3476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm0,       xmm5
3496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movd            [rdi],      xmm0
3506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;-
3516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm0,       xmm6
3526fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psrldq          xmm6,       8
3536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm0,       xmm6
3556fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movd            [rdi+4],    xmm0
3566fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org;-
3576fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movq            xmm0,       xmm7
3586fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        psrldq          xmm7,       8
3596fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        paddw           xmm0,       xmm7
3616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        movd            [rdi+8],    xmm0
3626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ; begin epilog
3646fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rcx
3656fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rdi
3666fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rsi
3676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    RESTORE_XMM
3686fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    UNSHADOW_ARGS
3696fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    pop         rbp
3706fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ret
371