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;int vp8_fast_quantize_b_impl_mmx(short *coeff_ptr, short *zbin_ptr,
15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;                           short *qcoeff_ptr,short *dequant_ptr,
16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;                           short *scan_mask, short *round_ptr,
17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org;                           short *quant_ptr, short *dqcoeff_ptr);
18f18f5eb544bb35db231ced346e077907a8c61fc9hclam@chromium.orgglobal sym(vp8_fast_quantize_b_impl_mmx) PRIVATE
19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgsym(vp8_fast_quantize_b_impl_mmx):
20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push        rbp
21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    mov         rbp, rsp
22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    SHADOW_ARGS_TO_STACK 8
23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push rsi
24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    push rdi
25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ; end prolog
26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rsi,        arg(0) ;coeff_ptr
29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm0,        [rsi]
30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rax,        arg(1) ;zbin_ptr
32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm1,        [rax]
33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm3,        mm0
35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psraw           mm0,        15
36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pxor            mm3,        mm0
38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psubw           mm3,        mm0         ; abs
39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm2,        mm3
41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pcmpgtw         mm1,        mm2
42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pandn           mm1,        mm2
44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm3,        mm1
45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdx,        arg(6) ;quant_ptr
47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm1,        [rdx]
48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rcx,        arg(5) ;round_ptr
50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm2,        [rcx]
51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm3,        mm2
53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pmulhuw         mm3,        mm1
54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pxor            mm3,        mm0
56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psubw           mm3,        mm0     ;gain the sign back
57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdi,        arg(2) ;qcoeff_ptr
59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm0,        mm3
60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            [rdi],      mm3
62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rax,        arg(3) ;dequant_ptr
64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm2,        [rax]
65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pmullw          mm3,        mm2
67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rax,        arg(7) ;dqcoeff_ptr
68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            [rax],      mm3
70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ; next 8
72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm4,        [rsi+8]
73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rax,        arg(1) ;zbin_ptr
75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm5,        [rax+8]
76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm7,        mm4
78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psraw           mm4,        15
79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pxor            mm7,        mm4
81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psubw           mm7,        mm4         ; abs
82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm6,        mm7
84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pcmpgtw         mm5,        mm6
85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pandn           mm5,        mm6
87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm7,        mm5
88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm5,        [rdx+8]
90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm6,        [rcx+8]
91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm7,        mm6
93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pmulhuw         mm7,        mm5
94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pxor            mm7,        mm4
96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psubw           mm7,        mm4;gain the sign back
97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdi,        arg(2) ;qcoeff_ptr
99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm1,        mm7
101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            [rdi+8],    mm7
102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rax,        arg(3) ;dequant_ptr
104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm6,        [rax+8]
105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pmullw          mm7,        mm6
107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rax,        arg(7) ;dqcoeff_ptr
108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            [rax+8],    mm7
110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                ; next 8
113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm4,        [rsi+16]
114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rax,        arg(1) ;zbin_ptr
116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm5,        [rax+16]
117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm7,        mm4
119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psraw           mm4,        15
120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pxor            mm7,        mm4
122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psubw           mm7,        mm4         ; abs
123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm6,        mm7
125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pcmpgtw         mm5,        mm6
126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pandn           mm5,        mm6
128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm7,        mm5
129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm5,        [rdx+16]
131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm6,        [rcx+16]
132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm7,        mm6
134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pmulhuw         mm7,        mm5
135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pxor            mm7,        mm4
137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psubw           mm7,        mm4;gain the sign back
138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdi,        arg(2) ;qcoeff_ptr
140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm1,        mm7
142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            [rdi+16],   mm7
143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rax,        arg(3) ;dequant_ptr
145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm6,        [rax+16]
146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pmullw          mm7,        mm6
148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rax,        arg(7) ;dqcoeff_ptr
149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            [rax+16],   mm7
151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                ; next 8
154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm4,        [rsi+24]
155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rax,        arg(1) ;zbin_ptr
157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm5,        [rax+24]
158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm7,        mm4
160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psraw           mm4,        15
161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
162474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pxor            mm7,        mm4
163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psubw           mm7,        mm4         ; abs
164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm6,        mm7
166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pcmpgtw         mm5,        mm6
167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pandn           mm5,        mm6
169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm7,        mm5
170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm5,        [rdx+24]
172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm6,        [rcx+24]
173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddw           mm7,        mm6
175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pmulhuw         mm7,        mm5
176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pxor            mm7,        mm4
178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psubw           mm7,        mm4;gain the sign back
179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdi,        arg(2) ;qcoeff_ptr
181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm1,        mm7
183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            [rdi+24],   mm7
184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rax,        arg(3) ;dequant_ptr
186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm6,        [rax+24]
187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pmullw          mm7,        mm6
189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rax,        arg(7) ;dqcoeff_ptr
190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            [rax+24],   mm7
192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rdi,        arg(4) ;scan_mask
196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mov             rsi,        arg(2) ;qcoeff_ptr
197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pxor            mm5,        mm5
199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pxor            mm7,        mm7
200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm0,        [rsi]
202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm1,        [rsi+8]
203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm2,        [rdi]
205474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm3,        [rdi+8];
206474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
207474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pcmpeqw         mm0,        mm7
208474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pcmpeqw         mm1,        mm7
209474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pcmpeqw         mm6,        mm6
211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pxor            mm0,        mm6
212474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
213474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pxor            mm1,        mm6
214474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrlw           mm0,        15
215474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
216474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrlw           mm1,        15
217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pmaddwd         mm0,        mm2
218474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pmaddwd         mm1,        mm3
220474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm5,        mm0
221474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
222474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddd           mm5,        mm1
223474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
224474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm0,        [rsi+16]
225474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm1,        [rsi+24]
226474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
227474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm2,        [rdi+16]
228474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm3,        [rdi+24];
229474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
230474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pcmpeqw         mm0,        mm7
231474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pcmpeqw         mm1,        mm7
232474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
233474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pcmpeqw         mm6,        mm6
234474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pxor            mm0,        mm6
235474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
236474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pxor            mm1,        mm6
237474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrlw           mm0,        15
238474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
239474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrlw           mm1,        15
240474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pmaddwd         mm0,        mm2
241474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
242474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pmaddwd         mm1,        mm3
243474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddd           mm5,        mm0
244474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
245474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddd           mm5,        mm1
246474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            mm0,        mm5
247474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
248474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        psrlq           mm5,        32
249474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        paddd           mm0,        mm5
250474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
251474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ; eob adjustment begins here
252474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        movq            rcx,        mm0
253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        and             rcx,        0xffff
254474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
255474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        xor             rdx,        rdx
256474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sub             rdx,        rcx ; rdx=-rcx
257474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
258474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        bsr             rax,        rcx
259474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        inc             rax
260474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
261474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sar             rdx,        31
262474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        and             rax,        rdx
263474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ; Substitute the sse assembly for the old mmx mixed assembly/C. The
264474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ; following is kept as reference
265474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ;    movq            rcx,        mm0
266474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ;    bsr             rax,        rcx
267474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ;
268474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ;    mov             eob,        rax
269474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ;    mov             eee,        rcx
270474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ;
271474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ;if(eee==0)
272474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ;{
273474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ;    eob=-1;
274474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ;}
275474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ;else if(eee<0)
276474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ;{
277474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ;    eob=15;
278474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ;}
279474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ;d->eob = eob+1;
280474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
281474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ; begin epilog
282474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop rdi
283474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop rsi
284474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    UNSHADOW_ARGS
285474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pop         rbp
286474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ret
287