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%include "vpx_ports/x86_abi_support.asm"
12474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
13474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%macro STACK_FRAME_CREATE_X3 0
14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if ABI_IS_32BIT
15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     src_ptr       rsi
16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     src_stride    rax
17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     ref_ptr       rdi
18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     ref_stride    rdx
19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     end_ptr       rcx
20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     ret_var       rbx
21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     result_ptr    arg(4)
225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org  %define     max_sad       arg(4)
23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     height        dword ptr arg(4)
24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rbp
25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    mov         rbp,        rsp
26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rsi
27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rdi
28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rbx
29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    mov         rsi,        arg(0)              ; src_ptr
31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    mov         rdi,        arg(2)              ; ref_ptr
32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    movsxd      rax,        dword ptr arg(1)    ; src_stride
34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    movsxd      rdx,        dword ptr arg(3)    ; ref_stride
35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%else
36fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org  %if LIBVPX_YASM_WIN64
37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    SAVE_XMM 7, u
38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     src_ptr     rcx
39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     src_stride  rdx
40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     ref_ptr     r8
41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     ref_stride  r9
42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     end_ptr     r10
43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     ret_var     r11
44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     result_ptr  [rsp+xmm_stack_space+8+4*8]
455c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    %define     max_sad     [rsp+xmm_stack_space+8+4*8]
46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     height      dword ptr [rsp+xmm_stack_space+8+4*8]
47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %else
48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     src_ptr     rdi
49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     src_stride  rsi
50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     ref_ptr     rdx
51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     ref_stride  rcx
52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     end_ptr     r9
53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     ret_var     r10
54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     result_ptr  r8
555c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    %define     max_sad     r8
56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     height      r8
57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %endif
58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endmacro
61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%macro STACK_FRAME_DESTROY_X3 0
63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     src_ptr
64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     src_stride
65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     ref_ptr
66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     ref_stride
67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     end_ptr
68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     ret_var
69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     result_ptr
705c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org  %define     max_sad
71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     height
72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if ABI_IS_32BIT
74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rbx
75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rdi
76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rsi
77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rbp
78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%else
79fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org  %if LIBVPX_YASM_WIN64
80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    RESTORE_XMM
81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %endif
82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ret
84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endmacro
85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%macro STACK_FRAME_CREATE_X4 0
87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if ABI_IS_32BIT
88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     src_ptr       rsi
89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     src_stride    rax
90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     r0_ptr        rcx
91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     r1_ptr        rdx
92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     r2_ptr        rbx
93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     r3_ptr        rdi
94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     ref_stride    rbp
95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     result_ptr    arg(4)
96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rbp
97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    mov         rbp,        rsp
98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rsi
99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rdi
100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rbx
101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rbp
103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    mov         rdi,        arg(2)              ; ref_ptr_base
104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    LOAD_X4_ADDRESSES rdi, rcx, rdx, rax, rdi
106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    mov         rsi,        arg(0)              ; src_ptr
108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    movsxd      rbx,        dword ptr arg(1)    ; src_stride
110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    movsxd      rbp,        dword ptr arg(3)    ; ref_stride
111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    xchg        rbx,        rax
113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%else
114fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org  %if LIBVPX_YASM_WIN64
115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    SAVE_XMM 7, u
116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     src_ptr     rcx
117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     src_stride  rdx
118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     r0_ptr      rsi
119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     r1_ptr      r10
120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     r2_ptr      r11
121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     r3_ptr      r8
122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     ref_stride  r9
123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     result_ptr  [rsp+xmm_stack_space+16+4*8]
124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rsi
125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    LOAD_X4_ADDRESSES r8, r0_ptr, r1_ptr, r2_ptr, r3_ptr
127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %else
128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     src_ptr     rdi
129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     src_stride  rsi
130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     r0_ptr      r9
131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     r1_ptr      r10
132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     r2_ptr      r11
133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     r3_ptr      rdx
134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     ref_stride  rcx
135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    %define     result_ptr  r8
136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    LOAD_X4_ADDRESSES rdx, r0_ptr, r1_ptr, r2_ptr, r3_ptr
138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %endif
140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endmacro
142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%macro STACK_FRAME_DESTROY_X4 0
144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     src_ptr
145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     src_stride
146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     r0_ptr
147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     r1_ptr
148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     r2_ptr
149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     r3_ptr
150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     ref_stride
151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %define     result_ptr
152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if ABI_IS_32BIT
154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rbx
155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rdi
156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rsi
157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rbp
158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%else
159fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org  %if LIBVPX_YASM_WIN64
160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rsi
161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    RESTORE_XMM
162474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  %endif
163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ret
165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endmacro
166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%macro PROCESS_16X2X3 5
168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if %1==0
169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm0,       XMMWORD PTR [%2]
170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm5,       XMMWORD PTR [%3]
171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm6,       XMMWORD PTR [%3+1]
172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm7,       XMMWORD PTR [%3+2]
173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm5,       xmm0
175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm6,       xmm0
176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm7,       xmm0
177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%else
178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm0,       XMMWORD PTR [%2]
179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm1,       XMMWORD PTR [%3]
180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm2,       XMMWORD PTR [%3+1]
181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm3,       XMMWORD PTR [%3+2]
182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm1,       xmm0
184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm2,       xmm0
185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm3,       xmm0
186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm5,       xmm1
188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm6,       xmm2
189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm7,       xmm3
190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm0,       XMMWORD PTR [%2+%4]
192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm1,       XMMWORD PTR [%3+%5]
193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm2,       XMMWORD PTR [%3+%5+1]
194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm3,       XMMWORD PTR [%3+%5+2]
195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if %1==0 || %1==1
197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             %2,         [%2+%4*2]
198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             %3,         [%3+%5*2]
199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm1,       xmm0
202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm2,       xmm0
203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm3,       xmm0
204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
205474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm5,       xmm1
206474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm6,       xmm2
207474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm7,       xmm3
208474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endmacro
209474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%macro PROCESS_8X2X3 5
211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if %1==0
212474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm0,       QWORD PTR [%2]
213474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm5,       QWORD PTR [%3]
214474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm6,       QWORD PTR [%3+1]
215474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm7,       QWORD PTR [%3+2]
216474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm5,       mm0
218474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm6,       mm0
219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm7,       mm0
220474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%else
221474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm0,       QWORD PTR [%2]
222474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm1,       QWORD PTR [%3]
223474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm2,       QWORD PTR [%3+1]
224474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm3,       QWORD PTR [%3+2]
225474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
226474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm1,       mm0
227474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm2,       mm0
228474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm3,       mm0
229474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
230474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm5,       mm1
231474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm6,       mm2
232474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm7,       mm3
233474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
234474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm0,       QWORD PTR [%2+%4]
235474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm1,       QWORD PTR [%3+%5]
236474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm2,       QWORD PTR [%3+%5+1]
237474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm3,       QWORD PTR [%3+%5+2]
238474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
239474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if %1==0 || %1==1
240474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             %2,        [%2+%4*2]
241474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             %3,        [%3+%5*2]
242474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
243474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
244474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm1,       mm0
245474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm2,       mm0
246474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm3,       mm0
247474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
248474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm5,       mm1
249474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm6,       mm2
250474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm7,       mm3
251474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endmacro
252474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%macro LOAD_X4_ADDRESSES 5
254474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             %2,         [%1+REG_SZ_BYTES*0]
255474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             %3,         [%1+REG_SZ_BYTES*1]
256474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
257474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             %4,         [%1+REG_SZ_BYTES*2]
258474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             %5,         [%1+REG_SZ_BYTES*3]
259474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endmacro
260474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
261474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%macro PROCESS_16X2X4 8
262474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if %1==0
263474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm0,       XMMWORD PTR [%2]
264474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm4,       XMMWORD PTR [%3]
265474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm5,       XMMWORD PTR [%4]
266474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm6,       XMMWORD PTR [%5]
267474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm7,       XMMWORD PTR [%6]
268474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
269474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm4,       xmm0
270474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm5,       xmm0
271474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm6,       xmm0
272474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm7,       xmm0
273474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%else
274474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm0,       XMMWORD PTR [%2]
275474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm1,       XMMWORD PTR [%3]
276474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm2,       XMMWORD PTR [%4]
277474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm3,       XMMWORD PTR [%5]
278474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
279474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm1,       xmm0
280474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm2,       xmm0
281474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm3,       xmm0
282474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
283474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm4,       xmm1
284474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm1,       XMMWORD PTR [%6]
285474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm5,       xmm2
286474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm6,       xmm3
287474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
288474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm1,       xmm0
289474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm7,       xmm1
290474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
291474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm0,       XMMWORD PTR [%2+%7]
292474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm1,       XMMWORD PTR [%3+%8]
293474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm2,       XMMWORD PTR [%4+%8]
294474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm3,       XMMWORD PTR [%5+%8]
295474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
296474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm1,       xmm0
297474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm2,       xmm0
298474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm3,       xmm0
299474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
300474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm4,       xmm1
301474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lddqu           xmm1,       XMMWORD PTR [%6+%8]
302474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm5,       xmm2
303474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm6,       xmm3
304474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
305474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if %1==0 || %1==1
306474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             %2,         [%2+%7*2]
307474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             %3,         [%3+%8*2]
308474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
309474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             %4,         [%4+%8*2]
310474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             %5,         [%5+%8*2]
311474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
312474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             %6,         [%6+%8*2]
313474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
314474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm1,       xmm0
315474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm7,       xmm1
316474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
317474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endmacro
318474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
319474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%macro PROCESS_8X2X4 8
320474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if %1==0
321474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm0,        QWORD PTR [%2]
322474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm4,        QWORD PTR [%3]
323474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm5,        QWORD PTR [%4]
324474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm6,        QWORD PTR [%5]
325474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm7,        QWORD PTR [%6]
326474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
327474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm4,        mm0
328474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm5,        mm0
329474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm6,        mm0
330474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm7,        mm0
331474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%else
332474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm0,        QWORD PTR [%2]
333474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm1,        QWORD PTR [%3]
334474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm2,        QWORD PTR [%4]
335474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm3,        QWORD PTR [%5]
336474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
337474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm1,        mm0
338474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm2,        mm0
339474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm3,        mm0
340474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
341474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm4,        mm1
342474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm1,        QWORD PTR [%6]
343474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm5,        mm2
344474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm6,        mm3
345474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
346474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm1,        mm0
347474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm7,        mm1
348474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
349474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm0,        QWORD PTR [%2+%7]
350474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm1,        QWORD PTR [%3+%8]
351474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm2,        QWORD PTR [%4+%8]
352474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm3,        QWORD PTR [%5+%8]
353474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
354474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm1,        mm0
355474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm2,        mm0
356474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm3,        mm0
357474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
358474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm4,        mm1
359474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm1,        QWORD PTR [%6+%8]
360474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm5,        mm2
361474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm6,        mm3
362474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
363474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if %1==0 || %1==1
364474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             %2,         [%2+%7*2]
365474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             %3,         [%3+%8*2]
366474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
367474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             %4,         [%4+%8*2]
368474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             %5,         [%5+%8*2]
369474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
370474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             %6,         [%6+%8*2]
371474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
372474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm1,        mm0
373474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm7,        mm1
374474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
375474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endmacro
376474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
377474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;void int vp8_sad16x16x3_sse3(
378474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *src_ptr,
379474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  src_stride,
380474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *ref_ptr,
381474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  ref_stride,
382474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  *results)
383f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_sad16x16x3_sse3) PRIVATE
384474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_sad16x16x3_sse3):
385474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
386474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_CREATE_X3
387474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
388474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 0, src_ptr, ref_ptr, src_stride, ref_stride
389474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 1, src_ptr, ref_ptr, src_stride, ref_stride
390474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 1, src_ptr, ref_ptr, src_stride, ref_stride
391474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 1, src_ptr, ref_ptr, src_stride, ref_stride
392474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 1, src_ptr, ref_ptr, src_stride, ref_stride
393474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 1, src_ptr, ref_ptr, src_stride, ref_stride
394474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 1, src_ptr, ref_ptr, src_stride, ref_stride
395474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 2, src_ptr, ref_ptr, src_stride, ref_stride
396474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
397474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rcx,        result_ptr
398474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
399474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm5
400474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm5,       8
401474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
402474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm5
403474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rcx],      xmm0
404474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;-
405474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm6
406474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm6,       8
407474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
408474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm6
409474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rcx+4],    xmm0
410474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;-
411474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm7
412474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm7,       8
413474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
414474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm7
415474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rcx+8],    xmm0
416474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
417474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_DESTROY_X3
418474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
419474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;void int vp8_sad16x8x3_sse3(
420474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *src_ptr,
421474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  src_stride,
422474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *ref_ptr,
423474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  ref_stride,
424474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  *results)
425f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_sad16x8x3_sse3) PRIVATE
426474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_sad16x8x3_sse3):
427474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
428474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_CREATE_X3
429474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
430474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 0, src_ptr, ref_ptr, src_stride, ref_stride
431474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 1, src_ptr, ref_ptr, src_stride, ref_stride
432474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 1, src_ptr, ref_ptr, src_stride, ref_stride
433474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X3 2, src_ptr, ref_ptr, src_stride, ref_stride
434474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
435474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rcx,        result_ptr
436474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
437474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm5
438474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm5,       8
439474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
440474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm5
441474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rcx],      xmm0
442474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;-
443474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm6
444474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm6,       8
445474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
446474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm6
447474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rcx+4],    xmm0
448474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;-
449474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm7
450474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm7,       8
451474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
452474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm7
453474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rcx+8],    xmm0
454474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
455474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_DESTROY_X3
456474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
457474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;void int vp8_sad8x16x3_sse3(
458474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *src_ptr,
459474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  src_stride,
460474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *ref_ptr,
461474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  ref_stride,
462474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  *results)
463f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_sad8x16x3_sse3) PRIVATE
464474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_sad8x16x3_sse3):
465474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
466474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_CREATE_X3
467474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
468474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X3 0, src_ptr, ref_ptr, src_stride, ref_stride
469474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X3 1, src_ptr, ref_ptr, src_stride, ref_stride
470474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X3 1, src_ptr, ref_ptr, src_stride, ref_stride
471474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X3 1, src_ptr, ref_ptr, src_stride, ref_stride
472474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X3 1, src_ptr, ref_ptr, src_stride, ref_stride
473474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X3 1, src_ptr, ref_ptr, src_stride, ref_stride
474474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X3 1, src_ptr, ref_ptr, src_stride, ref_stride
475474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X3 2, src_ptr, ref_ptr, src_stride, ref_stride
476474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
477474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rcx,        result_ptr
478474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
479474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpckldq       mm5,        mm6
480474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
481474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            [rcx],      mm5
482474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rcx+8],    mm7
483474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
484474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_DESTROY_X3
485474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
486474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;void int vp8_sad8x8x3_sse3(
487474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *src_ptr,
488474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  src_stride,
489474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *ref_ptr,
490474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  ref_stride,
491474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  *results)
492f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_sad8x8x3_sse3) PRIVATE
493474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_sad8x8x3_sse3):
494474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
495474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_CREATE_X3
496474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
497474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X3 0, src_ptr, ref_ptr, src_stride, ref_stride
498474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X3 1, src_ptr, ref_ptr, src_stride, ref_stride
499474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X3 1, src_ptr, ref_ptr, src_stride, ref_stride
500474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X3 2, src_ptr, ref_ptr, src_stride, ref_stride
501474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
502474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rcx,        result_ptr
503474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
504474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpckldq       mm5,        mm6
505474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
506474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            [rcx],      mm5
507474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rcx+8],    mm7
508474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
509474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_DESTROY_X3
510474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
511474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;void int vp8_sad4x4x3_sse3(
512474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *src_ptr,
513474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  src_stride,
514474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *ref_ptr,
515474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  ref_stride,
516474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  *results)
517f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_sad4x4x3_sse3) PRIVATE
518474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_sad4x4x3_sse3):
519474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
520474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_CREATE_X3
521474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
522474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm0,        DWORD PTR [src_ptr]
523474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm1,        DWORD PTR [ref_ptr]
524474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
525474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm2,        DWORD PTR [src_ptr+src_stride]
526474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm3,        DWORD PTR [ref_ptr+ref_stride]
527474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
528474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklbw       mm0,        mm2
529474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklbw       mm1,        mm3
530474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
531474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm4,        DWORD PTR [ref_ptr+1]
532474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm5,        DWORD PTR [ref_ptr+2]
533474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
534474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm2,        DWORD PTR [ref_ptr+ref_stride+1]
535474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm3,        DWORD PTR [ref_ptr+ref_stride+2]
536474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
537474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm1,        mm0
538474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
539474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklbw       mm4,        mm2
540474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklbw       mm5,        mm3
541474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
542474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm4,        mm0
543474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm5,        mm0
544474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
545474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             src_ptr,    [src_ptr+src_stride*2]
546474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             ref_ptr,    [ref_ptr+ref_stride*2]
547474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
548474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm0,        DWORD PTR [src_ptr]
549474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm2,        DWORD PTR [ref_ptr]
550474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
551474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm3,        DWORD PTR [src_ptr+src_stride]
552474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm6,        DWORD PTR [ref_ptr+ref_stride]
553474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
554474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklbw       mm0,        mm3
555474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklbw       mm2,        mm6
556474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
557474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm3,        DWORD PTR [ref_ptr+1]
558474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm7,        DWORD PTR [ref_ptr+2]
559474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
560474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm2,        mm0
561474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
562474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm1,        mm2
563474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
564474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm2,        DWORD PTR [ref_ptr+ref_stride+1]
565474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm6,        DWORD PTR [ref_ptr+ref_stride+2]
566474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
567474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklbw       mm3,        mm2
568474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklbw       mm7,        mm6
569474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
570474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm3,        mm0
571474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm7,        mm0
572474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
573474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm3,        mm4
574474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm7,        mm5
575474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
576474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rcx,        result_ptr
577474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
578474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpckldq       mm1,        mm3
579474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
580474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            [rcx],      mm1
581474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rcx+8],    mm7
582474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
583474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_DESTROY_X3
584474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
585474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;unsigned int vp8_sad16x16_sse3(
586474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *src_ptr,
587474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  src_stride,
588474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *ref_ptr,
589474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  ref_stride,
5905c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org;    int  max_sad)
591474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;%define lddqu movdqu
592f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_sad16x16_sse3) PRIVATE
593474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_sad16x16_sse3):
594474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
595474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_CREATE_X3
596474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
597474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             end_ptr,    4
598474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pxor            xmm7,        xmm7
599474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
600474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org.vp8_sad16x16_sse3_loop:
601474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm0,       XMMWORD PTR [src_ptr]
602474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqu          xmm1,       XMMWORD PTR [ref_ptr]
603474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm2,       XMMWORD PTR [src_ptr+src_stride]
604474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqu          xmm3,       XMMWORD PTR [ref_ptr+ref_stride]
605474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
606474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             src_ptr,    [src_ptr+src_stride*2]
607474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             ref_ptr,    [ref_ptr+ref_stride*2]
608474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
609474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm4,       XMMWORD PTR [src_ptr]
610474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqu          xmm5,       XMMWORD PTR [ref_ptr]
611474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          xmm6,       XMMWORD PTR [src_ptr+src_stride]
612474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
613474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm0,       xmm1
614474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
615474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqu          xmm1,       XMMWORD PTR [ref_ptr+ref_stride]
616474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
617474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm2,       xmm3
618474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm4,       xmm5
619474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          xmm6,       xmm1
620474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
621474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             src_ptr,    [src_ptr+src_stride*2]
622474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             ref_ptr,    [ref_ptr+ref_stride*2]
623474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
624474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm7,        xmm0
625474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm7,        xmm2
626474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm7,        xmm4
627474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm7,        xmm6
628474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
629474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sub             end_ptr,     1
630474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        jne             .vp8_sad16x16_sse3_loop
631474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
632474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm7
633474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm7,       8
634474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm7
635474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            rax,        xmm0
636474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
637474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_DESTROY_X3
638474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
639474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;void vp8_copy32xn_sse3(
640474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *src_ptr,
641474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  src_stride,
642474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *dst_ptr,
643474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  dst_stride,
644474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int height);
645f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_copy32xn_sse3) PRIVATE
646474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_copy32xn_sse3):
647474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
648474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_CREATE_X3
649474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
650167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org.block_copy_sse3_loopx4:
651474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             end_ptr,    [src_ptr+src_stride*2]
652474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
653474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqu          xmm0,       XMMWORD PTR [src_ptr]
654474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqu          xmm1,       XMMWORD PTR [src_ptr + 16]
655474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqu          xmm2,       XMMWORD PTR [src_ptr + src_stride]
656474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqu          xmm3,       XMMWORD PTR [src_ptr + src_stride + 16]
657474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqu          xmm4,       XMMWORD PTR [end_ptr]
658474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqu          xmm5,       XMMWORD PTR [end_ptr + 16]
659474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqu          xmm6,       XMMWORD PTR [end_ptr + src_stride]
660474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqu          xmm7,       XMMWORD PTR [end_ptr + src_stride + 16]
661474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
662474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             src_ptr,    [src_ptr+src_stride*4]
663474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
664474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             end_ptr,    [ref_ptr+ref_stride*2]
665474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
666474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          XMMWORD PTR [ref_ptr], xmm0
667474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          XMMWORD PTR [ref_ptr + 16], xmm1
668474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          XMMWORD PTR [ref_ptr + ref_stride], xmm2
669474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          XMMWORD PTR [ref_ptr + ref_stride + 16], xmm3
670474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          XMMWORD PTR [end_ptr], xmm4
671474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          XMMWORD PTR [end_ptr + 16], xmm5
672474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          XMMWORD PTR [end_ptr + ref_stride], xmm6
673474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          XMMWORD PTR [end_ptr + ref_stride + 16], xmm7
674474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
675474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             ref_ptr,    [ref_ptr+ref_stride*4]
676474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
677474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sub             height,     4
678474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cmp             height,     4
679167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        jge             .block_copy_sse3_loopx4
680474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
681474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ;Check to see if there is more rows need to be copied.
682474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cmp             height, 0
683167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        je              .copy_is_done
684474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
685167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org.block_copy_sse3_loop:
686474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqu          xmm0,       XMMWORD PTR [src_ptr]
687474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqu          xmm1,       XMMWORD PTR [src_ptr + 16]
688474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             src_ptr,    [src_ptr+src_stride]
689474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
690474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          XMMWORD PTR [ref_ptr], xmm0
691474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movdqa          XMMWORD PTR [ref_ptr + 16], xmm1
692474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             ref_ptr,    [ref_ptr+ref_stride]
693474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
694474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sub             height,     1
695167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        jne             .block_copy_sse3_loop
696474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
697167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org.copy_is_done:
698474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_DESTROY_X3
699474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
700474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;void vp8_sad16x16x4d_sse3(
701474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *src_ptr,
702474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  src_stride,
703474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *ref_ptr_base,
704474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  ref_stride,
705474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  *results)
706f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_sad16x16x4d_sse3) PRIVATE
707474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_sad16x16x4d_sse3):
708474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
709474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_CREATE_X4
710474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
711474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X4 0, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
712474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X4 1, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
713474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X4 1, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
714474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X4 1, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
715474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X4 1, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
716474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X4 1, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
717474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X4 1, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
718474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X4 2, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
719474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
720474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if ABI_IS_32BIT
721474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pop             rbp
722474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
723474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rcx,        result_ptr
724474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
725474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm4
726474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm4,       8
727474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
728474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm4
729474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rcx],      xmm0
730474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;-
731474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm5
732474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm5,       8
733474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
734474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm5
735474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rcx+4],    xmm0
736474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;-
737474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm6
738474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm6,       8
739474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
740474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm6
741474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rcx+8],    xmm0
742474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;-
743474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm7
744474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm7,       8
745474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
746474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm7
747474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rcx+12],   xmm0
748474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
749474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_DESTROY_X4
750474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
751474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;void vp8_sad16x8x4d_sse3(
752474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *src_ptr,
753474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  src_stride,
754474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *ref_ptr_base,
755474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  ref_stride,
756474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  *results)
757f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_sad16x8x4d_sse3) PRIVATE
758474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_sad16x8x4d_sse3):
759474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
760474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_CREATE_X4
761474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
762474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X4 0, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
763474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X4 1, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
764474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X4 1, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
765474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_16X2X4 2, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
766474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
767474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if ABI_IS_32BIT
768474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pop             rbp
769474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
770474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rcx,        result_ptr
771474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
772474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm4
773474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm4,       8
774474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
775474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm4
776474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rcx],      xmm0
777474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;-
778474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm5
779474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm5,       8
780474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
781474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm5
782474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rcx+4],    xmm0
783474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;-
784474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm6
785474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm6,       8
786474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
787474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm6
788474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rcx+8],    xmm0
789474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;-
790474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            xmm0,       xmm7
791474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrldq          xmm7,       8
792474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
793474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           xmm0,       xmm7
794474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rcx+12],   xmm0
795474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
796474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_DESTROY_X4
797474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
798474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;void int vp8_sad8x16x4d_sse3(
799474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *src_ptr,
800474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  src_stride,
801474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *ref_ptr,
802474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  ref_stride,
803474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  *results)
804f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_sad8x16x4d_sse3) PRIVATE
805474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_sad8x16x4d_sse3):
806474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
807474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_CREATE_X4
808474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
809474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X4 0, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
810474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X4 1, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
811474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X4 1, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
812474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X4 1, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
813474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X4 1, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
814474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X4 1, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
815474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X4 1, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
816474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X4 2, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
817474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
818474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if ABI_IS_32BIT
819474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pop             rbp
820474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
821474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rcx,        result_ptr
822474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
823474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpckldq       mm4,        mm5
824474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpckldq       mm6,        mm7
825474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
826474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            [rcx],      mm4
827474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            [rcx+8],    mm6
828474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
829474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_DESTROY_X4
830474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
831474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;void int vp8_sad8x8x4d_sse3(
832474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *src_ptr,
833474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  src_stride,
834474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *ref_ptr,
835474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  ref_stride,
836474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  *results)
837f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_sad8x8x4d_sse3) PRIVATE
838474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_sad8x8x4d_sse3):
839474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
840474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_CREATE_X4
841474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
842474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X4 0, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
843474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X4 1, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
844474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X4 1, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
845474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        PROCESS_8X2X4 2, src_ptr, r0_ptr, r1_ptr, r2_ptr, r3_ptr, src_stride, ref_stride
846474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
847474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if ABI_IS_32BIT
848474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pop             rbp
849474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
850474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rcx,        result_ptr
851474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
852474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpckldq       mm4,        mm5
853474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpckldq       mm6,        mm7
854474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
855474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            [rcx],      mm4
856474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            [rcx+8],    mm6
857474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
858474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_DESTROY_X4
859474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
860474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;void int vp8_sad4x4x4d_sse3(
861474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *src_ptr,
862474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  src_stride,
863474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    unsigned char *ref_ptr,
864474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  ref_stride,
865474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;    int  *results)
866f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_sad4x4x4d_sse3) PRIVATE
867474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_sad4x4x4d_sse3):
868474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
869474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_CREATE_X4
870474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
871474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm0,        DWORD PTR [src_ptr]
872474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm1,        DWORD PTR [r0_ptr]
873474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
874474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm2,        DWORD PTR [src_ptr+src_stride]
875474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm3,        DWORD PTR [r0_ptr+ref_stride]
876474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
877474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklbw       mm0,        mm2
878474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklbw       mm1,        mm3
879474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
880474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm4,        DWORD PTR [r1_ptr]
881474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm5,        DWORD PTR [r2_ptr]
882474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
883474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm6,        DWORD PTR [r3_ptr]
884474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm2,        DWORD PTR [r1_ptr+ref_stride]
885474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
886474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm3,        DWORD PTR [r2_ptr+ref_stride]
887474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm7,        DWORD PTR [r3_ptr+ref_stride]
888474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
889474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm1,        mm0
890474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
891474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklbw       mm4,        mm2
892474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklbw       mm5,        mm3
893474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
894474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklbw       mm6,        mm7
895474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm4,        mm0
896474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
897474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm5,        mm0
898474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm6,        mm0
899474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
900474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
901474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
902474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             src_ptr,    [src_ptr+src_stride*2]
903474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             r0_ptr,     [r0_ptr+ref_stride*2]
904474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
905474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             r1_ptr,     [r1_ptr+ref_stride*2]
906474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             r2_ptr,     [r2_ptr+ref_stride*2]
907474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
908474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lea             r3_ptr,     [r3_ptr+ref_stride*2]
909474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
910474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm0,        DWORD PTR [src_ptr]
911474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm2,        DWORD PTR [r0_ptr]
912474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
913474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm3,        DWORD PTR [src_ptr+src_stride]
914474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm7,        DWORD PTR [r0_ptr+ref_stride]
915474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
916474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklbw       mm0,        mm3
917474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklbw       mm2,        mm7
918474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
919474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm3,        DWORD PTR [r1_ptr]
920474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm7,        DWORD PTR [r2_ptr]
921474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
922474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm2,        mm0
923474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%if ABI_IS_32BIT
924474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rax,        rbp
925474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
926474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pop             rbp
927474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%define     ref_stride    rax
928474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org%endif
929474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rsi,        result_ptr
930474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
931474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm1,        mm2
932474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rsi],      mm1
933474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
934474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm2,        DWORD PTR [r1_ptr+ref_stride]
935474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm1,        DWORD PTR [r2_ptr+ref_stride]
936474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
937474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklbw       mm3,        mm2
938474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklbw       mm7,        mm1
939474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
940474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm3,        mm0
941474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm7,        mm0
942474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
943474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm2,        DWORD PTR [r3_ptr]
944474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            mm1,        DWORD PTR [r3_ptr+ref_stride]
945474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
946474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm3,        mm4
947474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm7,        mm5
948474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
949474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rsi+4],    mm3
950474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        punpcklbw       mm2,        mm1
951474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
952474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rsi+8],    mm7
953474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psadbw          mm2,        mm0
954474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
955474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm2,        mm6
956474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movd            [rsi+12],   mm2
957474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
958474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
959474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    STACK_FRAME_DESTROY_X4
960474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
961