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/****************************************************************************
13474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org*
14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org*   Module Title :     scaleopt.cpp
15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org*
16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org*   Description  :     Optimized scaling functions
17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org*
18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org****************************************************************************/
19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "pragmas.h"
20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/****************************************************************************
226fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org*  Module Statics
236fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org****************************************************************************/
246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org__declspec(align(16)) const static unsigned short round_values[] = { 128, 128, 128, 128 };
25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
26d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org#include "vpx_scale/vpx_scale.h"
276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vpx_mem/vpx_mem.h"
28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org__declspec(align(16)) const static unsigned short const54_2[] = {  0,  64, 128, 192 };
30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org__declspec(align(16)) const static unsigned short const54_1[] = {256, 192, 128,  64 };
31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/****************************************************************************
34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  ROUTINE       : horizontal_line_5_4_scale_mmx
36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  INPUTS        : const unsigned char *source : Pointer to source data.
38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *                  unsigned int source_width    : Stride of source.
39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *                  unsigned char *dest         : Pointer to destination data.
40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *                  unsigned int dest_width      : Stride of destination (NOT USED).
41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  OUTPUTS       : None.
43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  RETURNS       : void
45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  FUNCTION      : Copies horizontal line of pixels from source to
47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *                  destination scaling up by 4 to 5.
48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  SPECIAL NOTES : None.
50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ****************************************************************************/
52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic
53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid horizontal_line_5_4_scale_mmx
54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
55ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  const unsigned char *source,
56ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  unsigned int source_width,
57ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  unsigned char *dest,
58ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  unsigned int dest_width
59ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org) {
60ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  /*
61ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  unsigned i;
62ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  unsigned int a, b, c, d, e;
63ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  unsigned char *des = dest;
64ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  const unsigned char *src = source;
65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
66ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  (void) dest_width;
67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
68ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  for ( i=0; i<source_width; i+=5 )
69ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  {
70ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      a = src[0];
71ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      b = src[1];
72ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      c = src[2];
73ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      d = src[3];
74ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      e = src[4];
75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
76ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      des[0] = a;
77ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      des[1] = ((b*192 + c* 64 + 128)>>8);
78ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      des[2] = ((c*128 + d*128 + 128)>>8);
79ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      des[3] = ((d* 64 + e*192 + 128)>>8);
80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
81ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      src += 5;
82ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      des += 4;
83ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
84ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  */
85ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  (void) dest_width;
86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
87ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  __asm {
88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
89ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         esi,        source;
90ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         edi,        dest;
91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
92ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         ecx,        source_width;
93ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm5,        const54_1;
94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
95ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pxor        mm7,        mm7;
96ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm6,        const54_2;
97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
98ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm4,        round_values;
99ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    lea         edx,        [esi+ecx];
100ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    horizontal_line_5_4_loop:
101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
102ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm0,        QWORD PTR  [esi];
103ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    00 01 02 03 04 05 06 07
104ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm1,        mm0;
105ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    00 01 02 03 04 05 06 07
106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
107ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psrlq       mm0,        8;
108ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    01 02 03 04 05 06 07 xx
109ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    punpcklbw   mm1,        mm7;
110ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    xx 00 xx 01 xx 02 xx 03
111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
112ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    punpcklbw   mm0,        mm7;
113ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    xx 01 xx 02 xx 03 xx 04
114ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pmullw      mm1,        mm5
115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
116ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pmullw      mm0,        mm6
117ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    add         esi,        5
118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
119ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    add         edi,        4
120ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    paddw       mm1,        mm0
121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
122ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    paddw       mm1,        mm4
123ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psrlw       mm1,        8
124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
125ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cmp         esi,        edx
126ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    packuswb    mm1,        mm7
127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
128ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        DWORD PTR [edi-4], mm1
129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
130ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    jl          horizontal_line_5_4_loop
131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
132ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org__declspec(align(16)) const static unsigned short one_fourths[]   = {  64,  64,  64, 64  };
136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org__declspec(align(16)) const static unsigned short two_fourths[]   = { 128, 128, 128, 128 };
137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org__declspec(align(16)) const static unsigned short three_fourths[] = { 192, 192, 192, 192 };
138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic
140ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vertical_band_5_4_scale_mmx(unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) {
141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
142ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  __asm {
143ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    push        ebx
144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
145ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         esi,    source                    // Get the source and destination pointer
146ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         ecx,    src_pitch               // Get the pitch size
147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
148ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         edi,    dest                    // tow lines below
149ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pxor        mm7,    mm7                     // clear out mm7
150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
151ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         edx,    dest_pitch               // Loop counter
152ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         ebx,    dest_width
153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
154ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vs_5_4_loop:
155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
156ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        mm0,    DWORD ptr [esi]         // src[0];
157ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        mm1,    DWORD ptr [esi+ecx]     // src[1];
158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
159ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        mm2,    DWORD ptr [esi+ecx*2]
160ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    lea         eax,    [esi+ecx*2]             //
161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
162ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    punpcklbw   mm1,    mm7
163ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    punpcklbw   mm2,    mm7
164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
165ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm3,    mm2
166ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pmullw      mm1,    three_fourths
167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
168ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pmullw      mm2,    one_fourths
169ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        mm4,    [eax+ecx]
170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
171ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pmullw      mm3,    two_fourths
172ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    punpcklbw   mm4,    mm7
173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
174ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm5,    mm4
175ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pmullw      mm4,    two_fourths
176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
177ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    paddw       mm1,    mm2
178ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        mm6,    [eax+ecx*2]
179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
180ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pmullw      mm5,    one_fourths
181ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    paddw       mm1,    round_values;
182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
183ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    paddw       mm3,    mm4
184ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psrlw       mm1,    8
185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
186ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    punpcklbw   mm6,    mm7
187ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    paddw       mm3,    round_values
188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
189ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pmullw      mm6,    three_fourths
190ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psrlw       mm3,    8
191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
192ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    packuswb    mm1,    mm7
193ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    packuswb    mm3,    mm7
194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
195ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        DWORD PTR [edi], mm0
196ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        DWORD PTR [edi+edx], mm1
197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
199ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    paddw       mm5,    mm6
200ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        DWORD PTR [edi+edx*2], mm3
201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
202ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    lea         eax,    [edi+edx*2]
203ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    paddw       mm5,    round_values
204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
205ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psrlw       mm5,    8
206ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    add         edi,    4
207474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
208ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    packuswb    mm5,    mm7
209ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        DWORD PTR [eax+edx], mm5
210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
211ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    add         esi,    4
212ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    sub         ebx,    4
213474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
214ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    jg         vs_5_4_loop
215474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
216ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pop         ebx
217ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
218474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
220474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
221474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org__declspec(align(16)) const static unsigned short const53_1[] = {  0,  85, 171, 0 };
222474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org__declspec(align(16)) const static unsigned short const53_2[] = {256, 171,  85, 0 };
223474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
224474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
225474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic
226474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid horizontal_line_5_3_scale_mmx
227474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
228ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  const unsigned char *source,
229ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  unsigned int source_width,
230ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  unsigned char *dest,
231ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  unsigned int dest_width
232ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org) {
233474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
234ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  (void) dest_width;
235ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  __asm {
236474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
237ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         esi,        source;
238ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         edi,        dest;
239474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
240ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         ecx,        source_width;
241ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm5,        const53_1;
242474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
243ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pxor        mm7,        mm7;
244ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm6,        const53_2;
245474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
246ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm4,        round_values;
247ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    lea         edx,        [esi+ecx-5];
248ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    horizontal_line_5_3_loop:
249474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
250ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm0,        QWORD PTR  [esi];
251ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    00 01 02 03 04 05 06 07
252ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm1,        mm0;
253ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    00 01 02 03 04 05 06 07
254474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
255ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psllw       mm0,        8;
256ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    xx 00 xx 02 xx 04 xx 06
257ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psrlw       mm1,        8;
258ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    01 xx 03 xx 05 xx 07 xx
259474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
260ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psrlw       mm0,        8;
261ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    00 xx 02 xx 04 xx 06 xx
262ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psllq       mm1,        16;
263ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    xx xx 01 xx 03 xx 05 xx
264474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
265ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pmullw      mm0,        mm6
266474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
267ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pmullw      mm1,        mm5
268ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    add         esi,        5
269474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
270ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    add         edi,        3
271ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    paddw       mm1,        mm0
272474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
273ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    paddw       mm1,        mm4
274ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psrlw       mm1,        8
275474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
276ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cmp         esi,        edx
277ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    packuswb    mm1,        mm7
278474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
279ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        DWORD PTR [edi-3], mm1
280ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    jl          horizontal_line_5_3_loop
281474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
282ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org// exit condition
283ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm0,        QWORD PTR  [esi];
284ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    00 01 02 03 04 05 06 07
285ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm1,        mm0;
286ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    00 01 02 03 04 05 06 07
287474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
288ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psllw       mm0,        8;
289ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    xx 00 xx 02 xx 04 xx 06
290ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psrlw       mm1,        8;
291ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    01 xx 03 xx 05 xx 07 xx
292474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
293ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psrlw       mm0,        8;
294ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    00 xx 02 xx 04 xx 06 xx
295ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psllq       mm1,        16;
296ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    xx xx 01 xx 03 xx 05 xx
297474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
298ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pmullw      mm0,        mm6
299474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
300ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pmullw      mm1,        mm5
301ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    paddw       mm1,        mm0
302474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
303ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    paddw       mm1,        mm4
304ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psrlw       mm1,        8
305474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
306ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    packuswb    mm1,        mm7
307ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        eax,        mm1
308474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
309ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         edx,        eax
310ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    shr         edx,        16
311474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
312ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         WORD PTR[edi],   ax
313ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         BYTE PTR[edi+2], dl
314474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
315ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
316474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
317474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
318474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
319474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org__declspec(align(16)) const static unsigned short one_thirds[] = {  85,  85,  85,  85 };
320474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org__declspec(align(16)) const static unsigned short two_thirds[] = { 171, 171, 171, 171 };
321474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
322474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic
323ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vertical_band_5_3_scale_mmx(unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) {
324474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
325ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  __asm {
326ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    push        ebx
327474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
328ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         esi,    source                    // Get the source and destination pointer
329ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         ecx,    src_pitch               // Get the pitch size
330474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
331ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         edi,    dest                    // tow lines below
332ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pxor        mm7,    mm7                     // clear out mm7
333474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
334ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         edx,    dest_pitch               // Loop counter
335ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm5,    one_thirds
336474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
337ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm6,    two_thirds
338ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         ebx,    dest_width;
339474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
340ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vs_5_3_loop:
341474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
342ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        mm0,    DWORD ptr [esi]         // src[0];
343ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        mm1,    DWORD ptr [esi+ecx]     // src[1];
344474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
345ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        mm2,    DWORD ptr [esi+ecx*2]
346ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    lea         eax,    [esi+ecx*2]             //
347474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
348ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    punpcklbw   mm1,    mm7
349ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    punpcklbw   mm2,    mm7
350474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
351ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pmullw      mm1,    mm5
352ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pmullw      mm2,    mm6
353474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
354ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        mm3,    DWORD ptr [eax+ecx]
355ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        mm4,    DWORD ptr [eax+ecx*2]
356474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
357ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    punpcklbw   mm3,    mm7
358ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    punpcklbw   mm4,    mm7
359474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
360ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pmullw      mm3,    mm6
361ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pmullw      mm4,    mm5
362474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
363474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
364ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        DWORD PTR [edi], mm0
365ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    paddw       mm1,    mm2
366474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
367ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    paddw       mm1,    round_values
368ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psrlw       mm1,    8
369474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
370ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    packuswb    mm1,    mm7
371ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    paddw       mm3,    mm4
372474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
373ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    paddw       mm3,    round_values
374ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        DWORD PTR [edi+edx], mm1
375474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
376ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psrlw       mm3,    8
377ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    packuswb    mm3,    mm7
378474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
379ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        DWORD PTR [edi+edx*2], mm3
380474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
381474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
382ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    add         edi,    4
383ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    add         esi,    4
384474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
385ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    sub         ebx,    4
386ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    jg          vs_5_3_loop
387474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
388ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pop         ebx
389ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
390474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
391474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
392474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
393474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
394474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
395474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/****************************************************************************
396474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
397474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  ROUTINE       : horizontal_line_2_1_scale
398474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
399474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  INPUTS        : const unsigned char *source :
400474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *                  unsigned int source_width    :
401474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *                  unsigned char *dest         :
402474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *                  unsigned int dest_width      :
403474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
404474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  OUTPUTS       : None.
405474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
406474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  RETURNS       : void
407474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
408474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  FUNCTION      : 1 to 2 up-scaling of a horizontal line of pixels.
409474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
410474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  SPECIAL NOTES : None.
411474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
412474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ****************************************************************************/
413474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic
414474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid horizontal_line_2_1_scale_mmx
415474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
416ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  const unsigned char *source,
417ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  unsigned int source_width,
418ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  unsigned char *dest,
419ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  unsigned int dest_width
420ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org) {
421ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  (void) dest_width;
422ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  (void) source_width;
423ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  __asm {
424ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         esi,    source
425ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         edi,    dest
426ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
427ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pxor        mm7,    mm7
428ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         ecx,    dest_width
429ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
430ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    xor         edx,    edx
431ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    hs_2_1_loop:
432ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
433ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm0,    [esi+edx*2]
434ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psllw       mm0,    8
435ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
436ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psrlw       mm0,    8
437ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    packuswb    mm0,    mm7
438ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
439ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        DWORD Ptr [edi+edx], mm0;
440ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    add         edx,    4
441ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
442ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cmp         edx,    ecx
443ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    jl          hs_2_1_loop
444ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
445ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
446474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
447474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
448474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
449474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
450474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic
451ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vertical_band_2_1_scale_mmx(unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) {
452ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  (void) dest_pitch;
453ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  (void) src_pitch;
454ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  vpx_memcpy(dest, source, dest_width);
455474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
456474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
457474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
458474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org__declspec(align(16)) const static unsigned short three_sixteenths[] = {  48,  48,  48,  48 };
459474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org__declspec(align(16)) const static unsigned short ten_sixteenths[]   = { 160, 160, 160, 160 };
460474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
461474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic
462ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vertical_band_2_1_scale_i_mmx(unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) {
463474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
464ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  (void) dest_pitch;
465ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  __asm {
466ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         esi,        source
467ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         edi,        dest
468474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
469ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         eax,        src_pitch
470ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mov         edx,        dest_width
471474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
472ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pxor        mm7,        mm7
473ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    sub         esi,        eax             // back one line
474474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
475474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
476ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    lea         ecx,        [esi+edx];
477ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm6,        round_values;
478474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
479ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm5,        three_sixteenths;
480ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movq        mm4,        ten_sixteenths;
481474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
482ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vs_2_1_i_loop:
483ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        mm0,        [esi]           //
484ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        mm1,        [esi+eax]       //
485474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
486ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        mm2,        [esi+eax*2]     //
487ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    punpcklbw   mm0,        mm7
488474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
489ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pmullw      mm0,        mm5
490ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    punpcklbw   mm1,        mm7
491474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
492ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pmullw      mm1,        mm4
493ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    punpcklbw   mm2,        mm7
494474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
495ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pmullw      mm2,        mm5
496ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    paddw       mm0,        round_values
497474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
498ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    paddw       mm1,        mm2
499ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    paddw       mm0,        mm1
500474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
501ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    psrlw       mm0,        8
502ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    packuswb    mm0,        mm7
503474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
504ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    movd        DWORD PTR [edi],        mm0
505ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    add         esi,        4
506474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
507ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    add         edi,        4;
508ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cmp         esi,        ecx
509ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    jl          vs_2_1_i_loop
510474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
511ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
512474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
513474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
514474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
515474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
516474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid
517ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgregister_mmxscalers(void) {
518ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  vp8_vertical_band_5_4_scale           = vertical_band_5_4_scale_mmx;
519ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  vp8_vertical_band_5_3_scale           = vertical_band_5_3_scale_mmx;
520ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  vp8_vertical_band_2_1_scale           = vertical_band_2_1_scale_mmx;
521ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  vp8_vertical_band_2_1_scale_i         = vertical_band_2_1_scale_i_mmx;
522ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  vp8_horizontal_line_2_1_scale         = horizontal_line_2_1_scale_mmx;
523ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  vp8_horizontal_line_5_3_scale         = horizontal_line_5_3_scale_mmx;
524ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  vp8_horizontal_line_5_4_scale         = horizontal_line_5_4_scale_mmx;
525474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
526