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_16X2X8 1
15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if %1
16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm0,       XMMWORD PTR [rsi]
17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm1,       MMWORD PTR [rdi]
18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm3,       MMWORD PTR [rdi+8]
19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm2,       MMWORD PTR [rdi+16]
20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklqdq      xmm1,       xmm3
21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklqdq      xmm3,       xmm2
22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm2,       xmm1
24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm1,       xmm0,  0x0
25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm2,       xmm0,  0x5
26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm0,       8
28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm4,       xmm3
30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm3,       xmm0,  0x0
31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm4,       xmm0,  0x5
32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm1,       xmm2
34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm1,       xmm3
35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm1,       xmm4
36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%else
37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm0,       XMMWORD PTR [rsi]
38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm5,       MMWORD PTR [rdi]
39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm3,       MMWORD PTR [rdi+8]
40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm2,       MMWORD PTR [rdi+16]
41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklqdq      xmm5,       xmm3
42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklqdq      xmm3,       xmm2
43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm2,       xmm5
45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm5,       xmm0,  0x0
46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm2,       xmm0,  0x5
47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm0,       8
49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm4,       xmm3
51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm3,       xmm0,  0x0
52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm4,       xmm0,  0x5
53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm5,       xmm2
55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm5,       xmm3
56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm5,       xmm4
57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm1,       xmm5
59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm0,       XMMWORD PTR [rsi + rax]
61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm5,       MMWORD PTR [rdi+ rdx]
62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm3,       MMWORD PTR [rdi+ rdx+8]
63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm2,       MMWORD PTR [rdi+ rdx+16]
64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklqdq      xmm5,       xmm3
65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklqdq      xmm3,       xmm2
66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             rsi,        [rsi+rax*2]
68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             rdi,        [rdi+rdx*2]
69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm2,       xmm5
71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm5,       xmm0,  0x0
72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm2,       xmm0,  0x5
73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm0,       8
75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm4,       xmm3
76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm3,       xmm0,  0x0
77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm4,       xmm0,  0x5
78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm5,       xmm2
80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm5,       xmm3
81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm5,       xmm4
82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm1,       xmm5
84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endmacro
85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%macro PROCESS_8X2X8 1
87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if %1
88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       MMWORD PTR [rsi]
89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm1,       MMWORD PTR [rdi]
90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm3,       MMWORD PTR [rdi+8]
91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklqdq      xmm1,       xmm3
92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm2,       xmm1
94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm1,       xmm0,  0x0
95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm2,       xmm0,  0x5
96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm1,       xmm2
97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%else
98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       MMWORD PTR [rsi]
99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm5,       MMWORD PTR [rdi]
100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm3,       MMWORD PTR [rdi+8]
101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklqdq      xmm5,       xmm3
102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm2,       xmm5
104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm5,       xmm0,  0x0
105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm2,       xmm0,  0x5
106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm5,       xmm2
107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm1,       xmm5
109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       MMWORD PTR [rsi + rax]
111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm5,       MMWORD PTR [rdi+ rdx]
112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm3,       MMWORD PTR [rdi+ rdx+8]
113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklqdq      xmm5,       xmm3
114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             rsi,        [rsi+rax*2]
116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             rdi,        [rdi+rdx*2]
117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm2,       xmm5
119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm5,       xmm0,  0x0
120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm2,       xmm0,  0x5
121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm5,       xmm2
122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm1,       xmm5
124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endmacro
125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%macro PROCESS_4X2X8 1
127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if %1
128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            xmm0,       [rsi]
129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm1,       MMWORD PTR [rdi]
130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm3,       MMWORD PTR [rdi+8]
131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklqdq      xmm1,       xmm3
132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm1,       xmm0,  0x0
134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%else
135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            xmm0,       [rsi]
136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm5,       MMWORD PTR [rdi]
137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm3,       MMWORD PTR [rdi+8]
138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklqdq      xmm5,       xmm3
139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm5,       xmm0,  0x0
141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm1,       xmm5
143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            xmm0,       [rsi + rax]
145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm5,       MMWORD PTR [rdi+ rdx]
146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm3,       MMWORD PTR [rdi+ rdx+8]
147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklqdq      xmm5,       xmm3
148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             rsi,        [rsi+rax*2]
150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             rdi,        [rdi+rdx*2]
151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mpsadbw         xmm5,       xmm0,  0x0
153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm1,       xmm5
155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endmacro
156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;void vp8_sad16x16x8_sse4(
159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    const unsigned char *src_ptr,
160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  src_stride,
161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    const unsigned char *ref_ptr,
162474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  ref_stride,
163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned short *sad_array);
164f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_sad16x16x8_sse4) PRIVATE
165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_sad16x16x8_sse4):
166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rbp
167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    mov         rbp, rsp
168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    SHADOW_ARGS_TO_STACK 5
169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rsi
170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rdi
171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ; end prolog
172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rsi,        arg(0)           ;src_ptr
174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdi,        arg(2)           ;ref_ptr
175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movsxd          rax,        dword ptr arg(1) ;src_stride
177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movsxd          rdx,        dword ptr arg(3) ;ref_stride
178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X8 1
180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X8 0
181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X8 0
182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X8 0
183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X8 0
184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X8 0
185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X8 0
186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X8 0
187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdi,        arg(4)           ;Results
189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          XMMWORD PTR [rdi],    xmm1
190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ; begin epilog
192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rdi
193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rsi
194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    UNSHADOW_ARGS
195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rbp
196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ret
197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;void vp8_sad16x8x8_sse4(
200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    const unsigned char *src_ptr,
201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  src_stride,
202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    const unsigned char *ref_ptr,
203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  ref_stride,
204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned short *sad_array
205474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;);
206f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_sad16x8x8_sse4) PRIVATE
207474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_sad16x8x8_sse4):
208474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rbp
209474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    mov         rbp, rsp
210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    SHADOW_ARGS_TO_STACK 5
211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rsi
212474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rdi
213474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ; end prolog
214474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
215474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rsi,        arg(0)           ;src_ptr
216474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdi,        arg(2)           ;ref_ptr
217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
218474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movsxd          rax,        dword ptr arg(1) ;src_stride
219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movsxd          rdx,        dword ptr arg(3) ;ref_stride
220474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
221474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X8 1
222474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X8 0
223474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X8 0
224474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X8 0
225474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
226474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdi,        arg(4)           ;Results
227474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          XMMWORD PTR [rdi],    xmm1
228474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
229474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ; begin epilog
230474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rdi
231474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rsi
232474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    UNSHADOW_ARGS
233474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rbp
234474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ret
235474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
236474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
237474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;void vp8_sad8x8x8_sse4(
238474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    const unsigned char *src_ptr,
239474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  src_stride,
240474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    const unsigned char *ref_ptr,
241474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  ref_stride,
242474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned short *sad_array
243474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;);
244f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_sad8x8x8_sse4) PRIVATE
245474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_sad8x8x8_sse4):
246474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rbp
247474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    mov         rbp, rsp
248474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    SHADOW_ARGS_TO_STACK 5
249474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rsi
250474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rdi
251474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ; end prolog
252474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rsi,        arg(0)           ;src_ptr
254474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdi,        arg(2)           ;ref_ptr
255474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
256474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movsxd          rax,        dword ptr arg(1) ;src_stride
257474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movsxd          rdx,        dword ptr arg(3) ;ref_stride
258474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
259474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X8 1
260474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X8 0
261474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X8 0
262474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X8 0
263474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
264474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdi,        arg(4)           ;Results
265474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          XMMWORD PTR [rdi],    xmm1
266474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
267474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ; begin epilog
268474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rdi
269474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rsi
270474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    UNSHADOW_ARGS
271474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rbp
272474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ret
273474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
274474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
275474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;void vp8_sad8x16x8_sse4(
276474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    const unsigned char *src_ptr,
277474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  src_stride,
278474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    const unsigned char *ref_ptr,
279474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  ref_stride,
280474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned short *sad_array
281474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;);
282f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_sad8x16x8_sse4) PRIVATE
283474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_sad8x16x8_sse4):
284474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rbp
285474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    mov         rbp, rsp
286474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    SHADOW_ARGS_TO_STACK 5
287474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rsi
288474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rdi
289474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ; end prolog
290474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
291474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rsi,        arg(0)           ;src_ptr
292474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdi,        arg(2)           ;ref_ptr
293474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
294474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movsxd          rax,        dword ptr arg(1) ;src_stride
295474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movsxd          rdx,        dword ptr arg(3) ;ref_stride
296474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
297474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X8 1
298474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X8 0
299474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X8 0
300474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X8 0
301474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X8 0
302474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X8 0
303474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X8 0
304474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X8 0
305474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdi,        arg(4)           ;Results
306474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          XMMWORD PTR [rdi],    xmm1
307474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
308474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ; begin epilog
309474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rdi
310474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rsi
311474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    UNSHADOW_ARGS
312474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rbp
313474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ret
314474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
315474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
316474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;void vp8_sad4x4x8_c(
317474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    const unsigned char *src_ptr,
318474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  src_stride,
319474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    const unsigned char *ref_ptr,
320474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  ref_stride,
321474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned short *sad_array
322474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;);
323f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_sad4x4x8_sse4) PRIVATE
324474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_sad4x4x8_sse4):
325474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rbp
326474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    mov         rbp, rsp
327474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    SHADOW_ARGS_TO_STACK 5
328474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rsi
329474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rdi
330474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ; end prolog
331474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
332474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rsi,        arg(0)           ;src_ptr
333474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdi,        arg(2)           ;ref_ptr
334474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
335474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movsxd          rax,        dword ptr arg(1) ;src_stride
336474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movsxd          rdx,        dword ptr arg(3) ;ref_stride
337474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
338474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_4X2X8 1
339474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_4X2X8 0
340474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
341474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdi,        arg(4)           ;Results
342474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          XMMWORD PTR [rdi],    xmm1
343474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
344474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ; begin epilog
345474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rdi
346474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rsi
347474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    UNSHADOW_ARGS
348474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rbp
349474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ret
350474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
351474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
352474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
353474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
354