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