188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org/*
288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org *  Copyright 2011 The LibYuv Project Authors. All rights reserved.
388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org *
488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org *  Use of this source code is governed by a BSD-style license
588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org *  that can be found in the LICENSE file in the root of the source
688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org *  tree. An additional intellectual property rights grant can be found
788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org *  in the file PATENTS. All contributing project authors may
888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org *  be found in the AUTHORS file in the root of the source tree.
988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org */
1088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
1141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include "libyuv/row.h"
1241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
13d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#if defined (_M_X64) && !defined(LIBYUV_DISABLE_X86) && defined(_MSC_VER)
1441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include <emmintrin.h>
1541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include <tmmintrin.h>  // For _mm_maddubs_epi16
1641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif
1788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
1888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef __cplusplus
1988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgnamespace libyuv {
2088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgextern "C" {
2188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif
2288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
2341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// This module is for Visual C.
24d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#if !defined(LIBYUV_DISABLE_X86) && defined(_MSC_VER) && \
25d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    (defined(_M_IX86) || defined(_M_X64))
2641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
2741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#define YG 74  /* (int8)(1.164 * 64 + 0.5) */
2841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
2941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#define UB 127  /* min(127,(int8)(2.018 * 64)) */
3041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#define UG -25  /* (int8)(-0.391 * 64 - 0.5) */
3141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#define UR 0
3241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
3341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#define VB 0
3441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#define VG -52  /* (int8)(-0.813 * 64 - 0.5) */
3541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#define VR 102  /* (int8)(1.596 * 64 + 0.5) */
3641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
3741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// Bias
3841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#define BB UB * 128 + VB * 128
3941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#define BG UG * 128 + VG * 128
4041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#define BR UR * 128 + VR * 128
4141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
4241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic const vec8 kUVToB = {
4341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB
4441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
4541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
4641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic const vec8 kUVToR = {
4741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR
4841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
4941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
5041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic const vec8 kUVToG = {
5141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG
5241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
5341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
5441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic const vec8 kVUToB = {
5541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB,
5641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
5741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
5841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic const vec8 kVUToR = {
5941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR,
6041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
6141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
6241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic const vec8 kVUToG = {
6341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG,
6441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
6541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
6641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic const vec16 kYToRgb = { YG, YG, YG, YG, YG, YG, YG, YG };
6741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic const vec16 kYSub16 = { 16, 16, 16, 16, 16, 16, 16, 16 };
6841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic const vec16 kUVBiasB = { BB, BB, BB, BB, BB, BB, BB, BB };
6941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic const vec16 kUVBiasG = { BG, BG, BG, BG, BG, BG, BG, BG };
7041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic const vec16 kUVBiasR = { BR, BR, BR, BR, BR, BR, BR, BR };
7141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
7241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// 64 bit
7341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#if defined(_M_X64)
7441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
7541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// Aligned destination version.
7641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org__declspec(align(16))
7741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgvoid I422ToARGBRow_SSSE3(const uint8* y_buf,
7841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                         const uint8* u_buf,
7941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                         const uint8* v_buf,
8041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                         uint8* dst_argb,
8141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                         int width) {
8241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  __m128i xmm0, xmm1, xmm2, xmm3;
8341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const __m128i xmm5 = _mm_set1_epi8(-1);
8441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const __m128i xmm4 = _mm_setzero_si128();
8541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const ptrdiff_t offset = (uint8*)v_buf - (uint8*)u_buf;
8641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
8741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  while (width > 0) {
8841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_cvtsi32_si128(*(uint32*)u_buf);
8941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm1 = _mm_cvtsi32_si128(*(uint32*)(u_buf + offset));
9041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_unpacklo_epi8(xmm0, xmm1);
9141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_unpacklo_epi16(xmm0, xmm0);
9241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm1 = _mm_load_si128(&xmm0);
9341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm2 = _mm_load_si128(&xmm0);
9441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_maddubs_epi16(xmm0, *(__m128i*)kUVToB);
9541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm1 = _mm_maddubs_epi16(xmm1, *(__m128i*)kUVToG);
9641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm2 = _mm_maddubs_epi16(xmm2, *(__m128i*)kUVToR);
9741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_sub_epi16(xmm0, *(__m128i*)kUVBiasB);
9841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm1 = _mm_sub_epi16(xmm1, *(__m128i*)kUVBiasG);
9941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm2 = _mm_sub_epi16(xmm2, *(__m128i*)kUVBiasR);
10041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm3 = _mm_loadl_epi64((__m128i*)y_buf);
10141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm3 = _mm_unpacklo_epi8(xmm3, xmm4);
10241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm3 = _mm_subs_epi16(xmm3, *(__m128i*)kYSub16);
10341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm3 = _mm_mullo_epi16(xmm3, *(__m128i*)kYToRgb);
10441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_adds_epi16(xmm0, xmm3);
10541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm1 = _mm_adds_epi16(xmm1, xmm3);
10641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm2 = _mm_adds_epi16(xmm2, xmm3);
10741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_srai_epi16(xmm0, 6);
10841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm1 = _mm_srai_epi16(xmm1, 6);
10941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm2 = _mm_srai_epi16(xmm2, 6);
11041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_packus_epi16(xmm0, xmm0);
11141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm1 = _mm_packus_epi16(xmm1, xmm1);
11241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm2 = _mm_packus_epi16(xmm2, xmm2);
11341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_unpacklo_epi8(xmm0, xmm1);
11441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm2 = _mm_unpacklo_epi8(xmm2, xmm5);
11541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm1 = _mm_load_si128(&xmm0);
11641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_unpacklo_epi16(xmm0, xmm2);
11741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm1 = _mm_unpackhi_epi16(xmm1, xmm2);
11841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
11941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    _mm_store_si128((__m128i *)dst_argb, xmm0);
12041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    _mm_store_si128((__m128i *)(dst_argb + 16), xmm1);
12141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
12241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    y_buf += 8;
12341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    u_buf += 4;
12441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    dst_argb += 32;
12541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    width -= 8;
12641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
12741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
12841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
12941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// Unaligned destination version.
13041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgvoid I422ToARGBRow_Unaligned_SSSE3(const uint8* y_buf,
13141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                                   const uint8* u_buf,
13241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                                   const uint8* v_buf,
13341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                                   uint8* dst_argb,
13441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                                   int width) {
13541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  __m128i xmm0, xmm1, xmm2, xmm3;
13641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const __m128i xmm5 = _mm_set1_epi8(-1);
13741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const __m128i xmm4 = _mm_setzero_si128();
13841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const ptrdiff_t offset = (uint8*)v_buf - (uint8*)u_buf;
13941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
14041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  while (width > 0) {
14141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_cvtsi32_si128(*(uint32*)u_buf);
14241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm1 = _mm_cvtsi32_si128(*(uint32*)(u_buf + offset));
14341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_unpacklo_epi8(xmm0, xmm1);
14441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_unpacklo_epi16(xmm0, xmm0);
14541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm1 = _mm_load_si128(&xmm0);
14641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm2 = _mm_load_si128(&xmm0);
14741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_maddubs_epi16(xmm0, *(__m128i*)kUVToB);
14841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm1 = _mm_maddubs_epi16(xmm1, *(__m128i*)kUVToG);
14941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm2 = _mm_maddubs_epi16(xmm2, *(__m128i*)kUVToR);
15041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_sub_epi16(xmm0, *(__m128i*)kUVBiasB);
15141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm1 = _mm_sub_epi16(xmm1, *(__m128i*)kUVBiasG);
15241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm2 = _mm_sub_epi16(xmm2, *(__m128i*)kUVBiasR);
15341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm3 = _mm_loadl_epi64((__m128i*)y_buf);
15441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm3 = _mm_unpacklo_epi8(xmm3, xmm4);
15541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm3 = _mm_subs_epi16(xmm3, *(__m128i*)kYSub16);
15641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm3 = _mm_mullo_epi16(xmm3, *(__m128i*)kYToRgb);
15741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_adds_epi16(xmm0, xmm3);
15841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm1 = _mm_adds_epi16(xmm1, xmm3);
15941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm2 = _mm_adds_epi16(xmm2, xmm3);
16041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_srai_epi16(xmm0, 6);
16141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm1 = _mm_srai_epi16(xmm1, 6);
16241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm2 = _mm_srai_epi16(xmm2, 6);
16341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_packus_epi16(xmm0, xmm0);
16441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm1 = _mm_packus_epi16(xmm1, xmm1);
16541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm2 = _mm_packus_epi16(xmm2, xmm2);
16641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_unpacklo_epi8(xmm0, xmm1);
16741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm2 = _mm_unpacklo_epi8(xmm2, xmm5);
16841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm1 = _mm_load_si128(&xmm0);
16941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm0 = _mm_unpacklo_epi16(xmm0, xmm2);
17041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xmm1 = _mm_unpackhi_epi16(xmm1, xmm2);
17141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
17241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    _mm_storeu_si128((__m128i *)dst_argb, xmm0);
17341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    _mm_storeu_si128((__m128i *)(dst_argb + 16), xmm1);
17441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
17541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    y_buf += 8;
17641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    u_buf += 4;
17741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    dst_argb += 32;
17841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    width -= 8;
17941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
18041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
18141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// 32 bit
18241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#else  // defined(_M_X64)
18388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
18488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBTOYROW_SSSE3
18588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
18688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Constants for ARGB.
18788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const vec8 kARGBToY = {
18888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  13, 65, 33, 0, 13, 65, 33, 0, 13, 65, 33, 0, 13, 65, 33, 0
18988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
19088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
19188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// JPeg full range.
19288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const vec8 kARGBToYJ = {
19388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  15, 75, 38, 0, 15, 75, 38, 0, 15, 75, 38, 0, 15, 75, 38, 0
19488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
19588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
19688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const vec8 kARGBToU = {
19788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  112, -74, -38, 0, 112, -74, -38, 0, 112, -74, -38, 0, 112, -74, -38, 0
19888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
19988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
20088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const vec8 kARGBToUJ = {
20188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  127, -84, -43, 0, 127, -84, -43, 0, 127, -84, -43, 0, 127, -84, -43, 0
20288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
20388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
20488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const vec8 kARGBToV = {
20588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  -18, -94, 112, 0, -18, -94, 112, 0, -18, -94, 112, 0, -18, -94, 112, 0,
20688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
20788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
20888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const vec8 kARGBToVJ = {
20988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  -20, -107, 127, 0, -20, -107, 127, 0, -20, -107, 127, 0, -20, -107, 127, 0
21088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
21188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
21288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// vpermd for vphaddw + vpackuswb vpermd.
21388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const lvec32 kPermdARGBToY_AVX = {
21488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  0, 4, 1, 5, 2, 6, 3, 7
21588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
21688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
21788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// vpshufb for vphaddw + vpackuswb packed to shorts.
21888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const lvec8 kShufARGBToUV_AVX = {
21988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15,
22088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15,
22188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
22288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
22388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Constants for BGRA.
22488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const vec8 kBGRAToY = {
22588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  0, 33, 65, 13, 0, 33, 65, 13, 0, 33, 65, 13, 0, 33, 65, 13
22688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
22788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
22888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const vec8 kBGRAToU = {
22988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  0, -38, -74, 112, 0, -38, -74, 112, 0, -38, -74, 112, 0, -38, -74, 112
23088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
23188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
23288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const vec8 kBGRAToV = {
23388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  0, 112, -94, -18, 0, 112, -94, -18, 0, 112, -94, -18, 0, 112, -94, -18
23488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
23588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
23688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Constants for ABGR.
23788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const vec8 kABGRToY = {
23888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  33, 65, 13, 0, 33, 65, 13, 0, 33, 65, 13, 0, 33, 65, 13, 0
23988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
24088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
24188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const vec8 kABGRToU = {
24288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  -38, -74, 112, 0, -38, -74, 112, 0, -38, -74, 112, 0, -38, -74, 112, 0
24388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
24488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
24588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const vec8 kABGRToV = {
24688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  112, -94, -18, 0, 112, -94, -18, 0, 112, -94, -18, 0, 112, -94, -18, 0
24788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
24888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
24988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Constants for RGBA.
25088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const vec8 kRGBAToY = {
25188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  0, 13, 65, 33, 0, 13, 65, 33, 0, 13, 65, 33, 0, 13, 65, 33
25288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
25388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
25488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const vec8 kRGBAToU = {
25588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  0, 112, -74, -38, 0, 112, -74, -38, 0, 112, -74, -38, 0, 112, -74, -38
25688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
25788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
25888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const vec8 kRGBAToV = {
25988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  0, -18, -94, 112, 0, -18, -94, 112, 0, -18, -94, 112, 0, -18, -94, 112
26088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
26188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
26288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const uvec8 kAddY16 = {
26388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u
26488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
26588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
26688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const vec16 kAddYJ64 = {
26788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  64, 64, 64, 64, 64, 64, 64, 64
26888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
26988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
27088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const uvec8 kAddUV128 = {
27188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  128u, 128u, 128u, 128u, 128u, 128u, 128u, 128u,
27288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  128u, 128u, 128u, 128u, 128u, 128u, 128u, 128u
27388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
27488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
27588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const uvec16 kAddUVJ128 = {
27688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  0x8080u, 0x8080u, 0x8080u, 0x8080u, 0x8080u, 0x8080u, 0x8080u, 0x8080u
27788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
27888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
27988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Shuffle table for converting RGB24 to ARGB.
28088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const uvec8 kShuffleMaskRGB24ToARGB = {
28188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  0u, 1u, 2u, 12u, 3u, 4u, 5u, 13u, 6u, 7u, 8u, 14u, 9u, 10u, 11u, 15u
28288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
28388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
28488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Shuffle table for converting RAW to ARGB.
28588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const uvec8 kShuffleMaskRAWToARGB = {
28688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  2u, 1u, 0u, 12u, 5u, 4u, 3u, 13u, 8u, 7u, 6u, 14u, 11u, 10u, 9u, 15u
28788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
28888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
28988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Shuffle table for converting ARGB to RGB24.
29088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const uvec8 kShuffleMaskARGBToRGB24 = {
29188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  0u, 1u, 2u, 4u, 5u, 6u, 8u, 9u, 10u, 12u, 13u, 14u, 128u, 128u, 128u, 128u
29288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
29388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
29488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Shuffle table for converting ARGB to RAW.
29588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const uvec8 kShuffleMaskARGBToRAW = {
29688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  2u, 1u, 0u, 6u, 5u, 4u, 10u, 9u, 8u, 14u, 13u, 12u, 128u, 128u, 128u, 128u
29788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
29888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
29988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Shuffle table for converting ARGBToRGB24 for I422ToRGB24.  First 8 + next 4
30088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const uvec8 kShuffleMaskARGBToRGB24_0 = {
30188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  0u, 1u, 2u, 4u, 5u, 6u, 8u, 9u, 128u, 128u, 128u, 128u, 10u, 12u, 13u, 14u
30288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
30388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
30488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Shuffle table for converting ARGB to RAW.
30588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const uvec8 kShuffleMaskARGBToRAW_0 = {
30688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  2u, 1u, 0u, 6u, 5u, 4u, 10u, 9u, 128u, 128u, 128u, 128u, 8u, 14u, 13u, 12u
30788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
30888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
30988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Duplicates gray value 3 times and fills in alpha opaque.
31088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
31188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I400ToARGBRow_SSE2(const uint8* src_y, uint8* dst_argb, int pix) {
31288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
31388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]        // src_y
31488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]        // dst_argb
31588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]       // pix
31688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5            // generate mask 0xff000000
31788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld      xmm5, 24
31888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
31988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
32088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
32188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm0, qword ptr [eax]
32288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 8]
32388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm0
32488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
32588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm0
32688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm1
32788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm0, xmm5
32888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm1, xmm5
32988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
33088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 16], xmm1
33188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 32]
33288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
33388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
33488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
33588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
33688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
33788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
33888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
33988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I400ToARGBRow_Unaligned_SSE2(const uint8* src_y, uint8* dst_argb,
34088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                  int pix) {
34188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
34288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]        // src_y
34388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]        // dst_argb
34488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]       // pix
34588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5            // generate mask 0xff000000
34688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld      xmm5, 24
34788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
34888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
34988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
35088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm0, qword ptr [eax]
35188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 8]
35288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm0
35388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
35488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm0
35588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm1
35688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm0, xmm5
35788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm1, xmm5
35888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
35988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx + 16], xmm1
36088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 32]
36188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
36288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
36388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
36488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
36588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
36688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
36788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
36888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid RGB24ToARGBRow_SSSE3(const uint8* src_rgb24, uint8* dst_argb, int pix) {
36988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
37088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, [esp + 4]   // src_rgb24
37188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       edx, [esp + 8]   // dst_argb
37288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       ecx, [esp + 12]  // pix
37388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb   xmm5, xmm5       // generate mask 0xff000000
37488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld     xmm5, 24
37588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm4, kShuffleMaskRGB24ToARGB
37688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
37788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
37888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
37988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    xmm0, [eax]
38088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    xmm1, [eax + 16]
38188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    xmm3, [eax + 32]
38288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       eax, [eax + 48]
38388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm2, xmm3
38488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    palignr   xmm2, xmm1, 8    // xmm2 = { xmm3[0:3] xmm1[8:15]}
38588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb    xmm2, xmm4
38688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm2, xmm5
38788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    palignr   xmm1, xmm0, 12   // xmm1 = { xmm3[0:7] xmm0[12:15]}
38888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb    xmm0, xmm4
38988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    [edx + 32], xmm2
39088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm0, xmm5
39188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb    xmm1, xmm4
39288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    [edx], xmm0
39388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm1, xmm5
39488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    palignr   xmm3, xmm3, 4    // xmm3 = { xmm3[4:15]}
39588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb    xmm3, xmm4
39688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    [edx + 16], xmm1
39788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm3, xmm5
39888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       ecx, 16
39988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    [edx + 48], xmm3
40088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       edx, [edx + 64]
40188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg        convertloop
40288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
40388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
40488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
40588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
40688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
40788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid RAWToARGBRow_SSSE3(const uint8* src_raw, uint8* dst_argb,
40888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        int pix) {
40988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
41088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, [esp + 4]   // src_raw
41188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       edx, [esp + 8]   // dst_argb
41288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       ecx, [esp + 12]  // pix
41388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb   xmm5, xmm5       // generate mask 0xff000000
41488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld     xmm5, 24
41588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm4, kShuffleMaskRAWToARGB
41688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
41788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
41888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
41988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    xmm0, [eax]
42088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    xmm1, [eax + 16]
42188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    xmm3, [eax + 32]
42288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       eax, [eax + 48]
42388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm2, xmm3
42488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    palignr   xmm2, xmm1, 8    // xmm2 = { xmm3[0:3] xmm1[8:15]}
42588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb    xmm2, xmm4
42688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm2, xmm5
42788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    palignr   xmm1, xmm0, 12   // xmm1 = { xmm3[0:7] xmm0[12:15]}
42888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb    xmm0, xmm4
42988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    [edx + 32], xmm2
43088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm0, xmm5
43188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb    xmm1, xmm4
43288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    [edx], xmm0
43388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm1, xmm5
43488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    palignr   xmm3, xmm3, 4    // xmm3 = { xmm3[4:15]}
43588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb    xmm3, xmm4
43688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    [edx + 16], xmm1
43788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm3, xmm5
43888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       ecx, 16
43988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    [edx + 48], xmm3
44088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       edx, [edx + 64]
44188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg        convertloop
44288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
44388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
44488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
44588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
44688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// pmul method to replicate bits.
44788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Math to replicate bits:
44888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// (v << 8) | (v << 3)
44988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// v * 256 + v * 8
45088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// v * (256 + 8)
45188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// G shift of 5 is incorporated, so shift is 5 + 8 and 5 + 3
45288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 20 instructions.
45388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
45488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid RGB565ToARGBRow_SSE2(const uint8* src_rgb565, uint8* dst_argb,
45588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          int pix) {
45688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
45788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, 0x01080108  // generate multiplier to repeat 5 bits
45888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd      xmm5, eax
45988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd    xmm5, xmm5, 0
46088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, 0x20802080  // multiplier shift by 5 and then repeat 6 bits
46188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd      xmm6, eax
46288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd    xmm6, xmm6, 0
46388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb   xmm3, xmm3       // generate mask 0xf800f800 for Red
46488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psllw     xmm3, 11
46588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb   xmm4, xmm4       // generate mask 0x07e007e0 for Green
46688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psllw     xmm4, 10
46788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw     xmm4, 5
46888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb   xmm7, xmm7       // generate mask 0xff00ff00 for Alpha
46988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psllw     xmm7, 8
47088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
47188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, [esp + 4]   // src_rgb565
47288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       edx, [esp + 8]   // dst_argb
47388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       ecx, [esp + 12]  // pix
47488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       edx, eax
47588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       edx, eax
47688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
47788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
47888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
47988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    xmm0, [eax]   // fetch 8 pixels of bgr565
48088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm1, xmm0
48188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm2, xmm0
48288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand      xmm1, xmm3    // R in upper 5 bits
48388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psllw     xmm2, 11      // B in upper 5 bits
48488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw   xmm1, xmm5    // * (256 + 8)
48588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw   xmm2, xmm5    // * (256 + 8)
48688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psllw     xmm1, 8
48788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm1, xmm2    // RB
48888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand      xmm0, xmm4    // G in middle 6 bits
48988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw   xmm0, xmm6    // << 5 * (256 + 4)
49088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm0, xmm7    // AG
49188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm2, xmm1
49288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw xmm1, xmm0
49388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw xmm2, xmm0
49488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    [eax * 2 + edx], xmm1  // store 4 pixels of ARGB
49588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    [eax * 2 + edx + 16], xmm2  // store next 4 pixels of ARGB
49688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       eax, [eax + 16]
49788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       ecx, 8
49888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg        convertloop
49988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
50088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
50188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
50288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
50388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 24 instructions
50488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
50588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGB1555ToARGBRow_SSE2(const uint8* src_argb1555, uint8* dst_argb,
50688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                            int pix) {
50788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
50888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, 0x01080108  // generate multiplier to repeat 5 bits
50988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd      xmm5, eax
51088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd    xmm5, xmm5, 0
51188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, 0x42004200  // multiplier shift by 6 and then repeat 5 bits
51288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd      xmm6, eax
51388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd    xmm6, xmm6, 0
51488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb   xmm3, xmm3       // generate mask 0xf800f800 for Red
51588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psllw     xmm3, 11
51688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm4, xmm3       // generate mask 0x03e003e0 for Green
51788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw     xmm4, 6
51888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb   xmm7, xmm7       // generate mask 0xff00ff00 for Alpha
51988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psllw     xmm7, 8
52088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
52188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, [esp + 4]   // src_argb1555
52288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       edx, [esp + 8]   // dst_argb
52388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       ecx, [esp + 12]  // pix
52488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       edx, eax
52588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       edx, eax
52688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
52788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
52888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
52988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    xmm0, [eax]   // fetch 8 pixels of 1555
53088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm1, xmm0
53188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm2, xmm0
53288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psllw     xmm1, 1       // R in upper 5 bits
53388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psllw     xmm2, 11      // B in upper 5 bits
53488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand      xmm1, xmm3
53588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw   xmm2, xmm5    // * (256 + 8)
53688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw   xmm1, xmm5    // * (256 + 8)
53788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psllw     xmm1, 8
53888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm1, xmm2    // RB
53988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm2, xmm0
54088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand      xmm0, xmm4    // G in middle 5 bits
54188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw     xmm2, 8       // A
54288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw   xmm0, xmm6    // << 6 * (256 + 8)
54388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand      xmm2, xmm7
54488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm0, xmm2    // AG
54588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm2, xmm1
54688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw xmm1, xmm0
54788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw xmm2, xmm0
54888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    [eax * 2 + edx], xmm1  // store 4 pixels of ARGB
54988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    [eax * 2 + edx + 16], xmm2  // store next 4 pixels of ARGB
55088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       eax, [eax + 16]
55188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       ecx, 8
55288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg        convertloop
55388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
55488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
55588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
55688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
55788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 18 instructions.
55888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
55988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGB4444ToARGBRow_SSE2(const uint8* src_argb4444, uint8* dst_argb,
56088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                            int pix) {
56188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
56288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, 0x0f0f0f0f  // generate mask 0x0f0f0f0f
56388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd      xmm4, eax
56488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd    xmm4, xmm4, 0
56588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm5, xmm4       // 0xf0f0f0f0 for high nibbles
56688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld     xmm5, 4
56788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, [esp + 4]   // src_argb4444
56888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       edx, [esp + 8]   // dst_argb
56988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       ecx, [esp + 12]  // pix
57088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       edx, eax
57188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       edx, eax
57288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
57388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
57488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
57588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    xmm0, [eax]   // fetch 8 pixels of bgra4444
57688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm2, xmm0
57788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand      xmm0, xmm4    // mask low nibbles
57888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand      xmm2, xmm5    // mask high nibbles
57988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm1, xmm0
58088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm3, xmm2
58188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psllw     xmm1, 4
58288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw     xmm3, 4
58388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm0, xmm1
58488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm2, xmm3
58588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm1, xmm0
58688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw xmm0, xmm2
58788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw xmm1, xmm2
58888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    [eax * 2 + edx], xmm0  // store 4 pixels of ARGB
58988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    [eax * 2 + edx + 16], xmm1  // store next 4 pixels of ARGB
59088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       eax, [eax + 16]
59188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       ecx, 8
59288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg        convertloop
59388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
59488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
59588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
59688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
59788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
59888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToRGB24Row_SSSE3(const uint8* src_argb, uint8* dst_rgb, int pix) {
59988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
60088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, [esp + 4]   // src_argb
60188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       edx, [esp + 8]   // dst_rgb
60288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       ecx, [esp + 12]  // pix
60388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm6, kShuffleMaskARGBToRGB24
60488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
60588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
60688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
60788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    xmm0, [eax]   // fetch 16 pixels of argb
60888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    xmm1, [eax + 16]
60988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    xmm2, [eax + 32]
61088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    xmm3, [eax + 48]
61188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       eax, [eax + 64]
61288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb    xmm0, xmm6    // pack 16 bytes of ARGB to 12 bytes of RGB
61388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb    xmm1, xmm6
61488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb    xmm2, xmm6
61588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb    xmm3, xmm6
61688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm4, xmm1   // 4 bytes from 1 for 0
61788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrldq    xmm1, 4      // 8 bytes from 1
61888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslldq    xmm4, 12     // 4 bytes from 1 for 0
61988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm5, xmm2   // 8 bytes from 2 for 1
62088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm0, xmm4   // 4 bytes from 1 for 0
62188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslldq    xmm5, 8      // 8 bytes from 2 for 1
62288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    [edx], xmm0  // store 0
62388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm1, xmm5   // 8 bytes from 2 for 1
62488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrldq    xmm2, 8      // 4 bytes from 2
62588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslldq    xmm3, 4      // 12 bytes from 3 for 2
62688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm2, xmm3   // 12 bytes from 3 for 2
62788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    [edx + 16], xmm1   // store 1
62888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    [edx + 32], xmm2   // store 2
62988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       edx, [edx + 48]
63088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       ecx, 16
63188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg        convertloop
63288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
63388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
63488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
63588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
63688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
63788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToRAWRow_SSSE3(const uint8* src_argb, uint8* dst_rgb, int pix) {
63888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
63988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, [esp + 4]   // src_argb
64088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       edx, [esp + 8]   // dst_rgb
64188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       ecx, [esp + 12]  // pix
64288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm6, kShuffleMaskARGBToRAW
64388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
64488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
64588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
64688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    xmm0, [eax]   // fetch 16 pixels of argb
64788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    xmm1, [eax + 16]
64888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    xmm2, [eax + 32]
64988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    xmm3, [eax + 48]
65088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       eax, [eax + 64]
65188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb    xmm0, xmm6    // pack 16 bytes of ARGB to 12 bytes of RGB
65288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb    xmm1, xmm6
65388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb    xmm2, xmm6
65488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb    xmm3, xmm6
65588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm4, xmm1   // 4 bytes from 1 for 0
65688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrldq    xmm1, 4      // 8 bytes from 1
65788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslldq    xmm4, 12     // 4 bytes from 1 for 0
65888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm5, xmm2   // 8 bytes from 2 for 1
65988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm0, xmm4   // 4 bytes from 1 for 0
66088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslldq    xmm5, 8      // 8 bytes from 2 for 1
66188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    [edx], xmm0  // store 0
66288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm1, xmm5   // 8 bytes from 2 for 1
66388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrldq    xmm2, 8      // 4 bytes from 2
66488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslldq    xmm3, 4      // 12 bytes from 3 for 2
66588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm2, xmm3   // 12 bytes from 3 for 2
66688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    [edx + 16], xmm1   // store 1
66788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    [edx + 32], xmm2   // store 2
66888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       edx, [edx + 48]
66988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       ecx, 16
67088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg        convertloop
67188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
67288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
67388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
67488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
67588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
67688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToRGB565Row_SSE2(const uint8* src_argb, uint8* dst_rgb, int pix) {
67788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
67888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, [esp + 4]   // src_argb
67988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       edx, [esp + 8]   // dst_rgb
68088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       ecx, [esp + 12]  // pix
68188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb   xmm3, xmm3       // generate mask 0x0000001f
68288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld     xmm3, 27
68388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb   xmm4, xmm4       // generate mask 0x000007e0
68488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld     xmm4, 26
68588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld     xmm4, 5
68688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb   xmm5, xmm5       // generate mask 0xfffff800
68788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld     xmm5, 11
68888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
68988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
69088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
69188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm0, [eax]   // fetch 4 pixels of argb
69288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm1, xmm0    // B
69388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm2, xmm0    // G
69488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld     xmm0, 8       // R
69588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld     xmm1, 3       // B
69688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld     xmm2, 5       // G
69788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrad     xmm0, 16      // R
69888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand      xmm1, xmm3    // B
69988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand      xmm2, xmm4    // G
70088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand      xmm0, xmm5    // R
70188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm1, xmm2    // BG
70288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm0, xmm1    // BGR
70388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packssdw  xmm0, xmm0
70488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       eax, [eax + 16]
70588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq      qword ptr [edx], xmm0  // store 4 pixels of RGB565
70688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       edx, [edx + 8]
70788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       ecx, 4
70888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg        convertloop
70988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
71088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
71188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
71288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
71388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// TODO(fbarchard): Improve sign extension/packing.
71488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
71588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToARGB1555Row_SSE2(const uint8* src_argb, uint8* dst_rgb, int pix) {
71688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
71788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, [esp + 4]   // src_argb
71888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       edx, [esp + 8]   // dst_rgb
71988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       ecx, [esp + 12]  // pix
72088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb   xmm4, xmm4       // generate mask 0x0000001f
72188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld     xmm4, 27
72288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm5, xmm4       // generate mask 0x000003e0
72388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld     xmm5, 5
72488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm6, xmm4       // generate mask 0x00007c00
72588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld     xmm6, 10
72688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb   xmm7, xmm7       // generate mask 0xffff8000
72788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld     xmm7, 15
72888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
72988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
73088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
73188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm0, [eax]   // fetch 4 pixels of argb
73288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm1, xmm0    // B
73388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm2, xmm0    // G
73488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm3, xmm0    // R
73588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrad     xmm0, 16      // A
73688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld     xmm1, 3       // B
73788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld     xmm2, 6       // G
73888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld     xmm3, 9       // R
73988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand      xmm0, xmm7    // A
74088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand      xmm1, xmm4    // B
74188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand      xmm2, xmm5    // G
74288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand      xmm3, xmm6    // R
74388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm0, xmm1    // BA
74488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm2, xmm3    // GR
74588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm0, xmm2    // BGRA
74688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packssdw  xmm0, xmm0
74788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       eax, [eax + 16]
74888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq      qword ptr [edx], xmm0  // store 4 pixels of ARGB1555
74988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       edx, [edx + 8]
75088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       ecx, 4
75188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg        convertloop
75288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
75388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
75488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
75588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
75688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
75788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToARGB4444Row_SSE2(const uint8* src_argb, uint8* dst_rgb, int pix) {
75888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
75988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, [esp + 4]   // src_argb
76088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       edx, [esp + 8]   // dst_rgb
76188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       ecx, [esp + 12]  // pix
76288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb   xmm4, xmm4       // generate mask 0xf000f000
76388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psllw     xmm4, 12
76488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm3, xmm4       // generate mask 0x00f000f0
76588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw     xmm3, 8
76688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
76788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
76888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
76988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm0, [eax]   // fetch 4 pixels of argb
77088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm1, xmm0
77188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand      xmm0, xmm3    // low nibble
77288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand      xmm1, xmm4    // high nibble
77388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrl      xmm0, 4
77488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrl      xmm1, 8
77588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm0, xmm1
77688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb  xmm0, xmm0
77788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       eax, [eax + 16]
77888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq      qword ptr [edx], xmm0  // store 4 pixels of ARGB4444
77988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       edx, [edx + 8]
78088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       ecx, 4
78188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg        convertloop
78288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
78388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
78488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
78588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
78688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Convert 16 ARGB pixels (64 bytes) to 16 Y values.
78788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
78888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) {
78988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
79088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   /* src_argb */
79188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   /* dst_y */
79288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  /* pix */
79388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddY16
79488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, kARGBToY
79588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
79688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
79788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
79888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
79988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
80088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax + 32]
80188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax + 48]
80288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm4
80388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm4
80488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm4
80588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm4
80688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 64]
80788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm1
80888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm2, xmm3
80988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 7
81088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm2, 7
81188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm2
81288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5
81388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
81488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
81588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
81688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
81788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
81888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
81988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
82088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
82188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Convert 16 ARGB pixels (64 bytes) to 16 Y values.
82288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
82388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToYJRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) {
82488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
82588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   /* src_argb */
82688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   /* dst_y */
82788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  /* pix */
82888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, kARGBToYJ
82988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddYJ64
83088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
83188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
83288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
83388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
83488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
83588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax + 32]
83688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax + 48]
83788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm4
83888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm4
83988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm4
84088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm4
84188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 64]
84288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm1
84388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm2, xmm3
84488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm0, xmm5  // Add .5 for rounding.
84588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm2, xmm5
84688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 7
84788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm2, 7
84888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm2
84988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
85088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
85188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
85288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
85388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
85488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
85588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
85688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
85788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBTOYROW_AVX2
85888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Convert 32 ARGB pixels (128 bytes) to 32 Y values.
85988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(32))
86088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToYRow_AVX2(const uint8* src_argb, uint8* dst_y, int pix) {
86188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
86288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   /* src_argb */
86388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   /* dst_y */
86488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  /* pix */
86588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vbroadcastf128 ymm4, kARGBToY
86688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vbroadcastf128 ymm5, kAddY16
86788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqa    ymm6, kPermdARGBToY_AVX
86888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
86988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
87088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
87188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm0, [eax]
87288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm1, [eax + 32]
87388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm2, [eax + 64]
87488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm3, [eax + 96]
87588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmaddubsw ymm0, ymm0, ymm4
87688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmaddubsw ymm1, ymm1, ymm4
87788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmaddubsw ymm2, ymm2, ymm4
87888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmaddubsw ymm3, ymm3, ymm4
87988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 128]
88088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vphaddw    ymm0, ymm0, ymm1  // mutates.
88188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vphaddw    ymm2, ymm2, ymm3
88288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm0, ymm0, 7
88388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm2, ymm2, 7
88488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm0, ymm0, ymm2  // mutates.
88588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermd     ymm0, ymm6, ymm0  // For vphaddw + vpackuswb mutation.
88688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpaddb     ymm0, ymm0, ymm5
88788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 32
88888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [edx], ymm0
88988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 32]
89088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
89188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
89288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
89388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
89488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
89588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  //  HAS_ARGBTOYROW_AVX2
89688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
89788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBTOYROW_AVX2
89888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Convert 32 ARGB pixels (128 bytes) to 32 Y values.
89988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(32))
90088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToYJRow_AVX2(const uint8* src_argb, uint8* dst_y, int pix) {
90188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
90288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   /* src_argb */
90388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   /* dst_y */
90488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  /* pix */
90588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vbroadcastf128 ymm4, kARGBToYJ
90688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vbroadcastf128 ymm5, kAddYJ64
90788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqa    ymm6, kPermdARGBToY_AVX
90888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
90988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
91088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
91188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm0, [eax]
91288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm1, [eax + 32]
91388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm2, [eax + 64]
91488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm3, [eax + 96]
91588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmaddubsw ymm0, ymm0, ymm4
91688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmaddubsw ymm1, ymm1, ymm4
91788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmaddubsw ymm2, ymm2, ymm4
91888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmaddubsw ymm3, ymm3, ymm4
91988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 128]
92088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vphaddw    ymm0, ymm0, ymm1  // mutates.
92188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vphaddw    ymm2, ymm2, ymm3
92288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpaddw     ymm0, ymm0, ymm5  // Add .5 for rounding.
92388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpaddw     ymm2, ymm2, ymm5
92488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm0, ymm0, 7
92588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm2, ymm2, 7
92688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm0, ymm0, ymm2  // mutates.
92788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermd     ymm0, ymm6, ymm0  // For vphaddw + vpackuswb mutation.
92888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 32
92988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [edx], ymm0
93088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 32]
93188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
93288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
93388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
93488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
93588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
93688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
93788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  //  HAS_ARGBTOYJROW_AVX2
93888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
93988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
94088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToYRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) {
94188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
94288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   /* src_argb */
94388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   /* dst_y */
94488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  /* pix */
94588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddY16
94688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, kARGBToY
94788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
94888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
94988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
95088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
95188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
95288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [eax + 32]
95388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm3, [eax + 48]
95488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm4
95588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm4
95688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm4
95788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm4
95888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 64]
95988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm1
96088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm2, xmm3
96188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 7
96288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm2, 7
96388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm2
96488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5
96588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
96688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
96788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
96888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
96988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
97088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
97188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
97288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
97388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
97488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToYJRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) {
97588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
97688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   /* src_argb */
97788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   /* dst_y */
97888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  /* pix */
97988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, kARGBToYJ
98088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddYJ64
98188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
98288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
98388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
98488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
98588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
98688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [eax + 32]
98788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm3, [eax + 48]
98888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm4
98988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm4
99088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm4
99188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm4
99288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 64]
99388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm1
99488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm2, xmm3
99588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm0, xmm5
99688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm2, xmm5
99788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 7
99888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm2, 7
99988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm2
100088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
100188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
100288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
100388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
100488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
100588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
100688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
100788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
100888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
100988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid BGRAToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) {
101088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
101188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   /* src_argb */
101288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   /* dst_y */
101388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  /* pix */
101488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddY16
101588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, kBGRAToY
101688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
101788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
101888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
101988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
102088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
102188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax + 32]
102288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax + 48]
102388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm4
102488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm4
102588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm4
102688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm4
102788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 64]
102888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm1
102988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm2, xmm3
103088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 7
103188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm2, 7
103288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm2
103388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5
103488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
103588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
103688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
103788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
103888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
103988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
104088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
104188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
104288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
104388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid BGRAToYRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) {
104488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
104588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   /* src_argb */
104688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   /* dst_y */
104788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  /* pix */
104888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddY16
104988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, kBGRAToY
105088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
105188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
105288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
105388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
105488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
105588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [eax + 32]
105688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm3, [eax + 48]
105788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm4
105888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm4
105988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm4
106088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm4
106188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 64]
106288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm1
106388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm2, xmm3
106488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 7
106588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm2, 7
106688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm2
106788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5
106888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
106988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
107088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
107188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
107288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
107388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
107488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
107588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
107688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
107788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ABGRToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) {
107888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
107988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   /* src_argb */
108088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   /* dst_y */
108188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  /* pix */
108288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddY16
108388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, kABGRToY
108488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
108588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
108688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
108788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
108888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
108988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax + 32]
109088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax + 48]
109188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm4
109288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm4
109388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm4
109488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm4
109588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 64]
109688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm1
109788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm2, xmm3
109888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 7
109988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm2, 7
110088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm2
110188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5
110288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
110388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
110488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
110588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
110688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
110788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
110888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
110988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
111088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
111188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ABGRToYRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) {
111288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
111388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   /* src_argb */
111488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   /* dst_y */
111588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  /* pix */
111688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddY16
111788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, kABGRToY
111888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
111988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
112088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
112188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
112288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
112388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [eax + 32]
112488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm3, [eax + 48]
112588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm4
112688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm4
112788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm4
112888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm4
112988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 64]
113088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm1
113188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm2, xmm3
113288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 7
113388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm2, 7
113488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm2
113588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5
113688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
113788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
113888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
113988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
114088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
114188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
114288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
114388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
114488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
114588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid RGBAToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) {
114688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
114788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   /* src_argb */
114888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   /* dst_y */
114988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  /* pix */
115088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddY16
115188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, kRGBAToY
115288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
115388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
115488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
115588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
115688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
115788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax + 32]
115888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax + 48]
115988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm4
116088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm4
116188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm4
116288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm4
116388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 64]
116488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm1
116588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm2, xmm3
116688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 7
116788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm2, 7
116888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm2
116988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5
117088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
117188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
117288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
117388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
117488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
117588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
117688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
117788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
117888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
117988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid RGBAToYRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) {
118088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
118188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   /* src_argb */
118288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   /* dst_y */
118388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  /* pix */
118488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddY16
118588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, kRGBAToY
118688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
118788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
118888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
118988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
119088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
119188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [eax + 32]
119288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm3, [eax + 48]
119388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm4
119488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm4
119588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm4
119688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm4
119788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 64]
119888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm1
119988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm2, xmm3
120088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 7
120188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm2, 7
120288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm2
120388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5
120488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
120588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
120688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
120788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
120888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
120988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
121088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
121188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
121288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
121388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb,
121488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                       uint8* dst_u, uint8* dst_v, int width) {
121588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
121688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
121788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
121888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // src_argb
121988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // src_stride_argb
122088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]  // dst_u
122188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 16]  // dst_v
122288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // pix
122388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm7, kARGBToU
122488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, kARGBToV
122588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddUV128
122688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx             // stride from u to v
122788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
122888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
122988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
123088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    /* step 1 - subsample 16x2 argb pixels to 8x1 */
123188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
123288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
123388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax + 32]
123488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax + 48]
123588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, [eax + esi]
123688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm1, [eax + esi + 16]
123788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, [eax + esi + 32]
123888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm3, [eax + esi + 48]
123988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
124088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm0
124188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm0, xmm1, 0x88
124288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm1, 0xdd
124388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm4
124488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm2
124588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm2, xmm3, 0x88
124688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm3, 0xdd
124788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, xmm4
124888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
124988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 2 - convert to U and V
125088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // from here down is very similar to Y code except
125188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // instead of 16 different pixels, its 8 pixels of U and 8 of V
125288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
125388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm2
125488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm7  // U
125588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm7
125688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm6  // V
125788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm6
125888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm2
125988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm1, xmm3
126088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm0, 8
126188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm1, 8
126288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packsswb   xmm0, xmm1
126388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5            // -> unsigned
126488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
126588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 3 - store 8 U and 8 V values
126688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
126788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movlps     qword ptr [edx], xmm0 // U
126888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movhps     qword ptr [edx + edi], xmm0 // V
126988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
127088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
127188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
127288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
127388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
127488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
127588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
127688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
127788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
127888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
127988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToUVJRow_SSSE3(const uint8* src_argb0, int src_stride_argb,
128088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_u, uint8* dst_v, int width) {
128188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
128288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
128388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
128488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // src_argb
128588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // src_stride_argb
128688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]  // dst_u
128788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 16]  // dst_v
128888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // pix
128988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm7, kARGBToUJ
129088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, kARGBToVJ
129188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddUVJ128
129288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx             // stride from u to v
129388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
129488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
129588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
129688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    /* step 1 - subsample 16x2 argb pixels to 8x1 */
129788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
129888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
129988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax + 32]
130088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax + 48]
130188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, [eax + esi]
130288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm1, [eax + esi + 16]
130388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, [eax + esi + 32]
130488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm3, [eax + esi + 48]
130588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
130688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm0
130788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm0, xmm1, 0x88
130888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm1, 0xdd
130988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm4
131088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm2
131188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm2, xmm3, 0x88
131288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm3, 0xdd
131388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, xmm4
131488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
131588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 2 - convert to U and V
131688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // from here down is very similar to Y code except
131788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // instead of 16 different pixels, its 8 pixels of U and 8 of V
131888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
131988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm2
132088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm7  // U
132188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm7
132288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm6  // V
132388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm6
132488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm2
132588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm1, xmm3
132688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm0, xmm5            // +.5 rounding -> unsigned
132788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm1, xmm5
132888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm0, 8
132988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm1, 8
133088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packsswb   xmm0, xmm1
133188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
133288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 3 - store 8 U and 8 V values
133388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
133488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movlps     qword ptr [edx], xmm0 // U
133588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movhps     qword ptr [edx + edi], xmm0 // V
133688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
133788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
133888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
133988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
134088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
134188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
134288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
134388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
134488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
134588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBTOUVROW_AVX2
134688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(32))
134788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToUVRow_AVX2(const uint8* src_argb0, int src_stride_argb,
134888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                      uint8* dst_u, uint8* dst_v, int width) {
134988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
135088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
135188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
135288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // src_argb
135388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // src_stride_argb
135488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]  // dst_u
135588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 16]  // dst_v
135688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // pix
135788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vbroadcastf128 ymm5, kAddUV128
135888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vbroadcastf128 ymm6, kARGBToV
135988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vbroadcastf128 ymm7, kARGBToU
136088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx             // stride from u to v
136188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
136288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
136388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
136488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    /* step 1 - subsample 32x2 argb pixels to 16x1 */
136588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm0, [eax]
136688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm1, [eax + 32]
136788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm2, [eax + 64]
136888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm3, [eax + 96]
136988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpavgb     ymm0, ymm0, [eax + esi]
137088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpavgb     ymm1, ymm1, [eax + esi + 32]
137188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpavgb     ymm2, ymm2, [eax + esi + 64]
137288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpavgb     ymm3, ymm3, [eax + esi + 96]
137388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 128]
137488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vshufps    ymm4, ymm0, ymm1, 0x88
137588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vshufps    ymm0, ymm0, ymm1, 0xdd
137688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpavgb     ymm0, ymm0, ymm4  // mutated by vshufps
137788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vshufps    ymm4, ymm2, ymm3, 0x88
137888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vshufps    ymm2, ymm2, ymm3, 0xdd
137988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpavgb     ymm2, ymm2, ymm4  // mutated by vshufps
138088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
138188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 2 - convert to U and V
138288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // from here down is very similar to Y code except
138388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // instead of 32 different pixels, its 16 pixels of U and 16 of V
138488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmaddubsw ymm1, ymm0, ymm7  // U
138588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmaddubsw ymm3, ymm2, ymm7
138688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmaddubsw ymm0, ymm0, ymm6  // V
138788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmaddubsw ymm2, ymm2, ymm6
138888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vphaddw    ymm1, ymm1, ymm3  // mutates
138988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vphaddw    ymm0, ymm0, ymm2
139088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsraw     ymm1, ymm1, 8
139188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsraw     ymm0, ymm0, 8
139288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpacksswb  ymm0, ymm1, ymm0  // mutates
139388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm0, ymm0, 0xd8  // For vpacksswb
139488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpshufb    ymm0, ymm0, kShufARGBToUV_AVX  // For vshufps + vphaddw
139588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpaddb     ymm0, ymm0, ymm5  // -> unsigned
139688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
139788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 3 - store 16 U and 16 V values
139888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub         ecx, 32
139988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vextractf128 [edx], ymm0, 0 // U
140088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vextractf128 [edx + edi], ymm0, 1 // V
140188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
140288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
140388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
140488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
140588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
140688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
140788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
140888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
140988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
141088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBTOUVROW_AVX2
141188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
141288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
141388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToUVRow_Unaligned_SSSE3(const uint8* src_argb0, int src_stride_argb,
141488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                 uint8* dst_u, uint8* dst_v, int width) {
141588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
141688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
141788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
141888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // src_argb
141988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // src_stride_argb
142088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]  // dst_u
142188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 16]  // dst_v
142288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // pix
142388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm7, kARGBToU
142488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, kARGBToV
142588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddUV128
142688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx             // stride from u to v
142788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
142888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
142988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
143088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    /* step 1 - subsample 16x2 argb pixels to 8x1 */
143188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
143288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
143388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [eax + 32]
143488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm3, [eax + 48]
143588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi]
143688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm4
143788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi + 16]
143888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm1, xmm4
143988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi + 32]
144088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, xmm4
144188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi + 48]
144288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm3, xmm4
144388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
144488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm0
144588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm0, xmm1, 0x88
144688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm1, 0xdd
144788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm4
144888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm2
144988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm2, xmm3, 0x88
145088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm3, 0xdd
145188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, xmm4
145288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
145388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 2 - convert to U and V
145488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // from here down is very similar to Y code except
145588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // instead of 16 different pixels, its 8 pixels of U and 8 of V
145688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
145788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm2
145888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm7  // U
145988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm7
146088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm6  // V
146188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm6
146288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm2
146388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm1, xmm3
146488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm0, 8
146588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm1, 8
146688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packsswb   xmm0, xmm1
146788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5            // -> unsigned
146888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
146988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 3 - store 8 U and 8 V values
147088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
147188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movlps     qword ptr [edx], xmm0 // U
147288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movhps     qword ptr [edx + edi], xmm0 // V
147388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
147488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
147588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
147688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
147788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
147888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
147988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
148088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
148188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
148288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
148388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToUVJRow_Unaligned_SSSE3(const uint8* src_argb0, int src_stride_argb,
148488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                 uint8* dst_u, uint8* dst_v, int width) {
148588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
148688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
148788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
148888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // src_argb
148988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // src_stride_argb
149088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]  // dst_u
149188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 16]  // dst_v
149288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // pix
149388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm7, kARGBToUJ
149488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, kARGBToVJ
149588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddUVJ128
149688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx             // stride from u to v
149788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
149888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
149988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
150088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    /* step 1 - subsample 16x2 argb pixels to 8x1 */
150188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
150288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
150388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [eax + 32]
150488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm3, [eax + 48]
150588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi]
150688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm4
150788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi + 16]
150888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm1, xmm4
150988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi + 32]
151088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, xmm4
151188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi + 48]
151288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm3, xmm4
151388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
151488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm0
151588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm0, xmm1, 0x88
151688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm1, 0xdd
151788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm4
151888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm2
151988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm2, xmm3, 0x88
152088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm3, 0xdd
152188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, xmm4
152288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
152388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 2 - convert to U and V
152488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // from here down is very similar to Y code except
152588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // instead of 16 different pixels, its 8 pixels of U and 8 of V
152688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
152788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm2
152888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm7  // U
152988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm7
153088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm6  // V
153188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm6
153288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm2
153388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm1, xmm3
153488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm0, xmm5            // +.5 rounding -> unsigned
153588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm1, xmm5
153688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm0, 8
153788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm1, 8
153888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packsswb   xmm0, xmm1
153988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
154088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 3 - store 8 U and 8 V values
154188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
154288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movlps     qword ptr [edx], xmm0 // U
154388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movhps     qword ptr [edx + edi], xmm0 // V
154488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
154588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
154688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
154788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
154888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
154988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
155088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
155188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
155288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
155388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
155488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToUV444Row_SSSE3(const uint8* src_argb0,
155588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          uint8* dst_u, uint8* dst_v, int width) {
155688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
155788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
155888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // src_argb
155988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 8]   // dst_u
156088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 4 + 12]  // dst_v
156188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // pix
156288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm7, kARGBToU
156388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, kARGBToV
156488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddUV128
156588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx             // stride from u to v
156688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
156788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
156888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
156988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    /* convert to U and V */
157088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]          // U
157188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
157288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax + 32]
157388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax + 48]
157488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm7
157588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm7
157688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm7
157788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm7
157888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm1
157988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm2, xmm3
158088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm0, 8
158188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm2, 8
158288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packsswb   xmm0, xmm2
158388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5
158488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx,  16
158588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
158688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
158788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]          // V
158888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
158988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax + 32]
159088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax + 48]
159188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm6
159288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm6
159388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm6
159488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm6
159588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm1
159688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm2, xmm3
159788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm0, 8
159888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm2, 8
159988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packsswb   xmm0, xmm2
160088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5
160188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
160288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + edi], xmm0
160388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 16]
160488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
160588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
160688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
160788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
160888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
160988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
161088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
161188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
161288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToUV444Row_Unaligned_SSSE3(const uint8* src_argb0,
161388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                    uint8* dst_u, uint8* dst_v, int width) {
161488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
161588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
161688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // src_argb
161788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 8]   // dst_u
161888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 4 + 12]  // dst_v
161988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // pix
162088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm7, kARGBToU
162188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, kARGBToV
162288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddUV128
162388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx             // stride from u to v
162488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
162588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
162688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
162788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    /* convert to U and V */
162888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]          // U
162988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
163088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [eax + 32]
163188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm3, [eax + 48]
163288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm7
163388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm7
163488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm7
163588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm7
163688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm1
163788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm2, xmm3
163888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm0, 8
163988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm2, 8
164088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packsswb   xmm0, xmm2
164188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5
164288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx,  16
164388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
164488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
164588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]          // V
164688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
164788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [eax + 32]
164888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm3, [eax + 48]
164988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm6
165088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm6
165188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm6
165288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm6
165388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm1
165488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm2, xmm3
165588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm0, 8
165688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm2, 8
165788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packsswb   xmm0, xmm2
165888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5
165988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
166088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx + edi], xmm0
166188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 16]
166288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
166388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
166488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
166588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
166688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
166788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
166888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
166988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
167088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToUV422Row_SSSE3(const uint8* src_argb0,
167188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          uint8* dst_u, uint8* dst_v, int width) {
167288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
167388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
167488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // src_argb
167588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 8]   // dst_u
167688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 4 + 12]  // dst_v
167788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // pix
167888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm7, kARGBToU
167988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, kARGBToV
168088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddUV128
168188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx             // stride from u to v
168288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
168388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
168488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
168588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    /* step 1 - subsample 16x2 argb pixels to 8x1 */
168688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
168788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
168888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax + 32]
168988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax + 48]
169088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
169188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm0
169288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm0, xmm1, 0x88
169388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm1, 0xdd
169488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm4
169588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm2
169688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm2, xmm3, 0x88
169788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm3, 0xdd
169888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, xmm4
169988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
170088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 2 - convert to U and V
170188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // from here down is very similar to Y code except
170288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // instead of 16 different pixels, its 8 pixels of U and 8 of V
170388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
170488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm2
170588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm7  // U
170688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm7
170788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm6  // V
170888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm6
170988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm2
171088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm1, xmm3
171188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm0, 8
171288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm1, 8
171388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packsswb   xmm0, xmm1
171488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5            // -> unsigned
171588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
171688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 3 - store 8 U and 8 V values
171788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
171888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movlps     qword ptr [edx], xmm0 // U
171988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movhps     qword ptr [edx + edi], xmm0 // V
172088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
172188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
172288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
172388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
172488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
172588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
172688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
172788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
172888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
172988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToUV422Row_Unaligned_SSSE3(const uint8* src_argb0,
173088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                    uint8* dst_u, uint8* dst_v, int width) {
173188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
173288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
173388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // src_argb
173488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 8]   // dst_u
173588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 4 + 12]  // dst_v
173688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // pix
173788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm7, kARGBToU
173888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, kARGBToV
173988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddUV128
174088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx             // stride from u to v
174188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
174288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
174388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
174488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    /* step 1 - subsample 16x2 argb pixels to 8x1 */
174588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
174688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
174788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [eax + 32]
174888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm3, [eax + 48]
174988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
175088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm0
175188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm0, xmm1, 0x88
175288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm1, 0xdd
175388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm4
175488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm2
175588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm2, xmm3, 0x88
175688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm3, 0xdd
175788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, xmm4
175888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
175988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 2 - convert to U and V
176088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // from here down is very similar to Y code except
176188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // instead of 16 different pixels, its 8 pixels of U and 8 of V
176288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
176388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm2
176488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm7  // U
176588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm7
176688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm6  // V
176788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm6
176888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm2
176988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm1, xmm3
177088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm0, 8
177188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm1, 8
177288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packsswb   xmm0, xmm1
177388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5            // -> unsigned
177488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
177588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 3 - store 8 U and 8 V values
177688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
177788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movlps     qword ptr [edx], xmm0 // U
177888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movhps     qword ptr [edx + edi], xmm0 // V
177988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
178088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
178188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
178288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
178388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
178488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
178588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
178688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
178788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
178888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid BGRAToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb,
178988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                       uint8* dst_u, uint8* dst_v, int width) {
179088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
179188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
179288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
179388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // src_argb
179488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // src_stride_argb
179588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]  // dst_u
179688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 16]  // dst_v
179788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // pix
179888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm7, kBGRAToU
179988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, kBGRAToV
180088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddUV128
180188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx             // stride from u to v
180288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
180388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
180488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
180588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    /* step 1 - subsample 16x2 argb pixels to 8x1 */
180688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
180788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
180888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax + 32]
180988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax + 48]
181088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, [eax + esi]
181188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm1, [eax + esi + 16]
181288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, [eax + esi + 32]
181388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm3, [eax + esi + 48]
181488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
181588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm0
181688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm0, xmm1, 0x88
181788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm1, 0xdd
181888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm4
181988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm2
182088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm2, xmm3, 0x88
182188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm3, 0xdd
182288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, xmm4
182388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
182488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 2 - convert to U and V
182588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // from here down is very similar to Y code except
182688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // instead of 16 different pixels, its 8 pixels of U and 8 of V
182788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
182888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm2
182988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm7  // U
183088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm7
183188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm6  // V
183288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm6
183388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm2
183488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm1, xmm3
183588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm0, 8
183688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm1, 8
183788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packsswb   xmm0, xmm1
183888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5            // -> unsigned
183988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
184088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 3 - store 8 U and 8 V values
184188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
184288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movlps     qword ptr [edx], xmm0 // U
184388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movhps     qword ptr [edx + edi], xmm0 // V
184488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
184588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
184688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
184788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
184888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
184988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
185088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
185188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
185288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
185388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
185488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid BGRAToUVRow_Unaligned_SSSE3(const uint8* src_argb0, int src_stride_argb,
185588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                 uint8* dst_u, uint8* dst_v, int width) {
185688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
185788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
185888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
185988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // src_argb
186088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // src_stride_argb
186188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]  // dst_u
186288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 16]  // dst_v
186388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // pix
186488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm7, kBGRAToU
186588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, kBGRAToV
186688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddUV128
186788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx             // stride from u to v
186888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
186988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
187088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
187188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    /* step 1 - subsample 16x2 argb pixels to 8x1 */
187288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
187388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
187488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [eax + 32]
187588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm3, [eax + 48]
187688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi]
187788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm4
187888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi + 16]
187988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm1, xmm4
188088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi + 32]
188188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, xmm4
188288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi + 48]
188388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm3, xmm4
188488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
188588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm0
188688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm0, xmm1, 0x88
188788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm1, 0xdd
188888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm4
188988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm2
189088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm2, xmm3, 0x88
189188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm3, 0xdd
189288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, xmm4
189388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
189488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 2 - convert to U and V
189588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // from here down is very similar to Y code except
189688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // instead of 16 different pixels, its 8 pixels of U and 8 of V
189788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
189888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm2
189988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm7  // U
190088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm7
190188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm6  // V
190288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm6
190388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm2
190488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm1, xmm3
190588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm0, 8
190688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm1, 8
190788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packsswb   xmm0, xmm1
190888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5            // -> unsigned
190988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
191088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 3 - store 8 U and 8 V values
191188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
191288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movlps     qword ptr [edx], xmm0 // U
191388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movhps     qword ptr [edx + edi], xmm0 // V
191488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
191588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
191688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
191788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
191888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
191988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
192088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
192188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
192288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
192388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
192488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ABGRToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb,
192588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                       uint8* dst_u, uint8* dst_v, int width) {
192688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
192788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
192888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
192988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // src_argb
193088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // src_stride_argb
193188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]  // dst_u
193288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 16]  // dst_v
193388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // pix
193488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm7, kABGRToU
193588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, kABGRToV
193688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddUV128
193788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx             // stride from u to v
193888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
193988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
194088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
194188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    /* step 1 - subsample 16x2 argb pixels to 8x1 */
194288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
194388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
194488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax + 32]
194588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax + 48]
194688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, [eax + esi]
194788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm1, [eax + esi + 16]
194888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, [eax + esi + 32]
194988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm3, [eax + esi + 48]
195088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
195188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm0
195288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm0, xmm1, 0x88
195388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm1, 0xdd
195488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm4
195588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm2
195688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm2, xmm3, 0x88
195788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm3, 0xdd
195888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, xmm4
195988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
196088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 2 - convert to U and V
196188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // from here down is very similar to Y code except
196288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // instead of 16 different pixels, its 8 pixels of U and 8 of V
196388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
196488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm2
196588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm7  // U
196688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm7
196788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm6  // V
196888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm6
196988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm2
197088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm1, xmm3
197188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm0, 8
197288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm1, 8
197388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packsswb   xmm0, xmm1
197488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5            // -> unsigned
197588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
197688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 3 - store 8 U and 8 V values
197788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
197888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movlps     qword ptr [edx], xmm0 // U
197988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movhps     qword ptr [edx + edi], xmm0 // V
198088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
198188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
198288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
198388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
198488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
198588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
198688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
198788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
198888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
198988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
199088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ABGRToUVRow_Unaligned_SSSE3(const uint8* src_argb0, int src_stride_argb,
199188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                 uint8* dst_u, uint8* dst_v, int width) {
199288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
199388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
199488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
199588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // src_argb
199688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // src_stride_argb
199788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]  // dst_u
199888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 16]  // dst_v
199988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // pix
200088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm7, kABGRToU
200188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, kABGRToV
200288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddUV128
200388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx             // stride from u to v
200488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
200588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
200688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
200788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    /* step 1 - subsample 16x2 argb pixels to 8x1 */
200888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
200988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
201088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [eax + 32]
201188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm3, [eax + 48]
201288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi]
201388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm4
201488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi + 16]
201588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm1, xmm4
201688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi + 32]
201788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, xmm4
201888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi + 48]
201988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm3, xmm4
202088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
202188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm0
202288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm0, xmm1, 0x88
202388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm1, 0xdd
202488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm4
202588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm2
202688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm2, xmm3, 0x88
202788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm3, 0xdd
202888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, xmm4
202988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
203088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 2 - convert to U and V
203188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // from here down is very similar to Y code except
203288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // instead of 16 different pixels, its 8 pixels of U and 8 of V
203388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
203488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm2
203588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm7  // U
203688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm7
203788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm6  // V
203888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm6
203988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm2
204088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm1, xmm3
204188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm0, 8
204288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm1, 8
204388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packsswb   xmm0, xmm1
204488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5            // -> unsigned
204588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
204688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 3 - store 8 U and 8 V values
204788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
204888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movlps     qword ptr [edx], xmm0 // U
204988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movhps     qword ptr [edx + edi], xmm0 // V
205088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
205188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
205288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
205388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
205488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
205588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
205688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
205788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
205888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
205988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
206088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid RGBAToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb,
206188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                       uint8* dst_u, uint8* dst_v, int width) {
206288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
206388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
206488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
206588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // src_argb
206688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // src_stride_argb
206788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]  // dst_u
206888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 16]  // dst_v
206988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // pix
207088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm7, kRGBAToU
207188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, kRGBAToV
207288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddUV128
207388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx             // stride from u to v
207488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
207588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
207688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
207788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    /* step 1 - subsample 16x2 argb pixels to 8x1 */
207888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
207988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
208088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax + 32]
208188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax + 48]
208288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, [eax + esi]
208388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm1, [eax + esi + 16]
208488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, [eax + esi + 32]
208588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm3, [eax + esi + 48]
208688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
208788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm0
208888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm0, xmm1, 0x88
208988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm1, 0xdd
209088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm4
209188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm2
209288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm2, xmm3, 0x88
209388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm3, 0xdd
209488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, xmm4
209588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
209688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 2 - convert to U and V
209788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // from here down is very similar to Y code except
209888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // instead of 16 different pixels, its 8 pixels of U and 8 of V
209988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
210088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm2
210188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm7  // U
210288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm7
210388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm6  // V
210488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm6
210588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm2
210688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm1, xmm3
210788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm0, 8
210888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm1, 8
210988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packsswb   xmm0, xmm1
211088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5            // -> unsigned
211188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
211288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 3 - store 8 U and 8 V values
211388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
211488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movlps     qword ptr [edx], xmm0 // U
211588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movhps     qword ptr [edx + edi], xmm0 // V
211688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
211788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
211888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
211988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
212088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
212188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
212288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
212388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
212488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
212588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
212688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid RGBAToUVRow_Unaligned_SSSE3(const uint8* src_argb0, int src_stride_argb,
212788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                 uint8* dst_u, uint8* dst_v, int width) {
212888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
212988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
213088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
213188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // src_argb
213288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // src_stride_argb
213388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]  // dst_u
213488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 16]  // dst_v
213588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // pix
213688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm7, kRGBAToU
213788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, kRGBAToV
213888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddUV128
213988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx             // stride from u to v
214088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
214188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
214288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
214388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    /* step 1 - subsample 16x2 argb pixels to 8x1 */
214488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
214588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
214688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [eax + 32]
214788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm3, [eax + 48]
214888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi]
214988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm4
215088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi + 16]
215188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm1, xmm4
215288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi + 32]
215388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, xmm4
215488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm4, [eax + esi + 48]
215588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm3, xmm4
215688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
215788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm0
215888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm0, xmm1, 0x88
215988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm1, 0xdd
216088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm4
216188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm2
216288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm2, xmm3, 0x88
216388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shufps     xmm4, xmm3, 0xdd
216488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm2, xmm4
216588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
216688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 2 - convert to U and V
216788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // from here down is very similar to Y code except
216888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // instead of 16 different pixels, its 8 pixels of U and 8 of V
216988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
217088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm2
217188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm7  // U
217288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm2, xmm7
217388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm6  // V
217488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm3, xmm6
217588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm2
217688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm1, xmm3
217788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm0, 8
217888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm1, 8
217988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packsswb   xmm0, xmm1
218088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddb      xmm0, xmm5            // -> unsigned
218188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
218288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // step 3 - store 8 U and 8 V values
218388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
218488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movlps     qword ptr [edx], xmm0 // U
218588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movhps     qword ptr [edx + edi], xmm0 // V
218688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
218788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
218888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
218988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
219088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
219188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
219288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
219388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
219488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBTOYROW_SSSE3
219588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
219688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_I422TOARGBROW_AVX2
219788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
219888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const lvec8 kUVToB_AVX = {
219988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB,
220088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB
220188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
220288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const lvec8 kUVToR_AVX = {
220388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR,
220488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR
220588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
220688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const lvec8 kUVToG_AVX = {
220788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG,
220888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG
220988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
221088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const lvec16 kYToRgb_AVX = {
221188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG
221288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
221388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const lvec16 kYSub16_AVX = {
221488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16
221588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
221688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const lvec16 kUVBiasB_AVX = {
221788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB
221888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
221988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const lvec16 kUVBiasG_AVX = {
222088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG
222188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
222288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const lvec16 kUVBiasR_AVX = {
222388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR
222488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
222588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
222688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 16 pixels
222788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 8 UV values upsampled to 16 UV, mixed with 16 Y producing 16 ARGB (64 bytes).
222888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
222988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToARGBRow_AVX2(const uint8* y_buf,
223041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                        const uint8* u_buf,
223141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                        const uint8* v_buf,
223241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                        uint8* dst_argb,
223341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                        int width) {
223488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
223588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
223688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
223788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // Y
223888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // U
223988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 12]  // V
224088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 16]  // argb
224188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // width
224288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
224388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpcmpeqb   ymm5, ymm5, ymm5     // generate 0xffffffffffffffff for alpha
224488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpxor      ymm4, ymm4, ymm4
224588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
224688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
224788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
224888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovq      xmm0, qword ptr [esi]          //  U
224988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovq      xmm1, qword ptr [esi + edi]    //  V
225088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi,  [esi + 8]
225188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpcklbw ymm0, ymm0, ymm1               // UV
225288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm0, ymm0, 0xd8
225388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpcklwd ymm0, ymm0, ymm0              // UVUV
225488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmaddubsw ymm2, ymm0, kUVToB_AVX        // scale B UV
225588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmaddubsw ymm1, ymm0, kUVToG_AVX        // scale G UV
225688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmaddubsw ymm0, ymm0, kUVToR_AVX        // scale R UV
225788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsubw     ymm2, ymm2, kUVBiasB_AVX      // unbias back to signed
225888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsubw     ymm1, ymm1, kUVBiasG_AVX
225988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsubw     ymm0, ymm0, kUVBiasR_AVX
226088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
226188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 2: Find Y contribution to 16 R,G,B values
226288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    xmm3, [eax]                  // NOLINT
226388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
226488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm3, ymm3, 0xd8
226588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpcklbw ymm3, ymm3, ymm4
226688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsubsw    ymm3, ymm3, kYSub16_AVX
226788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmullw    ymm3, ymm3, kYToRgb_AVX
226888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpaddsw    ymm2, ymm2, ymm3           // B += Y
226988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpaddsw    ymm1, ymm1, ymm3           // G += Y
227088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpaddsw    ymm0, ymm0, ymm3           // R += Y
227188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsraw     ymm2, ymm2, 6
227288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsraw     ymm1, ymm1, 6
227388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsraw     ymm0, ymm0, 6
227488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm2, ymm2, ymm2           // B
227588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm1, ymm1, ymm1           // G
227688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm0, ymm0, ymm0           // R
227788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
227888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into ARGB
227988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpcklbw ymm2, ymm2, ymm1           // BG
228088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm2, ymm2, 0xd8
228188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpcklbw ymm0, ymm0, ymm5           // RA
228288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm0, ymm0, 0xd8
228388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpcklwd ymm1, ymm2, ymm0           // BGRA first 8 pixels
228488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpckhwd ymm2, ymm2, ymm0           // BGRA next 8 pixels
228588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [edx], ymm1
228688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [edx + 32], ymm2
228788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 64]
228888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
228988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
229088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
229188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
229288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
229388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
229488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
229588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
229688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
229788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_I422TOARGBROW_AVX2
229888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
229988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_I422TOARGBROW_SSSE3
230088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
230188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// TODO(fbarchard): Read that does half size on Y and treats 420 as 444.
230288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
230388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Read 8 UV from 444.
230488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define READYUV444 __asm {                                                     \
230588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm movq       xmm0, qword ptr [esi] /* U */                /* NOLINT */ \
230688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm movq       xmm1, qword ptr [esi + edi] /* V */          /* NOLINT */ \
230788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm lea        esi,  [esi + 8]                                           \
230888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm punpcklbw  xmm0, xmm1           /* UV */                             \
230988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
231088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
231188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Read 4 UV from 422, upsample to 8 UV.
231288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define READYUV422 __asm {                                                     \
231388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm movd       xmm0, [esi]          /* U */                              \
231488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm movd       xmm1, [esi + edi]    /* V */                              \
231588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm lea        esi,  [esi + 4]                                           \
231688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm punpcklbw  xmm0, xmm1           /* UV */                             \
231788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm punpcklwd  xmm0, xmm0           /* UVUV (upsample) */                \
231888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
231988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
232088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Read 2 UV from 411, upsample to 8 UV.
232188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define READYUV411 __asm {                                                     \
232288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm movzx      ebx, word ptr [esi]        /* U */           /* NOLINT */ \
232388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm movd       xmm0, ebx                                                 \
232488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm movzx      ebx, word ptr [esi + edi]  /* V */           /* NOLINT */ \
232588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm movd       xmm1, ebx                                                 \
232688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm lea        esi,  [esi + 2]                                           \
232788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm punpcklbw  xmm0, xmm1           /* UV */                             \
232888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm punpcklwd  xmm0, xmm0           /* UVUV (upsample) */                \
232988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm punpckldq  xmm0, xmm0           /* UVUV (upsample) */                \
233088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
233188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
233288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Read 4 UV from NV12, upsample to 8 UV.
233388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define READNV12 __asm {                                                       \
233488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm movq       xmm0, qword ptr [esi] /* UV */               /* NOLINT */ \
233588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm lea        esi,  [esi + 8]                                           \
233688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm punpcklwd  xmm0, xmm0           /* UVUV (upsample) */                \
233788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
233888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
233988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Convert 8 pixels: 8 UV and 8 Y.
234088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define YUVTORGB __asm {                                                       \
234188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    /* Step 1: Find 4 UV contributions to 8 R,G,B values */                    \
234288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm movdqa     xmm1, xmm0                                                \
234388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm movdqa     xmm2, xmm0                                                \
234488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm pmaddubsw  xmm0, kUVToB        /* scale B UV */                      \
234588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm pmaddubsw  xmm1, kUVToG        /* scale G UV */                      \
234688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm pmaddubsw  xmm2, kUVToR        /* scale R UV */                      \
234788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm psubw      xmm0, kUVBiasB      /* unbias back to signed */           \
234888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm psubw      xmm1, kUVBiasG                                            \
234988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm psubw      xmm2, kUVBiasR                                            \
235088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    /* Step 2: Find Y contribution to 8 R,G,B values */                        \
235188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm movq       xmm3, qword ptr [eax]                        /* NOLINT */ \
235288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm lea        eax, [eax + 8]                                            \
235388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm punpcklbw  xmm3, xmm4                                                \
235488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm psubsw     xmm3, kYSub16                                             \
235588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm pmullw     xmm3, kYToRgb                                             \
235688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm paddsw     xmm0, xmm3           /* B += Y */                         \
235788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm paddsw     xmm1, xmm3           /* G += Y */                         \
235888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm paddsw     xmm2, xmm3           /* R += Y */                         \
235988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm psraw      xmm0, 6                                                   \
236088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm psraw      xmm1, 6                                                   \
236188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm psraw      xmm2, 6                                                   \
236288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm packuswb   xmm0, xmm0           /* B */                              \
236388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm packuswb   xmm1, xmm1           /* G */                              \
236488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm packuswb   xmm2, xmm2           /* R */                              \
236588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
236688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
236788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Convert 8 pixels: 8 VU and 8 Y.
236888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define YVUTORGB __asm {                                                       \
236988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    /* Step 1: Find 4 UV contributions to 8 R,G,B values */                    \
237088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm movdqa     xmm1, xmm0                                                \
237188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm movdqa     xmm2, xmm0                                                \
237288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm pmaddubsw  xmm0, kVUToB        /* scale B UV */                      \
237388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm pmaddubsw  xmm1, kVUToG        /* scale G UV */                      \
237488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm pmaddubsw  xmm2, kVUToR        /* scale R UV */                      \
237588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm psubw      xmm0, kUVBiasB      /* unbias back to signed */           \
237688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm psubw      xmm1, kUVBiasG                                            \
237788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm psubw      xmm2, kUVBiasR                                            \
237888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    /* Step 2: Find Y contribution to 8 R,G,B values */                        \
237988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm movq       xmm3, qword ptr [eax]                        /* NOLINT */ \
238088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm lea        eax, [eax + 8]                                            \
238188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm punpcklbw  xmm3, xmm4                                                \
238288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm psubsw     xmm3, kYSub16                                             \
238388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm pmullw     xmm3, kYToRgb                                             \
238488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm paddsw     xmm0, xmm3           /* B += Y */                         \
238588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm paddsw     xmm1, xmm3           /* G += Y */                         \
238688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm paddsw     xmm2, xmm3           /* R += Y */                         \
238788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm psraw      xmm0, 6                                                   \
238888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm psraw      xmm1, 6                                                   \
238988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm psraw      xmm2, 6                                                   \
239088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm packuswb   xmm0, xmm0           /* B */                              \
239188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm packuswb   xmm1, xmm1           /* G */                              \
239288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    __asm packuswb   xmm2, xmm2           /* R */                              \
239388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
239488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
239588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 8 pixels, dest aligned 16.
239688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 8 UV values, mixed with 8 Y producing 8 ARGB (32 bytes).
239788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
239888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I444ToARGBRow_SSSE3(const uint8* y_buf,
239988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* u_buf,
240088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* v_buf,
240188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         uint8* dst_argb,
240288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         int width) {
240388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
240488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
240588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
240688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // Y
240788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // U
240888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 12]  // V
240988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 16]  // argb
241088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // width
241188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
241288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5           // generate 0xffffffff for alpha
241388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
241488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
241588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
241688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
241788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV444
241888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUVTORGB
241988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
242088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into ARGB
242188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm1           // BG
242288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm5           // RA
242388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
242488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm2           // BGRA first 4 pixels
242588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm2           // BGRA next 4 pixels
242688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
242788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 16], xmm1
242888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 32]
242988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
243088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
243188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
243288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
243388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
243488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
243588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
243688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
243788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
243888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 8 pixels, dest aligned 16.
243988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 4 UV values upsampled to 8 UV, mixed with 8 Y producing 8 ARGB (32 bytes).
244088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
244188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToRGB24Row_SSSE3(const uint8* y_buf,
244288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          const uint8* u_buf,
244388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          const uint8* v_buf,
244488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          uint8* dst_rgb24,
244588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          int width) {
244688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
244788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
244888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
244988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // Y
245088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // U
245188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 12]  // V
245288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 16]  // rgb24
245388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // width
245488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
245588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
245688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kShuffleMaskARGBToRGB24_0
245788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, kShuffleMaskARGBToRGB24
245888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
245988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
246088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
246188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
246288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUVTORGB
246388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
246488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into RRGB
246588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm1           // BG
246688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm2           // RR
246788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
246888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm2           // BGRR first 4 pixels
246988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm2           // BGRR next 4 pixels
247088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb     xmm0, xmm5           // Pack into first 8 and last 4 bytes.
247188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb     xmm1, xmm6           // Pack into first 12 bytes.
247288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    palignr    xmm1, xmm0, 12       // last 4 bytes of xmm0 + 12 from xmm1
247388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx], xmm0  // First 8 bytes
247488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx + 8], xmm1      // Last 16 bytes. = 24 bytes, 8 RGB pixels.
247588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 24]
247688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
247788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
247888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
247988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
248088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
248188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
248288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
248388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
248488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
248588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 8 pixels, dest aligned 16.
248688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 4 UV values upsampled to 8 UV, mixed with 8 Y producing 8 ARGB (32 bytes).
248788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
248888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToRAWRow_SSSE3(const uint8* y_buf,
248988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* u_buf,
249088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* v_buf,
249188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_raw,
249288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        int width) {
249388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
249488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
249588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
249688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // Y
249788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // U
249888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 12]  // V
249988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 16]  // raw
250088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // width
250188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
250288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
250388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kShuffleMaskARGBToRAW_0
250488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, kShuffleMaskARGBToRAW
250588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
250688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
250788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
250888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
250988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUVTORGB
251088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
251188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into RRGB
251288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm1           // BG
251388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm2           // RR
251488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
251588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm2           // BGRR first 4 pixels
251688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm2           // BGRR next 4 pixels
251788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb     xmm0, xmm5           // Pack into first 8 and last 4 bytes.
251888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb     xmm1, xmm6           // Pack into first 12 bytes.
251988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    palignr    xmm1, xmm0, 12       // last 4 bytes of xmm0 + 12 from xmm1
252088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx], xmm0  // First 8 bytes
252188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx + 8], xmm1      // Last 16 bytes. = 24 bytes, 8 RGB pixels.
252288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 24]
252388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
252488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
252588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
252688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
252788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
252888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
252988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
253088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
253188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
253288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 8 pixels, dest unaligned.
253388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 4 UV values upsampled to 8 UV, mixed with 8 Y producing 8 ARGB (32 bytes).
253488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
253588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToRGB565Row_SSSE3(const uint8* y_buf,
253688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                           const uint8* u_buf,
253788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                           const uint8* v_buf,
253888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                           uint8* rgb565_buf,
253988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                           int width) {
254088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
254188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
254288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
254388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // Y
254488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // U
254588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 12]  // V
254688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 16]  // rgb565
254788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // width
254888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
254988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
255088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5       // generate mask 0x0000001f
255188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld      xmm5, 27
255288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm6, xmm6       // generate mask 0x000007e0
255388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld      xmm6, 26
255488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld      xmm6, 5
255588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm7, xmm7       // generate mask 0xfffff800
255688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld      xmm7, 11
255788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
255888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
255988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
256088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
256188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUVTORGB
256288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
256388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into RRGB
256488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm1           // BG
256588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm2           // RR
256688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
256788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm2           // BGRR first 4 pixels
256888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm2           // BGRR next 4 pixels
256988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
257088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3b: RRGB -> RGB565
257188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm0    // B  first 4 pixels of argb
257288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, xmm0    // G
257388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld      xmm0, 8       // R
257488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld      xmm3, 3       // B
257588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld      xmm2, 5       // G
257688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrad      xmm0, 16      // R
257788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm3, xmm5    // B
257888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm2, xmm6    // G
257988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm7    // R
258088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm3, xmm2    // BG
258188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm0, xmm3    // BGR
258288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm1    // B  next 4 pixels of argb
258388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, xmm1    // G
258488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld      xmm1, 8       // R
258588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld      xmm3, 3       // B
258688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld      xmm2, 5       // G
258788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrad      xmm1, 16      // R
258888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm3, xmm5    // B
258988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm2, xmm6    // G
259088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm1, xmm7    // R
259188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm3, xmm2    // BG
259288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm1, xmm3    // BGR
259388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packssdw   xmm0, xmm1
259488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
259588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0   // store 8 pixels of RGB565
259688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
259788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
259888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
259988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
260088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
260188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
260288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
260388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
260488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
260588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 8 pixels, dest aligned 16.
260688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 4 UV values upsampled to 8 UV, mixed with 8 Y producing 8 ARGB (32 bytes).
260788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
260888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToARGBRow_SSSE3(const uint8* y_buf,
260988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* u_buf,
261088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* v_buf,
261188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         uint8* dst_argb,
261288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         int width) {
261388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
261488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
261588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
261688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // Y
261788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // U
261888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 12]  // V
261988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 16]  // argb
262088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // width
262188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
262288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5           // generate 0xffffffff for alpha
262388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
262488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
262588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
262688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
262788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
262888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUVTORGB
262988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
263088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into ARGB
263188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm1           // BG
263288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm5           // RA
263388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
263488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm2           // BGRA first 4 pixels
263588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm2           // BGRA next 4 pixels
263688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
263788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 16], xmm1
263888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 32]
263988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
264088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
264188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
264288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
264388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
264488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
264588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
264688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
264788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
264888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 8 pixels, dest aligned 16.
264988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 2 UV values upsampled to 8 UV, mixed with 8 Y producing 8 ARGB (32 bytes).
265088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Similar to I420 but duplicate UV once more.
265188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
265288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I411ToARGBRow_SSSE3(const uint8* y_buf,
265388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* u_buf,
265488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* v_buf,
265588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         uint8* dst_argb,
265688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         int width) {
265788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
265888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       ebx
265988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
266088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
266188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 12 + 4]   // Y
266288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 12 + 8]   // U
266388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 12 + 12]  // V
266488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 12 + 16]  // argb
266588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12 + 20]  // width
266688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
266788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5           // generate 0xffffffff for alpha
266888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
266988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
267088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
267188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
267288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV411  // modifies EBX
267388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUVTORGB
267488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
267588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into ARGB
267688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm1           // BG
267788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm5           // RA
267888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
267988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm2           // BGRA first 4 pixels
268088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm2           // BGRA next 4 pixels
268188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
268288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 16], xmm1
268388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 32]
268488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
268588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
268688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
268788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
268888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
268988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        ebx
269088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
269188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
269288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
269388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
269488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 8 pixels, dest aligned 16.
269588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 4 UV values upsampled to 8 UV, mixed with 8 Y producing 8 ARGB (32 bytes).
269688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
269788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid NV12ToARGBRow_SSSE3(const uint8* y_buf,
269888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* uv_buf,
269988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         uint8* dst_argb,
270088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         int width) {
270188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
270288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
270388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // Y
270488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4 + 8]   // UV
270588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 12]  // argb
270688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // width
270788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5           // generate 0xffffffff for alpha
270888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
270988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
271088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
271188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
271288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READNV12
271388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUVTORGB
271488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
271588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into ARGB
271688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm1           // BG
271788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm5           // RA
271888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
271988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm2           // BGRA first 4 pixels
272088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm2           // BGRA next 4 pixels
272188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
272288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 16], xmm1
272388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 32]
272488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
272588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
272688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
272788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
272888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
272988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
273088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
273188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
273288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 8 pixels, dest aligned 16.
273388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 4 UV values upsampled to 8 UV, mixed with 8 Y producing 8 ARGB (32 bytes).
273488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
273588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid NV21ToARGBRow_SSSE3(const uint8* y_buf,
273688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* uv_buf,
273788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         uint8* dst_argb,
273888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         int width) {
273988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
274088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
274188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // Y
274288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4 + 8]   // VU
274388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 12]  // argb
274488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // width
274588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5           // generate 0xffffffff for alpha
274688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
274788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
274888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
274988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
275088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READNV12
275188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YVUTORGB
275288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
275388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into ARGB
275488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm1           // BG
275588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm5           // RA
275688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
275788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm2           // BGRA first 4 pixels
275888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm2           // BGRA next 4 pixels
275988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
276088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 16], xmm1
276188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 32]
276288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
276388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
276488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
276588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
276688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
276788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
276888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
276988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
277088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 8 pixels, unaligned.
277188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 8 UV values, mixed with 8 Y producing 8 ARGB (32 bytes).
277288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
277388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I444ToARGBRow_Unaligned_SSSE3(const uint8* y_buf,
277488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   const uint8* u_buf,
277588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   const uint8* v_buf,
277688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   uint8* dst_argb,
277788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   int width) {
277888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
277988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
278088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
278188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // Y
278288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // U
278388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 12]  // V
278488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 16]  // argb
278588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // width
278688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
278788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5           // generate 0xffffffff for alpha
278888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
278988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
279088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
279188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
279288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV444
279388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUVTORGB
279488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
279588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into ARGB
279688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm1           // BG
279788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm5           // RA
279888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
279988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm2           // BGRA first 4 pixels
280088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm2           // BGRA next 4 pixels
280188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
280288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx + 16], xmm1
280388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 32]
280488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
280588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
280688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
280788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
280888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
280988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
281088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
281188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
281288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
281388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 8 pixels, unaligned.
281488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 4 UV values upsampled to 8 UV, mixed with 8 Y producing 8 ARGB (32 bytes).
281588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
281688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToARGBRow_Unaligned_SSSE3(const uint8* y_buf,
281788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   const uint8* u_buf,
281888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   const uint8* v_buf,
281988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   uint8* dst_argb,
282088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   int width) {
282188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
282288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
282388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
282488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // Y
282588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // U
282688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 12]  // V
282788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 16]  // argb
282888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // width
282988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
283088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5           // generate 0xffffffff for alpha
283188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
283288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
283388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
283488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
283588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
283688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUVTORGB
283788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
283888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into ARGB
283988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm1           // BG
284088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm5           // RA
284188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
284288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm2           // BGRA first 4 pixels
284388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm2           // BGRA next 4 pixels
284488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
284588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx + 16], xmm1
284688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 32]
284788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
284888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
284988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
285088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
285188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
285288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
285388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
285488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
285588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
285688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 8 pixels, unaligned.
285788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 2 UV values upsampled to 8 UV, mixed with 8 Y producing 8 ARGB (32 bytes).
285888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Similar to I420 but duplicate UV once more.
285988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
286088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I411ToARGBRow_Unaligned_SSSE3(const uint8* y_buf,
286188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   const uint8* u_buf,
286288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   const uint8* v_buf,
286388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   uint8* dst_argb,
286488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   int width) {
286588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
286688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       ebx
286788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
286888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
286988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 12 + 4]   // Y
287088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 12 + 8]   // U
287188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 12 + 12]  // V
287288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 12 + 16]  // argb
287388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12 + 20]  // width
287488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
287588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5           // generate 0xffffffff for alpha
287688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
287788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
287888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
287988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
288088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV411  // modifies EBX
288188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUVTORGB
288288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
288388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into ARGB
288488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm1           // BG
288588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm5           // RA
288688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
288788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm2           // BGRA first 4 pixels
288888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm2           // BGRA next 4 pixels
288988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
289088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx + 16], xmm1
289188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 32]
289288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
289388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
289488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
289588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
289688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
289788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        ebx
289888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
289988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
290088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
290188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
290288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 8 pixels, dest aligned 16.
290388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 4 UV values upsampled to 8 UV, mixed with 8 Y producing 8 ARGB (32 bytes).
290488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
290588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid NV12ToARGBRow_Unaligned_SSSE3(const uint8* y_buf,
290688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   const uint8* uv_buf,
290788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   uint8* dst_argb,
290888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   int width) {
290988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
291088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
291188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // Y
291288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4 + 8]   // UV
291388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 12]  // argb
291488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // width
291588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5           // generate 0xffffffff for alpha
291688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
291788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
291888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
291988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
292088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READNV12
292188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUVTORGB
292288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
292388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into ARGB
292488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm1           // BG
292588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm5           // RA
292688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
292788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm2           // BGRA first 4 pixels
292888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm2           // BGRA next 4 pixels
292988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
293088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx + 16], xmm1
293188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 32]
293288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
293388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
293488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
293588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
293688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
293788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
293888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
293988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
294088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 8 pixels, dest aligned 16.
294188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 4 UV values upsampled to 8 UV, mixed with 8 Y producing 8 ARGB (32 bytes).
294288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
294388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid NV21ToARGBRow_Unaligned_SSSE3(const uint8* y_buf,
294488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   const uint8* uv_buf,
294588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   uint8* dst_argb,
294688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   int width) {
294788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
294888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
294988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // Y
295088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4 + 8]   // VU
295188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 12]  // argb
295288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // width
295388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5           // generate 0xffffffff for alpha
295488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
295588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
295688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
295788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
295888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READNV12
295988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YVUTORGB
296088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
296188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into ARGB
296288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm1           // BG
296388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm5           // RA
296488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
296588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm2           // BGRA first 4 pixels
296688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm2           // BGRA next 4 pixels
296788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
296888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx + 16], xmm1
296988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 32]
297088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
297188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
297288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
297388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
297488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
297588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
297688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
297788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
297888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
297988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToBGRARow_SSSE3(const uint8* y_buf,
298088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* u_buf,
298188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* v_buf,
298288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         uint8* dst_bgra,
298388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         int width) {
298488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
298588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
298688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
298788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // Y
298888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // U
298988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 12]  // V
299088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 16]  // bgra
299188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // width
299288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
299388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
299488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
299588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
299688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
299788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
299888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUVTORGB
299988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
300088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into BGRA
300188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5           // generate 0xffffffff for alpha
300288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm1, xmm0           // GB
300388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm5, xmm2           // AR
300488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, xmm5
300588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm5, xmm1           // BGRA first 4 pixels
300688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm0, xmm1           // BGRA next 4 pixels
300788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm5
300888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 16], xmm0
300988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 32]
301088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
301188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
301288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
301388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
301488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
301588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
301688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
301788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
301888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
301988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
302088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToBGRARow_Unaligned_SSSE3(const uint8* y_buf,
302188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   const uint8* u_buf,
302288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   const uint8* v_buf,
302388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   uint8* dst_bgra,
302488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   int width) {
302588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
302688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
302788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
302888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // Y
302988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // U
303088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 12]  // V
303188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 16]  // bgra
303288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // width
303388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
303488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
303588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
303688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
303788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
303888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
303988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUVTORGB
304088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
304188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into BGRA
304288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5           // generate 0xffffffff for alpha
304388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm1, xmm0           // GB
304488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm5, xmm2           // AR
304588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, xmm5
304688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm5, xmm1           // BGRA first 4 pixels
304788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm0, xmm1           // BGRA next 4 pixels
304888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm5
304988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx + 16], xmm0
305088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 32]
305188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
305288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
305388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
305488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
305588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
305688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
305788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
305888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
305988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
306088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
306188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToABGRRow_SSSE3(const uint8* y_buf,
306288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* u_buf,
306388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* v_buf,
306488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         uint8* dst_abgr,
306588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         int width) {
306688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
306788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
306888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
306988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // Y
307088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // U
307188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 12]  // V
307288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 16]  // abgr
307388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // width
307488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
307588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5           // generate 0xffffffff for alpha
307688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
307788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
307888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
307988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
308088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
308188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUVTORGB
308288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
308388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into ARGB
308488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm1           // RG
308588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm5           // BA
308688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm2
308788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm2, xmm0           // RGBA first 4 pixels
308888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm0           // RGBA next 4 pixels
308988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm2
309088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 16], xmm1
309188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 32]
309288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
309388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
309488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
309588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
309688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
309788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
309888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
309988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
310088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
310188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
310288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToABGRRow_Unaligned_SSSE3(const uint8* y_buf,
310388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   const uint8* u_buf,
310488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   const uint8* v_buf,
310588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   uint8* dst_abgr,
310688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   int width) {
310788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
310888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
310988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
311088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // Y
311188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // U
311288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 12]  // V
311388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 16]  // abgr
311488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // width
311588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
311688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5           // generate 0xffffffff for alpha
311788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
311888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
311988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
312088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
312188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
312288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUVTORGB
312388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
312488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into ARGB
312588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm1           // RG
312688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm5           // BA
312788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm2
312888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm2, xmm0           // RGBA first 4 pixels
312988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm0           // RGBA next 4 pixels
313088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm2
313188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx + 16], xmm1
313288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 32]
313388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
313488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
313588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
313688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
313788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
313888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
313988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
314088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
314188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
314288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
314388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToRGBARow_SSSE3(const uint8* y_buf,
314488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* u_buf,
314588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* v_buf,
314688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         uint8* dst_rgba,
314788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         int width) {
314888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
314988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
315088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
315188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // Y
315288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // U
315388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 12]  // V
315488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 16]  // rgba
315588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // width
315688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
315788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
315888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
315988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
316088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
316188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
316288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUVTORGB
316388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
316488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into RGBA
316588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5           // generate 0xffffffff for alpha
316688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm1, xmm2           // GR
316788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm5, xmm0           // AB
316888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, xmm5
316988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm5, xmm1           // RGBA first 4 pixels
317088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm0, xmm1           // RGBA next 4 pixels
317188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm5
317288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 16], xmm0
317388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 32]
317488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
317588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
317688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
317788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
317888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
317988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
318088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
318188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
318288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
318388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
318488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToRGBARow_Unaligned_SSSE3(const uint8* y_buf,
318588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   const uint8* u_buf,
318688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   const uint8* v_buf,
318788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   uint8* dst_rgba,
318888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   int width) {
318988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
319088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
319188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
319288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // Y
319388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // U
319488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 12]  // V
319588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 16]  // rgba
319688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // width
319788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
319888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
319988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
320088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
320188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
320288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
320388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUVTORGB
320488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
320588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 3: Weave into RGBA
320688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5           // generate 0xffffffff for alpha
320788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm1, xmm2           // GR
320888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm5, xmm0           // AB
320988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, xmm5
321088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm5, xmm1           // RGBA first 4 pixels
321188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm0, xmm1           // RGBA next 4 pixels
321288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm5
321388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx + 16], xmm0
321488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 32]
321588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
321688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
321788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
321888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
321988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
322088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
322188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
322288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
322388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
322488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_I422TOARGBROW_SSSE3
322588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
322688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_YTOARGBROW_SSE2
322788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
322888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid YToARGBRow_SSE2(const uint8* y_buf,
322988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     uint8* rgb_buf,
323088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     int width) {
323188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
323288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm5, xmm5
323388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm4, xmm4           // generate mask 0xff000000
323488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld      xmm4, 24
323588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, 0x00100010
323688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm3, eax
323788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm3, xmm3, 0
323888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, 0x004a004a       // 74
323988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm2, eax
324088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm2, xmm2,0
324188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]       // Y
324288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]       // rgb
324388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]      // width
324488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
324588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
324688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
324788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 1: Scale Y contribution to 8 G values. G = (y - 16) * 1.164
324888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm0, qword ptr [eax]
324988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 8]
325088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm5           // 0.Y
325188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubusw    xmm0, xmm3
325288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmullw     xmm0, xmm2
325388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 6
325488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm0           // G
325588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
325688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Step 2: Weave into ARGB
325788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm0           // GG
325888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
325988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm0           // BGRA first 4 pixels
326088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm1           // BGRA next 4 pixels
326188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm0, xmm4
326288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm1, xmm4
326388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
326488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 16], xmm1
326588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx,  [edx + 32]
326688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
326788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
326888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
326988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
327088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
327188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
327288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_YTOARGBROW_SSE2
327388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
327488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_MIRRORROW_SSSE3
327588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Shuffle table for reversing the bytes.
327688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const uvec8 kShuffleMirror = {
327788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  15u, 14u, 13u, 12u, 11u, 10u, 9u, 8u, 7u, 6u, 5u, 4u, 3u, 2u, 1u, 0u
327888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
327988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
328088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
328188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid MirrorRow_SSSE3(const uint8* src, uint8* dst, int width) {
328288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
328388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, [esp + 4]   // src
328488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       edx, [esp + 8]   // dst
328588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       ecx, [esp + 12]  // width
328688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm5, kShuffleMirror
328788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       eax, [eax - 16]
328888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
328988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
329088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
329188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm0, [eax + ecx]
329288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb    xmm0, xmm5
329388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       ecx, 16
329488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    [edx], xmm0
329588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       edx, [edx + 16]
329688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg        convertloop
329788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
329888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
329988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
330088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_MIRRORROW_SSSE3
330188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
330288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_MIRRORROW_AVX2
330388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Shuffle table for reversing the bytes.
330488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const ulvec8 kShuffleMirror_AVX2 = {
330588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  15u, 14u, 13u, 12u, 11u, 10u, 9u, 8u, 7u, 6u, 5u, 4u, 3u, 2u, 1u, 0u,
330688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  15u, 14u, 13u, 12u, 11u, 10u, 9u, 8u, 7u, 6u, 5u, 4u, 3u, 2u, 1u, 0u
330788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
330888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
330988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
331088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid MirrorRow_AVX2(const uint8* src, uint8* dst, int width) {
331188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
331288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, [esp + 4]   // src
331388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       edx, [esp + 8]   // dst
331488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       ecx, [esp + 12]  // width
331588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqa   ymm5, kShuffleMirror_AVX2
331688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       eax, [eax - 32]
331788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
331888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
331988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
332088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu   ymm0, [eax + ecx]
332188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpshufb   ymm0, ymm0, ymm5
332288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq    ymm0, ymm0, 0x4e  // swap high and low halfs
332388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       ecx, 32
332488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu   [edx], ymm0
332588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       edx, [edx + 32]
332688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg        convertloop
332788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
332888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
332988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
333088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
333188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_MIRRORROW_AVX2
333288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
333388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_MIRRORROW_SSE2
333488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// SSE2 version has movdqu so it can be used on unaligned buffers when SSSE3
333588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// version can not.
333688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
333788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid MirrorRow_SSE2(const uint8* src, uint8* dst, int width) {
333888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
333988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, [esp + 4]   // src
334088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       edx, [esp + 8]   // dst
334188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       ecx, [esp + 12]  // width
334288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       eax, [eax - 16]
334388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
334488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
334588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
334688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    xmm0, [eax + ecx]
334788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm1, xmm0        // swap bytes
334888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psllw     xmm0, 8
334988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw     xmm1, 8
335088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por       xmm0, xmm1
335188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw   xmm0, xmm0, 0x1b  // swap words
335288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufhw   xmm0, xmm0, 0x1b
335388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd    xmm0, xmm0, 0x4e  // swap qwords
335488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       ecx, 16
335588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu    [edx], xmm0
335688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       edx, [edx + 16]
335788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg        convertloop
335888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
335988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
336088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
336188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_MIRRORROW_SSE2
336288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
336388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_MIRRORROW_UV_SSSE3
336488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Shuffle table for reversing the bytes of UV channels.
336588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const uvec8 kShuffleMirrorUV = {
336688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  14u, 12u, 10u, 8u, 6u, 4u, 2u, 0u, 15u, 13u, 11u, 9u, 7u, 5u, 3u, 1u
336788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
336888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
336988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
337088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid MirrorUVRow_SSSE3(const uint8* src, uint8* dst_u, uint8* dst_v,
337188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                       int width) {
337288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
337388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push      edi
337488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, [esp + 4 + 4]   // src
337588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       edx, [esp + 4 + 8]   // dst_u
337688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       edi, [esp + 4 + 12]  // dst_v
337788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       ecx, [esp + 4 + 16]  // width
337888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm1, kShuffleMirrorUV
337988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       eax, [eax + ecx * 2 - 16]
338088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       edi, edx
338188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
338288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
338388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
338488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm0, [eax]
338588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       eax, [eax - 16]
338688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb    xmm0, xmm1
338788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       ecx, 8
338888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movlpd    qword ptr [edx], xmm0
338988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movhpd    qword ptr [edx + edi], xmm0
339088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       edx, [edx + 8]
339188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg        convertloop
339288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
339388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop       edi
339488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
339588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
339688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
339788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_MIRRORROW_UV_SSSE3
339888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
339988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBMIRRORROW_SSSE3
340088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Shuffle table for reversing the bytes.
340188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const uvec8 kARGBShuffleMirror = {
340288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  12u, 13u, 14u, 15u, 8u, 9u, 10u, 11u, 4u, 5u, 6u, 7u, 0u, 1u, 2u, 3u
340388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
340488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
340588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
340688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBMirrorRow_SSSE3(const uint8* src, uint8* dst, int width) {
340788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
340888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, [esp + 4]   // src
340988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       edx, [esp + 8]   // dst
341088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       ecx, [esp + 12]  // width
341188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       eax, [eax - 16 + ecx * 4]  // last 4 pixels.
341288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm5, kARGBShuffleMirror
341388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
341488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
341588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
341688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    xmm0, [eax]
341788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       eax, [eax - 16]
341888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb    xmm0, xmm5
341988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       ecx, 4
342088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa    [edx], xmm0
342188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       edx, [edx + 16]
342288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg        convertloop
342388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
342488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
342588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
342688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBMIRRORROW_SSSE3
342788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
342888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBMIRRORROW_AVX2
342988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Shuffle table for reversing the bytes.
343088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const ulvec32 kARGBShuffleMirror_AVX2 = {
343188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  7u, 6u, 5u, 4u, 3u, 2u, 1u, 0u
343288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
343388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
343488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
343588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBMirrorRow_AVX2(const uint8* src, uint8* dst, int width) {
343688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
343788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       eax, [esp + 4]   // src
343888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       edx, [esp + 8]   // dst
343988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov       ecx, [esp + 12]  // width
344088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       eax, [eax - 32]
344188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqa   ymm5, kARGBShuffleMirror_AVX2
344288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
344388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
344488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
344588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermd    ymm0, ymm5, [eax + ecx * 4]  // permute dword order
344688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub       ecx, 8
344788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu   [edx], ymm0
344888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea       edx, [edx + 32]
344988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg        convertloop
345088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
345188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
345288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
345388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
345488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBMIRRORROW_AVX2
345588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
345688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_SPLITUVROW_SSE2
345788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
345888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid SplitUVRow_SSE2(const uint8* src_uv, uint8* dst_u, uint8* dst_v, int pix) {
345988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
346088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
346188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]    // src_uv
346288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 8]    // dst_u
346388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 4 + 12]   // dst_v
346488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]   // pix
346588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5            // generate mask 0x00ff00ff
346688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm5, 8
346788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx
346888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
346988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
347088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
347188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
347288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
347388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 32]
347488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, xmm0
347588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm1
347688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm5   // even bytes
347788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm1, xmm5
347888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
347988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm2, 8      // odd bytes
348088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm3, 8
348188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm2, xmm3
348288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
348388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + edi], xmm2
348488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
348588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
348688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
348788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
348888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
348988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
349088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
349188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
349288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
349388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
349488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid SplitUVRow_Unaligned_SSE2(const uint8* src_uv, uint8* dst_u, uint8* dst_v,
349588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                               int pix) {
349688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
349788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
349888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]    // src_uv
349988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 8]    // dst_u
350088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 4 + 12]   // dst_v
350188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]   // pix
350288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5            // generate mask 0x00ff00ff
350388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm5, 8
350488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx
350588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
350688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
350788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
350888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
350988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
351088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 32]
351188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, xmm0
351288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm1
351388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm5   // even bytes
351488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm1, xmm5
351588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
351688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm2, 8      // odd bytes
351788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm3, 8
351888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm2, xmm3
351988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
352088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx + edi], xmm2
352188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
352288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
352388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
352488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
352588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
352688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
352788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
352888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
352988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_SPLITUVROW_SSE2
353088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
353188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_SPLITUVROW_AVX2
353288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
353388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid SplitUVRow_AVX2(const uint8* src_uv, uint8* dst_u, uint8* dst_v, int pix) {
353488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
353588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
353688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]    // src_uv
353788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 8]    // dst_u
353888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 4 + 12]   // dst_v
353988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]   // pix
354088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpcmpeqb   ymm5, ymm5, ymm5      // generate mask 0x00ff00ff
354188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm5, ymm5, 8
354288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx
354388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
354488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
354588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
354688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm0, [eax]
354788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm1, [eax + 32]
354888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
354988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm2, ymm0, 8      // odd bytes
355088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm3, ymm1, 8
355188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpand      ymm0, ymm0, ymm5   // even bytes
355288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpand      ymm1, ymm1, ymm5
355388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm0, ymm0, ymm1
355488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm2, ymm2, ymm3
355588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm0, ymm0, 0xd8
355688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm2, ymm2, 0xd8
355788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [edx], ymm0
355888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [edx + edi], ymm2
355988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 32]
356088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 32
356188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
356288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
356388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
356488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
356588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
356688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
356788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
356888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_SPLITUVROW_AVX2
356988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
357088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_MERGEUVROW_SSE2
357188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
357288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid MergeUVRow_SSE2(const uint8* src_u, const uint8* src_v, uint8* dst_uv,
357388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     int width) {
357488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
357588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
357688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]    // src_u
357788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 8]    // src_v
357888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 4 + 12]   // dst_uv
357988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]   // width
358088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edx, eax
358188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
358288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
358388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
358488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]      // read 16 U's
358588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + edx]  // and 16 V's
358688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 16]
358788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, xmm0
358888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm1       // first 8 UV pairs
358988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm2, xmm1       // next 8 UV pairs
359088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edi], xmm0
359188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edi + 16], xmm2
359288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edi, [edi + 32]
359388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
359488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
359588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
359688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
359788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
359888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
359988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
360088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
360188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
360288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid MergeUVRow_Unaligned_SSE2(const uint8* src_u, const uint8* src_v,
360388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                               uint8* dst_uv, int width) {
360488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
360588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
360688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]    // src_u
360788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 8]    // src_v
360888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 4 + 12]   // dst_uv
360988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]   // width
361088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edx, eax
361188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
361288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
361388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
361488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]      // read 16 U's
361588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + edx]  // and 16 V's
361688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 16]
361788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, xmm0
361888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm1       // first 8 UV pairs
361988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm2, xmm1       // next 8 UV pairs
362088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edi], xmm0
362188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edi + 16], xmm2
362288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edi, [edi + 32]
362388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
362488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
362588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
362688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
362788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
362888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
362988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
363088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  //  HAS_MERGEUVROW_SSE2
363188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
363288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_MERGEUVROW_AVX2
363388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
363488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid MergeUVRow_AVX2(const uint8* src_u, const uint8* src_v, uint8* dst_uv,
363588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     int width) {
363688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
363788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
363888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]    // src_u
363988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 8]    // src_v
364088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 4 + 12]   // dst_uv
364188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]   // width
364288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edx, eax
364388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
364488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
364588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
364688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm0, [eax]           // read 32 U's
364788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm1, [eax + edx]     // and 32 V's
364888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 32]
364988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpcklbw ymm2, ymm0, ymm1      // low 16 UV pairs. mutated qqword 0,2
365088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpckhbw ymm0, ymm0, ymm1      // high 16 UV pairs. mutated qqword 1,3
365188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vperm2i128 ymm1, ymm2, ymm0, 0x20  // low 128 of ymm2 and low 128 of ymm0
365288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vperm2i128 ymm2, ymm2, ymm0, 0x31  // high 128 of ymm2 and high 128 of ymm0
365388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [edi], ymm1
365488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [edi + 32], ymm2
365588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edi, [edi + 64]
365688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 32
365788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
365888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
365988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
366088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
366188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
366288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
366388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
366488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  //  HAS_MERGEUVROW_AVX2
366588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
366688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_COPYROW_SSE2
366788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// CopyRow copys 'count' bytes using a 16 byte load/store, 32 bytes at time.
366888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
366988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid CopyRow_SSE2(const uint8* src, uint8* dst, int count) {
367088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
367188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   // src
367288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   // dst
367388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  // count
367488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
367588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
367688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
367788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
367888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
367988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 32]
368088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
368188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 16], xmm1
368288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 32]
368388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 32
368488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
368588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
368688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
368788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
368888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_COPYROW_SSE2
368988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
369088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Unaligned Multiple of 1.
369188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
369288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid CopyRow_ERMS(const uint8* src, uint8* dst, int count) {
369388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
369488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, esi
369588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, edi
369688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4]   // src
369788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8]   // dst
369888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  // count
369988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    rep movsb
370088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, edx
370188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, eax
370288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
370388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
370488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
370588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
370688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_COPYROW_X86
370788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
370888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid CopyRow_X86(const uint8* src, uint8* dst, int count) {
370988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
371088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, esi
371188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, edi
371288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4]   // src
371388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8]   // dst
371488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  // count
371588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shr        ecx, 2
371688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    rep movsd
371788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, edx
371888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, eax
371988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
372088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
372188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
372288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_COPYROW_X86
372388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
372488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBCOPYALPHAROW_SSE2
372588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// width in pixels
372688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
372788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBCopyAlphaRow_SSE2(const uint8* src, uint8* dst, int width) {
372888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
372988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   // src
373088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   // dst
373188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  // count
373288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm0, xmm0       // generate mask 0xff000000
373388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld      xmm0, 24
373488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm1, xmm1       // generate mask 0x00ffffff
373588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld      xmm1, 8
373688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
373788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
373888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
373988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax]
374088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax + 16]
374188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 32]
374288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, [edx]
374388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, [edx + 16]
374488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm2, xmm0
374588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm3, xmm0
374688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm4, xmm1
374788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm5, xmm1
374888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm2, xmm4
374988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm3, xmm5
375088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm2
375188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 16], xmm3
375288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 32]
375388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
375488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
375588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
375688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
375788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
375888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
375988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBCOPYALPHAROW_SSE2
376088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
376188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBCOPYALPHAROW_AVX2
376288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// width in pixels
376388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
376488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBCopyAlphaRow_AVX2(const uint8* src, uint8* dst, int width) {
376588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
376688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   // src
376788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   // dst
376888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  // count
376988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpcmpeqb   ymm0, ymm0, ymm0
377088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrld     ymm0, ymm0, 8    // generate mask 0x00ffffff
377188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
377288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
377388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
377488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm1, [eax]
377588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm2, [eax + 32]
377688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 64]
377788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpblendvb  ymm1, ymm1, [edx], ymm0
377888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpblendvb  ymm2, ymm2, [edx + 32], ymm0
377988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [edx], ymm1
378088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [edx + 32], ymm2
378188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 64]
378288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
378388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
378488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
378588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
378688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
378788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
378888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
378988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBCOPYALPHAROW_AVX2
379088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
379188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBCOPYYTOALPHAROW_SSE2
379288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// width in pixels
379388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
379488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBCopyYToAlphaRow_SSE2(const uint8* src, uint8* dst, int width) {
379588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
379688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   // src
379788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   // dst
379888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  // count
379988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm0, xmm0       // generate mask 0xff000000
380088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld      xmm0, 24
380188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm1, xmm1       // generate mask 0x00ffffff
380288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld      xmm1, 8
380388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
380488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
380588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
380688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm2, qword ptr [eax]  // 8 Y's
380788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 8]
380888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm2
380988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm3, xmm2
381088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm2, xmm2
381188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, [edx]
381288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, [edx + 16]
381388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm2, xmm0
381488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm3, xmm0
381588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm4, xmm1
381688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm5, xmm1
381788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm2, xmm4
381888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm3, xmm5
381988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm2
382088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 16], xmm3
382188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 32]
382288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
382388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
382488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
382588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
382688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
382788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
382888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBCOPYYTOALPHAROW_SSE2
382988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
383088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBCOPYYTOALPHAROW_AVX2
383188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// width in pixels
383288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
383388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBCopyYToAlphaRow_AVX2(const uint8* src, uint8* dst, int width) {
383488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
383588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   // src
383688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   // dst
383788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  // count
383888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpcmpeqb   ymm0, ymm0, ymm0
383988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrld     ymm0, ymm0, 8    // generate mask 0x00ffffff
384088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
384188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
384288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
384388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmovzxbd  ymm1, qword ptr [eax]
384488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmovzxbd  ymm2, qword ptr [eax + 8]
384588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
384688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpslld     ymm1, ymm1, 24
384788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpslld     ymm2, ymm2, 24
384888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpblendvb  ymm1, ymm1, [edx], ymm0
384988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpblendvb  ymm2, ymm2, [edx + 32], ymm0
385088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [edx], ymm1
385188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [edx + 32], ymm2
385288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 64]
385388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
385488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
385588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
385688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
385788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
385888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
385988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
386088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBCOPYYTOALPHAROW_AVX2
386188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
386288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_SETROW_X86
386388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// SetRow8 writes 'count' bytes using a 32 bit value repeated.
386488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
386588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid SetRow_X86(uint8* dst, uint32 v32, int count) {
386688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
386788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, edi
386888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 4]   // dst
386988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8]   // v32
387088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  // count
387188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shr        ecx, 2
387288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    rep stosd
387388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, edx
387488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
387588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
387688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
387788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
387888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// SetRow32 writes 'count' words using a 32 bit value repeated.
387988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
388088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBSetRows_X86(uint8* dst, uint32 v32, int width,
388188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                   int dst_stride, int height) {
388288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
388388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
388488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
388588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       ebp
388688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 12 + 4]   // dst
388788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 12 + 8]   // v32
388888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ebp, [esp + 12 + 12]  // width
388988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 12 + 16]  // dst_stride
389088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 12 + 20]  // height
389188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        ecx, [ebp * 4]
389288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edx, ecx             // stride - width * 4
389388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
389488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
389588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
389688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, ebp
389788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    rep stosd
389888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    add        edi, edx
389988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        esi, 1
390088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
390188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
390288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        ebp
390388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
390488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
390588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
390688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
390788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
390888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_SETROW_X86
390988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
391088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_YUY2TOYROW_AVX2
391188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
391288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid YUY2ToYRow_AVX2(const uint8* src_yuy2,
391388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     uint8* dst_y, int pix) {
391488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
391588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]    // src_yuy2
391688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]    // dst_y
391788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]   // pix
391888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpcmpeqb   ymm5, ymm5, ymm5  // generate mask 0x00ff00ff
391988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm5, ymm5, 8
392088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
392188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
392288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
392388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm0, [eax]
392488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm1, [eax + 32]
392588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
392688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpand      ymm0, ymm0, ymm5   // even bytes are Y
392788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpand      ymm1, ymm1, ymm5
392888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm0, ymm0, ymm1   // mutates.
392988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm0, ymm0, 0xd8
393088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 32
393188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [edx], ymm0
393288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 32]
393388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
393488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
393588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
393688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
393788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
393888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
393988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
394088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid YUY2ToUVRow_AVX2(const uint8* src_yuy2, int stride_yuy2,
394188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                      uint8* dst_u, uint8* dst_v, int pix) {
394288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
394388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
394488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
394588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]    // src_yuy2
394688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]    // stride_yuy2
394788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]   // dst_u
394888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 16]   // dst_v
394988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]   // pix
395088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpcmpeqb   ymm5, ymm5, ymm5      // generate mask 0x00ff00ff
395188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm5, ymm5, 8
395288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx
395388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
395488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
395588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
395688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm0, [eax]
395788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm1, [eax + 32]
395888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpavgb     ymm0, ymm0, [eax + esi]
395988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpavgb     ymm1, ymm1, [eax + esi + 32]
396088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
396188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm0, ymm0, 8      // YUYV -> UVUV
396288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm1, ymm1, 8
396388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm0, ymm0, ymm1   // mutates.
396488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm0, ymm0, 0xd8
396588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpand      ymm1, ymm0, ymm5  // U
396688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm0, ymm0, 8     // V
396788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm1, ymm1, ymm1  // mutates.
396888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm0, ymm0, ymm0  // mutates.
396988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm1, ymm1, 0xd8
397088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm0, ymm0, 0xd8
397188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vextractf128 [edx], ymm1, 0  // U
397288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vextractf128 [edx + edi], ymm0, 0 // V
397388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
397488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 32
397588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
397688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
397788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
397888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
397988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
398088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
398188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
398288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
398388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
398488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
398588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid YUY2ToUV422Row_AVX2(const uint8* src_yuy2,
398688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         uint8* dst_u, uint8* dst_v, int pix) {
398788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
398888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
398988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]    // src_yuy2
399088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 8]    // dst_u
399188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 4 + 12]   // dst_v
399288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]   // pix
399388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpcmpeqb   ymm5, ymm5, ymm5      // generate mask 0x00ff00ff
399488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm5, ymm5, 8
399588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx
399688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
399788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
399888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
399988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm0, [eax]
400088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm1, [eax + 32]
400188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
400288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm0, ymm0, 8      // YUYV -> UVUV
400388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm1, ymm1, 8
400488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm0, ymm0, ymm1   // mutates.
400588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm0, ymm0, 0xd8
400688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpand      ymm1, ymm0, ymm5  // U
400788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm0, ymm0, 8     // V
400888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm1, ymm1, ymm1  // mutates.
400988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm0, ymm0, ymm0  // mutates.
401088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm1, ymm1, 0xd8
401188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm0, ymm0, 0xd8
401288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vextractf128 [edx], ymm1, 0  // U
401388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vextractf128 [edx + edi], ymm0, 0 // V
401488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
401588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 32
401688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
401788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
401888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
401988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
402088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
402188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
402288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
402388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
402488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
402588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid UYVYToYRow_AVX2(const uint8* src_uyvy,
402688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     uint8* dst_y, int pix) {
402788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
402888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]    // src_uyvy
402988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]    // dst_y
403088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]   // pix
403188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
403288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
403388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
403488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm0, [eax]
403588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm1, [eax + 32]
403688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
403788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm0, ymm0, 8      // odd bytes are Y
403888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm1, ymm1, 8
403988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm0, ymm0, ymm1   // mutates.
404088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm0, ymm0, 0xd8
404188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 32
404288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [edx], ymm0
404388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 32]
404488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
404588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
404688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
404788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
404888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
404988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
405088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
405188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid UYVYToUVRow_AVX2(const uint8* src_uyvy, int stride_uyvy,
405288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                      uint8* dst_u, uint8* dst_v, int pix) {
405388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
405488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
405588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
405688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]    // src_yuy2
405788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]    // stride_yuy2
405888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]   // dst_u
405988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 16]   // dst_v
406088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]   // pix
406188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpcmpeqb   ymm5, ymm5, ymm5      // generate mask 0x00ff00ff
406288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm5, ymm5, 8
406388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx
406488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
406588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
406688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
406788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm0, [eax]
406888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm1, [eax + 32]
406988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpavgb     ymm0, ymm0, [eax + esi]
407088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpavgb     ymm1, ymm1, [eax + esi + 32]
407188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
407288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpand      ymm0, ymm0, ymm5   // UYVY -> UVUV
407388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpand      ymm1, ymm1, ymm5
407488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm0, ymm0, ymm1   // mutates.
407588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm0, ymm0, 0xd8
407688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpand      ymm1, ymm0, ymm5  // U
407788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm0, ymm0, 8     // V
407888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm1, ymm1, ymm1  // mutates.
407988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm0, ymm0, ymm0  // mutates.
408088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm1, ymm1, 0xd8
408188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm0, ymm0, 0xd8
408288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vextractf128 [edx], ymm1, 0  // U
408388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vextractf128 [edx + edi], ymm0, 0 // V
408488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
408588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 32
408688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
408788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
408888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
408988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
409088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
409188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
409288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
409388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
409488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
409588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
409688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid UYVYToUV422Row_AVX2(const uint8* src_uyvy,
409788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         uint8* dst_u, uint8* dst_v, int pix) {
409888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
409988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
410088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]    // src_yuy2
410188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 8]    // dst_u
410288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 4 + 12]   // dst_v
410388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]   // pix
410488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpcmpeqb   ymm5, ymm5, ymm5      // generate mask 0x00ff00ff
410588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm5, ymm5, 8
410688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx
410788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
410888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
410988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
411088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm0, [eax]
411188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm1, [eax + 32]
411288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 64]
411388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpand      ymm0, ymm0, ymm5   // UYVY -> UVUV
411488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpand      ymm1, ymm1, ymm5
411588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm0, ymm0, ymm1   // mutates.
411688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm0, ymm0, 0xd8
411788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpand      ymm1, ymm0, ymm5  // U
411888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm0, ymm0, 8     // V
411988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm1, ymm1, ymm1  // mutates.
412088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm0, ymm0, ymm0  // mutates.
412188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm1, ymm1, 0xd8
412288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq     ymm0, ymm0, 0xd8
412388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vextractf128 [edx], ymm1, 0  // U
412488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vextractf128 [edx + edi], ymm0, 0 // V
412588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
412688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 32
412788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
412888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
412988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
413088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
413188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
413288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
413388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
413488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_YUY2TOYROW_AVX2
413588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
413688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_YUY2TOYROW_SSE2
413788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
413888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid YUY2ToYRow_SSE2(const uint8* src_yuy2,
413988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     uint8* dst_y, int pix) {
414088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
414188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]    // src_yuy2
414288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]    // dst_y
414388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]   // pix
414488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5        // generate mask 0x00ff00ff
414588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm5, 8
414688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
414788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
414888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
414988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
415088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
415188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 32]
415288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm5   // even bytes are Y
415388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm1, xmm5
415488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
415588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
415688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
415788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
415888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
415988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
416088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
416188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
416288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
416388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
416488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid YUY2ToUVRow_SSE2(const uint8* src_yuy2, int stride_yuy2,
416588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                      uint8* dst_u, uint8* dst_v, int pix) {
416688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
416788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
416888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
416988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]    // src_yuy2
417088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]    // stride_yuy2
417188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]   // dst_u
417288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 16]   // dst_v
417388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]   // pix
417488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5            // generate mask 0x00ff00ff
417588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm5, 8
417688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx
417788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
417888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
417988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
418088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
418188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
418288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax + esi]
418388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax + esi + 16]
418488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 32]
418588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm2
418688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm1, xmm3
418788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 8      // YUYV -> UVUV
418888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8
418988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
419088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
419188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm5  // U
419288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm0
419388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8     // V
419488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm1, xmm1
419588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx], xmm0
419688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx + edi], xmm1
419788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
419888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
419988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
420088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
420188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
420288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
420388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
420488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
420588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
420688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
420788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
420888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid YUY2ToUV422Row_SSE2(const uint8* src_yuy2,
420988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         uint8* dst_u, uint8* dst_v, int pix) {
421088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
421188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
421288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]    // src_yuy2
421388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 8]    // dst_u
421488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 4 + 12]   // dst_v
421588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]   // pix
421688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5            // generate mask 0x00ff00ff
421788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm5, 8
421888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx
421988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
422088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
422188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
422288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
422388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
422488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 32]
422588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 8      // YUYV -> UVUV
422688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8
422788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
422888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
422988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm5  // U
423088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm0
423188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8     // V
423288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm1, xmm1
423388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx], xmm0
423488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx + edi], xmm1
423588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
423688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
423788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
423888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
423988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
424088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
424188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
424288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
424388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
424488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
424588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid YUY2ToYRow_Unaligned_SSE2(const uint8* src_yuy2,
424688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                               uint8* dst_y, int pix) {
424788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
424888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]    // src_yuy2
424988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]    // dst_y
425088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]   // pix
425188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5        // generate mask 0x00ff00ff
425288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm5, 8
425388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
425488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
425588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
425688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
425788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
425888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 32]
425988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm5   // even bytes are Y
426088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm1, xmm5
426188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
426288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
426388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
426488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
426588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
426688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
426788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
426888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
426988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
427088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
427188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid YUY2ToUVRow_Unaligned_SSE2(const uint8* src_yuy2, int stride_yuy2,
427288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                uint8* dst_u, uint8* dst_v, int pix) {
427388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
427488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
427588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
427688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]    // src_yuy2
427788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]    // stride_yuy2
427888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]   // dst_u
427988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 16]   // dst_v
428088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]   // pix
428188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5            // generate mask 0x00ff00ff
428288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm5, 8
428388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx
428488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
428588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
428688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
428788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
428888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
428988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [eax + esi]
429088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm3, [eax + esi + 16]
429188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 32]
429288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm2
429388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm1, xmm3
429488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 8      // YUYV -> UVUV
429588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8
429688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
429788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
429888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm5  // U
429988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm0
430088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8     // V
430188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm1, xmm1
430288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx], xmm0
430388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx + edi], xmm1
430488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
430588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
430688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
430788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
430888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
430988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
431088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
431188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
431288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
431388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
431488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
431588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid YUY2ToUV422Row_Unaligned_SSE2(const uint8* src_yuy2,
431688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   uint8* dst_u, uint8* dst_v, int pix) {
431788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
431888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
431988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]    // src_yuy2
432088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 8]    // dst_u
432188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 4 + 12]   // dst_v
432288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]   // pix
432388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5            // generate mask 0x00ff00ff
432488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm5, 8
432588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx
432688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
432788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
432888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
432988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
433088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
433188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 32]
433288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 8      // YUYV -> UVUV
433388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8
433488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
433588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
433688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm5  // U
433788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm0
433888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8     // V
433988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm1, xmm1
434088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx], xmm0
434188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx + edi], xmm1
434288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
434388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
434488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
434588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
434688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
434788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
434888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
434988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
435088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
435188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
435288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid UYVYToYRow_SSE2(const uint8* src_uyvy,
435388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     uint8* dst_y, int pix) {
435488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
435588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]    // src_uyvy
435688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]    // dst_y
435788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]   // pix
435888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
435988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
436088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
436188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
436288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
436388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 32]
436488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 8    // odd bytes are Y
436588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8
436688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
436788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
436888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
436988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
437088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
437188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
437288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
437388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
437488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
437588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
437688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid UYVYToUVRow_SSE2(const uint8* src_uyvy, int stride_uyvy,
437788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                      uint8* dst_u, uint8* dst_v, int pix) {
437888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
437988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
438088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
438188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]    // src_yuy2
438288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]    // stride_yuy2
438388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]   // dst_u
438488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 16]   // dst_v
438588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]   // pix
438688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5            // generate mask 0x00ff00ff
438788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm5, 8
438888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx
438988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
439088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
439188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
439288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
439388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
439488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax + esi]
439588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax + esi + 16]
439688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 32]
439788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm2
439888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm1, xmm3
439988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm5   // UYVY -> UVUV
440088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm1, xmm5
440188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
440288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
440388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm5  // U
440488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm0
440588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8     // V
440688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm1, xmm1
440788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx], xmm0
440888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx + edi], xmm1
440988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
441088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
441188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
441288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
441388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
441488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
441588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
441688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
441788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
441888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
441988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
442088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid UYVYToUV422Row_SSE2(const uint8* src_uyvy,
442188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         uint8* dst_u, uint8* dst_v, int pix) {
442288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
442388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
442488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]    // src_yuy2
442588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 8]    // dst_u
442688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 4 + 12]   // dst_v
442788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]   // pix
442888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5            // generate mask 0x00ff00ff
442988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm5, 8
443088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx
443188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
443288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
443388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
443488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
443588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
443688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 32]
443788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm5   // UYVY -> UVUV
443888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm1, xmm5
443988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
444088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
444188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm5  // U
444288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm0
444388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8     // V
444488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm1, xmm1
444588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx], xmm0
444688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx + edi], xmm1
444788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
444888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
444988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
445088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
445188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
445288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
445388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
445488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
445588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
445688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
445788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid UYVYToYRow_Unaligned_SSE2(const uint8* src_uyvy,
445888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                               uint8* dst_y, int pix) {
445988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
446088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]    // src_uyvy
446188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]    // dst_y
446288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]   // pix
446388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
446488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
446588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
446688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
446788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
446888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 32]
446988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 8    // odd bytes are Y
447088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8
447188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
447288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
447388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
447488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
447588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
447688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
447788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
447888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
447988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
448088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
448188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid UYVYToUVRow_Unaligned_SSE2(const uint8* src_uyvy, int stride_uyvy,
448288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                uint8* dst_u, uint8* dst_v, int pix) {
448388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
448488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
448588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
448688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]    // src_yuy2
448788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]    // stride_yuy2
448888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]   // dst_u
448988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 16]   // dst_v
449088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]   // pix
449188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5            // generate mask 0x00ff00ff
449288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm5, 8
449388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx
449488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
449588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
449688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
449788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
449888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
449988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [eax + esi]
450088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm3, [eax + esi + 16]
450188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 32]
450288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm2
450388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm1, xmm3
450488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm5   // UYVY -> UVUV
450588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm1, xmm5
450688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
450788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
450888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm5  // U
450988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm0
451088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8     // V
451188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm1, xmm1
451288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx], xmm0
451388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx + edi], xmm1
451488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
451588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
451688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
451788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
451888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
451988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
452088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
452188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
452288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
452388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
452488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
452588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid UYVYToUV422Row_Unaligned_SSE2(const uint8* src_uyvy,
452688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   uint8* dst_u, uint8* dst_v, int pix) {
452788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
452888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
452988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]    // src_yuy2
453088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 8]    // dst_u
453188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 4 + 12]   // dst_v
453288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]   // pix
453388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5            // generate mask 0x00ff00ff
453488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm5, 8
453588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, edx
453688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
453788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
453888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
453988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
454088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
454188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 32]
454288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm5   // UYVY -> UVUV
454388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm1, xmm5
454488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
454588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
454688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm5  // U
454788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm0
454888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8     // V
454988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm1, xmm1
455088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx], xmm0
455188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx + edi], xmm1
455288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
455388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
455488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
455588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
455688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
455788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
455888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
455988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
456088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_YUY2TOYROW_SSE2
456188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
456288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBBLENDROW_SSE2
456388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Blend 8 pixels at a time.
456488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
456588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBBlendRow_SSE2(const uint8* src_argb0, const uint8* src_argb1,
456688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                       uint8* dst_argb, int width) {
456788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
456888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
456988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // src_argb0
457088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4 + 8]   // src_argb1
457188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 12]  // dst_argb
457288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // width
457388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm7, xmm7       // generate constant 1
457488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm7, 15
457588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm6, xmm6       // generate mask 0x00ff00ff
457688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm6, 8
457788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5       // generate mask 0xff00ff00
457888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psllw      xmm5, 8
457988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm4, xmm4       // generate mask 0xff000000
458088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld      xmm4, 24
458188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
458288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 1
458388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         convertloop1     // only 1 pixel?
458488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jl         convertloop1b
458588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
458688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 1 pixel loop until destination pointer is aligned.
458788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  alignloop1:
458888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    test       edx, 15          // aligned?
458988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         alignloop1b
459088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm3, [eax]
459188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 4]
459288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, xmm3       // src argb
459388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm3, xmm4       // ~alpha
459488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm2, [esi]      // _r_b
459588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm3, 8          // alpha
459688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufhw    xmm3, xmm3, 0F5h // 8 alpha words
459788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm3, xmm3, 0F5h
459888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm2, xmm6       // _r_b
459988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm3, xmm7       // 256 - alpha
460088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmullw     xmm2, xmm3       // _r_b * alpha
460188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm1, [esi]      // _a_g
460288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 4]
460388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8          // _a_g
460488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm0, xmm4       // set alpha to 255
460588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmullw     xmm1, xmm3       // _a_g * alpha
460688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm2, 8          // _r_b convert to 8 bits again
460788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddusb    xmm0, xmm2       // + src argb
460888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm1, xmm5       // a_g_ convert to 8 bits again
460988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddusb    xmm0, xmm1       // + src argb
461088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 1
461188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       [edx], xmm0
461288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 4]
461388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jge        alignloop1
461488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
461588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  alignloop1b:
461688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    add        ecx, 1 - 4
461788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jl         convertloop4b
461888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
461988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 4 pixel loop.
462088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop4:
462188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm3, [eax]      // src argb
462288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
462388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, xmm3       // src argb
462488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm3, xmm4       // ~alpha
462588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [esi]      // _r_b
462688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm3, 8          // alpha
462788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufhw    xmm3, xmm3, 0F5h // 8 alpha words
462888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm3, xmm3, 0F5h
462988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm2, xmm6       // _r_b
463088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm3, xmm7       // 256 - alpha
463188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmullw     xmm2, xmm3       // _r_b * alpha
463288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [esi]      // _a_g
463388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
463488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8          // _a_g
463588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm0, xmm4       // set alpha to 255
463688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmullw     xmm1, xmm3       // _a_g * alpha
463788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm2, 8          // _r_b convert to 8 bits again
463888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddusb    xmm0, xmm2       // + src argb
463988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm1, xmm5       // a_g_ convert to 8 bits again
464088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddusb    xmm0, xmm1       // + src argb
464188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
464288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
464388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
464488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jge        convertloop4
464588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
464688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop4b:
464788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    add        ecx, 4 - 1
464888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jl         convertloop1b
464988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
465088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 1 pixel loop.
465188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop1:
465288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm3, [eax]      // src argb
465388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 4]
465488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, xmm3       // src argb
465588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm3, xmm4       // ~alpha
465688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm2, [esi]      // _r_b
465788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm3, 8          // alpha
465888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufhw    xmm3, xmm3, 0F5h // 8 alpha words
465988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm3, xmm3, 0F5h
466088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm2, xmm6       // _r_b
466188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm3, xmm7       // 256 - alpha
466288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmullw     xmm2, xmm3       // _r_b * alpha
466388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm1, [esi]      // _a_g
466488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 4]
466588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8          // _a_g
466688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm0, xmm4       // set alpha to 255
466788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmullw     xmm1, xmm3       // _a_g * alpha
466888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm2, 8          // _r_b convert to 8 bits again
466988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddusb    xmm0, xmm2       // + src argb
467088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm1, xmm5       // a_g_ convert to 8 bits again
467188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddusb    xmm0, xmm1       // + src argb
467288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 1
467388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       [edx], xmm0
467488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 4]
467588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jge        convertloop1
467688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
467788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop1b:
467888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
467988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
468088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
468188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
468288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBBLENDROW_SSE2
468388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
468488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBBLENDROW_SSSE3
468588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Shuffle table for isolating alpha.
468688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const uvec8 kShuffleAlpha = {
468788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  3u, 0x80, 3u, 0x80, 7u, 0x80, 7u, 0x80,
468888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  11u, 0x80, 11u, 0x80, 15u, 0x80, 15u, 0x80
468988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
469088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Same as SSE2, but replaces:
469188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org//    psrlw      xmm3, 8          // alpha
469288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org//    pshufhw    xmm3, xmm3, 0F5h // 8 alpha words
469388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org//    pshuflw    xmm3, xmm3, 0F5h
469488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// with..
469588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org//    pshufb     xmm3, kShuffleAlpha // alpha
469688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Blend 8 pixels at a time.
469788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
469888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
469988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBBlendRow_SSSE3(const uint8* src_argb0, const uint8* src_argb1,
470088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_argb, int width) {
470188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
470288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
470388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // src_argb0
470488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4 + 8]   // src_argb1
470588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 12]  // dst_argb
470688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // width
470788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm7, xmm7       // generate constant 0x0001
470888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm7, 15
470988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm6, xmm6       // generate mask 0x00ff00ff
471088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm6, 8
471188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5       // generate mask 0xff00ff00
471288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psllw      xmm5, 8
471388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm4, xmm4       // generate mask 0xff000000
471488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld      xmm4, 24
471588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
471688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 1
471788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         convertloop1     // only 1 pixel?
471888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jl         convertloop1b
471988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
472088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 1 pixel loop until destination pointer is aligned.
472188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  alignloop1:
472288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    test       edx, 15          // aligned?
472388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         alignloop1b
472488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm3, [eax]
472588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 4]
472688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, xmm3       // src argb
472788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm3, xmm4       // ~alpha
472888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm2, [esi]      // _r_b
472988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb     xmm3, kShuffleAlpha // alpha
473088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm2, xmm6       // _r_b
473188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm3, xmm7       // 256 - alpha
473288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmullw     xmm2, xmm3       // _r_b * alpha
473388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm1, [esi]      // _a_g
473488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 4]
473588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8          // _a_g
473688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm0, xmm4       // set alpha to 255
473788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmullw     xmm1, xmm3       // _a_g * alpha
473888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm2, 8          // _r_b convert to 8 bits again
473988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddusb    xmm0, xmm2       // + src argb
474088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm1, xmm5       // a_g_ convert to 8 bits again
474188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddusb    xmm0, xmm1       // + src argb
474288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 1
474388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       [edx], xmm0
474488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 4]
474588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jge        alignloop1
474688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
474788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  alignloop1b:
474888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    add        ecx, 1 - 4
474988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jl         convertloop4b
475088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
475188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    test       eax, 15          // unaligned?
475288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jne        convertuloop4
475388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    test       esi, 15          // unaligned?
475488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jne        convertuloop4
475588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
475688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 4 pixel loop.
475788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop4:
475888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax]      // src argb
475988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
476088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, xmm3       // src argb
476188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm3, xmm4       // ~alpha
476288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [esi]      // _r_b
476388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb     xmm3, kShuffleAlpha // alpha
476488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm2, xmm6       // _r_b
476588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm3, xmm7       // 256 - alpha
476688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmullw     xmm2, xmm3       // _r_b * alpha
476788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [esi]      // _a_g
476888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
476988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8          // _a_g
477088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm0, xmm4       // set alpha to 255
477188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmullw     xmm1, xmm3       // _a_g * alpha
477288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm2, 8          // _r_b convert to 8 bits again
477388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddusb    xmm0, xmm2       // + src argb
477488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm1, xmm5       // a_g_ convert to 8 bits again
477588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddusb    xmm0, xmm1       // + src argb
477688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
477788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
477888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
477988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jge        convertloop4
478088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        convertloop4b
478188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
478288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 4 pixel unaligned loop.
478388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertuloop4:
478488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm3, [eax]      // src argb
478588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
478688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, xmm3       // src argb
478788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm3, xmm4       // ~alpha
478888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [esi]      // _r_b
478988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb     xmm3, kShuffleAlpha // alpha
479088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm2, xmm6       // _r_b
479188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm3, xmm7       // 256 - alpha
479288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmullw     xmm2, xmm3       // _r_b * alpha
479388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [esi]      // _a_g
479488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
479588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8          // _a_g
479688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm0, xmm4       // set alpha to 255
479788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmullw     xmm1, xmm3       // _a_g * alpha
479888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm2, 8          // _r_b convert to 8 bits again
479988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddusb    xmm0, xmm2       // + src argb
480088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm1, xmm5       // a_g_ convert to 8 bits again
480188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddusb    xmm0, xmm1       // + src argb
480288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
480388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
480488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
480588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jge        convertuloop4
480688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
480788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop4b:
480888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    add        ecx, 4 - 1
480988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jl         convertloop1b
481088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
481188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 1 pixel loop.
481288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop1:
481388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm3, [eax]      // src argb
481488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 4]
481588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, xmm3       // src argb
481688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm3, xmm4       // ~alpha
481788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm2, [esi]      // _r_b
481888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb     xmm3, kShuffleAlpha // alpha
481988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm2, xmm6       // _r_b
482088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm3, xmm7       // 256 - alpha
482188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmullw     xmm2, xmm3       // _r_b * alpha
482288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm1, [esi]      // _a_g
482388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 4]
482488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8          // _a_g
482588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm0, xmm4       // set alpha to 255
482688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmullw     xmm1, xmm3       // _a_g * alpha
482788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm2, 8          // _r_b convert to 8 bits again
482888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddusb    xmm0, xmm2       // + src argb
482988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm1, xmm5       // a_g_ convert to 8 bits again
483088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddusb    xmm0, xmm1       // + src argb
483188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 1
483288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       [edx], xmm0
483388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 4]
483488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jge        convertloop1
483588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
483688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop1b:
483788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
483888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
483988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
484088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
484188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBBLENDROW_SSSE3
484288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
484388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBATTENUATEROW_SSE2
484488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Attenuate 4 pixels at a time.
484588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Aligned to 16 bytes.
484688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
484788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBAttenuateRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width) {
484888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
484988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   // src_argb0
485088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   // dst_argb
485188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  // width
485288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm4, xmm4       // generate mask 0xff000000
485388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld      xmm4, 24
485488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5       // generate mask 0x00ffffff
485588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld      xmm5, 8
485688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
485788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
485888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
485988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]      // read 4 pixels
486088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm0       // first 2
486188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufhw    xmm2, xmm0, 0FFh // 8 alpha words
486288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm2, xmm2, 0FFh
486388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw    xmm0, xmm2       // rgb * a
486488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax]      // read 4 pixels
486588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm1, xmm1       // next 2 pixels
486688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufhw    xmm2, xmm1, 0FFh // 8 alpha words
486788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm2, xmm2, 0FFh
486888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw    xmm1, xmm2       // rgb * a
486988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax]      // alphas
487088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
487188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 8
487288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm2, xmm4
487388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8
487488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
487588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm5       // keep original alphas
487688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm0, xmm2
487788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
487888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
487988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
488088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
488188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
488288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
488388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
488488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
488588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBATTENUATEROW_SSE2
488688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
488788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBATTENUATEROW_SSSE3
488888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Shuffle table duplicating alpha.
488988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const uvec8 kShuffleAlpha0 = {
489088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  3u, 3u, 3u, 3u, 3u, 3u, 128u, 128u, 7u, 7u, 7u, 7u, 7u, 7u, 128u, 128u,
489188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
489288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const uvec8 kShuffleAlpha1 = {
489388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  11u, 11u, 11u, 11u, 11u, 11u, 128u, 128u,
489488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  15u, 15u, 15u, 15u, 15u, 15u, 128u, 128u,
489588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
489688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
489788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBAttenuateRow_SSSE3(const uint8* src_argb, uint8* dst_argb, int width) {
489888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
489988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   // src_argb0
490088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   // dst_argb
490188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  // width
490288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm3, xmm3       // generate mask 0xff000000
490388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld      xmm3, 24
490488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, kShuffleAlpha0
490588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kShuffleAlpha1
490688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
490788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
490888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
490988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]      // read 4 pixels
491088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb     xmm0, xmm4       // isolate first 2 alphas
491188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax]      // read 4 pixels
491288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm1, xmm1       // first 2 pixel rgbs
491388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw    xmm0, xmm1       // rgb * a
491488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax]      // read 4 pixels
491588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb     xmm1, xmm5       // isolate next 2 alphas
491688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [eax]      // read 4 pixels
491788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm2, xmm2       // next 2 pixel rgbs
491888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw    xmm1, xmm2       // rgb * a
491988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [eax]      // mask original alpha
492088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
492188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm2, xmm3
492288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 8
492388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8
492488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
492588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm0, xmm2       // copy original alpha
492688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
492788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
492888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
492988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
493088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
493188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
493288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
493388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
493488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBATTENUATEROW_SSSE3
493588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
493688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBATTENUATEROW_AVX2
493788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Shuffle table duplicating alpha.
493888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const ulvec8 kShuffleAlpha_AVX2 = {
493988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  6u, 7u, 6u, 7u, 6u, 7u, 128u, 128u,
494088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  14u, 15u, 14u, 15u, 14u, 15u, 128u, 128u,
494188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  6u, 7u, 6u, 7u, 6u, 7u, 128u, 128u,
494288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  14u, 15u, 14u, 15u, 14u, 15u, 128u, 128u,
494388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
494488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
494588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBAttenuateRow_AVX2(const uint8* src_argb, uint8* dst_argb, int width) {
494688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
494788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   // src_argb0
494888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   // dst_argb
494988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  // width
495088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edx, eax
495188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqa    ymm4, kShuffleAlpha_AVX2
495288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpcmpeqb   ymm5, ymm5, ymm5 // generate mask 0xff000000
495388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpslld     ymm5, ymm5, 24
495488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
495588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
495688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
495788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm6, [eax]       // read 8 pixels.
495888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpcklbw ymm0, ymm6, ymm6  // low 4 pixels. mutated.
495988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpckhbw ymm1, ymm6, ymm6  // high 4 pixels. mutated.
496088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpshufb    ymm2, ymm0, ymm4  // low 4 alphas
496188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpshufb    ymm3, ymm1, ymm4  // high 4 alphas
496288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmulhuw   ymm0, ymm0, ymm2  // rgb * a
496388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmulhuw   ymm1, ymm1, ymm3  // rgb * a
496488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpand      ymm6, ymm6, ymm5  // isolate alpha
496588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm0, ymm0, 8
496688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm1, ymm1, 8
496788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm0, ymm0, ymm1  // unmutated.
496888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpor       ymm0, ymm0, ymm6  // copy original alpha
496988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
497088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [eax + edx], ymm0
497188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 32]
497288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
497388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
497488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
497588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
497688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
497788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
497888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBATTENUATEROW_AVX2
497988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
498088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBUNATTENUATEROW_SSE2
498188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Unattenuate 4 pixels at a time.
498288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Aligned to 16 bytes.
498388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
498488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBUnattenuateRow_SSE2(const uint8* src_argb, uint8* dst_argb,
498588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                             int width) {
498688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
498788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
498888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
498988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // src_argb0
499088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 8]   // dst_argb
499188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 12]  // width
499288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
499388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
499488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
499588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]      // read 4 pixels
499688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      esi, byte ptr [eax + 3]  // first alpha
499788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edi, byte ptr [eax + 7]  // second alpha
499888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm0       // first 2
499988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm2, dword ptr fixed_invtbl8[esi * 4]
500088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm3, dword ptr fixed_invtbl8[edi * 4]
500188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm2, xmm2, 040h // first 4 inv_alpha words.  1, a, a, a
500288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm3, xmm3, 040h // next 4 inv_alpha words
500388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movlhps    xmm2, xmm3
500488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw    xmm0, xmm2       // rgb * a
500588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
500688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax]      // read 4 pixels
500788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      esi, byte ptr [eax + 11]  // third alpha
500888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edi, byte ptr [eax + 15]  // forth alpha
500988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm1, xmm1       // next 2
501088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm2, dword ptr fixed_invtbl8[esi * 4]
501188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm3, dword ptr fixed_invtbl8[edi * 4]
501288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm2, xmm2, 040h // first 4 inv_alpha words
501388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm3, xmm3, 040h // next 4 inv_alpha words
501488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movlhps    xmm2, xmm3
501588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw    xmm1, xmm2       // rgb * a
501688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
501788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
501888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
501988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
502088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
502188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
502288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
502388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
502488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
502588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
502688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
502788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
502888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBUNATTENUATEROW_SSE2
502988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
503088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBUNATTENUATEROW_AVX2
503188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Shuffle table duplicating alpha.
503288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const ulvec8 kUnattenShuffleAlpha_AVX2 = {
503388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  0u, 1u, 0u, 1u, 0u, 1u, 6u, 7u, 8u, 9u, 8u, 9u, 8u, 9u, 14u, 15,
503488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  0u, 1u, 0u, 1u, 0u, 1u, 6u, 7u, 8u, 9u, 8u, 9u, 8u, 9u, 14u, 15,
503588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
503688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// TODO(fbarchard): Enable USE_GATHER for future hardware if faster.
503788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// USE_GATHER is not on by default, due to being a slow instruction.
503888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef USE_GATHER
503988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
504088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBUnattenuateRow_AVX2(const uint8* src_argb, uint8* dst_argb,
504188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                             int width) {
504288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
504388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   // src_argb0
504488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   // dst_argb
504588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  // width
504688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edx, eax
504788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqa    ymm4, kUnattenShuffleAlpha_AVX2
504888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
504988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
505088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
505188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm6, [eax]       // read 8 pixels.
505288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpcmpeqb   ymm5, ymm5, ymm5  // generate mask 0xffffffff for gather.
505388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrld     ymm2, ymm6, 24    // alpha in low 8 bits.
505488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpcklbw ymm0, ymm6, ymm6  // low 4 pixels. mutated.
505588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpckhbw ymm1, ymm6, ymm6  // high 4 pixels. mutated.
505688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpgatherdd ymm3, [ymm2 * 4 + fixed_invtbl8], ymm5  // ymm5 cleared.  1, a
505788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpcklwd ymm2, ymm3, ymm3  // low 4 inverted alphas. mutated. 1, 1, a, a
505888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpckhwd ymm3, ymm3, ymm3  // high 4 inverted alphas. mutated.
505988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpshufb    ymm2, ymm2, ymm4  // replicate low 4 alphas. 1, a, a, a
506088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpshufb    ymm3, ymm3, ymm4  // replicate high 4 alphas
506188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmulhuw   ymm0, ymm0, ymm2  // rgb * ia
506288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmulhuw   ymm1, ymm1, ymm3  // rgb * ia
506388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm0, ymm0, ymm1  // unmutated.
506488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
506588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [eax + edx], ymm0
506688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 32]
506788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
506888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
506988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
507088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
507188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
507288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
507388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#else  // USE_GATHER
507488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
507588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBUnattenuateRow_AVX2(const uint8* src_argb, uint8* dst_argb,
507688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                             int width) {
507788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
507888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
507988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   // src_argb0
508088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   // dst_argb
508188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  // width
508288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edx, eax
508388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqa    ymm5, kUnattenShuffleAlpha_AVX2
508488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
508588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
508688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
508788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
508888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
508988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
509088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // replace VPGATHER
509188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      esi, byte ptr [eax + 3]                 // alpha0
509288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edi, byte ptr [eax + 7]                 // alpha1
509388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovd      xmm0, dword ptr fixed_invtbl8[esi * 4]  // [1,a0]
509488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovd      xmm1, dword ptr fixed_invtbl8[edi * 4]  // [1,a1]
509588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      esi, byte ptr [eax + 11]                // alpha2
509688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edi, byte ptr [eax + 15]                // alpha3
509788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpckldq xmm6, xmm0, xmm1                        // [1,a1,1,a0]
509888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovd      xmm2, dword ptr fixed_invtbl8[esi * 4]  // [1,a2]
509988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovd      xmm3, dword ptr fixed_invtbl8[edi * 4]  // [1,a3]
510088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      esi, byte ptr [eax + 19]                // alpha4
510188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edi, byte ptr [eax + 23]                // alpha5
510288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpckldq xmm7, xmm2, xmm3                        // [1,a3,1,a2]
510388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovd      xmm0, dword ptr fixed_invtbl8[esi * 4]  // [1,a4]
510488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovd      xmm1, dword ptr fixed_invtbl8[edi * 4]  // [1,a5]
510588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      esi, byte ptr [eax + 27]                // alpha6
510688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edi, byte ptr [eax + 31]                // alpha7
510788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpckldq xmm0, xmm0, xmm1                        // [1,a5,1,a4]
510888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovd      xmm2, dword ptr fixed_invtbl8[esi * 4]  // [1,a6]
510988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovd      xmm3, dword ptr fixed_invtbl8[edi * 4]  // [1,a7]
511088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpckldq xmm2, xmm2, xmm3                        // [1,a7,1,a6]
511188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpcklqdq xmm3, xmm6, xmm7                       // [1,a3,1,a2,1,a1,1,a0]
511288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpcklqdq xmm0, xmm0, xmm2                       // [1,a7,1,a6,1,a5,1,a4]
511388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vinserti128 ymm3, ymm3, xmm0, 1 // [1,a7,1,a6,1,a5,1,a4,1,a3,1,a2,1,a1,1,a0]
511488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // end of VPGATHER
511588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
511688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm6, [eax]       // read 8 pixels.
511788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpcklbw ymm0, ymm6, ymm6  // low 4 pixels. mutated.
511888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpckhbw ymm1, ymm6, ymm6  // high 4 pixels. mutated.
511988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpcklwd ymm2, ymm3, ymm3  // low 4 inverted alphas. mutated. 1, 1, a, a
512088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpckhwd ymm3, ymm3, ymm3  // high 4 inverted alphas. mutated.
512188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpshufb    ymm2, ymm2, ymm5  // replicate low 4 alphas. 1, a, a, a
512288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpshufb    ymm3, ymm3, ymm5  // replicate high 4 alphas
512388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmulhuw   ymm0, ymm0, ymm2  // rgb * ia
512488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmulhuw   ymm1, ymm1, ymm3  // rgb * ia
512588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm0, ymm0, ymm1  // unmutated.
512688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
512788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [eax + edx], ymm0
512888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 32]
512988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
513088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
513188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
513288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
513388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
513488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
513588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
513688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
513788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // USE_GATHER
513888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBATTENUATEROW_AVX2
513988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
514088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBGRAYROW_SSSE3
514188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Convert 8 ARGB pixels (64 bytes) to 8 Gray ARGB pixels.
514288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
514388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBGrayRow_SSSE3(const uint8* src_argb, uint8* dst_argb, int width) {
514488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
514588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   /* src_argb */
514688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   /* dst_argb */
514788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  /* width */
514888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, kARGBToYJ
514988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, kAddYJ64
515088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
515188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
515288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
515388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]  // G
515488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
515588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm4
515688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm4
515788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm1
515888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm0, xmm5  // Add .5 for rounding.
515988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 7
516088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm0   // 8 G bytes
516188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax]  // A
516288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax + 16]
516388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 32]
516488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld      xmm2, 24
516588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld      xmm3, 24
516688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm2, xmm3
516788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm2, xmm2   // 8 A bytes
516888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm0   // Weave into GG, GA, then GGGA
516988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm0   // 8 GG words
517088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm3, xmm2   // 8 GA words
517188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
517288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm3   // GGGA first 4
517388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm3   // GGGA next 4
517488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
517588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
517688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 16], xmm1
517788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 32]
517888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
517988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
518088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
518188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
518288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBGRAYROW_SSSE3
518388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
518488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBSEPIAROW_SSSE3
518588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org//    b = (r * 35 + g * 68 + b * 17) >> 7
518688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org//    g = (r * 45 + g * 88 + b * 22) >> 7
518788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org//    r = (r * 50 + g * 98 + b * 24) >> 7
518888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Constant for ARGB color to sepia tone.
518988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const vec8 kARGBToSepiaB = {
519088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  17, 68, 35, 0, 17, 68, 35, 0, 17, 68, 35, 0, 17, 68, 35, 0
519188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
519288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
519388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const vec8 kARGBToSepiaG = {
519488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  22, 88, 45, 0, 22, 88, 45, 0, 22, 88, 45, 0, 22, 88, 45, 0
519588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
519688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
519788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic const vec8 kARGBToSepiaR = {
519888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  24, 98, 50, 0, 24, 98, 50, 0, 24, 98, 50, 0, 24, 98, 50, 0
519988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
520088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
520188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Convert 8 ARGB pixels (32 bytes) to 8 Sepia ARGB pixels.
520288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
520388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBSepiaRow_SSSE3(uint8* dst_argb, int width) {
520488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
520588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   /* dst_argb */
520688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8]   /* width */
520788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, kARGBToSepiaB
520888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, kARGBToSepiaG
520988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, kARGBToSepiaR
521088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
521188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
521288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
521388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]  // B
521488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, [eax + 16]
521588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm2
521688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm6, xmm2
521788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm6
521888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 7
521988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm0   // 8 B values
522088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, [eax]  // G
522188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
522288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm5, xmm3
522388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm3
522488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm5, xmm1
522588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm5, 7
522688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm5, xmm5   // 8 G values
522788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm5   // 8 BG values
522888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, [eax]  // R
522988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
523088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm5, xmm4
523188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm4
523288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm5, xmm1
523388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm5, 7
523488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm5, xmm5   // 8 R values
523588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, [eax]  // A
523688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
523788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld      xmm6, 24
523888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld      xmm1, 24
523988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm6, xmm1
524088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm6, xmm6   // 8 A values
524188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm5, xmm6   // 8 RA values
524288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0   // Weave BG, RA together
524388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm5   // BGRA first 4
524488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm5   // BGRA next 4
524588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
524688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [eax], xmm0
524788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [eax + 16], xmm1
524888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 32]
524988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
525088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
525188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
525288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
525388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBSEPIAROW_SSSE3
525488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
525588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBCOLORMATRIXROW_SSSE3
525688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Tranform 8 ARGB pixels (32 bytes) with color matrix.
525788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Same as Sepia except matrix is provided.
525888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// TODO(fbarchard): packuswbs only use half of the reg. To make RGBA, combine R
525988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// and B into a high and low, then G/A, unpackl/hbw and then unpckl/hwd.
526088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
526188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBColorMatrixRow_SSSE3(const uint8* src_argb, uint8* dst_argb,
526288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                              const int8* matrix_argb, int width) {
526388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
526488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   /* src_argb */
526588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   /* dst_argb */
526688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  /* matrix_argb */
526788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm5, [ecx]
526888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm2, xmm5, 0x00
526988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm3, xmm5, 0x55
527088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm4, xmm5, 0xaa
527188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm5, xmm5, 0xff
527288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 16]  /* width */
527388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
527488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
527588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
527688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]  // B
527788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm7, [eax + 16]
527888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm2
527988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm7, xmm2
528088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, [eax]  // G
528188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
528288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm6, xmm3
528388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm3
528488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddsw    xmm0, xmm7   // B
528588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddsw    xmm6, xmm1   // G
528688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm0, 6      // B
528788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm6, 6      // G
528888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm0   // 8 B values
528988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm6, xmm6   // 8 G values
529088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm6   // 8 BG values
529188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax]  // R
529288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm7, [eax + 16]
529388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm4
529488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm7, xmm4
529588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddsw    xmm1, xmm7   // R
529688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, [eax]  // A
529788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm7, [eax + 16]
529888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm6, xmm5
529988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm7, xmm5
530088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddsw    xmm6, xmm7   // A
530188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm1, 6      // R
530288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psraw      xmm6, 6      // A
530388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm1, xmm1   // 8 R values
530488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm6, xmm6   // 8 A values
530588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm1, xmm6   // 8 RA values
530688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, xmm0   // Weave BG, RA together
530788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm1   // BGRA first 4
530888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm6, xmm1   // BGRA next 4
530988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
531088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
531188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 16], xmm6
531288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 32]
531388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 32]
531488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
531588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
531688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
531788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
531888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBCOLORMATRIXROW_SSSE3
531988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
532088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBQUANTIZEROW_SSE2
532188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Quantize 4 ARGB pixels (16 bytes).
532288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Aligned to 16 bytes.
532388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
532488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBQuantizeRow_SSE2(uint8* dst_argb, int scale, int interval_size,
532588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          int interval_offset, int width) {
532688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
532788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]    /* dst_argb */
532888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm2, [esp + 8]   /* scale */
532988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm3, [esp + 12]  /* interval_size */
533088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm4, [esp + 16]  /* interval_offset */
533188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 20]   /* width */
533288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm2, xmm2, 040h
533388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm2, xmm2, 044h
533488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm3, xmm3, 040h
533588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm3, xmm3, 044h
533688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm4, xmm4, 040h
533788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm4, xmm4, 044h
533888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm5, xmm5  // constant 0
533988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm6, xmm6  // generate mask 0xff000000
534088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld      xmm6, 24
534188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
534288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
534388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
534488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]  // read 4 pixels
534588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm5   // first 2 pixels
534688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw    xmm0, xmm2   // pixel * scale >> 16
534788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax]  // read 4 pixels
534888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm1, xmm5   // next 2 pixels
534988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw    xmm1, xmm2
535088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmullw     xmm0, xmm3   // * interval_size
535188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm7, [eax]  // read 4 pixels
535288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmullw     xmm1, xmm3
535388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm7, xmm6   // mask alpha
535488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm0, xmm4   // + interval_size / 2
535588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm1, xmm4
535688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
535788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm0, xmm7
535888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
535988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [eax], xmm0
536088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
536188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
536288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
536388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
536488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
536588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBQUANTIZEROW_SSE2
536688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
536788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBSHADEROW_SSE2
536888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Shade 4 pixels at a time by specified value.
536988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Aligned to 16 bytes.
537088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
537188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBShadeRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width,
537288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                       uint32 value) {
537388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
537488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   // src_argb
537588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   // dst_argb
537688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]  // width
537788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm2, [esp + 16]  // value
537888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm2
537988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklqdq xmm2, xmm2
538088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
538188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
538288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
538388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]      // read 4 pixels
538488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
538588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
538688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm0       // first 2
538788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm1, xmm1       // next 2
538888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw    xmm0, xmm2       // argb * value
538988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw    xmm1, xmm2       // argb * value
539088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 8
539188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 8
539288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
539388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
539488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
539588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
539688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
539788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
539888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
539988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
540088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
540188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBSHADEROW_SSE2
540288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
540388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBMULTIPLYROW_SSE2
540488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Multiply 2 rows of ARGB pixels together, 4 pixels at a time.
540588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
540688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBMultiplyRow_SSE2(const uint8* src_argb0, const uint8* src_argb1,
540788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          uint8* dst_argb, int width) {
540888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
540988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
541088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // src_argb0
541188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4 + 8]   // src_argb1
541288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 12]  // dst_argb
541388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // width
541488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm5, xmm5  // constant 0
541588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
541688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
541788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
541888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]        // read 4 pixels from src_argb0
541988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [esi]        // read 4 pixels from src_argb1
542088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, xmm0
542188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm3, xmm2
542288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm0         // first 2
542388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm1, xmm1         // next 2
542488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm5         // first 2
542588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm3, xmm5         // next 2
542688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw    xmm0, xmm2         // src_argb0 * src_argb1 first 2
542788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw    xmm1, xmm3         // src_argb0 * src_argb1 next 2
542888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
542988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
543088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
543188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
543288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
543388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
543488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
543588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
543688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
543788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
543888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
543988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
544088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBMULTIPLYROW_SSE2
544188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
544288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBADDROW_SSE2
544388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Add 2 rows of ARGB pixels together, 4 pixels at a time.
544488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// TODO(fbarchard): Port this to posix, neon and other math functions.
544588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
544688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBAddRow_SSE2(const uint8* src_argb0, const uint8* src_argb1,
544788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     uint8* dst_argb, int width) {
544888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
544988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
545088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // src_argb0
545188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4 + 8]   // src_argb1
545288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 12]  // dst_argb
545388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // width
545488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
545588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
545688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jl         convertloop49
545788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
545888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
545988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop4:
546088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]        // read 4 pixels from src_argb0
546188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
546288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [esi]        // read 4 pixels from src_argb1
546388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
546488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddusb    xmm0, xmm1         // src_argb0 + src_argb1
546588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
546688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
546788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
546888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jge        convertloop4
546988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
547088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop49:
547188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    add        ecx, 4 - 1
547288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jl         convertloop19
547388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
547488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop1:
547588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm0, [eax]        // read 1 pixels from src_argb0
547688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 4]
547788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm1, [esi]        // read 1 pixels from src_argb1
547888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 4]
547988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddusb    xmm0, xmm1         // src_argb0 + src_argb1
548088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 1
548188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       [edx], xmm0
548288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 4]
548388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jge        convertloop1
548488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
548588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop19:
548688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
548788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
548888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
548988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
549088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBADDROW_SSE2
549188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
549288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBSUBTRACTROW_SSE2
549388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Subtract 2 rows of ARGB pixels together, 4 pixels at a time.
549488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
549588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBSubtractRow_SSE2(const uint8* src_argb0, const uint8* src_argb1,
549688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          uint8* dst_argb, int width) {
549788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
549888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
549988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // src_argb0
550088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4 + 8]   // src_argb1
550188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 12]  // dst_argb
550288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // width
550388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
550488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
550588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
550688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]        // read 4 pixels from src_argb0
550788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
550888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [esi]        // read 4 pixels from src_argb1
550988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
551088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubusb    xmm0, xmm1         // src_argb0 - src_argb1
551188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
551288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
551388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
551488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
551588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
551688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
551788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
551888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
551988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
552088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBSUBTRACTROW_SSE2
552188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
552288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBMULTIPLYROW_AVX2
552388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Multiply 2 rows of ARGB pixels together, 8 pixels at a time.
552488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
552588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBMultiplyRow_AVX2(const uint8* src_argb0, const uint8* src_argb1,
552688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          uint8* dst_argb, int width) {
552788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
552888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
552988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // src_argb0
553088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4 + 8]   // src_argb1
553188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 12]  // dst_argb
553288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // width
553388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpxor      ymm5, ymm5, ymm5     // constant 0
553488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
553588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
553688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
553788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm1, [eax]        // read 8 pixels from src_argb0
553888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 32]
553988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm3, [esi]        // read 8 pixels from src_argb1
554088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 32]
554188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpcklbw ymm0, ymm1, ymm1   // low 4
554288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpckhbw ymm1, ymm1, ymm1   // high 4
554388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpcklbw ymm2, ymm3, ymm5   // low 4
554488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpckhbw ymm3, ymm3, ymm5   // high 4
554588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmulhuw   ymm0, ymm0, ymm2   // src_argb0 * src_argb1 low 4
554688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmulhuw   ymm1, ymm1, ymm3   // src_argb0 * src_argb1 high 4
554788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm0, ymm0, ymm1
554888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [edx], ymm0
554988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 32]
555088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
555188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
555288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
555388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
555488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
555588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
555688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
555788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
555888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBMULTIPLYROW_AVX2
555988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
556088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBADDROW_AVX2
556188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Add 2 rows of ARGB pixels together, 8 pixels at a time.
556288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
556388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBAddRow_AVX2(const uint8* src_argb0, const uint8* src_argb1,
556488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     uint8* dst_argb, int width) {
556588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
556688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
556788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // src_argb0
556888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4 + 8]   // src_argb1
556988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 12]  // dst_argb
557088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // width
557188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
557288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
557388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
557488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm0, [eax]              // read 8 pixels from src_argb0
557588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 32]
557688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpaddusb   ymm0, ymm0, [esi]        // add 8 pixels from src_argb1
557788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 32]
557888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [edx], ymm0
557988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 32]
558088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
558188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
558288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
558388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
558488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
558588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
558688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
558788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
558888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBADDROW_AVX2
558988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
559088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBSUBTRACTROW_AVX2
559188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Subtract 2 rows of ARGB pixels together, 8 pixels at a time.
559288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
559388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBSubtractRow_AVX2(const uint8* src_argb0, const uint8* src_argb1,
559488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          uint8* dst_argb, int width) {
559588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
559688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
559788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // src_argb0
559888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4 + 8]   // src_argb1
559988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 12]  // dst_argb
560088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // width
560188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
560288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
560388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
560488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm0, [eax]              // read 8 pixels from src_argb0
560588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 32]
560688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsubusb   ymm0, ymm0, [esi]        // src_argb0 - src_argb1
560788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 32]
560888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [edx], ymm0
560988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 32]
561088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
561188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
561288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
561388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
561488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
561588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
561688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
561788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
561888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBSUBTRACTROW_AVX2
561988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
562088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_SOBELXROW_SSE2
562188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// SobelX as a matrix is
562288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// -1  0  1
562388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// -2  0  2
562488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// -1  0  1
562588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
562688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid SobelXRow_SSE2(const uint8* src_y0, const uint8* src_y1,
562788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                    const uint8* src_y2, uint8* dst_sobelx, int width) {
562888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
562988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
563088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
563188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   // src_y0
563288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // src_y1
563388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 12]  // src_y2
563488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 16]  // dst_sobelx
563588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]  // width
563688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        esi, eax
563788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, eax
563888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edx, eax
563988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm5, xmm5  // constant 0
564088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
564188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
564288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
564388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm0, qword ptr [eax]            // read 8 pixels from src_y0[0]
564488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm1, qword ptr [eax + 2]        // read 8 pixels from src_y0[2]
564588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm5
564688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm1, xmm5
564788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubw      xmm0, xmm1
564888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm1, qword ptr [eax + esi]      // read 8 pixels from src_y1[0]
564988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm2, qword ptr [eax + esi + 2]  // read 8 pixels from src_y1[2]
565088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm1, xmm5
565188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm5
565288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubw      xmm1, xmm2
565388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm2, qword ptr [eax + edi]      // read 8 pixels from src_y2[0]
565488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm3, qword ptr [eax + edi + 2]  // read 8 pixels from src_y2[2]
565588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm5
565688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm3, xmm5
565788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubw      xmm2, xmm3
565888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm0, xmm2
565988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm0, xmm1
566088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm0, xmm1
566188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm1, xmm1   // abs = max(xmm0, -xmm0).  SSSE3 could use pabsw
566288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubw      xmm1, xmm0
566388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaxsw     xmm0, xmm1
566488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm0
566588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
566688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [eax + edx], xmm0
566788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 8]
566888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
566988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
567088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
567188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
567288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
567388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
567488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
567588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_SOBELXROW_SSE2
567688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
567788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_SOBELYROW_SSE2
567888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// SobelY as a matrix is
567988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// -1 -2 -1
568088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org//  0  0  0
568188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org//  1  2  1
568288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
568388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid SobelYRow_SSE2(const uint8* src_y0, const uint8* src_y1,
568488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                    uint8* dst_sobely, int width) {
568588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
568688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
568788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // src_y0
568888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4 + 8]   // src_y1
568988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 12]  // dst_sobely
569088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // width
569188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        esi, eax
569288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edx, eax
569388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm5, xmm5  // constant 0
569488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
569588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
569688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
569788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm0, qword ptr [eax]            // read 8 pixels from src_y0[0]
569888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm1, qword ptr [eax + esi]      // read 8 pixels from src_y1[0]
569988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm5
570088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm1, xmm5
570188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubw      xmm0, xmm1
570288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm1, qword ptr [eax + 1]        // read 8 pixels from src_y0[1]
570388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm2, qword ptr [eax + esi + 1]  // read 8 pixels from src_y1[1]
570488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm1, xmm5
570588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm5
570688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubw      xmm1, xmm2
570788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm2, qword ptr [eax + 2]        // read 8 pixels from src_y0[2]
570888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm3, qword ptr [eax + esi + 2]  // read 8 pixels from src_y1[2]
570988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm5
571088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm3, xmm5
571188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubw      xmm2, xmm3
571288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm0, xmm2
571388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm0, xmm1
571488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm0, xmm1
571588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm1, xmm1   // abs = max(xmm0, -xmm0).  SSSE3 could use pabsw
571688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubw      xmm1, xmm0
571788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaxsw     xmm0, xmm1
571888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm0
571988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
572088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [eax + edx], xmm0
572188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 8]
572288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
572388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
572488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
572588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
572688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
572788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
572888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_SOBELYROW_SSE2
572988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
573088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_SOBELROW_SSE2
573188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Adds Sobel X and Sobel Y and stores Sobel into ARGB.
573288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// A = 255
573388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// R = Sobel
573488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// G = Sobel
573588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// B = Sobel
573688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
573788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid SobelRow_SSE2(const uint8* src_sobelx, const uint8* src_sobely,
573888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                   uint8* dst_argb, int width) {
573988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
574088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
574188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // src_sobelx
574288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4 + 8]   // src_sobely
574388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 12]  // dst_argb
574488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // width
574588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        esi, eax
574688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5           // alpha 255
574788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pslld      xmm5, 24             // 0xff000000
574888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
574988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
575088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
575188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]            // read 16 pixels src_sobelx
575288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + esi]      // read 16 pixels src_sobely
575388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
575488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddusb    xmm0, xmm1             // sobel = sobelx + sobely
575588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, xmm0             // GG
575688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm0             // First 8
575788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm0, xmm0             // Next 8
575888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm2             // GGGG
575988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm1, xmm2             // First 4
576088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm2, xmm2             // Next 4
576188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm1, xmm5             // GGGA
576288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm2, xmm5
576388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm0             // GGGG
576488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm3, xmm0             // Next 4
576588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm0, xmm0             // Last 4
576688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm3, xmm5             // GGGA
576788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    por        xmm0, xmm5
576888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
576988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm1
577088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 16], xmm2
577188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 32], xmm3
577288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 48], xmm0
577388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 64]
577488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
577588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
577688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
577788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
577888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
577988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
578088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_SOBELROW_SSE2
578188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
578288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_SOBELTOPLANEROW_SSE2
578388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Adds Sobel X and Sobel Y and stores Sobel into a plane.
578488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
578588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid SobelToPlaneRow_SSE2(const uint8* src_sobelx, const uint8* src_sobely,
578688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          uint8* dst_y, int width) {
578788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
578888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
578988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // src_sobelx
579088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4 + 8]   // src_sobely
579188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 12]  // dst_argb
579288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // width
579388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        esi, eax
579488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
579588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
579688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
579788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]            // read 16 pixels src_sobelx
579888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + esi]      // read 16 pixels src_sobely
579988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
580088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddusb    xmm0, xmm1             // sobel = sobelx + sobely
580188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
580288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
580388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
580488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
580588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
580688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
580788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
580888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
580988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
581088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_SOBELTOPLANEROW_SSE2
581188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
581288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_SOBELXYROW_SSE2
581388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Mixes Sobel X, Sobel Y and Sobel into ARGB.
581488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// A = 255
581588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// R = Sobel X
581688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// G = Sobel
581788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// B = Sobel Y
581888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
581988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid SobelXYRow_SSE2(const uint8* src_sobelx, const uint8* src_sobely,
582088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     uint8* dst_argb, int width) {
582188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
582288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
582388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   // src_sobelx
582488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4 + 8]   // src_sobely
582588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 12]  // dst_argb
582688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  // width
582788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        esi, eax
582888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5           // alpha 255
582988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
583088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
583188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
583288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]            // read 16 pixels src_sobelx
583388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + esi]      // read 16 pixels src_sobely
583488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
583588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, xmm0
583688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddusb    xmm2, xmm1             // sobel = sobelx + sobely
583788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm0             // XA
583888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm3, xmm5
583988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm0, xmm5
584088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm1             // YS
584188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm4, xmm2
584288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm1, xmm2
584388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, xmm4             // YSXA
584488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm6, xmm3             // First 4
584588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm4, xmm3             // Next 4
584688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm7, xmm1             // YSXA
584788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm7, xmm0             // Next 4
584888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm1, xmm0             // Last 4
584988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
585088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm6
585188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 16], xmm4
585288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 32], xmm7
585388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 48], xmm1
585488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 64]
585588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
585688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
585788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
585888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
585988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
586088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
586188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_SOBELXYROW_SSE2
586288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
586388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_CUMULATIVESUMTOAVERAGEROW_SSE2
586488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Consider float CumulativeSum.
586588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Consider calling CumulativeSum one row at time as needed.
586688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Consider circular CumulativeSum buffer of radius * 2 + 1 height.
586788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Convert cumulative sum for an area to an average for 1 pixel.
586888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// topleft is pointer to top left of CumulativeSum buffer for area.
586988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// botleft is pointer to bottom left of CumulativeSum buffer.
587088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// width is offset from left to right of area in CumulativeSum buffer measured
587188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org//   in number of ints.
587288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// area is the number of pixels in the area being averaged.
587388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// dst points to pixel to store result to.
587488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// count is number of averaged pixels to produce.
587588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Does 4 pixels at a time, requires CumulativeSum pointers to be 16 byte
587688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// aligned.
587788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid CumulativeSumToAverageRow_SSE2(const int32* topleft, const int32* botleft,
587888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                    int width, int area, uint8* dst,
587988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                    int count) {
588088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
588188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, topleft  // eax topleft
588288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, botleft  // esi botleft
588388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, width
588488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm5, area
588588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, dst
588688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, count
588788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvtdq2ps   xmm5, xmm5
588888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    rcpss      xmm4, xmm5  // 1.0f / area
588988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm4, xmm4, 0
589088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
589188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jl         l4b
589288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
589388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        area, 128  // 128 pixels will not overflow 15 bits.
589488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ja         l4
589588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
589688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm5, xmm5, 0        // area
589788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm6, xmm6           // constant of 65536.0 - 1 = 65535.0
589888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld      xmm6, 16
589988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvtdq2ps   xmm6, xmm6
590088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    addps      xmm5, xmm6           // (65536.0 + area - 1)
590188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mulps      xmm5, xmm4           // (65536.0 + area - 1) * 1 / area
590288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvtps2dq   xmm5, xmm5           // 0.16 fixed point
590388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packssdw   xmm5, xmm5           // 16 bit shorts
590488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
590588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 4 pixel loop small blocks.
590688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
590788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  s4:
590888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // top left
590988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
591088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
591188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax + 32]
591288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax + 48]
591388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
591488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // - top right
591588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubd      xmm0, [eax + edx * 4]
591688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubd      xmm1, [eax + edx * 4 + 16]
591788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubd      xmm2, [eax + edx * 4 + 32]
591888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubd      xmm3, [eax + edx * 4 + 48]
591988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 64]
592088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
592188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // - bottom left
592288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubd      xmm0, [esi]
592388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubd      xmm1, [esi + 16]
592488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubd      xmm2, [esi + 32]
592588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubd      xmm3, [esi + 48]
592688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
592788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // + bottom right
592888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm0, [esi + edx * 4]
592988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm1, [esi + edx * 4 + 16]
593088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm2, [esi + edx * 4 + 32]
593188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm3, [esi + edx * 4 + 48]
593288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 64]
593388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
593488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packssdw   xmm0, xmm1  // pack 4 pixels into 2 registers
593588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packssdw   xmm2, xmm3
593688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
593788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw    xmm0, xmm5
593888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhuw    xmm2, xmm5
593988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
594088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm2
594188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edi], xmm0
594288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edi, [edi + 16]
594388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
594488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jge        s4
594588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
594688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        l4b
594788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
594888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 4 pixel loop
594988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
595088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  l4:
595188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // top left
595288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
595388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
595488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [eax + 32]
595588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [eax + 48]
595688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
595788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // - top right
595888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubd      xmm0, [eax + edx * 4]
595988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubd      xmm1, [eax + edx * 4 + 16]
596088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubd      xmm2, [eax + edx * 4 + 32]
596188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubd      xmm3, [eax + edx * 4 + 48]
596288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 64]
596388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
596488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // - bottom left
596588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubd      xmm0, [esi]
596688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubd      xmm1, [esi + 16]
596788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubd      xmm2, [esi + 32]
596888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubd      xmm3, [esi + 48]
596988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
597088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // + bottom right
597188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm0, [esi + edx * 4]
597288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm1, [esi + edx * 4 + 16]
597388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm2, [esi + edx * 4 + 32]
597488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm3, [esi + edx * 4 + 48]
597588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 64]
597688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
597788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvtdq2ps   xmm0, xmm0   // Average = Sum * 1 / Area
597888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvtdq2ps   xmm1, xmm1
597988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mulps      xmm0, xmm4
598088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mulps      xmm1, xmm4
598188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvtdq2ps   xmm2, xmm2
598288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvtdq2ps   xmm3, xmm3
598388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mulps      xmm2, xmm4
598488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mulps      xmm3, xmm4
598588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvtps2dq   xmm0, xmm0
598688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvtps2dq   xmm1, xmm1
598788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvtps2dq   xmm2, xmm2
598888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvtps2dq   xmm3, xmm3
598988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packssdw   xmm0, xmm1
599088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packssdw   xmm2, xmm3
599188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm2
599288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edi], xmm0
599388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edi, [edi + 16]
599488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
599588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jge        l4
599688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
599788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  l4b:
599888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    add        ecx, 4 - 1
599988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jl         l1b
600088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
600188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 1 pixel loop
600288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
600388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  l1:
600488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
600588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubd      xmm0, [eax + edx * 4]
600688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
600788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubd      xmm0, [esi]
600888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm0, [esi + edx * 4]
600988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
601088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvtdq2ps   xmm0, xmm0
601188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mulps      xmm0, xmm4
601288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvtps2dq   xmm0, xmm0
601388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packssdw   xmm0, xmm0
601488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm0
601588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       dword ptr [edi], xmm0
601688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edi, [edi + 4]
601788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 1
601888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jge        l1
601988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  l1b:
602088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
602188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
602288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_CUMULATIVESUMTOAVERAGEROW_SSE2
602388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
602488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_COMPUTECUMULATIVESUMROW_SSE2
602588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Creates a table of cumulative sums where each value is a sum of all values
602688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// above and to the left of the value.
602788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ComputeCumulativeSumRow_SSE2(const uint8* row, int32* cumsum,
602888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                  const int32* previous_cumsum, int width) {
602988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
603088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, row
603188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, cumsum
603288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, previous_cumsum
603388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, width
603488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm0, xmm0
603588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm1, xmm1
603688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
603788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
603888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jl         l4b
603988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    test       edx, 15
604088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jne        l4b
604188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
604288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 4 pixel loop
604388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
604488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  l4:
604588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [eax]  // 4 argb pixels 16 bytes.
604688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
604788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm2
604888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
604988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm1
605088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm2
605188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm2, xmm1
605288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm3, xmm1
605388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
605488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm4, xmm1
605588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, xmm4
605688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm4, xmm1
605788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm5, xmm1
605888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
605988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm0, xmm2
606088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [esi]  // previous row above.
606188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm2, xmm0
606288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
606388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm0, xmm3
606488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, [esi + 16]
606588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm3, xmm0
606688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
606788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm0, xmm4
606888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, [esi + 32]
606988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm4, xmm0
607088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
607188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm0, xmm5
607288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, [esi + 48]
607388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 64]
607488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm5, xmm0
607588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
607688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm2
607788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 16], xmm3
607888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 32], xmm4
607988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 48], xmm5
608088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
608188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 64]
608288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
608388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jge        l4
608488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
608588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  l4b:
608688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    add        ecx, 4 - 1
608788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jl         l1b
608888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
608988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 1 pixel loop
609088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
609188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  l1:
609288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm2, dword ptr [eax]  // 1 argb pixel 4 bytes.
609388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 4]
609488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm1
609588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm2, xmm1
609688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm0, xmm2
609788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [esi]
609888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
609988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm2, xmm0
610088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm2
610188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
610288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 1
610388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jge        l1
610488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
610588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org l1b:
610688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
610788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
610888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_COMPUTECUMULATIVESUMROW_SSE2
610988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
611088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBAFFINEROW_SSE2
611188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Copy ARGB pixels from source image with slope to a row of destination.
611288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
611388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgLIBYUV_API
611488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBAffineRow_SSE2(const uint8* src_argb, int src_argb_stride,
611588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_argb, const float* uv_dudv, int width) {
611688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
611788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
611888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
611988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 12]  // src_argb
612088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 16]  // stride
612188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 20]  // dst_argb
612288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 24]  // pointer to uv_dudv
612388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm2, qword ptr [ecx]  // uv
612488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm7, qword ptr [ecx + 8]  // dudv
612588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 28]  // width
612688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shl        esi, 16          // 4, stride
612788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    add        esi, 4
612888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm5, esi
612988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
613088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jl         l4b
613188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
613288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // setup for 4 pixel loop
613388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm7, xmm7, 0x44  // dup dudv
613488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm5, xmm5, 0  // dup 4, stride
613588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, xmm2    // x0, y0, x1, y1
613688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    addps      xmm0, xmm7
613788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movlhps    xmm2, xmm0
613888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm7
613988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    addps      xmm4, xmm4    // dudv *= 2
614088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm2    // x2, y2, x3, y3
614188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    addps      xmm3, xmm4
614288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    addps      xmm4, xmm4    // dudv *= 4
614388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
614488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 4 pixel loop
614588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
614688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  l4:
614788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvttps2dq  xmm0, xmm2    // x, y float to int first 2
614888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvttps2dq  xmm1, xmm3    // x, y float to int next 2
614988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packssdw   xmm0, xmm1    // x, y as 8 shorts
615088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddwd    xmm0, xmm5    // offsets = x * 4 + y * stride.
615188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       esi, xmm0
615288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm0, xmm0, 0x39  // shift right
615388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       edi, xmm0
615488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm0, xmm0, 0x39  // shift right
615588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm1, [eax + esi]  // read pixel 0
615688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm6, [eax + edi]  // read pixel 1
615788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckldq  xmm1, xmm6     // combine pixel 0 and 1
615888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    addps      xmm2, xmm4    // x, y += dx, dy first 2
615988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx], xmm1
616088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       esi, xmm0
616188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm0, xmm0, 0x39  // shift right
616288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       edi, xmm0
616388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm6, [eax + esi]  // read pixel 2
616488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm0, [eax + edi]  // read pixel 3
616588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckldq  xmm6, xmm0     // combine pixel 2 and 3
616688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    addps      xmm3, xmm4    // x, y += dx, dy next 2
616788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
616888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr 8[edx], xmm6
616988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
617088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jge        l4
617188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
617288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  l4b:
617388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    add        ecx, 4 - 1
617488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jl         l1b
617588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
617688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 1 pixel loop
617788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
617888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  l1:
617988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvttps2dq  xmm0, xmm2    // x, y float to int
618088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packssdw   xmm0, xmm0    // x, y as shorts
618188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddwd    xmm0, xmm5    // offset = x * 4 + y * stride
618288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    addps      xmm2, xmm7    // x, y += dx, dy
618388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       esi, xmm0
618488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm0, [eax + esi]  // copy a pixel
618588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 1
618688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       [edx], xmm0
618788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 4]
618888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jge        l1
618988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  l1b:
619088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
619188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
619288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
619388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
619488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
619588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBAFFINEROW_SSE2
619688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
619788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_INTERPOLATEROW_AVX2
619888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Bilinear filter 16x2 -> 16x1
619988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
620088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid InterpolateRow_AVX2(uint8* dst_ptr, const uint8* src_ptr,
620188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          ptrdiff_t src_stride, int dst_width,
620288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          int source_y_fraction) {
620388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
620488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
620588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
620688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 4]   // dst_ptr
620788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // src_ptr
620888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]  // src_stride
620988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 16]  // dst_width
621088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 20]  // source_y_fraction (0..255)
621188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shr        eax, 1
621288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Dispatch to specialized filters if applicable.
621388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 0
621488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop100  // 0 / 128.  Blend 100 / 0.
621588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
621688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 32
621788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop75   // 32 / 128 is 0.25.  Blend 75 / 25.
621888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 64
621988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop50   // 64 / 128 is 0.50.  Blend 50 / 50.
622088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 96
622188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop25   // 96 / 128 is 0.75.  Blend 25 / 75.
622288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
622388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovd      xmm0, eax  // high fraction 0..127
622488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    neg        eax
622588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    add        eax, 128
622688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovd      xmm5, eax  // low fraction 128..1
622788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpcklbw xmm5, xmm5, xmm0
622888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpcklwd xmm5, xmm5, xmm5
622988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpxor      ymm0, ymm0, ymm0
623088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermd     ymm5, ymm0, ymm5
623188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
623288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
623388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop:
623488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm0, [esi]
623588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm2, [esi + edx]
623688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpckhbw ymm1, ymm0, ymm2  // mutates
623788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpunpcklbw ymm0, ymm0, ymm2  // mutates
623888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmaddubsw ymm0, ymm0, ymm5
623988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmaddubsw ymm1, ymm1, ymm5
624088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm0, ymm0, 7
624188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpsrlw     ymm1, ymm1, 7
624288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb  ymm0, ymm0, ymm1  // unmutates
624388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 32
624488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [esi + edi], ymm0
624588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 32]
624688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop
624788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
624888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
624988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 25 / 75.
625088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
625188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop25:
625288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm0, [esi]
625388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpavgb     ymm0, ymm0, [esi + edx]
625488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpavgb     ymm0, ymm0, [esi + edx]
625588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 32
625688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [esi + edi], ymm0
625788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 32]
625888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop25
625988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
626088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
626188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 50 / 50.
626288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
626388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop50:
626488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm0, [esi]
626588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpavgb     ymm0, ymm0, [esi + edx]
626688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 32
626788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [esi + edi], ymm0
626888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 32]
626988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop50
627088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
627188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
627288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 75 / 25.
627388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
627488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop75:
627588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm0, [esi + edx]
627688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpavgb     ymm0, ymm0, [esi]
627788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpavgb     ymm0, ymm0, [esi]
627888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 32
627988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu     [esi + edi], ymm0
628088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 32]
628188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop75
628288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
628388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
628488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 100 / 0 - Copy row unchanged.
628588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
628688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop100:
628788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    rep movsb
628888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
628988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop99:
629088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
629188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
629288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
629388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
629488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
629588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
629688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_INTERPOLATEROW_AVX2
629788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
629888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_INTERPOLATEROW_SSSE3
629988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Bilinear filter 16x2 -> 16x1
630088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
630188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid InterpolateRow_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
630288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          ptrdiff_t src_stride, int dst_width,
630388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          int source_y_fraction) {
630488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
630588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
630688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
630788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 4]   // dst_ptr
630888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // src_ptr
630988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]  // src_stride
631088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 16]  // dst_width
631188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 20]  // source_y_fraction (0..255)
631288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
631388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shr        eax, 1
631488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Dispatch to specialized filters if applicable.
631588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 0
631688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop100  // 0 / 128.  Blend 100 / 0.
631788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 32
631888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop75   // 32 / 128 is 0.25.  Blend 75 / 25.
631988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 64
632088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop50   // 64 / 128 is 0.50.  Blend 50 / 50.
632188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 96
632288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop25   // 96 / 128 is 0.75.  Blend 25 / 75.
632388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
632488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm0, eax  // high fraction 0..127
632588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    neg        eax
632688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    add        eax, 128
632788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm5, eax  // low fraction 128..1
632888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm5, xmm0
632988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm5, xmm5
633088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm5, xmm5, 0
633188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
633288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
633388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop:
633488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [esi]
633588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [esi + edx]
633688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
633788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm2
633888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm1, xmm2
633988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm5
634088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm5
634188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 7
634288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 7
634388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
634488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
634588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [esi + edi], xmm0
634688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
634788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop
634888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
634988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
635088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 25 / 75.
635188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
635288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop25:
635388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [esi]
635488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [esi + edx]
635588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
635688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
635788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
635888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [esi + edi], xmm0
635988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
636088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop25
636188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
636288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
636388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 50 / 50.
636488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
636588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop50:
636688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [esi]
636788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [esi + edx]
636888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
636988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
637088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [esi + edi], xmm0
637188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
637288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop50
637388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
637488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
637588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 75 / 25.
637688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
637788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop75:
637888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [esi]
637988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [esi + edx]
638088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
638188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
638288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
638388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [esi + edi], xmm0
638488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
638588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop75
638688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
638788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
638888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 100 / 0 - Copy row unchanged.
638988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
639088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop100:
639188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [esi]
639288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
639388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [esi + edi], xmm0
639488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
639588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop100
639688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
639788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop99:
639888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
639988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
640088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
640188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
640288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
640388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_INTERPOLATEROW_SSSE3
640488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
640588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_INTERPOLATEROW_SSE2
640688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Bilinear filter 16x2 -> 16x1
640788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
640888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid InterpolateRow_SSE2(uint8* dst_ptr, const uint8* src_ptr,
640988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         ptrdiff_t src_stride, int dst_width,
641088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         int source_y_fraction) {
641188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
641288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
641388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
641488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 4]   // dst_ptr
641588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // src_ptr
641688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]  // src_stride
641788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 16]  // dst_width
641888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 20]  // source_y_fraction (0..255)
641988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
642088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Dispatch to specialized filters if applicable.
642188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 0
642288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop100  // 0 / 256.  Blend 100 / 0.
642388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 64
642488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop75   // 64 / 256 is 0.25.  Blend 75 / 25.
642588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 128
642688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop50   // 128 / 256 is 0.50.  Blend 50 / 50.
642788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 192
642888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop25   // 192 / 256 is 0.75.  Blend 25 / 75.
642988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
643088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm5, eax            // xmm5 = y fraction
643188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm5, xmm5
643288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm5, 1
643388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm5, xmm5
643488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckldq  xmm5, xmm5
643588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklqdq xmm5, xmm5
643688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
643788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
643888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
643988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop:
644088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [esi]  // row0
644188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, [esi + edx]  // row1
644288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
644388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm3, xmm2
644488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm4
644588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm3, xmm4
644688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm4
644788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm1, xmm4
644888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubw      xmm2, xmm0  // row1 - row0
644988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubw      xmm3, xmm1
645088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm2, xmm2  // 9 bits * 15 bits = 8.16
645188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm3, xmm3
645288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhw     xmm2, xmm5  // scale diff
645388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhw     xmm3, xmm5
645488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm0, xmm2  // sum rows
645588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm1, xmm3
645688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
645788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
645888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [esi + edi], xmm0
645988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
646088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop
646188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
646288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
646388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 25 / 75.
646488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
646588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop25:
646688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [esi]
646788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [esi + edx]
646888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
646988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
647088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
647188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [esi + edi], xmm0
647288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
647388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop25
647488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
647588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
647688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 50 / 50.
647788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
647888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop50:
647988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [esi]
648088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [esi + edx]
648188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
648288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
648388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [esi + edi], xmm0
648488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
648588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop50
648688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
648788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
648888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 75 / 25.
648988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
649088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop75:
649188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [esi]
649288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [esi + edx]
649388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
649488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
649588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
649688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [esi + edi], xmm0
649788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
649888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop75
649988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
650088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
650188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 100 / 0 - Copy row unchanged.
650288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
650388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop100:
650488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [esi]
650588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
650688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [esi + edi], xmm0
650788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
650888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop100
650988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
651088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop99:
651188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
651288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
651388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
651488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
651588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
651688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_INTERPOLATEROW_SSE2
651788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
651888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Bilinear filter 16x2 -> 16x1
651988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
652088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid InterpolateRow_Unaligned_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
652188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                    ptrdiff_t src_stride, int dst_width,
652288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                    int source_y_fraction) {
652388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
652488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
652588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
652688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 4]   // dst_ptr
652788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // src_ptr
652888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]  // src_stride
652988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 16]  // dst_width
653088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 20]  // source_y_fraction (0..255)
653188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
653288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    shr        eax, 1
653388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Dispatch to specialized filters if applicable.
653488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 0
653588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop100  // 0 / 128.  Blend 100 / 0.
653688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 32
653788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop75   // 32 / 128 is 0.25.  Blend 75 / 25.
653888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 64
653988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop50   // 64 / 128 is 0.50.  Blend 50 / 50.
654088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 96
654188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop25   // 96 / 128 is 0.75.  Blend 25 / 75.
654288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
654388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm0, eax  // high fraction 0..127
654488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    neg        eax
654588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    add        eax, 128
654688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm5, eax  // low fraction 128..1
654788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm5, xmm0
654888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm5, xmm5
654988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm5, xmm5, 0
655088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
655188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
655288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop:
655388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [esi]
655488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [esi + edx]
655588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, xmm0
655688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm2
655788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm1, xmm2
655888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm5
655988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm1, xmm5
656088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm0, 7
656188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm1, 7
656288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
656388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
656488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [esi + edi], xmm0
656588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
656688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop
656788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
656888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
656988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 25 / 75.
657088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
657188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop25:
657288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [esi]
657388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [esi + edx]
657488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
657588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
657688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
657788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [esi + edi], xmm0
657888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
657988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop25
658088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
658188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
658288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 50 / 50.
658388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
658488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop50:
658588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [esi]
658688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [esi + edx]
658788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
658888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
658988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [esi + edi], xmm0
659088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
659188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop50
659288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
659388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
659488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 75 / 25.
659588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
659688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop75:
659788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [esi]
659888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [esi + edx]
659988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
660088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
660188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
660288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [esi + edi], xmm0
660388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
660488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop75
660588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
660688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
660788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 100 / 0 - Copy row unchanged.
660888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
660988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop100:
661088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [esi]
661188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
661288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [esi + edi], xmm0
661388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
661488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop100
661588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
661688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop99:
661788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
661888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
661988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
662088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
662188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
662288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
662388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_INTERPOLATEROW_SSE2
662488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Bilinear filter 16x2 -> 16x1
662588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
662688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid InterpolateRow_Unaligned_SSE2(uint8* dst_ptr, const uint8* src_ptr,
662788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   ptrdiff_t src_stride, int dst_width,
662888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                   int source_y_fraction) {
662988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
663088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
663188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
663288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 4]   // dst_ptr
663388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]   // src_ptr
663488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]  // src_stride
663588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 16]  // dst_width
663688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 20]  // source_y_fraction (0..255)
663788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, esi
663888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Dispatch to specialized filters if applicable.
663988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 0
664088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop100  // 0 / 256.  Blend 100 / 0.
664188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 64
664288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop75   // 64 / 256 is 0.25.  Blend 75 / 25.
664388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 128
664488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop50   // 128 / 256 is 0.50.  Blend 50 / 50.
664588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        eax, 192
664688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         xloop25   // 192 / 256 is 0.75.  Blend 25 / 75.
664788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
664888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm5, eax            // xmm5 = y fraction
664988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm5, xmm5
665088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrlw      xmm5, 1
665188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm5, xmm5
665288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckldq  xmm5, xmm5
665388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklqdq xmm5, xmm5
665488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm4, xmm4
665588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
665688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
665788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop:
665888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [esi]  // row0
665988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm2, [esi + edx]  // row1
666088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, xmm0
666188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm3, xmm2
666288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm4
666388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm3, xmm4
666488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm4
666588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm1, xmm4
666688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubw      xmm2, xmm0  // row1 - row0
666788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psubw      xmm3, xmm1
666888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm2, xmm2  // 9 bits * 15 bits = 8.16
666988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm3, xmm3
667088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhw     xmm2, xmm5  // scale diff
667188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmulhw     xmm3, xmm5
667288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm0, xmm2  // sum rows
667388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddw      xmm1, xmm3
667488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
667588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
667688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [esi + edi], xmm0
667788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
667888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop
667988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
668088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
668188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 25 / 75.
668288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
668388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop25:
668488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [esi]
668588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [esi + edx]
668688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
668788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
668888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
668988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [esi + edi], xmm0
669088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
669188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop25
669288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
669388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
669488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 50 / 50.
669588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
669688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop50:
669788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [esi]
669888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [esi + edx]
669988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
670088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
670188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [esi + edi], xmm0
670288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
670388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop50
670488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
670588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
670688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 75 / 25.
670788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
670888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop75:
670988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [esi]
671088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [esi + edx]
671188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
671288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, xmm1
671388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
671488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [esi + edi], xmm0
671588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
671688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop75
671788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        xloop99
671888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
671988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 100 / 0 - Copy row unchanged.
672088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
672188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop100:
672288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [esi]
672388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
672488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [esi + edi], xmm0
672588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 16]
672688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         xloop100
672788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
672888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  xloop99:
672988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
673088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
673188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
673288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
673388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
673488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_INTERPOLATEROW_SSE2
673588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
673688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
673788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid HalfRow_SSE2(const uint8* src_uv, int src_uv_stride,
673888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                  uint8* dst_uv, int pix) {
673988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
674088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
674188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]    // src_uv
674288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 8]    // src_uv_stride
674388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 4 + 12]   // dst_v
674488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]   // pix
674588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, eax
674688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
674788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
674888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
674988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
675088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pavgb      xmm0, [eax + edx]
675188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
675288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [eax + edi], xmm0
675388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 16]
675488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
675588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
675688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
675788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
675888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
675988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
676088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_HALFROW_AVX2
676188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
676288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid HalfRow_AVX2(const uint8* src_uv, int src_uv_stride,
676388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                  uint8* dst_uv, int pix) {
676488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
676588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
676688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]    // src_uv
676788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 8]    // src_uv_stride
676888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 4 + 12]   // dst_v
676988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]   // pix
677088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edi, eax
677188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
677288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
677388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
677488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm0, [eax]
677588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpavgb     ymm0, ymm0, [eax + edx]
677688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 32
677788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [eax + edi], ymm0
677888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax,  [eax + 32]
677988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
678088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
678188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
678288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
678388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
678488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
678588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
678688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_HALFROW_AVX2
678788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
678888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
678988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToBayerRow_SSSE3(const uint8* src_argb, uint8* dst_bayer,
679088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          uint32 selector, int pix) {
679188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
679288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]    // src_argb
679388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]    // dst_bayer
679488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm5, [esp + 12]  // selector
679588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 16]   // pix
679688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm5, xmm5, 0
679788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
679888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
679988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  wloop:
680088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
680188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
680288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 32]
680388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb     xmm0, xmm5
680488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb     xmm1, xmm5
680588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckldq  xmm0, xmm1
680688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
680788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx], xmm0
680888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
680988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         wloop
681088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
681188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
681288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
681388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
681488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Specialized ARGB to Bayer that just isolates G channel.
681588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
681688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToBayerGGRow_SSE2(const uint8* src_argb, uint8* dst_bayer,
681788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                           uint32 selector, int pix) {
681888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
681988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]    // src_argb
682088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]    // dst_bayer
682188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                 // selector
682288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 16]   // pix
682388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm5, xmm5        // generate mask 0x000000ff
682488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld      xmm5, 24
682588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
682688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
682788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  wloop:
682888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
682988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
683088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 32]
683188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld      xmm0, 8  // Move green to bottom.
683288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psrld      xmm1, 8
683388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm5
683488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm1, xmm5
683588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packssdw   xmm0, xmm1
683688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
683788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
683888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx], xmm0
683988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
684088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         wloop
684188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
684288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
684388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
684488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
684588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// For BGRAToARGB, ABGRToARGB, RGBAToARGB, and ARGBToRGBA.
684688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
684788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBShuffleRow_SSSE3(const uint8* src_argb, uint8* dst_argb,
684888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          const uint8* shuffler, int pix) {
684988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
685088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]    // src_argb
685188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]    // dst_argb
685288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]   // shuffler
685388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, [ecx]
685488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 16]   // pix
685588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
685688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
685788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  wloop:
685888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm0, [eax]
685988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, [eax + 16]
686088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 32]
686188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb     xmm0, xmm5
686288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb     xmm1, xmm5
686388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
686488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx], xmm0
686588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     [edx + 16], xmm1
686688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 32]
686788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         wloop
686888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
686988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
687088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
687188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
687288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
687388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBShuffleRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_argb,
687488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                    const uint8* shuffler, int pix) {
687588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
687688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]    // src_argb
687788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]    // dst_argb
687888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]   // shuffler
687988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, [ecx]
688088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 16]   // pix
688188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
688288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
688388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  wloop:
688488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
688588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm1, [eax + 16]
688688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 32]
688788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb     xmm0, xmm5
688888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufb     xmm1, xmm5
688988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 8
689088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
689188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx + 16], xmm1
689288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 32]
689388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         wloop
689488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
689588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
689688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
689788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
689888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBSHUFFLEROW_AVX2
689988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
690088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBShuffleRow_AVX2(const uint8* src_argb, uint8* dst_argb,
690188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* shuffler, int pix) {
690288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
690388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]     // src_argb
690488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]     // dst_argb
690588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]    // shuffler
690688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vbroadcastf128 ymm5, [ecx]    // same shuffle in high as low.
690788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 16]    // pix
690888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
690988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
691088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  wloop:
691188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm0, [eax]
691288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    ymm1, [eax + 32]
691388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 64]
691488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpshufb    ymm0, ymm0, ymm5
691588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpshufb    ymm1, ymm1, ymm5
691688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
691788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [edx], ymm0
691888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovdqu    [edx + 32], ymm1
691988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 64]
692088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         wloop
692188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
692288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
692388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
692488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
692588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
692688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBSHUFFLEROW_AVX2
692788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
692888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
692988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBShuffleRow_SSE2(const uint8* src_argb, uint8* dst_argb,
693088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* shuffler, int pix) {
693188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
693288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       ebx
693388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
693488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]    // src_argb
693588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 8]    // dst_argb
693688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 12]   // shuffler
693788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 16]   // pix
693888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm5, xmm5
693988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
694088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ebx, [esi]   // shuffler
694188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        ebx, 0x03000102
694288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         shuf_3012
694388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        ebx, 0x00010203
694488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         shuf_0123
694588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        ebx, 0x00030201
694688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         shuf_0321
694788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cmp        ebx, 0x02010003
694888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    je         shuf_2103
694988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
695088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  // TODO(fbarchard): Use one source pointer and 3 offsets.
695188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  shuf_any1:
695288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      ebx, byte ptr [esi]
695388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      ebx, byte ptr [eax + ebx]
695488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        [edx], bl
695588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      ebx, byte ptr [esi + 1]
695688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      ebx, byte ptr [eax + ebx]
695788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        [edx + 1], bl
695888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      ebx, byte ptr [esi + 2]
695988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      ebx, byte ptr [eax + ebx]
696088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        [edx + 2], bl
696188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      ebx, byte ptr [esi + 3]
696288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      ebx, byte ptr [eax + ebx]
696388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        [edx + 3], bl
696488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 4]
696588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 4]
696688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 1
696788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         shuf_any1
696888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        shuf99
696988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
697088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
697188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  shuf_0123:
697288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
697388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
697488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
697588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm5
697688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm1, xmm5
697788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufhw    xmm0, xmm0, 01Bh   // 1B = 00011011 = 0x0123 = BGRAToARGB
697888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm0, xmm0, 01Bh
697988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufhw    xmm1, xmm1, 01Bh
698088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm1, xmm1, 01Bh
698188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
698288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
698388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
698488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
698588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         shuf_0123
698688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        shuf99
698788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
698888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
698988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  shuf_0321:
699088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
699188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
699288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
699388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm5
699488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm1, xmm5
699588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufhw    xmm0, xmm0, 039h   // 39 = 00111001 = 0x0321 = RGBAToARGB
699688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm0, xmm0, 039h
699788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufhw    xmm1, xmm1, 039h
699888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm1, xmm1, 039h
699988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
700088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
700188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
700288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
700388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         shuf_0321
700488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        shuf99
700588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
700688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
700788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  shuf_2103:
700888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
700988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
701088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
701188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm5
701288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm1, xmm5
701388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufhw    xmm0, xmm0, 093h   // 93 = 10010011 = 0x2103 = ARGBToRGBA
701488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm0, xmm0, 093h
701588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufhw    xmm1, xmm1, 093h
701688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm1, xmm1, 093h
701788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
701888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
701988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
702088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
702188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         shuf_2103
702288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jmp        shuf99
702388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
702488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
702588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  shuf_3012:
702688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax]
702788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
702888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
702988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm5
703088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm1, xmm5
703188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufhw    xmm0, xmm0, 0C6h   // C6 = 11000110 = 0x3012 = ABGRToARGB
703288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm0, xmm0, 0C6h
703388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufhw    xmm1, xmm1, 0C6h
703488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshuflw    xmm1, xmm1, 0C6h
703588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm1
703688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
703788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edx], xmm0
703888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 16]
703988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         shuf_3012
704088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
704188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  shuf99:
704288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
704388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        ebx
704488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
704588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
704688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
704788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
704888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// YUY2 - Macro-pixel = 2 image pixels
704988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Y0U0Y1V0....Y2U2Y3V2...Y4U4Y5V4....
705088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
705188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// UYVY - Macro-pixel = 2 image pixels
705288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// U0Y0V0Y1
705388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
705488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
705588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToYUY2Row_SSE2(const uint8* src_y,
705688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_u,
705788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_v,
705888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_frame, int width) {
705988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
706088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
706188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
706288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]    // src_y
706388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]    // src_u
706488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]   // src_v
706588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 16]   // dst_frame
706688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]   // width
706788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edx, esi
706888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
706988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
707088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
707188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm2, qword ptr [esi] // U
707288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm3, qword ptr [esi + edx] // V
707388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 8]
707488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm3 // UV
707588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax] // Y
707688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
707788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0
707888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm2 // YUYV
707988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm1, xmm2
708088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edi], xmm0
708188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edi + 16], xmm1
708288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edi, [edi + 32]
708388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
708488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
708588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
708688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
708788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
708888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
708988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
709088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
709188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
709288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
709388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToUYVYRow_SSE2(const uint8* src_y,
709488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_u,
709588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_v,
709688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_frame, int width) {
709788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
709888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
709988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
710088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]    // src_y
710188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 8 + 8]    // src_u
710288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8 + 12]   // src_v
710388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 16]   // dst_frame
710488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 20]   // width
710588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        edx, esi
710688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
710788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
710888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
710988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm2, qword ptr [esi] // U
711088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm3, qword ptr [esi + edx] // V
711188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        esi, [esi + 8]
711288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm2, xmm3 // UV
711388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, [eax] // Y
711488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm2
711588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
711688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm1, xmm0 // UYVY
711788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhbw  xmm2, xmm0
711888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edi], xmm1
711988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     [edi + 16], xmm2
712088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edi, [edi + 32]
712188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 16
712288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
712388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
712488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
712588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
712688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
712788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
712888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
712988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
713088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBPOLYNOMIALROW_SSE2
713188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
713288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBPolynomialRow_SSE2(const uint8* src_argb,
713388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                            uint8* dst_argb, const float* poly,
713488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                            int width) {
713588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
713688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
713788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   /* src_argb */
713888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 4 + 8]   /* dst_argb */
713988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4 + 12]  /* poly */
714088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 16]  /* width */
714188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm3, xmm3  // 0 constant for zero extending bytes to ints.
714288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
714388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 2 pixel loop.
714488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
714588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
714688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org//    pmovzxbd  xmm0, dword ptr [eax]  // BGRA pixel
714788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org//    pmovzxbd  xmm4, dword ptr [eax + 4]  // BGRA pixel
714888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       xmm0, qword ptr [eax]  // BGRABGRA
714988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 8]
715088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklbw  xmm0, xmm3
715188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm4, xmm0
715288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm3  // pixel 0
715388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpckhwd  xmm4, xmm3  // pixel 1
715488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvtdq2ps   xmm0, xmm0  // 4 floats
715588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvtdq2ps   xmm4, xmm4
715688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm1, xmm0  // X
715788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm5, xmm4
715888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mulps      xmm0, [esi + 16]  // C1 * X
715988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mulps      xmm4, [esi + 16]
716088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    addps      xmm0, [esi]  // result = C0 + C1 * X
716188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    addps      xmm4, [esi]
716288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm2, xmm1
716388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqa     xmm6, xmm5
716488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mulps      xmm2, xmm1  // X * X
716588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mulps      xmm6, xmm5
716688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mulps      xmm1, xmm2  // X * X * X
716788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mulps      xmm5, xmm6
716888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mulps      xmm2, [esi + 32]  // C2 * X * X
716988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mulps      xmm6, [esi + 32]
717088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mulps      xmm1, [esi + 48]  // C3 * X * X * X
717188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mulps      xmm5, [esi + 48]
717288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    addps      xmm0, xmm2  // result += C2 * X * X
717388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    addps      xmm4, xmm6
717488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    addps      xmm0, xmm1  // result += C3 * X * X * X
717588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    addps      xmm4, xmm5
717688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvttps2dq  xmm0, xmm0
717788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    cvttps2dq  xmm4, xmm4
717888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm4
717988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    packuswb   xmm0, xmm0
718088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 2
718188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movq       qword ptr [edx], xmm0
718288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edx, [edx + 8]
718388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
718488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
718588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
718688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
718788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
718888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBPOLYNOMIALROW_SSE2
718988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
719088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBPOLYNOMIALROW_AVX2
719188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
719288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBPolynomialRow_AVX2(const uint8* src_argb,
719388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                            uint8* dst_argb, const float* poly,
719488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                            int width) {
719588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
719688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4]   /* src_argb */
719788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edx, [esp + 8]   /* dst_argb */
719888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 12]   /* poly */
719988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vbroadcastf128 ymm4, [ecx]       // C0
720088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vbroadcastf128 ymm5, [ecx + 16]  // C1
720188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vbroadcastf128 ymm6, [ecx + 32]  // C2
720288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vbroadcastf128 ymm7, [ecx + 48]  // C3
720388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 16]  /* width */
720488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
720588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 2 pixel loop.
720688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
720788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org convertloop:
720888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpmovzxbd   ymm0, qword ptr [eax]  // 2 BGRA pixels
720988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea         eax, [eax + 8]
721088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vcvtdq2ps   ymm0, ymm0        // X 8 floats
721188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmulps      ymm2, ymm0, ymm0  // X * X
721288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmulps      ymm3, ymm0, ymm7  // C3 * X
721388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vfmadd132ps ymm0, ymm4, ymm5  // result = C0 + C1 * X
721488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vfmadd231ps ymm0, ymm2, ymm6  // result += C2 * X * X
721588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vfmadd231ps ymm0, ymm2, ymm3  // result += C3 * X * X * X
721688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vcvttps2dq  ymm0, ymm0
721788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackusdw   ymm0, ymm0, ymm0  // b0g0r0a0_00000000_b0g0r0a0_00000000
721888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpermq      ymm0, ymm0, 0xd8  // b0g0r0a0_b0g0r0a0_00000000_00000000
721988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vpackuswb   xmm0, xmm0, xmm0  // bgrabgra_00000000_00000000_00000000
722088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub         ecx, 2
722188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vmovq       qword ptr [edx], xmm0
722288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea         edx, [edx + 8]
722388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg          convertloop
722488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vzeroupper
722588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
722688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
722788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
722888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBPOLYNOMIALROW_AVX2
722988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
723088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBCOLORTABLEROW_X86
723188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Tranform ARGB pixels with color table.
723288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
723388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBColorTableRow_X86(uint8* dst_argb, const uint8* table_argb,
723488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                           int width) {
723588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
723688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
723788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   /* dst_argb */
723888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4 + 8]   /* table_argb */
723988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 12]  /* width */
724088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
724188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 1 pixel loop.
724288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
724388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
724488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax]
724588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 4]
724688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [esi + edx * 4]
724788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [eax - 4], dl
724888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax - 4 + 1]
724988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [esi + edx * 4 + 1]
725088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [eax - 4 + 1], dl
725188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax - 4 + 2]
725288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [esi + edx * 4 + 2]
725388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [eax - 4 + 2], dl
725488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax - 4 + 3]
725588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [esi + edx * 4 + 3]
725688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [eax - 4 + 3], dl
725788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    dec        ecx
725888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
725988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
726088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
726188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
726288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
726388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBCOLORTABLEROW_X86
726488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
726588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_RGBCOLORTABLEROW_X86
726688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Tranform RGB pixels with color table.
726788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
726888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid RGBColorTableRow_X86(uint8* dst_argb, const uint8* table_argb, int width) {
726988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
727088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
727188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 4 + 4]   /* dst_argb */
727288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        esi, [esp + 4 + 8]   /* table_argb */
727388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 4 + 12]  /* width */
727488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
727588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 1 pixel loop.
727688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
727788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
727888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax]
727988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 4]
728088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [esi + edx * 4]
728188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [eax - 4], dl
728288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax - 4 + 1]
728388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [esi + edx * 4 + 1]
728488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [eax - 4 + 1], dl
728588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax - 4 + 2]
728688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [esi + edx * 4 + 2]
728788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [eax - 4 + 2], dl
728888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    dec        ecx
728988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
729088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
729188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
729288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
729388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
729488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
729588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_RGBCOLORTABLEROW_X86
729688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
729788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBLUMACOLORTABLEROW_SSSE3
729888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Tranform RGB pixels with luma table.
729988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org__declspec(naked) __declspec(align(16))
730088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBLumaColorTableRow_SSSE3(const uint8* src_argb, uint8* dst_argb,
730188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                 int width,
730288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                 const uint8* luma, uint32 lumacoeff) {
730388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  __asm {
730488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       esi
730588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    push       edi
730688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        eax, [esp + 8 + 4]   /* src_argb */
730788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        edi, [esp + 8 + 8]   /* dst_argb */
730888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        ecx, [esp + 8 + 12]  /* width */
730988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm2, dword ptr [esp + 8 + 16]  // luma table
731088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       xmm3, dword ptr [esp + 8 + 20]  // lumacoeff
731188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm2, xmm2, 0
731288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm3, xmm3, 0
731388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pcmpeqb    xmm4, xmm4        // generate mask 0xff00ff00
731488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    psllw      xmm4, 8
731588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pxor       xmm5, xmm5
731688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
731788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 4 pixel loop.
731888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    align      4
731988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  convertloop:
732088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movdqu     xmm0, qword ptr [eax]      // generate luma ptr
732188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pmaddubsw  xmm0, xmm3
732288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    phaddw     xmm0, xmm0
732388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pand       xmm0, xmm4  // mask out low bits
732488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    punpcklwd  xmm0, xmm5
732588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    paddd      xmm0, xmm2  // add table base
732688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       esi, xmm0
732788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm0, xmm0, 0x39  // 00111001 to rotate right 32
732888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
732988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax]
733088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [esi + edx]
733188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [edi], dl
733288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax + 1]
733388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [esi + edx]
733488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [edi + 1], dl
733588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax + 2]
733688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [esi + edx]
733788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [edi + 2], dl
733888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax + 3]  // copy alpha.
733988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [edi + 3], dl
734088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
734188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       esi, xmm0
734288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm0, xmm0, 0x39  // 00111001 to rotate right 32
734388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
734488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax + 4]
734588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [esi + edx]
734688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [edi + 4], dl
734788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax + 5]
734888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [esi + edx]
734988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [edi + 5], dl
735088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax + 6]
735188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [esi + edx]
735288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [edi + 6], dl
735388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax + 7]  // copy alpha.
735488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [edi + 7], dl
735588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
735688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       esi, xmm0
735788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pshufd     xmm0, xmm0, 0x39  // 00111001 to rotate right 32
735888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
735988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax + 8]
736088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [esi + edx]
736188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [edi + 8], dl
736288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax + 9]
736388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [esi + edx]
736488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [edi + 9], dl
736588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax + 10]
736688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [esi + edx]
736788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [edi + 10], dl
736888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax + 11]  // copy alpha.
736988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [edi + 11], dl
737088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
737188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movd       esi, xmm0
737288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
737388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax + 12]
737488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [esi + edx]
737588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [edi + 12], dl
737688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax + 13]
737788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [esi + edx]
737888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [edi + 13], dl
737988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax + 14]
738088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [esi + edx]
738188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [edi + 14], dl
738288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    movzx      edx, byte ptr [eax + 15]  // copy alpha.
738388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    mov        byte ptr [edi + 15], dl
738488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
738588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    sub        ecx, 4
738688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        eax, [eax + 16]
738788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    lea        edi, [edi + 16]
738888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    jg         convertloop
738988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
739088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        edi
739188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    pop        esi
739288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ret
739388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
739488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
739588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBLUMACOLORTABLEROW_SSSE3
739688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
739741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif  // defined(_M_X64)
739841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif  // !defined(LIBYUV_DISABLE_X86) && defined(_MSC_VER)
739988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
740088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef __cplusplus
740188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}  // extern "C"
740288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}  // namespace libyuv
740388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif
7404