1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;
2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;
4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;  Use of this source code is governed by a BSD-style license
5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;  that can be found in the LICENSE file in the root of the source
6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;  tree. An additional intellectual property rights grant can be found
7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;  in the file PATENTS.  All contributing project authors may
8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;  be found in the AUTHORS file in the root of the source tree.
9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;
10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
12474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%include "vpx_ports/x86_abi_support.asm"
13474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%macro PROCESS_16X2X3 1
15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if %1
16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm0,       XMMWORD PTR [rsi]
17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm5,       XMMWORD PTR [rdi]
18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm6,       XMMWORD PTR [rdi+1]
19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm7,       XMMWORD PTR [rdi+2]
20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm5,       xmm0
22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm6,       xmm0
23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm7,       xmm0
24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%else
25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm0,       XMMWORD PTR [rsi]
26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm1,       XMMWORD PTR [rdi]
27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm2,       XMMWORD PTR [rdi+1]
28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm3,       XMMWORD PTR [rdi+2]
29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm1,       xmm0
31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm2,       xmm0
32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm3,       xmm0
33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm5,       xmm1
35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm6,       xmm2
36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm7,       xmm3
37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm0,       XMMWORD PTR [rsi+rax]
39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm1,       XMMWORD PTR [rdi+rdx]
40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm2,       XMMWORD PTR [rdi+rdx+1]
41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm3,       XMMWORD PTR [rdi+rdx+2]
42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             rsi,        [rsi+rax*2]
44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             rdi,        [rdi+rdx*2]
45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm1,       xmm0
47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm2,       xmm0
48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm3,       xmm0
49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm5,       xmm1
51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm6,       xmm2
52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm7,       xmm3
53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endmacro
54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%macro PROCESS_16X2X3_OFFSET 2
56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if %1
57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm0,       XMMWORD PTR [rsi]
58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm4,       XMMWORD PTR [rdi]
59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm7,       XMMWORD PTR [rdi+16]
60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm5,       xmm7
62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        palignr         xmm5,       xmm4,       %2
63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm6,       xmm7
65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        palignr         xmm6,       xmm4,       (%2+1)
66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        palignr         xmm7,       xmm4,       (%2+2)
68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm5,       xmm0
70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm6,       xmm0
71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm7,       xmm0
72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%else
73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm0,       XMMWORD PTR [rsi]
74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm4,       XMMWORD PTR [rdi]
75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm3,       XMMWORD PTR [rdi+16]
76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm1,       xmm3
78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        palignr         xmm1,       xmm4,       %2
79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm2,       xmm3
81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        palignr         xmm2,       xmm4,       (%2+1)
82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        palignr         xmm3,       xmm4,       (%2+2)
84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm1,       xmm0
86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm2,       xmm0
87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm3,       xmm0
88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm5,       xmm1
90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm6,       xmm2
91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm7,       xmm3
92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm0,       XMMWORD PTR [rsi+rax]
94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm4,       XMMWORD PTR [rdi+rdx]
95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm3,       XMMWORD PTR [rdi+rdx+16]
96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm1,       xmm3
98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        palignr         xmm1,       xmm4,       %2
99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm2,       xmm3
101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        palignr         xmm2,       xmm4,       (%2+1)
102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        palignr         xmm3,       xmm4,       (%2+2)
104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             rsi,        [rsi+rax*2]
106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             rdi,        [rdi+rdx*2]
107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm1,       xmm0
109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm2,       xmm0
110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm3,       xmm0
111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm5,       xmm1
113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm6,       xmm2
114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm7,       xmm3
115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endmacro
116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%macro PROCESS_16X16X3_OFFSET 2
118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%2_aligned_by_%1:
119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sub             rdi,        %1
121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3_OFFSET 1, %1
123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        jmp             %2_store_off
132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endmacro
134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%macro PROCESS_16X8X3_OFFSET 2
136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%2_aligned_by_%1:
137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sub             rdi,        %1
139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3_OFFSET 1, %1
141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3_OFFSET 0, %1
144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        jmp             %2_store_off
146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endmacro
148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;void int vp8_sad16x16x3_ssse3(
150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *src_ptr,
151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  src_stride,
152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *ref_ptr,
153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  ref_stride,
154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  *results)
155f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_sad16x16x3_ssse3) PRIVATE
156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_sad16x16x3_ssse3):
157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rbp
158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    mov         rbp, rsp
159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    SHADOW_ARGS_TO_STACK 5
160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    SAVE_XMM 7
161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rsi
162474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rdi
163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rcx
164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ; end prolog
165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rsi,        arg(0) ;src_ptr
167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdi,        arg(2) ;ref_ptr
168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdx,        0xf
170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        and             rdx,        rdi
171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
172167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        jmp .vp8_sad16x16x3_ssse3_skiptable
173167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org.vp8_sad16x16x3_ssse3_jumptable:
174167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x16x3_ssse3_aligned_by_0  - .vp8_sad16x16x3_ssse3_do_jump
175167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x16x3_ssse3_aligned_by_1  - .vp8_sad16x16x3_ssse3_do_jump
176167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x16x3_ssse3_aligned_by_2  - .vp8_sad16x16x3_ssse3_do_jump
177167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x16x3_ssse3_aligned_by_3  - .vp8_sad16x16x3_ssse3_do_jump
178167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x16x3_ssse3_aligned_by_4  - .vp8_sad16x16x3_ssse3_do_jump
179167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x16x3_ssse3_aligned_by_5  - .vp8_sad16x16x3_ssse3_do_jump
180167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x16x3_ssse3_aligned_by_6  - .vp8_sad16x16x3_ssse3_do_jump
181167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x16x3_ssse3_aligned_by_7  - .vp8_sad16x16x3_ssse3_do_jump
182167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x16x3_ssse3_aligned_by_8  - .vp8_sad16x16x3_ssse3_do_jump
183167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x16x3_ssse3_aligned_by_9  - .vp8_sad16x16x3_ssse3_do_jump
184167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x16x3_ssse3_aligned_by_10 - .vp8_sad16x16x3_ssse3_do_jump
185167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x16x3_ssse3_aligned_by_11 - .vp8_sad16x16x3_ssse3_do_jump
186167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x16x3_ssse3_aligned_by_12 - .vp8_sad16x16x3_ssse3_do_jump
187167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x16x3_ssse3_aligned_by_13 - .vp8_sad16x16x3_ssse3_do_jump
188167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x16x3_ssse3_aligned_by_14 - .vp8_sad16x16x3_ssse3_do_jump
189167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x16x3_ssse3_aligned_by_15 - .vp8_sad16x16x3_ssse3_do_jump
190167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org.vp8_sad16x16x3_ssse3_skiptable:
191167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
192167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        call .vp8_sad16x16x3_ssse3_do_jump
193167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org.vp8_sad16x16x3_ssse3_do_jump:
194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pop             rcx                         ; get the address of do_jump
195167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        mov             rax,  .vp8_sad16x16x3_ssse3_jumptable - .vp8_sad16x16x3_ssse3_do_jump
196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        add             rax,  rcx  ; get the absolute address of vp8_sad16x16x3_ssse3_jumptable
197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movsxd          rax,  dword [rax + 4*rdx]   ; get the 32 bit offset from the jumptable
199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        add             rcx,        rax
200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movsxd          rax,        dword ptr arg(1) ;src_stride
202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movsxd          rdx,        dword ptr arg(3) ;ref_stride
203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        jmp             rcx
205474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
206167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X16X3_OFFSET 0,  .vp8_sad16x16x3_ssse3
207167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X16X3_OFFSET 1,  .vp8_sad16x16x3_ssse3
208167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X16X3_OFFSET 2,  .vp8_sad16x16x3_ssse3
209167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X16X3_OFFSET 3,  .vp8_sad16x16x3_ssse3
210167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X16X3_OFFSET 4,  .vp8_sad16x16x3_ssse3
211167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X16X3_OFFSET 5,  .vp8_sad16x16x3_ssse3
212167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X16X3_OFFSET 6,  .vp8_sad16x16x3_ssse3
213167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X16X3_OFFSET 7,  .vp8_sad16x16x3_ssse3
214167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X16X3_OFFSET 8,  .vp8_sad16x16x3_ssse3
215167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X16X3_OFFSET 9,  .vp8_sad16x16x3_ssse3
216167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X16X3_OFFSET 10, .vp8_sad16x16x3_ssse3
217167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X16X3_OFFSET 11, .vp8_sad16x16x3_ssse3
218167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X16X3_OFFSET 12, .vp8_sad16x16x3_ssse3
219167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X16X3_OFFSET 13, .vp8_sad16x16x3_ssse3
220167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X16X3_OFFSET 14, .vp8_sad16x16x3_ssse3
221167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
222167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org.vp8_sad16x16x3_ssse3_aligned_by_15:
223474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 1
224474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 0
225474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 0
226474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 0
227474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 0
228474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 0
229474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 0
230474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 0
231474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
232167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org.vp8_sad16x16x3_ssse3_store_off:
233474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdi,        arg(4) ;Results
234474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
235474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm5
236474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm5,       8
237474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
238474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm5
239474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rdi],      xmm0
240474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;-
241474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm6
242474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm6,       8
243474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
244474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm6
245474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rdi+4],    xmm0
246474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;-
247474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm7
248474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm7,       8
249474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
250474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm7
251474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rdi+8],    xmm0
252474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ; begin epilog
254474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rcx
255474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rdi
256474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rsi
257474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    RESTORE_XMM
258474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    UNSHADOW_ARGS
259474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rbp
260474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ret
261474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
262474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;void int vp8_sad16x8x3_ssse3(
263474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *src_ptr,
264474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  src_stride,
265474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *ref_ptr,
266474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  ref_stride,
267474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  *results)
268f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_sad16x8x3_ssse3) PRIVATE
269474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_sad16x8x3_ssse3):
270474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rbp
271474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    mov         rbp, rsp
272474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    SHADOW_ARGS_TO_STACK 5
273474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    SAVE_XMM 7
274474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rsi
275474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rdi
276474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rcx
277474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ; end prolog
278474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
279474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rsi,        arg(0) ;src_ptr
280474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdi,        arg(2) ;ref_ptr
281474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
282474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdx,        0xf
283474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        and             rdx,        rdi
284474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
285167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        jmp .vp8_sad16x8x3_ssse3_skiptable
286167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org.vp8_sad16x8x3_ssse3_jumptable:
287167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x8x3_ssse3_aligned_by_0  - .vp8_sad16x8x3_ssse3_do_jump
288167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x8x3_ssse3_aligned_by_1  - .vp8_sad16x8x3_ssse3_do_jump
289167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x8x3_ssse3_aligned_by_2  - .vp8_sad16x8x3_ssse3_do_jump
290167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x8x3_ssse3_aligned_by_3  - .vp8_sad16x8x3_ssse3_do_jump
291167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x8x3_ssse3_aligned_by_4  - .vp8_sad16x8x3_ssse3_do_jump
292167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x8x3_ssse3_aligned_by_5  - .vp8_sad16x8x3_ssse3_do_jump
293167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x8x3_ssse3_aligned_by_6  - .vp8_sad16x8x3_ssse3_do_jump
294167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x8x3_ssse3_aligned_by_7  - .vp8_sad16x8x3_ssse3_do_jump
295167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x8x3_ssse3_aligned_by_8  - .vp8_sad16x8x3_ssse3_do_jump
296167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x8x3_ssse3_aligned_by_9  - .vp8_sad16x8x3_ssse3_do_jump
297167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x8x3_ssse3_aligned_by_10 - .vp8_sad16x8x3_ssse3_do_jump
298167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x8x3_ssse3_aligned_by_11 - .vp8_sad16x8x3_ssse3_do_jump
299167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x8x3_ssse3_aligned_by_12 - .vp8_sad16x8x3_ssse3_do_jump
300167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x8x3_ssse3_aligned_by_13 - .vp8_sad16x8x3_ssse3_do_jump
301167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x8x3_ssse3_aligned_by_14 - .vp8_sad16x8x3_ssse3_do_jump
302167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dd .vp8_sad16x8x3_ssse3_aligned_by_15 - .vp8_sad16x8x3_ssse3_do_jump
303167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org.vp8_sad16x8x3_ssse3_skiptable:
304167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
305167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        call .vp8_sad16x8x3_ssse3_do_jump
306167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org.vp8_sad16x8x3_ssse3_do_jump:
307474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pop             rcx                         ; get the address of do_jump
308167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        mov             rax,  .vp8_sad16x8x3_ssse3_jumptable - .vp8_sad16x8x3_ssse3_do_jump
309474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        add             rax,  rcx  ; get the absolute address of vp8_sad16x8x3_ssse3_jumptable
310474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
311474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movsxd          rax,  dword [rax + 4*rdx]   ; get the 32 bit offset from the jumptable
312474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        add             rcx,        rax
313474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
314474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movsxd          rax,        dword ptr arg(1) ;src_stride
315474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movsxd          rdx,        dword ptr arg(3) ;ref_stride
316474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
317474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        jmp             rcx
318474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
319167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X8X3_OFFSET 0,  .vp8_sad16x8x3_ssse3
320167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X8X3_OFFSET 1,  .vp8_sad16x8x3_ssse3
321167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X8X3_OFFSET 2,  .vp8_sad16x8x3_ssse3
322167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X8X3_OFFSET 3,  .vp8_sad16x8x3_ssse3
323167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X8X3_OFFSET 4,  .vp8_sad16x8x3_ssse3
324167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X8X3_OFFSET 5,  .vp8_sad16x8x3_ssse3
325167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X8X3_OFFSET 6,  .vp8_sad16x8x3_ssse3
326167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X8X3_OFFSET 7,  .vp8_sad16x8x3_ssse3
327167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X8X3_OFFSET 8,  .vp8_sad16x8x3_ssse3
328167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X8X3_OFFSET 9,  .vp8_sad16x8x3_ssse3
329167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X8X3_OFFSET 10, .vp8_sad16x8x3_ssse3
330167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X8X3_OFFSET 11, .vp8_sad16x8x3_ssse3
331167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X8X3_OFFSET 12, .vp8_sad16x8x3_ssse3
332167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X8X3_OFFSET 13, .vp8_sad16x8x3_ssse3
333167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        PROCESS_16X8X3_OFFSET 14, .vp8_sad16x8x3_ssse3
334167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
335167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org.vp8_sad16x8x3_ssse3_aligned_by_15:
336474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
337474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 1
338474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 0
339474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 0
340474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 0
341474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
342167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org.vp8_sad16x8x3_ssse3_store_off:
343474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdi,        arg(4) ;Results
344474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
345474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm5
346474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm5,       8
347474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
348474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm5
349474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rdi],      xmm0
350474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;-
351474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm6
352474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm6,       8
353474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
354474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm6
355474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rdi+4],    xmm0
356474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;-
357474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm7
358474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm7,       8
359474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
360474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm7
361474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rdi+8],    xmm0
362474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
363474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ; begin epilog
364474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rcx
365474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rdi
366474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rsi
367474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    RESTORE_XMM
368474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    UNSHADOW_ARGS
369474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rbp
370474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ret
371